U
    cc/                     @   s  d dl Z d dlmZ d dlmZmZ d dlmZmZm	Z	m
Z
mZmZmZ d dlmZ d dlmZ d dlmZ eeedd	d
Zdd ZeeedddZeedddZeedddZejejdddZG dd de jZejeej eej!eej"eiZ#G dd de$Z%ej&dddZ'ej(ddd Z)G d!d" d"Z*ed#d$G d%d& d&Z+eee
e+ f Z,ee+ e,d'd(d)Z-ej.e,d*d+d,Z/G d-d. d.Z0G d/d0 d0Z1G d1d2 d2Z2e,d3d4d5Z3e,d3d6d7Z4dS )8    N)	dataclass)IPv4AddressIPv6Address)UnionCallableOptionalSetDictListIterable)x509)urisplit)PathValidationError)	base_host
other_hostreturnc                 C   s2   | d dkr&| | \}}}|o$| S || kS d S )Nr   .)
rpartition)r   r   pre_post r   Z/var/www/html/project/venv/lib/python3.8/site-packages/pyhanko_certvalidator/name_trees.pyhost_tree_contains   s    
r   c                 C   sP   t |  }|rt|ttfrL|d k	r2d| dnd}td|  d| d|S )Nz	has host r   zis not a well-formed URI.zCURI constraints require URIs with a host specified as a FQDN; URI 'z' )r   Zgethost
isinstancer   r   
ValueError)Zcand_uriZ	cand_hostZhost_errr   r   r   _host_regname   s    r   )baseotherr   c              
   C   sB   zt |}W n* tk
r6 } zt|W 5 d }~X Y nX t| |S N)r   r   r   r   )r   r   r   er   r   r   uri_tree_contains#   s
    r!   )r   r   c                 C   sX   |  d}| d}t|t|k r(dS t|t|koVtdd tt|t|D S )Nr   Fc                 s   s   | ]\}}||kV  qd S r   r   .0xyr   r   r   	<genexpr>3   s    z$dns_tree_contains.<locals>.<genexpr>)splitlenallzipreversed)r   r   Zbase_labelsZother_labelsr   r   r   dns_tree_contains,   s    

r,   c                 C   s:   |  d\}}}| d\}}}|r,| |kS t||S d S )N@)r   r   )r   r   Zbase_mailboxr   Zbase_host_or_domainZother_mailboxZother_host_or_domainr   r   r   email_tree_contains8   s
    r.   c                 C   s4   | j }|j }t|t|ko2tdd t||D S )Nc                 s   s   | ]\}}||kV  qd S r   r   r"   r   r   r   r&   I   s    z(dirname_tree_contains.<locals>.<genexpr>)chosenr(   r)   r*   )r   r   Zbase_rdn_sequenceZother_rdn_sequencer   r   r   dirname_tree_containsE   s
    r0   c                   @   s   e Zd Ze Ze Ze Ze Ze Z	e Z
e Ze Ze Zeeeeeejf eeejf gef  dddZed dddZdS )GeneralNameTyper   c                 C   s   t | d S r   )_name_type_checkersgetselfr   r   r   check_membership[   s    z GeneralNameType.check_membershipc                 C   s   t | | S r   )getattrupper)clschoicer   r   r   from_choiceb   s    zGeneralNameType.from_choiceN)__name__
__module____qualname__enumautoZ
OTHER_NAMERFC822_NAMEDNS_NAMEZX400_ADDRESSDIRECTORY_NAMEZEDI_PARTY_NAMEUNIFORM_RESOURCE_IDENTIFIERZ
IP_ADDRESSZREGISTERED_IDpropertyr   r   r   strr   Nameboolr7   classmethodr<   r   r   r   r   r1   P   s    "r1   c                       s"   e Zd Zed fddZ  ZS )UnsupportedNameTypeError)	name_typec                    s   t  |j  d S r   )super__init__namelower)r6   rL   	__class__r   r   rN   p   s    z!UnsupportedNameTypeError.__init__)r=   r>   r?   r1   rN   __classcell__r   r   rQ   r   rK   o   s   rK   )gnamec                 C   s*   t | j}| j}|t jkr"|j}||fS r   )r1   r<   rO   r/   rD   native)rT   Z
gname_typevaluer   r   r   _interpret_general_namet   s
    
