
    Wwgn3                        d dl Z 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  ej&                  e      Z G d de      Zd	ed
edefdZd ZdededefdZdedefdZdedefdZdej>                  dej>                  fdZ  G d de jB                        Z"e"jF                  e e"jH                  ee"jJ                  ee"jL                  eiZ' G d de(      Z)dejT                  fdZ+dejX                  fdZ- G d d      Z. ed       G d  d!             Z/e	e"ee/   f   Z0d"e
ej>                     de0fd#Z1d$e
e/   de0fd%Z2d&ejf                  de0fd'Z4 G d( d)      Z5 G d* d+      Z6 G d, d-      Z7de0fd.Z8de0fd/Z9y)0    N)	dataclass)IPv4AddressIPv6Address)CallableDictIterableListOptionalSetUnion)x509)urisplitc                       e Zd Zy)NameConstraintErrorN)__name__
__module____qualname__     W/var/www/horilla/myenv/lib/python3.12/site-packages/pyhanko_certvalidator/name_trees.pyr   r      s    r   r   	base_host
other_hostreturnc                 x    | d   dk(  r.|j                  |       \  }}}t        |      xr t        |       S || k(  S )Nr   .)
rpartitionbool)r   r   pre_posts        r   host_tree_containsr!      sF     |s!,,Y7QCy+d^+Y&&r   c                     t        |       j                         }|rt        |t        t        f      r3|d| dnd}d|  d| d}t
        j                  |       t        |      |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   gethost
isinstancer   r   loggerwarningr   )cand_uri	cand_hosthost_errmsgs       r   _host_regnamer+      s    "**,I
9{K.HI $ 	{!$- 	:Rz, 	 	s!#&&r   baseotherc                 0    t        |      }t        | |      S N)r+   r!   )r,   r-   r   s      r   uri_tree_containsr0   ,   s    #E*JdJ//r   c           	         | j                  d      }|j                  d      }t        |      t        |      k  ryt        |      t        |      k\  xr. t        d t        t	        |      t	        |            D              S )Nr   Fc              3   ,   K   | ]  \  }}||k(    y wr/   r   .0xys      r   	<genexpr>z$dns_tree_contains.<locals>.<genexpr>9   s      91aQ9   )splitlenallzipreversed)r,   r-   base_labelsother_labelss       r   dns_tree_containsr@   2   su     **S/K;;s#L
<3{++|K 00 S 9x5x7LM9 6 r   c                 |    | j                  d      \  }}}|j                  d      \  }}}|r| |k(  S t        ||      S )N@)r   r!   )r,   r-   base_mailboxr   base_host_or_domainother_mailboxother_host_or_domains          r   email_tree_containsrG   >   sN     ,0??3+?(L!(-2-=-=c-B*M1*u}!"57KLLr   c                     | j                   }|j                   }t        |      t        |      k\  xr t        d t        ||      D              S )Nc              3   ,   K   | ]  \  }}||k(    y wr/   r   r3   s      r   r7   z(dirname_tree_contains.<locals>.<genexpr>O   s      E1aQEr8   )chosenr:   r;   r<   )r,   r-   base_rdn_sequenceother_rdn_sequences       r   dirname_tree_containsrM   K   sT    !"c*;&<<  E02DEE B r   c                      e Zd Z ej                         Z ej                         Z ej                         Z ej                         Z ej                         Z	 ej                         Z
 ej                         Z ej                         Z ej                         Zedeeeeej(                  f   eeej(                  f   gef      fd       Zedd       Zy)GeneralNameTyper   c                 .    t         j                  | d       S r/   )_name_type_checkersgetselfs    r   check_membershipz GeneralNameType.check_membershipb   s     #&&tT22r   c                 6    t        | |j                               S r/   )getattrupper)clschoices     r   from_choicezGeneralNameType.from_choicej   s    sFLLN++r   N)r   rO   )r   r   r   enumauto
OTHER_NAMERFC822_NAMEDNS_NAMEX400_ADDRESSDIRECTORY_NAMEEDI_PARTY_NAMEUNIFORM_RESOURCE_IDENTIFIER
IP_ADDRESSREGISTERED_IDpropertyr
   r   r   strr   Namer   rU   classmethodr[   r   r   r   rO   rO   W   s    J$))+Ktyy{H499;LTYY[NTYY[N"+$))+JDIIKM3	%TYY'sDII~)>?EF
3 3 , ,r   rO   c                   $     e Zd Zdef fdZ xZS )UnsupportedNameTypeError	name_typec                 T    t         |   |j                  j                                y r/   )super__init__namelower)rT   rm   	__class__s     r   rp   z!UnsupportedNameTypeError.__init__x   s    --/0r   )r   r   r   rO   rp   __classcell__)rs   s   @r   rl   rl   w   s    1/ 1 1r   rl   gnamec                     t         j                  | j                        }| j                  }|t         j                  k7  r|j
                  }||fS r/   )rO   r[   rq   rJ   rb   native)ru   
