zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
U
 ý°díKã @shUdZddlmZddlZddlmZzddlmZWn$e    k
rZGdd„de
ƒZYnXddl Z ddl Z ddl Z ddlZddlmZdd    lmZdd
lmZd d lmZejd ed de jrÎddlmZddgZejjejjejj ejje j!ejj"iZ#e$e dƒr$e$ejdƒr$ejj%e#e j&<e$e dƒrLe$ejdƒrLejj'e#e j(<e j)ejj*e j+ejj,e j-ejj,ejj.iZ/dd„e/ 0¡DƒZ1e2ejddƒe2ejddƒBZ3de4d<e2ejddƒZ5de4d<e2ejddƒZ6de4d<e2ejd dƒZ7de4d!<e2ejd"dƒZ8de4d#<e j9j:e3e j9j;e3e j9j<e3e5Be j9j=e3e5Be6Be j9j>e3e5Be6Be7Be j9j?e3e5Be6Be7BiZ@d$e4d%<e j9j:e3e5Be6Be7Be8Be j9j;e3e6Be7Be8Be j9j<e3e7Be8Be j9j=e3e8Be j9j>e3e j9j?e3iZAd$e4d&<d'ZBejjCZDe  EeF¡ZGd(d)œd*d„ZHd(d)œd+d„ZId(d)œd,d-„ZJd.d/d0œd1d2„ZKd3d4d5œd6d7„ZLGd8d9„d9ƒZMejNeM_NGd:d;„d;ƒZOd<d3dddd=d>œd?d@„ZPdS)Aa
Module for using pyOpenSSL as a TLS backend. This module was relevant before
the standard library ``ssl`` module supported SNI, but now that we've dropped
support for Python 2.7 all relevant Python versions support SNI so
**this module is no longer recommended**.
 
This needs the following packages installed:
 
* `pyOpenSSL`_ (tested with 16.0.0)
* `cryptography`_ (minimum 1.3.4, from pyopenssl)
* `idna`_ (minimum 2.0, from cryptography)
 
However, pyOpenSSL depends on cryptography, which depends on idna, so while we
use all three directly here we end up having relatively few packages required.
 
You can install them with the following command:
 
.. code-block:: bash
 
    $ python -m pip install pyopenssl cryptography idna
 
To activate certificate checking, call
:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code
before you begin making HTTP requests. This can be done in a ``sitecustomize``
module, or at any other time before your application begins using ``urllib3``,
like this:
 
.. code-block:: python
 
    try:
        import urllib3.contrib.pyopenssl
        urllib3.contrib.pyopenssl.inject_into_urllib3()
    except ImportError:
        pass
 
.. _pyopenssl: https://www.pyopenssl.org
.. _cryptography: https://cryptography.io
.. _idna: https://github.com/kjd/idna
é)Ú annotationsN)Úx509)ÚUnsupportedExtensionc@s eZdZdS)rN)Ú__name__Ú
__module__Ú __qualname__©rrúPd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\urllib3/contrib/pyopenssl.pyr2sr)ÚBytesIO)Úsocket)Útimeouté)ÚutilzŸ'urllib3.contrib.pyopenssl' module is deprecated and will be removed in urllib3 v2.1.0. Read more in this issue: https://github.com/urllib3/urllib3/issues/2680)ÚcategoryÚ
stacklevel©ÚX509Úinject_into_urllib3Úextract_from_urllib3ÚPROTOCOL_TLSv1_1ÚTLSv1_1_METHODÚPROTOCOL_TLSv1_2ÚTLSv1_2_METHODcCsi|]\}}||“qSrr)Ú.0ÚkÚvrrr    Ú
<dictcomp>bsrÚ OP_NO_SSLv2Ú OP_NO_SSLv3ÚintÚ_OP_NO_SSLv2_OR_SSLv3Ú OP_NO_TLSv1Ú _OP_NO_TLSv1Ú OP_NO_TLSv1_1Ú_OP_NO_TLSv1_1Ú OP_NO_TLSv1_2Ú_OP_NO_TLSv1_2Ú OP_NO_TLSv1_3Ú_OP_NO_TLSv1_3zdict[int, int]Ú_openssl_to_ssl_minimum_versionÚ_openssl_to_ssl_maximum_versioni@ÚNone©ÚreturncCs&tƒtt_ttj_dt_dtj_dS)z7Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.TN)Ú_validate_dependencies_metÚPyOpenSSLContextrÚ
SSLContextÚssl_Ú IS_PYOPENSSLrrrr    r”s
cCs tt_ttj_dt_dtj_dS)z4Undo monkey-patching by :func:`inject_into_urllib3`.FN)Úorig_util_SSLContextrr0r1r2rrrr    rŸscCsRddlm}t|ddƒdkr$tdƒ‚ddlm}|ƒ}t|ddƒdkrNtdƒ‚dS)    z{
    Verifies that PyOpenSSL's package-level dependencies have been met.
    Throws `ImportError` if they are not met.
    r)Ú
