o
    �õ±j$  ã                   @   s¦   d dl Z d dlZd dlmZmZ d dlmZmZmZ d dl	m
Z
 d dlmZ degfdegfdegfd	egfd
egfdœZG dd„ dƒZdd„ ZedkrQeƒ  dS dS )é    N)ÚurlparseÚparse_qs)Ústr_oneÚint_oneÚbool_one)Úcontextmanager)ÚNamedTemporaryFileÚcacertÚcertfileÚkeyfileÚpasswordÚverify)ÚcaÚcertÚkeyr   r   c                   @   sŒ   e Zd ZdZddededededef
d	d
„Zdd„ Zdd„ Ze	ddd„ƒZ
ejfdd„Ze	dd„ ƒZe	dd„ ƒZdd„ Zdd„ Zdd„ ZdS ) ÚUniSSLz~This class was necessary to be able to create duplicates of ssl contexts, which is not possible with the ssl.SSLContext class.NFr
   r   r	   r   r   c                 C   sD   t j| _|| _|| _|| _|| _|| _d | _d | _	d | _
|  ¡  d S ©N)ÚsslÚPROTOCOL_TLSÚprotocolr	   r   r
   r   r   Ú_UniSSL__cacertfilenameÚ_UniSSL__keyfilenameÚ_UniSSL__certfilenameÚ_UniSSL__startup)Úselfr
   r   r	   r   r   © r   ú‘/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/unicomm/common/unissl.pyÚ__init__   s   zUniSSL.__init__c                 C   sV  | j d ur�t| j tƒrj| j  d¡s| j  d¡r |  | j | j¡ npzt| j dƒ�}W d   ƒ n1 s2w   Y  | j | _W nS   dt 	d¡ 
¡  | _t| jddd��}| | j ¡ W d   ƒ n1 scw   Y  Y n&dt 	d¡ 
¡  | _t| jd	ƒ�}| | j ¡ W d   ƒ n1 s‹w   Y  | jd u�r"t| jtƒrû| j d¡s¨| j d¡r±|  | j| j¡ nqzt| jdƒ�}W d   ƒ n1 sÃw   Y  | j| _W nT   d
t 	d¡ 
¡  | _t| jddd��}| | j¡ W d   ƒ n1 sôw   Y  Y n'dt 	d¡ 
¡  | _t| jd	ƒ�}| | j¡ W d   ƒ n	1 �sw   Y  | jd u�r©t| jtƒ�rzt| jdƒ�}W d   ƒ n	1 �sBw   Y  | j| _W d S    dt 	d¡ 
¡  | _t| jddd��}| | j¡ W d   ƒ Y d S 1 �sww   Y  Y d S dt 	d¡ 
¡  | _t| jd	ƒ�}| | j¡ W d   ƒ d S 1 �s¢w   Y  d S d S )Nz.pfxz.p12Úrbz
key_%s.pemé   ÚwÚ )ÚnewlineÚwbzcert_%s.pemzcacert_%s.pem)r   Ú
isinstanceÚstrÚendswithÚ
pfx_to_pemr   Úopenr   ÚosÚurandomÚhexÚwriter
   r   r	   r   )r   Úfr   r   r   Ú	__startup   sn   
ÿÿ€ÿÿÿ€ÿÿ(ÿ$ÿôzUniSSL.__startupc                 C   sr  ddl m} ddlm}m}m} ddlm} 	 ||ƒ ¡ }t	|t
ƒr'| d¡}|||d ƒ\}	}
}dt d¡ ¡  }d| | _d	| | _t| jd
ƒ�}| |	 |j|j|ƒ ¡¡ W d   ƒ n1 saw   Y  t| jd
ƒ�}| |
 |j¡¡ W d   ƒ n1 s€w   Y  t|ƒdkr·d| | _t| jd
