3
K^(              
   @   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	jejG dd deZejeG dd deZdd ZejeG dd deZejeG dd deZejeG d d! d!eZejeG d"d# d#eZ ejeG d$d% d%eZ!ej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   s.   ydd l } | 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   B/tmp/pip-unpacked-wheel-vvkwn1hz/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| j| || _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j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rNy|jd W qV tk
rJ   | j|}tjdtj	dd Y qVX nt
dt|\}}|sl| rtt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   )
stacklevelz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__r4   c             C   s   | j | }||_|S )N)__new__r4   )clsr#   instancer   r   r   _init_without_validation[   s    
z#RFC822Name._init_without_validationc             C   s<   t  }t|\}}|jd}|d d |j|d jd S )N@r   r
   r'   )r   r   splitr,   decode)r   r#   r   _r6   partsr   r   r   r.   a   s    
zRFC822Name._idna_encodec             C   s   dj | 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 )N)r)   r&   NotImplementedr#   )r   otherr   r   r   __eq__j   s    
zRFC822Name.__eq__c             C   s
   | |k S )Nr   )r   rC   r   r   r   __ne__p   s    zRFC822Name.__ne__c             C   s
   t | jS )N)hashr#   )r   r   r   r   __hash__s   s    zRFC822Name.__hash__N)r   r   r    r   r   read_only_propertyr#   classmethodr:   r.   rA   rD   rE   rG   r   r   r   r   r&   >   s   
r&   c             C   sR   t  }x:dD ]2}| j|r| t|d  } ||j| jd S qW |j| jdS )N*..r'   )rJ   rK   )r   
startswithlenr,   r=   )r#   r   prefixr   r   r   r.   w   s    

r.   c               @   sJ   e Zd Zdd Zej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rLy|j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(   zvalue must be string)r)   r*   r+   r,   r-   r.   r/   r0   r   r1   r2   r4   )r   r#   r   r   r   r      s    zDNSName.__init__r4   c             C   s   | j | }||_|S )N)r7   r4   )r8   r#   r9   r   r   r   r:      s    
z DNSName._init_without_validationc             C   s   dj | jS )Nz<DNSName(value={0!r})>)r@   r#   )r   r   r   r   rA      s    zDNSName.__repr__c             C   s   t |tstS | j|jkS )N)r)   rO   rB   r#   )r   rC   r   r   r   rD      s    
zDNSName.__eq__c             C   s
   | |k S )Nr   )r   rC   r   r   r   rE      s    zDNSName.__ne__c             C   s
   t | jS )N)rF   r#   )r   r   r   r   rG      s    zDNSName.__hash__N)r   r   r    r   r   rH   r#   rI   r:   rA   rD   rE   rG   r   r   r   r   rO      s   
rO   c               @   sR   e Zd Zdd Zej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rNy|jd W qV tk
rJ   | j|}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(   zvalue must be string)r)   r*   r+   r,   r-   r.   r/   r0   r   r1   r2   r4   )r   r#   r   r   r   r      s    
z"UniformResourceIdentifier.__init__r4   c             C   s   | j | }||_|S )N)r7   r4   )r8   r#   r9   r   r   r   r:      s    
z2UniformResourceIdentifier._init_without_validationc             C   sn   t  }tj|}|jr<|j|jdj|jjd jd}n|j|jjd}tj|j	||j
|j|j|jfS )Nz:{}r'   )r   r   urlparseportr,   hostnamer@   r=   
urlunparseschemepathparamsqueryfragment)r   r#   r   parsednetlocr   r   r   r.      s    

z&UniformResourceIdentifier._idna_encodec             C   s   dj | jS )Nz(<UniformResourceIdentifier(value={0!r})>)r@   r#   )r   r   r   r   rA      s    z"UniformResourceIdentifier.__repr__c             C   s   t |tstS | j|jkS )N)r)   rP   rB   r#   )r   rC   r   r   r   rD      s    
z UniformResourceIdentifier.__eq__c             C   s
   | |k S )Nr   )r   rC   r   r   r   rE      s    z UniformResourceIdentifier.__ne__c             C   s
   t | jS )N)rF   r#   )r   r   r   r   rG      s    z"UniformResourceIdentifier.__hash__N)r   r   r    r   r   rH   r#   rI   r:   r.   rA   rD   rE   rG   r   r   r   r   rP      s   