rW   )certc                 c   sz   t | jjrtj| jfV  | j}|d krb| jjD ].}|D ]$}|d jdkr8tj|d jfV  q8q0n|D ]}t|V  qfd S )NtypeZemail_addressrV   )	r(   subjectr/   r1   rD   Zsubject_alt_name_valuerU   rB   rW   )rX   Zsubject_alt_namesZrdnZ	name_pairrO   r   r   r   _enumerate_names_in_cert~   s    r[   c                   @   sF   e Zd Zeeejf dddZedd Z	dd Z
d dd	d
ZdS )_StringOrNamerV   c                 C   s
   || _ d S r   r]   )r6   rV   r   r   r   rN      s    z_StringOrName.__init__c                 C   s*   | j }t|tjrd| fS d|fS d S )Nr      )rV   r   r   rH   dump)r6   valr   r   r   _code   s    z_StringOrName._codec                 C   s
   t | jS r   )hashra   r5   r   r   r   __hash__   s    z_StringOrName.__hash__)r   c                 C   s   | j |j kS r   )ra   )r6   r   r   r   r   __eq__   s    z_StringOrName.__eq__N)r=   r>   r?   r   rG   r   rH   rN   rF   ra   rc   rd   r   r   r   r   r\      s
   
r\   T)frozenc                   @   s~   e Zd ZU eed< ee ed< dZeed< dZ	ee ed< e
eejf eddd	Zed d
ddZeed dddZdS )NameSubtreerL   	tree_baser   minNmax)itemr   c                 C   s<   | j d krdS | jdks"| jd k	r*td| j| j j|S )NTr   zuThe minimum/maximum fields on a name constraint are not meaningful in the PKIX (RFC 5280) profile --- not processing.)rg   rh   ri   NotImplementedErrorrL   r7   rV   )r6   rj   r   r   r   __contains__   s    
zNameSubtree.__contains__r2   c                 C   s4   |d }t |\}}t|t||d j|d jdS )Nr   minimummaximum)rh   ri   )rW   rf   r\   rU   )r:   subtreerT   rL   Zname_objr   r   r   from_general_subtree   s      z NameSubtree.from_general_subtreerL   r   c                 C   s   t |ddS )z
        Tree that contains all names of a given type.
        :param name_type:
            The name type to use.
        :return:
        N)rL   rg   )rf   )r:   rL   r   r   r   universal_tree   s    zNameSubtree.universal_tree)r=   r>   r?   r1   __annotations__r   r\   rh   intri   r   rG   r   rH   rI   rl   rJ   rp   rr   r   r   r   r   rf      s   
rf   )treesr   c              	   C   sH   i }| D ]:}z||j  | W q tk
r@   |h||j < Y qX q|S r   )rL   addKeyError)ru   resulttreer   r   r   _group_subtrees   s    rz   )subtreesr   c                 C   s   t dd | D S )Nc                 s   s   | ]}t |V  qd S r   )rf   rp   )r#   ro   r   r   r   r&      s    z+process_general_subtrees.<locals>.<genexpr>)rz   )r{   r   r   r   process_general_subtrees   s    r|   c                   @   s*   e Zd ZdddZdd Zedd ZdS )	NameConstraintValidationResultNc                 C   s   || _ || _d S r   failing_name_typefailing_name)r6   r   r   r   r   r   rN      s    z'NameConstraintValidationResult.__init__c                 C   s
   | j d kS r   )r   r5   r   r   r   __bool__   s    z'NameConstraintValidationResult.__bool__c                 C   sD   | j d k	st| j}t|tjr&|j}| j j }d| d| dS )Nz