ƒ�}|D ]}| | |j¡¡ q™W d   ƒ d S 1 s°w   Y  d S d S )Nr   )ÚPath)ÚEncodingÚPrivateFormatÚNoEncryption)Úload_key_and_certificateszutf-8z%s.pemr   zkey_%szcert_%sr#   z	cacert_%s)Úpathlibr/   Ú,cryptography.hazmat.primitives.serializationr0   r1   r2   Ú3cryptography.hazmat.primitives.serialization.pkcs12r3   Ú
read_bytesr$   r%   Úencoder)   r*   r+   r   r   r(   r,   Úprivate_bytesÚPEMÚPKCS8Úpublic_bytesÚlenr   )r   Úpfx_pathÚpfx_passwordr/   r0   r1   r2   r3   ÚpfxÚprivate_keyÚ	main_certÚ	add_certsÚsuffixr-   r   r   r   r   r'   \   s2   



ÿÿ
ÿ"ÿþzUniSSL.pfx_to_pemÚ	localhostc                 C   s:   | du rddl m} ||ƒ\}}t||ddd�S tdd�S )zCReturns a generic SSL context that does not verify the certificate.Tr   )Úgenerate_selfsigned_certNF)r   )Ú$asysocks.unicomm.utils.genselfsignedrF   r   )Ú	is_serverÚhostnamerF   Úserver_certfileÚserver_keyfiler   r   r   Úget_noverify_contexts   s
   
zUniSSL.get_noverify_contextc                 C   s�   zB|   ¡  t |¡}| jd ur|j| j| j| jd� | jdu r'd|_tj	|_
n| jd ur4|j| jd� n|jtjjd� |W |  ¡  S |  ¡  w )N)r
   r   r   F)Úcafile)Úpurpose)r   r   Ú
SSLContextr   Úload_cert_chainr   r   r   Úcheck_hostnameÚ	CERT_NONEÚverify_moder	   Úload_verify_locationsr   Úload_default_certsÚPurposeÚSERVER_AUTHÚ_UniSSL__cleanup)r   r   Ússl_ctxr   r   r   Úget_ssl_context}   s   




zUniSSL.get_ssl_contextc                 C   sP   t | ƒ}i }|jd ur#t|jƒ}|D ]}| d¡du rq|| ||< qt |¡S )Nr   F)r   Úqueryr   Ú
startswithr   Úfrom_urlparams)ÚurlÚurl_eÚparamsr[   Úkr   r   r   Úfrom_url�   s   


zUniSSL.from_urlc                 C   s–   i }| D ]7}|  d¡du r|dd … }n|  d¡du r"|dd … }nq|tv r;t| d d | | d ƒ|t| d < qt|ƒdkrDd S tdi |¤ŽS )	NÚssl_Tr   r   é   é   r   r   )r\   Úunissl_url_param2varr=   r   )r`   Úfinalparamsra   Úpnamer   r   r   r]   œ   s   (€zUniSSL.from_urlparamsc                 C   s|   | j | jkrzt | j ¡ W n   Y | j| jkr&zt | j¡ W n   Y | j| jkr<z	t | j¡ W d S    Y d S d S r   )r   r
   r)   Úremover   r   r   r	   ©r   r   r   r   Ú	__cleanup­   s    üzUniSSL.__cleanupc                 C   s    d| j | j| j| j| j| jf S )NzOUniSSL(certfile=%s, keyfile=%s, cacert=%s, verify=%s, protocol=%s, password=%s))r
   r   r	   r   r   r   rj   r   r   r   Ú__str__¾   s    zUniSSL.__str__c                 C   s   |   ¡  d S r   )rX   rj   r   r   r   Ú__del__Á   s   zUniSSL.__del__)NNNNF)FrE   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   Úboolr   r   r'   ÚstaticmethodrL   r   ÚPROTOCOL_TLS_CLIENTrZ   rb   r]   rX   rl   rm   r   r   r   r   r      s     >	

r   c                  C   s   d} t  | ¡}t|ƒ d S )Nz`https://www.google.com/?ssl_cert=cert.pem&ssl_key=key.pem&ssl_cacert=cacert.pem&ssl_verify=False)r   rb   Úprint)r^   r   r   r   r   ÚmainÄ   s   
rv   Ú__main__)r)   r   Úurllib.parser   r   Ú%asysocks.unicomm.utils.paramprocessorr   r   r   Ú
contextlibr   Útempfiler   r%   rr   rf   r   rv   rn   r   r   r   r   Ú<module>   s$    û 5
ÿ