home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2493 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.6 KB  |  154 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import sys
  5. import struct
  6. import SocketServer
  7. import win32api
  8. import httplib
  9. import traceback
  10. import win32security
  11. import sspi
  12. import sspicon
  13. import optparse
  14. options = None
  15.  
  16. def GetUserName():
  17.     
  18.     try:
  19.         return win32api.GetUserName()
  20.     except win32api.error:
  21.         details = None
  22.         return repr(win32api.GetUserNameEx(win32api.NameSamCompatible))
  23.  
  24.  
  25.  
  26. def _send_msg(s, m):
  27.     s.send(struct.pack('i', len(m)))
  28.     s.send(m)
  29.  
  30.  
  31. def _get_msg(s):
  32.     size_data = s.recv(struct.calcsize('i'))
  33.     if not size_data:
  34.         return None
  35.     cb = struct.unpack('i', size_data)[0]
  36.     return s.recv(cb)
  37.  
  38.  
  39. class SSPISocketServer(SocketServer.TCPServer):
  40.     
  41.     def __init__(self, *args, **kw):
  42.         SocketServer.TCPServer.__init__(self, *args, **kw)
  43.         self.sa = sspi.ServerAuth(options.package)
  44.  
  45.     
  46.     def verify_request(self, sock, ca):
  47.         self.sa.reset()
  48.         while None:
  49.             data = _get_msg(sock)
  50.             if data is None:
  51.                 return False
  52.             
  53.             try:
  54.                 (err, sec_buffer) = self.sa.authorize(data)
  55.             except sspi.error:
  56.                 data is None
  57.                 details = data is None
  58.                 print 'FAILED to authorize client:', details
  59.                 return False
  60.  
  61.             if err == 0:
  62.                 break
  63.             
  64.             continue
  65.             return True
  66.  
  67.     
  68.     def process_request(self, request, client_address):
  69.         print 'The server is running as user', GetUserName()
  70.         self.sa.ctxt.ImpersonateSecurityContext()
  71.         
  72.         try:
  73.             print 'Having conversation with client as user', GetUserName()
  74.             while None:
  75.                 data = _get_msg(request)
  76.                 key = _get_msg(request)
  77.                 if data is None or key is None:
  78.                     break
  79.                 
  80.                 data = self.sa.decrypt(data, key)
  81.                 print 'Client sent:', repr(data)
  82.             self.sa.ctxt.RevertSecurityContext()
  83.             self.close_request(request)
  84.             print 'The server is back to user', GetUserName()
  85.             return None
  86.  
  87.  
  88.  
  89.  
  90. def serve():
  91.     s = SSPISocketServer(('localhost', options.port), None)
  92.     print 'Running test server...'
  93.     s.serve_forever()
  94.  
  95.  
  96. def sspi_client():
  97.     c = httplib.HTTPConnection('localhost', options.port)
  98.     c.connect()
  99.     ca = sspi.ClientAuth(options.package, targetspn = options.target_spn)
  100.     data = None
  101.     while None:
  102.         (err, out_buf) = ca.authorize(data)
  103.         if err == 0:
  104.             break
  105.         
  106.         data = _get_msg(c.sock)
  107.         continue
  108.         print 'Auth dance complete - sending a few encryted messages'
  109.         for data in 'Hello from the client'.split():
  110.             (blob, key) = ca.encrypt(data)
  111.             _send_msg(c.sock, blob)
  112.             _send_msg(c.sock, key)
  113.         
  114.     c.sock.close()
  115.     print 'Client completed.'
  116.  
  117. if __name__ == '__main__':
  118.     parser = optparse.OptionParser('%prog [options] client|server', description = __doc__)
  119.     parser.add_option('', '--package', action = 'store', default = 'NTLM', help = 'The SSPI package to use (eg, Kerberos) - default is NTLM')
  120.     parser.add_option('', '--target-spn', action = 'store', help = "The target security provider name to use. The\n                      string contents are security-package specific.  For\n                      example, 'Kerberos' or 'Negotiate' require the server\n                      principal name (SPN) (ie, the username) of the remote\n                      process.  For NTLM this must be blank.")
  121.     parser.add_option('', '--port', action = 'store', default = '8181', help = 'The port number to use (default=8181)')
  122.     parser.add_option('', '--wait', action = 'store_true', help = 'Cause the program to wait for input just before\n                              terminating. Useful when using via runas to see\n                              any error messages before termination.\n                           ')
  123.     (options, args) = parser.parse_args()
  124.     
  125.     try:
  126.         options.port = int(options.port)
  127.     except (ValueError, TypeError):
  128.         parser.error('--port must be an integer')
  129.  
  130.     
  131.     try:
  132.         if not args:
  133.             args = [
  134.                 '']
  135.         
  136.         if args[0] == 'client':
  137.             sspi_client()
  138.         elif args[0] == 'server':
  139.             serve()
  140.         else:
  141.             parser.error("You must supply 'client' or 'server' - use --help for details")
  142.     except KeyboardInterrupt:
  143.         pass
  144.     except SystemExit:
  145.         pass
  146.     except:
  147.         traceback.print_exc()
  148.     finally:
  149.         if options.wait:
  150.             raw_input('Press enter to continue')
  151.         
  152.  
  153.  
  154.