U
    e](                  
   @   s~  d dl mZmZmZ d dlZd dlZd dlZd dlmZ d dl	Z	d dl
mZ d dlmZ d dlmZ d dlmZ dd	d
ddddddd	Zdd ZG dd deZe	ejG dd deZeeG dd deZdd ZeeG dd deZeeG dd deZeeG d d! d!eZeeG d"d# d#eZ eeG d$d% d%eZ!eeG d&d' d'eZ"dS )(    )absolute_importdivisionprint_functionN)	parseaddr)urllib_parse)utils)Name)ObjectIdentifierZ	otherNameZ
rfc822NameZdNSNameZx400AddressZdirectoryNameZediPartyNameZuniformResourceIdentifierZ	iPAddressZregisteredID)	r                           c                  C   s0   zdd l } | W S  tk
r*   tdY nX d S )Nr   zidna is not installed, but a deprecated feature that requires it was used. See: https://cryptography.io/en/latest/faq/#importerror-idna-is-not-installed)idnaImportError)r    r   @/usr/lib/python3/dist-packages/cryptography/x509/general_name.py_lazy_import_idna!   s    r   c                       s   e Zd Z fddZ  ZS )UnsupportedGeneralNameTypec                    s   t t| | || _d S N)superr   __init__type)selfmsgr   	__class__r   r   r   0   s    z#UnsupportedGeneralNameType.__init__)__name__
__module____qualname__r   __classcell__r   r   r   r   r   /   s   r   c                   @   s   e Zd Zejdd ZdS )GeneralNamec                 C   s   dS )z0
        Return the value of the object
        Nr   r   r   r   r   value7   s    zGeneralName.valueN)r    r!   r"   abcabstractpropertyr&   r   r   r   r   r$   5   s   r$   c                   @   sR   e Zd Zdd ZedZedd Zdd Z	dd	 Z
d
d Zdd Zdd ZdS )
RFC822Namec                 C   s|   t |tjrNz|d W qV tk
rJ   | |}tjdtj	dd Y qVX nt
dt|\}}|sj|srtd|| _d S )NasciizRFC822Name values should be passed as an A-label string. This means unicode characters should be encoded via idna. Support for passing unicode strings (aka U-label) will be removed in a future version.r   
stacklevelvalue must be stringzInvalid rfc822name value)
isinstancesix	text_typeencodeUnicodeEncodeError_idna_encodewarningswarnr   PersistentlyDeprecated2017	TypeErrorr   
ValueError_value)r   r&   nameaddressr   r   r   r   @   s    
	zRFC822Name.__init__r9   c                 C   s   |  | }||_|S r   __new__r9   clsr&   instancer   r   r   _init_without_validation[   s    
z#RFC822Name._init_without_validationc                 C   s<   t  }t|\}}|d}|d d ||d d S )N@r   r
   r*   )r   r   splitr1   decode)r   r&   r   _r;   partsr   r   r   r3   a   s    
zRFC822Name._idna_encodec                 C   s   d | jS )Nz<RFC822Name(value={0!r})>formatr&   r%   r   r   r   __repr__g   s    zRFC822Name.__repr__c                 C   s   t |tstS | j|jkS r   )r.   r)   NotImplementedr&   r   otherr   r   r   __eq__j   s    
zRFC822Name.__eq__c                 C   s
   | |k S r   r   rK   r   r   r   __ne__p   s    zRFC822Name.__ne__c                 C   s
   t | jS r   hashr&   r%   r   r   r   __hash__s   s    zRFC822Name.__hash__Nr    r!   r"   r   r   read_only_propertyr&   classmethodrA   r3   rI   rM   rN   rQ   r   r   r   r   r)   >   s   

r)   c                 C   sR   t  }dD ]6}| |r
| t|d  } ||| d   S q
|| dS )N)z*..r*   )r   
startswithlenr1   rD   )r&   r   prefixr   r   r   r3   w   s    
r3   c                   @   sJ   e Zd Zdd ZedZedd Zdd Z	dd	 Z
d
d Zdd ZdS )DNSNamec                 C   s^   t |tjrLz|d W qT tk
rH   t|}tjdtj	dd Y qTX nt
d|| _d S )Nr*   zDNSName values should be passed as an A-label string. This means unicode characters should be encoded via idna. Support for passing unicode strings (aka U-label) will be removed in a future version.r   r+   r-   r.   r/   r0   r1   r2   r3   r4   r5   r   r6   r7   r9   r   r&   r   r   r   r      s    	zDNSName.__init__r9   c                 C   s   |  | }||_|S r   r<   r>   r   r   r   rA      s    
z DNSName._init_without_validationc                 C   s   d | jS )Nz<DNSName(value={0!r})>rG   r%   r   r   r   rI      s    zDNSName.__repr__c                 C   s   t |tstS | j|jkS r   )r.   rY   rJ   r&   rK   r   r   r   rM      s    
zDNSName.__eq__c                 C   s
   | |k S r   r   rK   r   r   r   rN      s    zDNSName.__ne__c                 C   s
   t | jS r   rO   r%   r   r   r   rQ      s    zDNSName.__hash__N)r    r!   r"   r   r   rS   r&   rT   rA   rI   rM   rN   rQ   r   r   r   r   rY      s   