ExtensionsÚget_extension_for_classNzX'cryptography' module missing required functionality.  Try upgrading to v1.3.4 or newer.rZ_x509zS'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.)Zcryptography.x509.extensionsr4ÚgetattrÚ ImportErrorÚOpenSSL.cryptor)r4rrrrr    r.¨s ÿ ÿr.Ústrú
str | None©Únamer-cCs:dddœdd„}d|kr|S||ƒ}|dkr0dS| d¡S)    a%
    Converts a dNSName SubjectAlternativeName field to the form used by the
    standard library on the given Python version.
 
    Cryptography produces a dNSName as a unicode string that was idna-decoded
    from ASCII bytes. We need to idna-encode that string to get it back, and
    then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib
    uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8).
 
    If the name cannot be idna-encoded then we return None signalling that
    the name given should be skipped.
    r9ú bytes | Noner;cSsrddl}zJdD]8}| |¡r|t|ƒd…}| d¡| |¡WSq| |¡WS|jjk
rlYdSXdS)zÒ
        Borrowed wholesale from the Python Cryptography Project. It turns out
        that we can't just safely call `idna.encode`: it can explode for
        wildcard names. This avoids that problem.
        rN)z*.Ú.Úascii)ÚidnaÚ
startswithÚlenÚencodeÚcoreÚ    IDNAError)r<r@Úprefixrrr    Ú idna_encodeÐs
 z'_dnsname_to_stdlib.<locals>.idna_encodeú:Núutf-8)Údecode)r<rGÚ encoded_namerrr    Ú_dnsname_to_stdlibÂsrLrzlist[tuple[str, str]])Ú    peer_certr-c Cs´| ¡}z|j tj¡j}WnZtjk
r6gYStjttj    t
fk
rv}zt   d|¡gWY¢Sd}~XYnXdd„t t| tj¡ƒDƒ}| dd„| tj¡Dƒ¡|S)zU
    Given an PyOpenSSL certificate, provides all the subject alternative names.
    z­A problem was encountered with the certificate that prevented urllib3 from finding the SubjectAlternativeName field. This can affect certificate validation. The error was %sNcSsg|]}|dk    rd|f‘qS)NÚDNSr©rr<rrr    Ú
<listcomp>sþz%get_subj_alt_name.<locals>.<listcomp>css|]}dt|ƒfVqdS)z
IP AddressN)r9rOrrr    Ú    <genexpr>sz$get_subj_alt_name.<locals>.<genexpr>)Zto_cryptographyÚ
extensionsr5rZSubjectAlternativeNameÚvalueZExtensionNotFoundZDuplicateExtensionrZUnsupportedGeneralNameTypeÚ UnicodeErrorÚlogÚwarningÚmaprLZget_values_for_typeZDNSNameÚextendZ    IPAddress)rMÚcertÚextÚeÚnamesrrr    Úget_subj_alt_nameës.üü    þ
 
