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rt| 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 sw   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 sw   Y  | j| _W nT   d
t	d
  | _t| jddd}|| j W d    n1 sw   Y  Y n'dt	d
  | _t| jd	}|| j W d    n	1 sw   Y  | jd urt| 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 sw   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 sw   Y  t|dkrd| | _t| jd
}|D ]}|||j qW d    d S 1 sw   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