rY   c                   @   sR   e Zd Zdd ZedZedd Zdd Z	dd	 Z
d
d Zdd Zdd ZdS )UniformResourceIdentifierc                 C   s`   t |tjrNz|d W qV tk
rJ   | |}tjdtj	dd Y qVX nt
d|| _d S )Nr*   zURI values should be passed as an A-label string. This means unicode characters should be encoded via idna. Support for passing unicode strings (aka U-label)  will be removed in a future version.r   r+   r-   rZ   r[   r   r   r   r      s    
	z"UniformResourceIdentifier.__init__r9   c                 C   s   |  | }||_|S r   r<   r>   r   r   r   rA      s    
z2UniformResourceIdentifier._init_without_validationc                 C   sn   t  }t|}|jr<||jd|jd d}n||jd}t|j	||j
|j|j|jfS )Nz:{}r*   )r   r   ZurlparseZportr1   ZhostnamerH   rD   Z
urlunparseZschemepathZparamsZqueryZfragment)r   r&   r   ZparsedZnetlocr   r   r   r3      s$    

z&UniformResourceIdentifier._idna_encodec                 C   s   d | jS )Nz(<UniformResourceIdentifier(value={0!r})>rG   r%   r   r   r   rI      s    z"UniformResourceIdentifier.__repr__c                 C   s   t |tstS | j|jkS r   )r.   r\   rJ   r&   rK   r   r   r   rM      s    
z UniformResourceIdentifier.__eq__c                 C   s
   | |k S r   r   rK   r   r   r   rN      s    z UniformResourceIdentifier.__ne__c                 C   s
   t | jS r   rO   r%   r   r   r   rQ      s    z"UniformResourceIdentifier.__hash__NrR   r   r   r   r   r\      s   

r\   c                   @   s>   e Zd Zdd ZedZdd Zdd Zdd	 Z	d
d Z
dS )DirectoryNamec                 C   s   t |tstd|| _d S )Nzvalue must be a Name)r.   r   r7   r9   r[   r   r   r   r      s    
zDirectoryName.__init__r9   c                 C   s   d | jS )Nz<DirectoryName(value={})>rG   r%   r   r   r   rI      s    zDirectoryName.__repr__c                 C   s   t |tstS | j|jkS r   )r.   r^   rJ   r&   rK   r   r   r   rM      s    
zDirectoryName.__eq__c                 C   s
   | |k S r   r   rK   r   r   r   rN     s    zDirectoryName.__ne__c                 C   s
   t | jS r   rO   r%   r   r   r   rQ     s    zDirectoryName.__hash__Nr    r!   r"   r   r   rS   r&   rI   rM   rN   rQ   r   r   r   r   r^      s   
r^   c                   @   s>   e Zd Zdd ZedZdd Zdd Zdd	 Z	d
d Z
dS )RegisteredIDc                 C   s   t |tstd|| _d S )Nz!value must be an ObjectIdentifier)r.   r	   r7   r9   r[   r   r   r   r     s    
zRegisteredID.__init__r9   c                 C   s   d | jS )Nz<RegisteredID(value={})>rG   r%   r   r   r   rI     s    zRegisteredID.__repr__c                 C   s   t |tstS | j|jkS r   )r.   r`   rJ   r&   rK   r   r   r   rM     s    
zRegisteredID.__eq__c                 C   s
   | |k S r   r   rK   r   r   r   rN     s    zRegisteredID.__ne__c                 C   s
   t | jS r   rO   r%   r   r   r   rQ   "  s    zRegisteredID.__hash__Nr_   r   r   r   r   r`     s   
r`   c                   @   s>   e Zd Zdd ZedZdd Zdd Zdd	 Z	d
d Z
dS )	IPAddressc                 C   s,   t |tjtjtjtjfs"td|| _d S )Nzzvalue must be an instance of ipaddress.IPv4Address, ipaddress.IPv6Address, ipaddress.IPv4Network, or ipaddress.IPv6Network)r.   	ipaddressZIPv4AddressZIPv6AddressZIPv4NetworkZIPv6Networkr7   r9   r[   r   r   r   r   (  s    	zIPAddress.__init__r9   c                 C   s   d | jS )Nz<IPAddress(value={})>rG   r%   r   r   r   rI   <  s    zIPAddress.__repr__c                 C   s   t |tstS | j|jkS r   )r.   ra   rJ   r&   rK   r   r   r   rM   ?  s    
zIPAddress.__eq__c                 C   s
   | |k S r   r   rK   r   r   r   rN   E  s    zIPAddress.__ne__c                 C   s
   t | jS r   rO   r%   r   r   r   rQ   H  s    zIPAddress.__hash__Nr_   r   r   r   r   ra   &  s   
ra   c                   @   sH   e Zd Zdd ZedZedZdd Zdd Z	d	d
 Z
dd ZdS )	OtherNamec                 C   s4   t |tstdt |ts$td|| _|| _d S )Nz#type_id must be an ObjectIdentifierzvalue must be a binary string)r.   r	   r7   bytes_type_idr9   )r   type_idr&   r   r   r   r   N  s    

zOtherName.__init__re   r9   c                 C   s   d | j| jS )Nz#<OtherName(type_id={}, value={!r})>)rH   rf   r&   r%   r   r   r   rI   Z  s     zOtherName.__repr__c                 C   s&   t |tstS | j|jko$| j|jkS r   )r.   rc   rJ   rf   r&   rK   r   r   r   rM   ^  s    
zOtherName.__eq__c                 C   s
   | |k S r   r   rK   r   r   r   rN   d  s    zOtherName.__ne__c                 C   s   t | j| jfS r   )rP   rf   r&   r%   r   r   r   rQ   g  s    zOtherName.__hash__N)r    r!   r"   r   r   rS   rf   r&   rI   rM   rN   rQ   r   r   r   r   rc   L  s   	

rc   )#Z
__future__r   r   r   r'   rb   r4   Zemail.utilsr   r/   Z	six.movesr   Zcryptographyr   Zcryptography.x509.namer   Zcryptography.x509.oidr	   Z_GENERAL_NAMESr   	Exceptionr   Zadd_metaclassABCMetaobjectr$   Zregister_interfacer)   r3   rY   r\   r^   r`   ra   rc   r   r   r   r   <module>   sL   
8
,C%