o
    Ð­jNE  ã                	   @  s¼  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 ddlmZmZ ddlmZmZ dZdZdZdZd	gZeeeeeef Zd
d„ dD ƒZd]dd„Zejrxd dlmZ d dlmZ ddl mZ! G dd„ dedd�Z"i Z#de$d< zQd dlZd dlm%Z%mZm&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.mZm/Z/ e)Z0er«ee(ƒs«dZdD ]Z1ze2e/e1ƒe#e2ede1› �ƒ< W q­ e3yÇ   Y q­w ddl mZ W n e4yê   dZ&dZ'd Z-d!Z.d Z0Z)d"Z*d#Z+d$Z,Y nw ej5de6df Z7d^d)d*„Z8d_d.d/„Z9d`d1d2„Z:							dadbd=d>„Z;ej<	?	?	?	?	?	?	?	?	?	?	?	?dcdddOdP„ƒZ=ej<	?	?	?	?	?	?	?	?	?	?	?	?dcdedRdP„ƒZ=												dfdedSdP„Z=dgdVdW„Z>dhdYdZ„Z?	didjd[d\„Z@dS )ké    )ÚannotationsN)Ú	unhexlifyé   )ÚProxySchemeUnsupportedÚSSLErroré   )Ú_BRACELESS_IPV6_ADDRZ_REÚ_IPV4_REFzhttp/1.1c                 C  s   i | ]\}}|t t|d ƒ“qS ©N)ÚgetattrÚhashlib)Ú.0ÚlengthÚ	algorithm© r   úN/var/www/html/CropPilot/venv/lib/python3.10/site-packages/urllib3/util/ssl_.pyÚ
<dictcomp>   s    ÿÿr   ))é    Úmd5)é(   Úsha1)é@   Úsha256Úopenssl_versionÚstrÚreturnÚboolc                 C  s   |   d¡}|S )NzOpenSSL )Ú
startswith)r   Ú
is_opensslr   r   r   Ú(_is_has_never_check_common_name_reliable   s   
r   )Ú
VerifyMode)Ú	TypedDict)ÚSSLTransportc                   @  s&   e Zd ZU ded< ded< ded< dS )Ú_TYPE_PEER_CERT_RET_DICTztuple[tuple[str, str], ...]ÚsubjectAltNamez'tuple[tuple[tuple[str, str], ...], ...]Úsubjectr   ÚserialNumberN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r   r   r#   .   s   
 r#   )Útotalzdict[int, int]Ú_SSL_VERSION_TO_TLS_VERSION)ÚCERT_REQUIREDÚHAS_NEVER_CHECK_COMMON_NAMEÚOP_NO_COMPRESSIONÚOP_NO_TICKETÚOPENSSL_VERSIONÚPROTOCOL_TLSÚPROTOCOL_TLS_CLIENTÚVERIFY_X509_PARTIAL_CHAINÚVERIFY_X509_STRICTÚOP_NO_SSLv2ÚOP_NO_SSLv3Ú
SSLContextÚ
TLSVersion)ÚTLSv1ÚTLSv1_1ÚTLSv1_2Ú	PROTOCOL_i   i @  i   i   é   i   r   Úcertúbytes | NoneÚfingerprintÚNonec                 C  s    | du rt dƒ‚| dd¡ ¡ }t|ƒ}|tvrt d|› �ƒ‚t |¡}|du r/t d|› �ƒ‚t| ¡ ƒ}|| ƒ ¡ }t	 
||¡sNt d|› d| ¡ › d	�ƒ‚dS )
zá
    Checks if given fingerprint matches the supplied certificate.

    :param cert:
        Certificate as bytes object.
    :param fingerprint:
        Fingerprint as string of hexdigits, can be interspersed by colons.
    NzNo certificate for the peer.ú:Ú zFingerprint of invalid length: zAHash function implementation unavailable for fingerprint length: z&Fingerprints did not match. Expected "z", got "ú")r   ÚreplaceÚlowerÚlenÚHASHFUNC_MAPÚgetr   ÚencodeÚdigestÚhmacÚcompare_digestÚhex)r?   rA   Údigest_lengthÚhashfuncÚfingerprint_bytesÚcert_digestr   r   r   Úassert_fingerprintk   s$   

ÿÿÿrT   Ú	candidateúNone | int | strr    c                 C  s@   | du rt S t| tƒrtt| dƒ}|du rttd|  ƒ}|S | S )aë  
    Resolves the argument to a numeric constant, which can be passed to
    the wrap_socket function/method from the ssl module.
    Defaults to :data:`ssl.CERT_REQUIRED`.
    If given a string it is assumed to be the name of the constant in the
    :mod:`ssl` module or its abbreviation.
    (So you can specify `REQUIRED` instead of `CERT_REQUIRED`.
    If it's neither `None` nor a string we assume it is already the numeric
    constant which can directly be passed to wrap_socket.
    NÚCERT_)r-   Ú