ÿr]c@sàeZdZdZd/dddddœdd    „Zd
d œd d „Zdd œdd„Zddddœdd„Zddd
dœdd„Zdddœdd„Z    dd
dœdd„Z
dddœdd„Z dd œd d!„Z dd œd"d#„Z dd œd$d%„Zd0dd'd(œd)d*„Zd+d œd,d-„Zd.S)1Ú WrappedSocketz@API-compatibility wrapper for Python OpenSSL's Connection-class.TúOpenSSL.SSL.ConnectionÚ
socket_clsÚboolr+)Ú
connectionr Úsuppress_ragged_eofsr-cCs"||_||_||_d|_d|_dS©NrF)rbr rcÚ_io_refsÚ_closed)Úselfrbr rcrrr    Ú__init__s
zWrappedSocket.__init__rr,cCs
|j ¡S©N)r Úfileno©rgrrr    rj*szWrappedSocket.filenocCs*|jdkr|jd8_|jr&| ¡dS)Nré)rerfÚcloserkrrr    Ú_decref_socketios.s
zWrappedSocket._decref_socketiosz
typing.AnyÚbytes)ÚargsÚkwargsr-c
Os4z|jj||Ž}Wntjjk
rj}z4|jrD|jdkrDWY¢dSt|jdt|ƒƒ|‚W5d}~XYnÆtjj    k
rš|j 
¡tjj kr”YdS‚Yn–tjj k
rò}z8t  |j|j ¡¡sÎtdƒ|‚n|j||ŽWY¢SW5d}~XYn>tjjk
r*}zt d|›¡|‚W5d}~XYnX|SdS)N©éÿÿÿÿzUnexpected EOFórúThe read operation timed outú read error: )rbÚrecvÚOpenSSLÚSSLÚ SysCallErrorrcrpÚOSErrorr9ÚZeroReturnErrorÚ get_shutdownÚRECEIVED_SHUTDOWNÚ WantReadErrorrÚ wait_for_readr Ú
gettimeoutr ÚErrorÚsslÚSSLError)rgrprqÚdatar[rrr    rw4s"
& $$zWrappedSocket.recvc
Os,z|jj||ŽWStjjk
rf}z4|jr@|jdkr@WY¢dSt|jdt|ƒƒ|‚W5d}~XYnÂtjj    k
r–|j 
¡tjj krYdS‚Yn’tjj k
rî}z8t  |j|j ¡¡sÊtdƒ|‚n|j||ŽWY¢SW5d}~XYn:tjjk
r&}zt d|›¡|‚W5d}~XYnXdS)Nrrrrurv)rbÚ    recv_intorxryrzrcrpr{r9r|r}r~rrr€r rr r‚rƒr„)rgrprqr[rrr    r†Ms 
& $zWrappedSocket.recv_intoÚfloat)r r-cCs |j |¡Sri)r Ú
settimeout)rgr rrr    rˆdszWrappedSocket.settimeout)r…r-c
Csšz|j |¡WStjjk
rX}z(t |j|j ¡¡s@t    ƒ|‚WY¢qW5d}~XYqtjj
k
r’}zt |j dt |ƒƒ|‚W5d}~XYqXqdS©Nr)rbÚsendrxryZWantWriteErrorrÚwait_for_writer rr rzr{rpr9)rgr…r[rrr    Ú_send_until_donegszWrappedSocket._send_until_donecCs4d}|t|ƒkr0| |||t…¡}||7}qdSr‰)rBrŒÚSSL_WRITE_BLOCKSIZE)rgr…Ú
total_sentÚsentrrr    Úsendallrs  ÿzWrappedSocket.sendallcCs|j ¡dSri)rbÚshutdownrkrrr    r‘zszWrappedSocket.shutdowncCsd|_|jdkr| ¡dS)NTr)rfreÚ _real_closerkrrr    rm~s
zWrappedSocket.closecCs,z |j ¡WStjjk
r&YdSXdSri)rbrmrxryr‚rkrrr    r’ƒs zWrappedSocket._real_closeFz"dict[str, list[typing.Any]] | None)Ú binary_formr-cCsD|j ¡}|s|S|r(tj tjj|¡Sd| ¡jffft|ƒdœS)NÚ
commonName)ÚsubjectÚsubjectAltName)    rbZget_peer_certificaterxZcryptoZdump_certificateZ FILETYPE_ASN1Z get_subjectZCNr])rgr“rrrr    Ú getpeercert‰s
þzWrappedSocket.getpeercertr9cCs
|j ¡Sri)rbZget_protocol_version_namerkrrr    Úversion™szWrappedSocket.versionN)T)F)rrrÚ__doc__rhrjrnrwr†rˆrŒrr‘rmr’r—r˜rrrr    r^s ü  ÿr^c@sBeZdZdZdddœdd„Zeddœdd    „ƒZejddd
œd d    „ƒZeddœd d „ƒZejddd
œdd „ƒZddœdd„Z    dddœdd„Z
d7dddddœdd„Z d8dddddœdd„Z d dd!œd"d#„Z d9d&d'd'd'd(d)d*œd+d,„Zddœd-d.„Zeddœd/d0„ƒZejddd1œd2d0„ƒZeddœd3d4„ƒZejddd5œd6d4„ƒZdS):r/zÂ
    I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible
    for translating the interface of the standard library ``SSLContext`` object
    to calls into PyOpenSSL.
    rr+)Úprotocolr-cCs>t||_tj |j¡|_d|_d|_tj    j