gname_typevalues      r   _interpret_general_namerz   |   sC     ,,UZZ8JLLE _333ur   certc              #   x  K   t        | j                  j                        rt        j                  | j                  f | j
                  }|W| j                  j                  D ]=  }|D ]6  }|d   j                  dk(  st        j                  |d   j                  f 8 ? y |D ]  }t        |        y w)Ntypeemail_addressry   )	r:   subjectrJ   rO   rb   subject_alt_name_valuerw   r_   rz   )r{   subject_alt_namesrdn	name_pairrq   s        r   _enumerate_names_in_certr      s     
4<<,,dll::+/+F+F 
 <<&& 	QC  Q	V$++>)55y7I7P7PPPQ	Q
 & 	0D)$//	0s   A<B:?;B:c                   R    e Zd Zdeeej                  f   fdZed        Z	d Z
d Zy)_StringOrNamery   c                     || _         y r/   )ry   )rT   ry   s     r   rp   z_StringOrName.__init__   s	    
r   c                 z    | j                   }t        |t        j                        rd|j	                         fS d|fS )Nr      )ry   r$   r   ri   dump)rT   vals     r   _codez_StringOrName._code   s2    jjc499%chhj= c6Mr   c                 ,    t        | j                        S r/   )hashr   rS   s    r   __hash__z_StringOrName.__hash__   s    DJJr   c                 X    t        |t              xr | j                  |j                  k(  S r/   )r$   r   r   )rT   r-   s     r   __eq__z_StringOrName.__eq__   s!    %/MDJJ%++4MMr   N)r   r   r   r   rh   r   ri   rp   rg   r   r   r   r   r   r   r   r      s:    eCN3    Nr   r   T)frozenc                       e Zd ZU eed<   ee   ed<   dZeed<   dZ	ee   ed<   de
eej                  f   defd	Zeded
e
eej                  f   fd       Zedd       Zededd fd       Zy)NameSubtreerm   	tree_baser   minNmaxitemr   c                    | j                   y| j                  dk7  s| j                  t        d      | j                  j
                  }|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.z%No containment checker available for )r   r   r   NotImplementedErrorrm   rU   ry   )rT   r   checkers      r   __contains__zNameSubtree.__contains__   s    >>! 88q=DHH0%P  ..11?%77GH  t~~++T22r   rq   c                 .    t        |t        |            S )Nrm   r   )r   r   )rY   rm   rq   s      r   	from_namezNameSubtree.from_name   s    Y-:MNNr   c                     |d   }t        |      \  }}t        |t        |      |d   j                  |d   j                        S )Nr,   minimummaximum)r   r   )rz   r   r   rw   )rY   subtreeru   rm   name_objs        r   from_general_subtreez NameSubtree.from_general_subtree   sN    5e<	8(#	"))	"))	
 	
r   c                     t        |d      S )z
        Tree that contains all names of a given type.

        :param name_type:
            The name type to use.
        :return:
        Nr   )r   )rY   rm   s     r   universal_treezNameSubtree.universal_tree   s     Y$??r   )r   r   )r   r   r   rO   __annotations__r
   r   r   intr   r   rh   r   ri   r   r   rj   r   r   r   r   r   r   r   r      s    &&CLC#3sDII~!6 34 3" O/ OsDII~9N O O 
 
 @ @= @ @r   r   namesc                     dt         j                  fd}t        j                  | D ch c]
  } ||       c}iS c c}w )Nrq   c                 L    t         j                  t        j                  |       S )N)rm   rq   )r   r   rO   rb   )rq   s    r   _subtreez(x509_names_to_subtrees.<locals>._subtree   s%    $$%444 % 
 	
r   )r   ri   rO   rb   )r   r   ns      r   x509_names_to_subtreesr      s7    
tyy 

 **%,HQXa[,HII,Hs   ;treesc                     i }| D ]!  }	 ||j                      j                  |       # |S # t        $ r |h||j                   <   Y Aw xY wr/   )rm   addKeyError)r   resulttrees      r   _group_subtreesr      s\     F ,	,4>>"&&t,,
 M  	,&*VF4>>"	,s   +AAsubtreesc                 &    t        d | D              S )Nc              3   F   K   | ]  }t         j                  |        y wr/   )r   r   )r4   r   s     r   r7   z+process_general_subtrees.<locals>.<genexpr>   s       6=((1s   !)r   )r   s    r   process_general_subtreesr      s     AI  r   c                   ^    e Zd Z	 	 ddee   deeej                  df   fdZ	d Z