The name 'z
' of type z is not allowed.)	r   AssertionErrorr   r   r   rH   Zhuman_friendlyrO   rP   )r6   Zname_strrL   r   r   r   error_message   s    z,NameConstraintValidationResult.error_message)NN)r=   r>   r?   rN   r   rF   r   r   r   r   r   r}      s   
r}   c                   @   sJ   e Zd ZedddZedddZeeddd	Ze	j
ed
ddZdS )PermittedSubtreesinitial_permitted_subtreesc                    s    fddt D }|| _d S )Nc                    s    i | ]}|t  |d gqS )r   )setr4   r#   rL   r   r   r   
<dictcomp>	  s    z.PermittedSubtrees.__init__.<locals>.<dictcomp>)r1   _trees)r6   r   ru   r   r   r   rN      s    
zPermittedSubtrees.__init__ru   c                 C   s&   |  D ]\}}| j| | qd S r   )itemsr   append)r6   ru   rL   Znew_permittedr   r   r   intersect_with  s    z PermittedSubtrees.intersect_withrq   c                    s    t  fddt| j| D S )Nc                 3   s$   | ]}t  fd d|D V  qdS )c                 3   s   | ]} |kV  qd S r   r   r#   ry   rO   r   r   r&     s     z:PermittedSubtrees.accept_name.<locals>.<genexpr>.<genexpr>N)any)r#   Ztrees_in_generationr   r   r   r&     s   z0PermittedSubtrees.accept_name.<locals>.<genexpr>)r)   r+   r   r6   rL   rO   r   r   r   accept_name  s    zPermittedSubtrees.accept_namerX   r   c                    sL   z,t  fddt|D \}}t||dW S  tk
rF   t  Y S X d S )Nc                 3   s&   | ]\}}  ||s||fV  qd S r   )r   r#   rL   rO   r5   r   r   r&   !  s   z0PermittedSubtrees.accept_cert.<locals>.<genexpr>r~   nextr[   r}   StopIterationr6   rX   r   r   r   r5   r   accept_cert  s    zPermittedSubtrees.accept_certN)r=   r>   r?   PKIXSubtreesrN   r   r1   rI   r   r   Certificater}   r   r   r   r   r   r      s   
r   c                   @   sJ   e Zd ZedddZedddZeeddd	Ze	j
ed
ddZdS )ExcludedSubtrees)initial_excluded_subtreesc                 C   s   dd |  D | _d S )Nc                 S   s   i | ]\}}|t |qS r   r   )r#   rL   Ztree_setr   r   r   r   5  s    z-ExcludedSubtrees.__init__.<locals>.<dictcomp>)r   r   )r6   r   r   r   r   rN   0  s    zExcludedSubtrees.__init__r   c                 C   s&   |  D ]\}}| j| | qd S r   )r   r   update)r6   ru   rL   Znew_excludedr   r   r   
union_with:  s    zExcludedSubtrees.union_withrq   c                    s   t  fdd| j| D S )Nc                 3   s   | ]} |kV  qd S r   r   r   r   r   r   r&   @  s     z/ExcludedSubtrees.reject_name.<locals>.<genexpr>)r   r   r   r   r   r   reject_name?  s    zExcludedSubtrees.reject_namer   c                    sL   z,t  fddt|D \}}t||dW S  tk
rF   t  Y S X d S )Nc                 3   s&   | ]\}}  ||r||fV  qd S r   )r   r   r5   r   r   r&   E  s   z/ExcludedSubtrees.accept_cert.<locals>.<genexpr>r~   r   r   r   r5   r   r   B  s    zExcludedSubtrees.accept_certN)r=   r>   r?   r   rN   r   r1   rI   r   r   r   r}   r   r   r   r   r   r   .  s   
r   r2   c                   C   s   dd t D S )Nc                 S   s   i | ]}|t |hqS r   )rf   rr   r   r   r   r   r   S  s    z.default_permitted_subtrees.<locals>.<dictcomp>r1   r   r   r   r   default_permitted_subtreesR  s    r   c                   C   s   dd t D S )Nc                 S   s   i | ]}|t  qS r   r   r   r   r   r   r   Z  s      z-default_excluded_subtrees.<locals>.<dictcomp>r   r   r   r   r   default_excluded_subtreesY  s    r   )5r@   dataclassesr   	ipaddressr   r   typingr   r   r   r   r	   r
   r   Z
asn1cryptor   Zuritoolsr   Zpyhanko_certvalidator.errorsr   rG   rI   r   r   r!   r,   r.   rH   r0   Enumr1   rD   rB   rC   rE   r3   rk   rK   ZGeneralNamerW   r   r[   r\   rf   r   rz   ZGeneralSubtreesr|   r}   r   r   r   r   r   r   r   r   <module>   sH   $
	    
'3$