|_ tj    j |_ dSrd)Ú_openssl_versionsršrxryÚContextÚ_ctxÚ_optionsÚcheck_hostnamerƒÚ
TLSVersionÚMINIMUM_SUPPORTEDÚ_minimum_versionÚMAXIMUM_SUPPORTEDÚ_maximum_version)rgršrrr    rh§s 
 
zPyOpenSSLContext.__init__r,cCs|jSri)ržrkrrr    Úoptions¯szPyOpenSSLContext.options)rSr-cCs||_| ¡dSri)ržÚ_set_ctx_options©rgrSrrr    r¥³scCst|j ¡Sri)Ú_openssl_to_stdlib_verifyrZget_verify_moderkrrr    Ú verify_mode¸szPyOpenSSLContext.verify_modezssl.VerifyModecCs|j t|t¡dSri)rZ
set_verifyÚ_stdlib_to_openssl_verifyÚ_verify_callbackr§rrr    r©¼scCs|j ¡dSri)rÚset_default_verify_pathsrkrrr    r¬Àsz)PyOpenSSLContext.set_default_verify_pathsz bytes | str)Úciphersr-cCs$t|tƒr| d¡}|j |¡dS)NrI)Ú
isinstancer9rCrZset_cipher_list)rgr­rrr    Ú set_ciphersÃs
 
zPyOpenSSLContext.set_ciphersNr:r=)ÚcafileÚcapathÚcadatar-c
CsŒ|dk    r| d¡}|dk    r$| d¡}z*|j ||¡|dk    rL|j t|ƒ¡Wn8tjjk
r†}zt d|›¡|‚W5d}~XYnXdS)NrIz%unable to load trusted certificates: )    rCrÚload_verify_locationsr
rxryr‚rƒr„)rgr°r±r²r[rrr    r³Ès
 
z&PyOpenSSLContext.load_verify_locationsr9)ÚcertfileÚkeyfileÚpasswordr-c
sŽzP|j |¡ˆdk    r>tˆtƒs*ˆ d¡‰|j ‡fdd„¡|j |pJ|¡Wn8tjj    k
rˆ}zt
  d|›¡|‚W5d}~XYnXdS)NrIcsˆSrir)Ú_©r¶rr    Ú<lambda>ärtz2PyOpenSSLContext.load_cert_chain.<locals>.<lambda>z"Unable to load certificate chain: ) rZuse_certificate_chain_filer®rorCZ set_passwd_cbZuse_privatekey_filerxryr‚rƒr„)rgr´rµr¶r[rr¸r    Úload_cert_chainÙs 
 