ed        Zy)NameConstraintValidationResultNfailing_name_typefailing_namec                      || _         || _        y r/   r   r   )rT   r   r   s      r   rp   z'NameConstraintValidationResult.__init__  s    
 =N9Er   c                     | j                   d u S r/   )r   rS   s    r   __bool__z'NameConstraintValidationResult.__bool__  s    %%--r   c                     | j                   J | j                  }t        |t        j                        r|j
                  }| j                   j                  j                         }d| d| dS )Nz
The name 'z
' of type z is not allowed.)r   r   r$   r   ri   human_friendlyrq   rr   )rT   name_strrm   s      r   error_messagez,NameConstraintValidationResult.error_message  sh    %%111$$h		*..H**//557	H:Z	{:JKKr   )NN)r   r   r   r
   rO   r   rh   r   ri   rp   r   rg   r   r   r   r   r   r     sT     8<48F#O4F CD01F. L Lr   r   c                   X    e Zd ZdefdZdefdZdedefdZde	j                  defd	Zy
)PermittedSubtreesinitial_permitted_subtreesc           
      x    t         D ci c]  }|t        |j                  |d            g! }}|| _        y c c}w )Nr   )rO   setrR   _trees)rT   r   rm   r   s       r   rp   zPermittedSubtrees.__init__  sN     -@
 6::9bIJKK@
 @
 	@