rP   c               @   s>   e Zd Zdd Zej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   r2   r4   )r   r#   r   r   r   r      s    
zDirectoryName.__init__r4   c             C   s   dj | jS )Nz<DirectoryName(value={})>)r@   r#   )r   r   r   r   rA      s    zDirectoryName.__repr__c             C   s   t |tstS | j|jkS )N)r)   r\   rB   r#   )r   rC   r   r   r   rD      s    
zDirectoryName.__eq__c             C   s
   | |k S )Nr   )r   rC   r   r   r   rE     s    zDirectoryName.__ne__c             C   s
   t | jS )N)rF   r#   )r   r   r   r   rG     s    zDirectoryName.__hash__N)r   r   r    r   r   rH   r#   rA   rD   rE   rG   r   r   r   r   r\      s   
r\   c               @   s>   e Zd Zdd Zej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	   r2   r4   )r   r#   r   r   r   r     s    
zRegisteredID.__init__r4   c             C   s   dj | jS )Nz<RegisteredID(value={})>)r@   r#   )r   r   r   r   rA     s    zRegisteredID.__repr__c             C   s   t |tstS | j|jkS )N)r)   r]   rB   r#   )r   rC   r   r   r   rD     s    
zRegisteredID.__eq__c             C   s
   | |k S )Nr   )r   rC   r   r   r   rE     s    zRegisteredID.__ne__c             C   s
   t | jS )N)rF   r#   )r   r   r   r   rG   "  s    zRegisteredID.__hash__N)r   r   r    r   r   rH   r#   rA   rD   rE   rG   r   r   r   r   r]     s   
r]   c               @   s>   e Zd Zdd Zej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)   	ipaddressIPv4AddressIPv6AddressIPv4NetworkIPv6Networkr2   r4   )r   r#   r   r   r   r   (  s    
zIPAddress.__init__r4   c             C   s   dj | jS )Nz<IPAddress(value={})>)r@   r#   )r   r   r   r   rA   <  s    zIPAddress.__repr__c             C   s   t |tstS | j|jkS )N)r)   r^   rB   r#   )r   rC   r   r   r   rD   ?  s    
zIPAddress.__eq__c             C   s
   | |k S )Nr   )r   rC   r   r   r   rE   E  s    zIPAddress.__ne__c             C   s
   t | jS )N)rF   r#   )r   r   r   r   rG   H  s    zIPAddress.__hash__N)r   r   r    r   r   rH   r#   rA   rD   rE   rG   r   r   r   r   r^   &  s   
r^   c               @   sH   e Zd Zdd ZejdZej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	   r2   bytes_type_idr4   )r   type_idr#   r   r   r   r   N  s    

zOtherName.__init__rf   r4   c             C   s   dj | j| jS )Nz#<OtherName(type_id={}, value={!r})>)r@   rg   r#   )r   r   r   r   rA   Z  s    zOtherName.__repr__c             C   s&   t |tstS | j|jko$| j|jkS )N)r)   rd   rB   rg   r#   )r   rC   r   r   r   rD   ^  s    
zOtherName.__eq__c             C   s
   | |k S )Nr   )r   rC   r   r   r   rE   d  s    zOtherName.__ne__c             C   s   t | j| jfS )N)rF   rg   r#   )r   r   r   r   rG   g  s    zOtherName.__hash__N)r   r   r    r   r   rH   rg   r#   rA   rD   rE   rG   r   r   r   r   rd   L  s   	

rd   )#
__future__r   r   r   r$   r_   r/   email.utilsr   r*   Z	six.movesr   Zcryptographyr   Zcryptography.x509.namer   Zcryptography.x509.oidr	   Z_GENERAL_NAMESr   	Exceptionr   add_metaclassABCMetaobjectr"   Zregister_interfacer&   r.   rO   rP   r\   r]   r^   rd   r   r   r   r   <module>   sJ   8
,C%