Ignore:
Timestamp:
Mar 19, 2014, 11:11:30 AM (11 years ago)
Author:
dmik
Message:

python: Update vendor to 2.7.6.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • python/vendor/current/Lib/ssl.py

    r2 r388  
    6060import _ssl             # if we can't import it, let the error propagate
    6161
     62from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION
    6263from _ssl import SSLError
    6364from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED
    64 from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1
    6565from _ssl import RAND_status, RAND_egd, RAND_add
    6666from _ssl import \
     
    7474     SSL_ERROR_EOF, \
    7575     SSL_ERROR_INVALID_ERROR_CODE
    76 
    77 from socket import socket, _fileobject
     76from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1
     77_PROTOCOL_NAMES = {
     78    PROTOCOL_TLSv1: "TLSv1",
     79    PROTOCOL_SSLv23: "SSLv23",
     80    PROTOCOL_SSLv3: "SSLv3",
     81}
     82try:
     83    from _ssl import PROTOCOL_SSLv2
     84    _SSLv2_IF_EXISTS = PROTOCOL_SSLv2
     85except ImportError:
     86    _SSLv2_IF_EXISTS = None
     87else:
     88    _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2"
     89
     90from socket import socket, _fileobject, _delegate_methods, error as socket_error
    7891from socket import getnameinfo as _getnameinfo
    7992import base64        # for DER-to-PEM translation
     93import errno
     94
     95# Disable weak or insecure ciphers by default
     96# (OpenSSL's default setting is 'DEFAULT:!aNULL:!eNULL')
     97_DEFAULT_CIPHERS = 'DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2'
     98
    8099
    81100class SSLSocket(socket):
     
    89108                 ssl_version=PROTOCOL_SSLv23, ca_certs=None,
    90109                 do_handshake_on_connect=True,
    91                  suppress_ragged_eofs=True):
     110                 suppress_ragged_eofs=True, ciphers=None):
    92111        socket.__init__(self, _sock=sock._sock)
    93         # the initializer for socket trashes the methods (tsk, tsk), so...
    94         self.send = lambda data, flags=0: SSLSocket.send(self, data, flags)
    95         self.sendto = lambda data, addr, flags=0: SSLSocket.sendto(self, data, addr, flags)
    96         self.recv = lambda buflen=1024, flags=0: SSLSocket.recv(self, buflen, flags)
    97         self.recvfrom = lambda addr, buflen=1024, flags=0: SSLSocket.recvfrom(self, addr, buflen, flags)
    98         self.recv_into = lambda buffer, nbytes=None, flags=0: SSLSocket.recv_into(self, buffer, nbytes, flags)
    99         self.recvfrom_into = lambda buffer, nbytes=None, flags=0: SSLSocket.recvfrom_into(self, buffer, nbytes, flags)
     112        # The initializer for socket overrides the methods send(), recv(), etc.
     113        # in the instancce, which we don't need -- but we want to provide the
     114        # methods defined in SSLSocket.
     115        for attr in _delegate_methods:
     116            try:
     117                delattr(self, attr)
     118            except AttributeError:
     119                pass
     120
     121        if ciphers is None and ssl_version != _SSLv2_IF_EXISTS:
     122            ciphers = _DEFAULT_CIPHERS
    100123
    101124        if certfile and not keyfile:
     
    104127        try:
    105128            socket.getpeername(self)
    106         except:
     129        except socket_error, e:
     130            if e.errno != errno.ENOTCONN:
     131                raise
    107132            # no, no connection yet
     133            self._connected = False
    108134            self._sslobj = None
    109135        else:
    110136            # yes, create the SSL object
     137            self._connected = True
    111138            self._sslobj = _ssl.sslwrap(self._sock, server_side,
    112139                                        keyfile, certfile,
    113                                         cert_reqs, ssl_version, ca_certs)
     140                                        cert_reqs, ssl_version, ca_certs,
     141                                        ciphers)
    114142            if do_handshake_on_connect:
    115                 timeout = self.gettimeout()
    116                 try:
    117                     self.settimeout(None)
    118                     self.do_handshake()
    119                 finally:
    120                     self.settimeout(timeout)
     143                self.do_handshake()
    121144        self.keyfile = keyfile
    122145        self.certfile = certfile
     
    124147        self.ssl_version = ssl_version
    125148        self.ca_certs = ca_certs
     149        self.ciphers = ciphers
    126150        self.do_handshake_on_connect = do_handshake_on_connect
    127151        self.suppress_ragged_eofs = suppress_ragged_eofs
     
    183207                    return v
    184208        else:
    185             return socket.send(self, data, flags)
    186 
    187     def sendto(self, data, addr, flags=0):
     209            return self._sock.send(data, flags)
     210
     211    def sendto(self, data, flags_or_addr, addr=None):
    188212        if self._sslobj:
    189213            raise ValueError("sendto not allowed on instances of %s" %
    190214                             self.__class__)
    191         else:
    192             return socket.sendto(self, data, addr, flags)
     215        elif addr is None:
     216            return self._sock.sendto(data, flags_or_addr)
     217        else:
     218            return self._sock.sendto(data, flags_or_addr, addr)
    193219
    194220    def sendall(self, data, flags=0):
     
    211237            if flags != 0:
    212238                raise ValueError(
    213                     "non-zero flags not allowed in calls to sendall() on %s" %
     239                    "non-zero flags not allowed in calls to recv() on %s" %
    214240                    self.__class__)
    215             while True:
    216                 try:
    217                     return self.read(buflen)
    218                 except SSLError, x:
    219                     if x.args[0] == SSL_ERROR_WANT_READ:
    220                         continue
    221                     else:
    222                         raise x
    223         else:
    224             return socket.recv(self, buflen, flags)
     241            return self.read(buflen)
     242        else:
     243            return self._sock.recv(buflen, flags)
    225244
    226245    def recv_into(self, buffer, nbytes=None, flags=0):
     
    234253                  "non-zero flags not allowed in calls to recv_into() on %s" %
    235254                  self.__class__)
    236             while True:
    237                 try:
    238                     tmp_buffer = self.read(nbytes)
    239                     v = len(tmp_buffer)
    240                     buffer[:v] = tmp_buffer
    241                     return v
    242                 except SSLError as x:
    243                     if x.args[0] == SSL_ERROR_WANT_READ:
    244                         continue
    245                     else:
    246                         raise x
    247         else:
    248             return socket.recv_into(self, buffer, nbytes, flags)
    249 
    250     def recvfrom(self, addr, buflen=1024, flags=0):
     255            tmp_buffer = self.read(nbytes)
     256            v = len(tmp_buffer)
     257            buffer[:v] = tmp_buffer
     258            return v
     259        else:
     260            return self._sock.recv_into(buffer, nbytes, flags)
     261
     262    def recvfrom(self, buflen=1024, flags=0):
    251263        if self._sslobj:
    252264            raise ValueError("recvfrom not allowed on instances of %s" %
    253265                             self.__class__)
    254266        else:
    255             return socket.recvfrom(self, addr, buflen, flags)
     267            return self._sock.recvfrom(buflen, flags)
    256268
    257269    def recvfrom_into(self, buffer, nbytes=None, flags=0):
     
    260272                             self.__class__)
    261273        else:
    262             return socket.recvfrom_into(self, buffer, nbytes, flags)
     274            return self._sock.recvfrom_into(buffer, nbytes, flags)
    263275
    264276    def pending(self):
     
    293305        self._sslobj.do_handshake()
    294306
     307    def _real_connect(self, addr, return_errno):
     308        # Here we assume that the socket is client-side, and not
     309        # connected at the time of the call.  We connect it, then wrap it.
     310        if self._connected:
     311            raise ValueError("attempt to connect already-connected SSLSocket!")
     312        self._sslobj = _ssl.sslwrap(self._sock, False, self.keyfile, self.certfile,
     313                                    self.cert_reqs, self.ssl_version,
     314                                    self.ca_certs, self.ciphers)
     315        try:
     316            if return_errno:
     317                rc = socket.connect_ex(self, addr)
     318            else:
     319                rc = None
     320                socket.connect(self, addr)
     321            if not rc:
     322                if self.do_handshake_on_connect:
     323                    self.do_handshake()
     324                self._connected = True
     325            return rc
     326        except socket_error:
     327            self._sslobj = None
     328            raise
     329
    295330    def connect(self, addr):
    296 
    297331        """Connects to remote ADDR, and then wraps the connection in
    298332        an SSL channel."""
    299 
    300         # Here we assume that the socket is client-side, and not
    301         # connected at the time of the call.  We connect it, then wrap it.
    302         if self._sslobj:
    303             raise ValueError("attempt to connect already-connected SSLSocket!")
    304         socket.connect(self, addr)
    305         self._sslobj = _ssl.sslwrap(self._sock, False, self.keyfile, self.certfile,
    306                                     self.cert_reqs, self.ssl_version,
    307                                     self.ca_certs)
    308         if self.do_handshake_on_connect:
    309             self.do_handshake()
     333        self._real_connect(addr, False)
     334
     335    def connect_ex(self, addr):
     336        """Connects to remote ADDR, and then wraps the connection in
     337        an SSL channel."""
     338        return self._real_connect(addr, True)
    310339
    311340    def accept(self):
     
    316345
    317346        newsock, addr = socket.accept(self)
    318         return (SSLSocket(newsock,
    319                           keyfile=self.keyfile,
    320                           certfile=self.certfile,
    321                           server_side=True,
    322                           cert_reqs=self.cert_reqs,
    323                           ssl_version=self.ssl_version,
    324                           ca_certs=self.ca_certs,
    325                           do_handshake_on_connect=self.do_handshake_on_connect,
    326                           suppress_ragged_eofs=self.suppress_ragged_eofs),
    327                 addr)
     347        try:
     348            return (SSLSocket(newsock,
     349                              keyfile=self.keyfile,
     350                              certfile=self.certfile,
     351                              server_side=True,
     352                              cert_reqs=self.cert_reqs,
     353                              ssl_version=self.ssl_version,
     354                              ca_certs=self.ca_certs,
     355                              ciphers=self.ciphers,
     356                              do_handshake_on_connect=self.do_handshake_on_connect,
     357                              suppress_ragged_eofs=self.suppress_ragged_eofs),
     358                    addr)
     359        except socket_error as e:
     360            newsock.close()
     361            raise e
    328362
    329363    def makefile(self, mode='r', bufsize=-1):
     
    334368
    335369        self._makefile_refs += 1
    336         return _fileobject(self, mode, bufsize)
     370        # close=True so as to decrement the reference count when done with
     371        # the file-like object.
     372        return _fileobject(self, mode, bufsize, close=True)
    337373
    338374
     
    342378                ssl_version=PROTOCOL_SSLv23, ca_certs=None,
    343379                do_handshake_on_connect=True,
    344                 suppress_ragged_eofs=True):
     380                suppress_ragged_eofs=True, ciphers=None):
    345381
    346382    return SSLSocket(sock, keyfile=keyfile, certfile=certfile,
     
    348384                     ssl_version=ssl_version, ca_certs=ca_certs,
    349385                     do_handshake_on_connect=do_handshake_on_connect,
    350                      suppress_ragged_eofs=suppress_ragged_eofs)
     386                     suppress_ragged_eofs=suppress_ragged_eofs,
     387                     ciphers=ciphers)
    351388
    352389
     
    374411        f = base64.standard_b64encode(der_cert_bytes)
    375412        return (PEM_HEADER + '\n' +
    376                 textwrap.fill(f, 64) +
     413                textwrap.fill(f, 64) + '\n' +
    377414                PEM_FOOTER + '\n')
    378415    else:
     
    415452
    416453def get_protocol_name(protocol_code):
    417     if protocol_code == PROTOCOL_TLSv1:
    418         return "TLSv1"
    419     elif protocol_code == PROTOCOL_SSLv23:
    420         return "SSLv23"
    421     elif protocol_code == PROTOCOL_SSLv2:
    422         return "SSLv2"
    423     elif protocol_code == PROTOCOL_SSLv3:
    424         return "SSLv3"
    425     else:
    426         return "<unknown>"
     454    return _PROTOCOL_NAMES.get(protocol_code, '<unknown>')
    427455
    428456
     
    442470    try:
    443471        sock.getpeername()
    444     except:
     472    except socket_error:
    445473        # no, no connection yet
    446474        pass
Note: See TracChangeset for help on using the changeset viewer.