Changeset 846

Show
Ignore:
Timestamp:
03/13/07 13:01:22 (1 year ago)
Author:
mfenniak
Message:

add ssl support

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • pg8000/trunk/pg8000.py

    r845 r846  
    362362            self.conn = None 
    363363 
    364     def connect(user, host=None, unix_sock=None, port=5432, database=None, password=None, socket_timeout=60): 
     364    def connect(user, host=None, unix_sock=None, port=5432, database=None, password=None, socket_timeout=60, ssl=False): 
    365365        return DBAPI.ConnectionWrapper(user=user, host=host, 
    366366                unix_sock=unix_sock, port=port, database=database, 
    367                 password=password, socket_timeout=socket_timeout
     367                password=password, socket_timeout=socket_timeout, ssl=ssl
    368368    connect = staticmethod(connect) 
    369369 
     
    692692# @keyparam socket_timeout  Socket connect timeout measured in seconds. 
    693693# Defaults to 60 seconds. 
     694# 
     695# @keyparam ssl     Use SSL encryption for TCP/IP socket.  Defaults to False. 
    694696class Connection(Cursor): 
    695     def __init__(self, user, host=None, unix_sock=None, port=5432, database=None, password=None, socket_timeout=60): 
     697    def __init__(self, user, host=None, unix_sock=None, port=5432, database=None, password=None, socket_timeout=60, ssl=False): 
    696698        self._row_desc = None 
    697699        try: 
    698             self.c = Protocol.Connection(unix_sock=unix_sock, host=host, port=port, socket_timeout=socket_timeout
     700            self.c = Protocol.Connection(unix_sock=unix_sock, host=host, port=port, socket_timeout=socket_timeout, ssl=ssl
    699701            #self.c.connect() 
    700702            self.c.authenticate(user, password=password, database=database) 
    701703        except socket.error, e: 
     704            print repr(e) 
     705            print dir(e) 
     706            print str(e) 
     707 
    702708            raise InterfaceError("communication error", e) 
    703709        Cursor.__init__(self, self) 
     
    729735 
    730736class Protocol(object): 
     737 
     738    class SSLRequest(object): 
     739        def __init__(self): 
     740            pass 
     741 
     742        def serialize(selF): 
     743            return struct.pack("!ii", 8, 80877103) 
     744 
    731745    class StartupMessage(object): 
    732746        def __init__(self, user, database=None): 
     
    10701084        createFromData = staticmethod(createFromData) 
    10711085 
     1086    class SSLWrapper(object): 
     1087        def __init__(self, sslobj): 
     1088            self.sslobj = sslobj 
     1089        def send(self, data): 
     1090            self.sslobj.write(data) 
     1091        def recv(self, num): 
     1092            return self.sslobj.read(num) 
     1093 
    10721094    class Connection(object): 
    1073         def __init__(self, unix_sock=None, host=None, port=5432, socket_timeout=60): 
     1095        def __init__(self, unix_sock=None, host=None, port=5432, socket_timeout=60, ssl=False): 
    10741096            self._client_encoding = "ascii" 
    10751097            if unix_sock == None and host != None: 
     
    10791101            else: 
    10801102                raise ProgrammingError("one of host or unix_sock must be provided") 
    1081             self._sock.settimeout(socket_timeout) 
    10821103            if unix_sock == None and host != None: 
    10831104                self._sock.connect((host, port)) 
    10841105            elif unix_sock != None: 
    10851106                self._sock.connect(unix_sock) 
     1107            if ssl: 
     1108                self._send(Protocol.SSLRequest()) 
     1109                resp = self._sock.recv(1) 
     1110                if resp == 'S': 
     1111                    self._sock = Protocol.SSLWrapper(socket.ssl(self._sock)) 
     1112                else: 
     1113                    raise InterfaceError("server refuses SSL") 
     1114            else: 
     1115                # settimeout causes ssl failure, on windows.  Python bug 1462352. 
     1116                self._sock.settimeout(socket_timeout) 
    10861117            self._state = "noauth" 
    10871118            self._backend_key_data = None 
  • pg8000/trunk/pg8000_test.py

    r845 r846  
    1313        "database": "pg8000-test", 
    1414        "password": "pg8000-test", 
    15         "socket_timeout": 5 
     15        "socket_timeout": 5, 
     16        "ssl": False, 
    1617        } 
    1718db = pg8000.Connection(**db_connect)