isinstancer   r   Ússl©rU   Úresr   r   r   Úresolve_cert_reqs�   s   
r\   Úintc                 C  sH   | du rt S t| tƒr"tt| dƒ}|du rttd|  ƒ}t t|¡S | S )z 
    like resolve_cert_reqs
    Nr=   )r2   rX   r   r   rY   ÚtypingÚcastr]   rZ   r   r   r   Úresolve_ssl_version¤   s   
r`   Ússl_versionú
int | NoneÚ	cert_reqsÚoptionsÚciphersú
str | NoneÚssl_minimum_versionÚssl_maximum_versionÚverify_flagsússl.SSLContextc           	      C  s”  t du rtdƒ‚| dttfvr1|dus|durtdƒ‚t | tj¡}t | tj	¡}t
jdtdd� t tƒ}|dur=||_ntj|_|durH||_|rO| |¡ |du rVtjn|}|du rnd}|tO }|tO }|tO }|tO }| j|O  _|du rˆd}tjdkrˆ|tO }|tO }| j|O  _t|d	dƒduršd
|_|tjkr¨ts¨||_ d
|_!nd|_!||_ d|_"dt#j$v rÁt#j% &t#j$ d¡¡}nd}|rÈ||_'|S )a#  Creates and configures an :class:`ssl.SSLContext` instance for use with urllib3.

    :param ssl_version:
        The desired protocol version to use. This will default to
        PROTOCOL_SSLv23 which will negotiate the highest protocol that both
        the server and your installation of OpenSSL support.

        This parameter is deprecated instead use 'ssl_minimum_version'.
    :param ssl_minimum_version:
        The minimum version of TLS to be used. Use the 'ssl.TLSVersion' enum for specifying the value.
    :param ssl_maximum_version:
        The maximum version of TLS to be used. Use the 'ssl.TLSVersion' enum for specifying the value.
        Not recommended to set to anything other than 'ssl.TLSVersion.MAXIMUM_SUPPORTED' which is the
        default value.
    :param cert_reqs:
        Whether to require the certificate verification. This defaults to
        ``ssl.CERT_REQUIRED``.
    :param options:
        Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``,
        ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``, and ``ssl.OP_NO_TICKET``.
    :param ciphers:
        Which cipher suites to allow the server to select. Defaults to either system configured
        ciphers if OpenSSL 1.1.1+, otherwise uses a secure default set of ciphers.
    :param verify_flags:
        The flags for certificate verification operations. These default to
        ``ssl.VERIFY_X509_PARTIAL_CHAIN`` and ``ssl.VERIFY_X509_STRICT`` for Python 3.13+.
    :returns:
        Constructed SSLContext object with specified options
    :rtype: SSLContext
    Nz7Can't create an SSLContext object without an ssl modulezZCan't specify both 'ssl_version' and either 'ssl_minimum_version' or 'ssl_maximum_version'zi'ssl_version' option is deprecated and will be removed in urllib3 v3.0. Instead use 'ssl_minimum_version'r   )ÚcategoryÚ
stacklevelr   )é   é   Úpost_handshake_authTFÚSSLKEYLOGFILE)(r8   Ú	TypeErrorr2   r3   Ú
ValueErrorr,   rJ   r9   ÚMINIMUM_SUPPORTEDÚMAXIMUM_SUPPORTEDÚwarningsÚwarnÚFutureWarningÚminimum_versionr<   Úmaximum_versionÚset_ciphersrY   r-   r6   r7   r/   r0   rd   ÚsysÚversion_infor4   r5   ri   r   ro   ÚIS_PYOPENSSLÚverify_modeÚcheck_hostnameÚhostname_checks_common_nameÚosÚenvironÚpathÚ
expandvarsÚkeylog_filename)	ra   rc   rd   re   rg   rh   ri   ÚcontextÚsslkeylogfiler   r   r   Úcreate_urllib3_context´   sl   'ÿÿÿü


rˆ   .Úsockúsocket.socketÚkeyfileÚcertfileÚca_certsÚserver_hostnameÚssl_contextússl.SSLContext | NoneÚca_cert_dirÚkey_passwordÚca_cert_dataúNone | str | bytesÚ
tls_in_tlsútyping.Literal[False]ússl.SSLSocketc                 C  ó   d S r
   r   ©r‰   r‹   rŒ   rc   r�   rŽ   ra   re   r�   r‘   r’   r“   r•   r   r   r   Ússl_wrap_socketG  ó   rš   ú ssl.SSLSocket | SSLTransportTypec                 C  r˜   r
   r   r™   r   r   r   rš   Y  r›   c              
   C  sÖ   |}|du rt |||d�}|s|	s|r.z	| ||	|¡ W n ty- } zt|ƒ|‚d}~ww |du r;t|dƒr;| ¡  |rI|
du rIt|ƒrItdƒ‚|r]|
du rV| ||¡ n| |||
¡ | t	¡ t
| |||ƒ}|S )a´  
    All arguments except for server_hostname, ssl_context, tls_in_tls, ca_cert_data and
    ca_cert_dir have the same meaning as they do when using
    :func:`ssl.create_default_context`, :meth:`ssl.SSLContext.load_cert_chain`,
    :meth:`ssl.SSLContext.set_ciphers` and :meth:`ssl.SSLContext.wrap_socket`.

    :param server_hostname:
        When SNI is supported, the expected hostname of the certificate
    :param ssl_context:
        A pre-made :class:`SSLContext` object. If none is provided, one will
        be created using :func:`create_urllib3_context`.
    :param ciphers:
        A string of ciphers we wish the client to support.
    :param ca_cert_dir:
        A directory containing CA certificates in multiple separate files, as
        supported by OpenSSL's -CApath flag or the capath argument to
        SSLContext.load_verify_locations().
    :param key_password:
        Optional password if the keyfile is encrypted.
    :param ca_cert_data:
        Optional string containing CA certificates in PEM format suitable for
        passing as the cadata parameter to SSLContext.load_verify_locations()
    :param tls_in_tls:
        Use SSLTransport to wrap the existing socket.
    N)re   Úload_default_certsz5Client private key is encrypted, password is required)rˆ   Úload_verify_locationsÚOSErrorr   Úhasattrr�   Ú_is_key_file_encryptedÚload_cert_chainÚset_alpn_protocolsÚALPN_PROTOCOLSÚ_ssl_wrap_socket_impl)r‰   r‹   rŒ   rc   r�   rŽ   ra   re   r�   r‘   r’   r“   r•   r†   ÚeÚssl_sockr   r   r   rš   k  s*   (
€ÿ
Úhostnameústr | bytesc                 C  s,   t | tƒr
|  d¡} tt | ¡pt | ¡ƒS )zæDetects whether the hostname given is an IPv4 or IPv6 address.
    Also detects IPv6 addresses with Zone IDs.

    :param str hostname: Hostname to examine.
    :return: True if the hostname is an IP address, False otherwise.
    Úascii)rX   ÚbytesÚdecoder   r	   Úmatchr   )r¨   r   r   r   Úis_ipaddressµ  s   

r®   Úkey_filec                 C  sR   t | ƒ�}|D ]}d|v r W d  ƒ dS qW d  ƒ dS 1 s"w   Y  dS )z*Detects if a key file is encrypted or not.Ú	ENCRYPTEDNTF)Úopen)r¯   ÚfÚliner   r   r   r¡   Â  s   
üþ
ÿúr¡   c                 C  s4   |rt stdƒ‚t  |¡ t | ||ƒS |j| |d�S )Nz0TLS in TLS requires support for the 'ssl' module)rŽ   )r"   r   Ú$_validate_ssl_context_for_tls_in_tlsÚwrap_socket)r‰   r�   r•   rŽ   r   r   r   r¥   Í  s   ÿ
r¥   )r   r   r   r   )r?   r@   rA   r   r   rB   )rU   rV   r   r    )rU   rV   r   r]   )NNNNNNN)ra   rb   rc   rb   rd   rb   re   rf   rg   rb   rh   rb   ri   rb   r   rj   )............)r‰   rŠ   r‹   rf   rŒ   rf   rc   rb   r�   rf   rŽ   rf   ra   rb   re   rf   r�   r�   r‘   rf   r’   rf   r“   r”   r•   r–   r   r—   )r‰   rŠ   r‹   rf   rŒ   rf   rc   rb   r�   rf   rŽ   rf   ra   rb   re   rf   r�   r�   r‘   rf   r’   rf   r“   r”   r•   r   r   rœ   )NNNNNNNNNNNF)r¨   r©   r   r   )r¯   r   r   r   r
   )
r‰   rŠ   r�   rj   r•   r   rŽ   rf   r   rœ   )AÚ
__future__r   r   rM   r�   Úsocketr{   r^   ru   Úbinasciir   Ú
exceptionsr   r   Úurlr   r	   r8   r"   r.   r}   r¤   Útupler]   r   Ú_TYPE_VERSION_INFOrI   r   ÚTYPE_CHECKINGrY   r    r!   ÚssltransportÚSSLTransportTyper#   r,   r*   r-   r/   r0   r1   r2   r3   r4   r5   r6   r7   r9   ÚPROTOCOL_SSLv23Úattrr   ÚAttributeErrorÚImportErrorÚUnionr«   Ú_TYPE_PEER_CERT_RETrT   r\   r`   rˆ   Úoverloadrš   r®   r¡   r¥   r   r   r   r   Ú<module>   sà    þ

<ÿÿÿø

"
ù óóó
J
ü