Changeset 388 for python/vendor/current/Lib/ssl.py
- Timestamp:
- Mar 19, 2014, 11:11:30 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/vendor/current/Lib/ssl.py
r2 r388 60 60 import _ssl # if we can't import it, let the error propagate 61 61 62 from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION 62 63 from _ssl import SSLError 63 64 from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED 64 from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv165 65 from _ssl import RAND_status, RAND_egd, RAND_add 66 66 from _ssl import \ … … 74 74 SSL_ERROR_EOF, \ 75 75 SSL_ERROR_INVALID_ERROR_CODE 76 77 from socket import socket, _fileobject 76 from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 77 _PROTOCOL_NAMES = { 78 PROTOCOL_TLSv1: "TLSv1", 79 PROTOCOL_SSLv23: "SSLv23", 80 PROTOCOL_SSLv3: "SSLv3", 81 } 82 try: 83 from _ssl import PROTOCOL_SSLv2 84 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 85 except ImportError: 86 _SSLv2_IF_EXISTS = None 87 else: 88 _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" 89 90 from socket import socket, _fileobject, _delegate_methods, error as socket_error 78 91 from socket import getnameinfo as _getnameinfo 79 92 import base64 # for DER-to-PEM translation 93 import 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 80 99 81 100 class SSLSocket(socket): … … 89 108 ssl_version=PROTOCOL_SSLv23, ca_certs=None, 90 109 do_handshake_on_connect=True, 91 suppress_ragged_eofs=True ):110 suppress_ragged_eofs=True, ciphers=None): 92 111 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 100 123 101 124 if certfile and not keyfile: … … 104 127 try: 105 128 socket.getpeername(self) 106 except: 129 except socket_error, e: 130 if e.errno != errno.ENOTCONN: 131 raise 107 132 # no, no connection yet 133 self._connected = False 108 134 self._sslobj = None 109 135 else: 110 136 # yes, create the SSL object 137 self._connected = True 111 138 self._sslobj = _ssl.sslwrap(self._sock, server_side, 112 139 keyfile, certfile, 113 cert_reqs, ssl_version, ca_certs) 140 cert_reqs, ssl_version, ca_certs, 141 ciphers) 114 142 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() 121 144 self.keyfile = keyfile 122 145 self.certfile = certfile … … 124 147 self.ssl_version = ssl_version 125 148 self.ca_certs = ca_certs 149 self.ciphers = ciphers 126 150 self.do_handshake_on_connect = do_handshake_on_connect 127 151 self.suppress_ragged_eofs = suppress_ragged_eofs … … 183 207 return v 184 208 else: 185 return s ocket.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): 188 212 if self._sslobj: 189 213 raise ValueError("sendto not allowed on instances of %s" % 190 214 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) 193 219 194 220 def sendall(self, data, flags=0): … … 211 237 if flags != 0: 212 238 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" % 214 240 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) 225 244 226 245 def recv_into(self, buffer, nbytes=None, flags=0): … … 234 253 "non-zero flags not allowed in calls to recv_into() on %s" % 235 254 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): 251 263 if self._sslobj: 252 264 raise ValueError("recvfrom not allowed on instances of %s" % 253 265 self.__class__) 254 266 else: 255 return s ocket.recvfrom(self, addr,buflen, flags)267 return self._sock.recvfrom(buflen, flags) 256 268 257 269 def recvfrom_into(self, buffer, nbytes=None, flags=0): … … 260 272 self.__class__) 261 273 else: 262 return s ocket.recvfrom_into(self,buffer, nbytes, flags)274 return self._sock.recvfrom_into(buffer, nbytes, flags) 263 275 264 276 def pending(self): … … 293 305 self._sslobj.do_handshake() 294 306 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 295 330 def connect(self, addr): 296 297 331 """Connects to remote ADDR, and then wraps the connection in 298 332 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) 310 339 311 340 def accept(self): … … 316 345 317 346 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 328 362 329 363 def makefile(self, mode='r', bufsize=-1): … … 334 368 335 369 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) 337 373 338 374 … … 342 378 ssl_version=PROTOCOL_SSLv23, ca_certs=None, 343 379 do_handshake_on_connect=True, 344 suppress_ragged_eofs=True ):380 suppress_ragged_eofs=True, ciphers=None): 345 381 346 382 return SSLSocket(sock, keyfile=keyfile, certfile=certfile, … … 348 384 ssl_version=ssl_version, ca_certs=ca_certs, 349 385 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) 351 388 352 389 … … 374 411 f = base64.standard_b64encode(der_cert_bytes) 375 412 return (PEM_HEADER + '\n' + 376 textwrap.fill(f, 64) + 413 textwrap.fill(f, 64) + '\n' + 377 414 PEM_FOOTER + '\n') 378 415 else: … … 415 452 416 453 def 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>') 427 455 428 456 … … 442 470 try: 443 471 sock.getpeername() 444 except :472 except socket_error: 445 473 # no, no connection yet 446 474 pass
Note:
See TracChangeset
for help on using the changeset viewer.