s   $7r   c                 p    |j                         D ]#  \  }}| j                  |   j                  |       % y r/   )itemsr   append)rT   r   rm   new_permitteds       r   intersect_withz PermittedSubtrees.intersect_with-  s3    (- 	9$I}KK	"))-8	9r   rm   r   c                 x    	 t        fdt        | j                  |         D              S # t        $ r Y yw xY w)Nc              3   F   K   | ]  }t        fd |D                yw)c              3   &   K   | ]  }|v  
 y wr/   r   r4   r   rq   s     r   r7   z:PermittedSubtrees.accept_name.<locals>.<genexpr>.<genexpr>9  s     ATDDLA   N)any)r4   trees_in_generationrq   s     r   r7   z0PermittedSubtrees.accept_name.<locals>.<genexpr>8  s%      ' A-@AAs   !F)r;   r=   r   r   rT   rm   rq   s     `r   accept_namezPermittedSubtrees.accept_name2  sD    
	 +3DKK	4J+K   # 		s   )- 	99r{   c                      	 t         fdt        |      D              \  }}t        ||      S # t        $ r t               cY S w xY w)Nc              3   P   K   | ]  \  }}j                  ||      s||f  y wr/   )r   r4   rm   rq   rT   s      r   r7   z0PermittedSubtrees.accept_cert.<locals>.<genexpr>C  s2      3#It''	48 D!3   #&r   nextr   r   StopIterationrT   r{   r   r   s   `   r   accept_certzPermittedSubtrees.accept_cert?  X    
	4.2 3'?'E3 /+|
 2"3,   	4133	4   ,0 AAN)r   r   r   PKIXSubtreesrp   r   rO   r   r   r   Certificater   r   r   r   r   r   r     sH    < &9L 9
_ t 4$$4	'4r   r   c                   X    e Zd ZdefdZdefdZdedefdZde	j                  defd	Zy
)ExcludedSubtreesinitial_excluded_subtreesc                 t    |j                         D ci c]  \  }}|t        |       c}}| _        y c c}}w r/   )r   r   r   )rT   r   rm   tree_sets       r   rp   zExcludedSubtrees.__init__P  s:     (A'F'F'H%
#	8 s8}$%
 %
s   4r   c                 p    |j                         D ]#  \  }}| j                  |   j                  |       % y r/   )r   r   update)rT   r   rm   new_excludeds       r   
union_withzExcludedSubtrees.union_withZ  s3    ',{{} 	8#I|KK	")),7	8r   rm   r   c                 f    	 t        fd| j                  |   D              S # t        $ r Y yw xY w)Nc              3   &   K   | ]  }|v  
 y wr/   r   r   s     r   r7   z/ExcludedSubtrees.reject_name.<locals>.<genexpr>a  s     Gtt|Gr   T)r   r   r   r   s     `r   reject_namezExcludedSubtrees.reject_name_  s4    	GI0FGGG" 		s    $ 	00r{   c                      	 t         fdt        |      D              \  }}t        ||      S # t        $ r t               cY S w xY w)Nc              3   P   K   | ]  \  }}j                  ||      r||f  y wr/   )r   r   s      r   r7   z/ExcludedSubtrees.accept_cert.<locals>.<genexpr>i  s2      3#It##It4 D!3r   r   r   r   s   `   r   r   zExcludedSubtrees.accept_certe  r   r   N)r   r   r   r   rp   r   rO   r   r   r   r   r   r   r   r   r   r   r   O  sH    
, 
8 8
_ t 4$$4	'4r   r   c                  ^    t         D  ci c]  } | t        j                  |       h c} S c c} w r/   )rO   r   r   rm   s    r   default_permitted_subtreesr   u  s7     ) 	K..y9::  s   *c                  F    t         D  ci c]  } | t                c} S c c} w r/   )rO   r   r   s    r   default_excluded_subtreesr   |  s    .=>Isu>>>s   ):r\   loggingdataclassesr   	ipaddressr   r   typingr   r   r   r	   r
   r   r   
asn1cryptor   uritoolsr   	getLoggerr   r%   
ValueErrorr   rh   r   r!   r+   r0   r@   rG   ri   rM   EnumrO   rb   r_   r`   rd   rQ   r   rl   GeneralNamerz   r   r   r   r   r   r   r   GeneralSubtreesr   r   r   r   r   r   r   r   r   <module>r     s     ! . G G G  			8	$	* 	'# '3 '4 '"0C 0 0 0	C 	 	
Mc 
M# 
M		 $)) ,dii ,2 ""$9!4///1B	 12 1
4#3#3 04#3#3 0(N N* $/@ /@ /@f OS%556J(499"5 J, J
8K0 
\ 
t';';  L L.34 34l#4 #4LL ?< ?r   