z PyOpenSSLContext.load_cert_chainzlist[bytes | str])Ú    protocolsr-cCsdd„|Dƒ}|j |¡S)NcSsg|]}tj |d¡‘qS)r?)rÚto_bytes)rÚprrr    rPêsz7PyOpenSSLContext.set_alpn_protocols.<locals>.<listcomp>)rZset_alpn_protos)rgr»rrr    Úset_alpn_protocolsész#PyOpenSSLContext.set_alpn_protocolsFTr`razbytes | str | Noner^)ÚsockÚ server_sideÚdo_handshake_on_connectrcÚserver_hostnamer-c
Csàtj |j|¡}|r>tj |¡s>t|tƒr4|     d¡}| 
|¡|  ¡z |  ¡WqÖtjj k
rš}z&t || ¡¡s‚tdƒ|‚WY¢qFW5d}~XYqÖtjjk
rÐ}zt d|›¡|‚W5d}~XYqÖXqÖqFt||ƒS)NrIzselect timed outzbad handshake: )rxryÚ
Connectionrrr1Ú is_ipaddressr®r9rCZset_tlsext_host_nameZset_connect_stateÚ do_handshakerr€rr r‚rƒr„r^)rgr¿rÀrÁrcrÂÚcnxr[rrr    Ú wrap_socketís 
 
 
 
$zPyOpenSSLContext.wrap_socketcCs&|j |jt|jBt|jB¡dSri)rZ set_optionsržr)r¢r*r¤rkrrr    r¦ sÿþÿz!PyOpenSSLContext._set_ctx_optionscCs|jSri)r¢rkrrr    Úminimum_versionsz PyOpenSSLContext.minimum_version)rÈr-cCs||_| ¡dSri)r¢r¦)rgrÈrrr    rÈscCs|jSri)r¤rkrrr    Úmaximum_versionsz PyOpenSSLContext.maximum_version)rÉr-cCs||_| ¡dSri)r¤r¦)rgrÉrrr    rÉ s)NNN)NN)FTTN)rrrr™rhÚpropertyr¥Úsetterr©r¬r¯r³rºr¾rÇr¦rÈrÉrrrr    r/ sDüüúr/r_ra)rÆrÚerr_noÚ    err_depthÚ return_coder-cCs|dkSr‰r)rÆrrÌrÍrÎrrr    r«&sr«)Qr™Ú
__future__rZ OpenSSL.SSLrxZ cryptographyrZcryptography.x509rr7Ú    ExceptionÚloggingrƒÚtypingÚwarningsÚior
r r`r ÚrÚwarnÚDeprecationWarningÚ TYPE_CHECKINGr8rÚ__all__r1Ú PROTOCOL_TLSryZ SSLv23_METHODÚPROTOCOL_TLS_CLIENTÚPROTOCOL_TLSv1Z TLSv1_METHODr›ÚhasattrrrrrÚ    CERT_NONEZ VERIFY_NONEÚ CERT_OPTIONALZ VERIFY_PEERÚ CERT_REQUIREDZVERIFY_FAIL_IF_NO_PEER_CERTrªÚitemsr¨r6r Ú__annotations__r"r$r&r(r r¡ÚTLSv1ÚTLSv1_1ÚTLSv1_2ÚTLSv1_3r£r)r*rr0r3Ú    getLoggerrrUrrr.rLr]r^Úmakefiler/r«rrrr    Ú<module>sÊ(      û ýÿýÿ
÷ ÿþýü
ò 
     )0