
    !h1                    P   S r SSKJr  SSKrSSKrSSKJrJrJrJ	r	  SSK
r
SSKJrJrJrJrJrJrJr   SSKr\
R*                  " SS9 " S	 S
5      5       r        S'S jr      S(S jrS)S jrS*S jr\
R*                  " SS9 " S S5      5       r\
R*                  " SS9 " S S5      5       r\
R*                  " SS9 " S S5      5       r\
R*                  " SS9 " S S5      5       r\\\\\4   r \	 " S S\5      5       r \
R*                  " SSS9 " S S5      5       r!\
R*                  " SS9 " S S5      5       r"\
R*                  " SSS9 " S S 5      5       r#\
R*                  " SSS9 " S! S"5      5       r$S+S# jr%S,S$ jr&\'RQ                  S%S&5      r)g! \ a    Sr GNlf = f)-z
Common verification code.
    )annotationsN)ProtocolSequenceUnionruntime_checkable   )CertificateErrorDNSMismatchIPAddressMismatchMismatchSRVMismatchURIMismatchVerificationErrorT)slotsc                  r    \ rS rSr% Sr\R                  " 5       rS\S'   \R                  " 5       r	S\S'   Sr
g)	ServiceMatch   z4
A match of a service id and a certificate pattern.
	ServiceID
service_idCertificatePatterncert_pattern N)__name__
__module____qualname____firstlineno____doc__attribr   __annotations__r   __static_attributes__r       ^/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/service_identity/hazmat.pyr   r      s*     !GGIJ	%'+wwyL$0r"   r   c                   U (       d  Sn[        U5      e/ n[        X5      [        X5      -   nU Vs/ s H  ofR                  PM     nnU H(  nX;  d  M
  UR                  UR	                  US95        M*     U HD  nX;  d  M
  [        XR                  5      (       d  M&  UR                  UR	                  US95        MF     U(       a	  [        US9eU$ s  snf )z
Verify whether *cert_patterns* are valid for *obligatory_ids* and
*optional_ids*.

*obligatory_ids* must be both present and match.  *optional_ids* must match
if a pattern of the respective type is present.
z3Certificate does not contain any `subjectAltName`s.)mismatched_id)errors)r	   _find_matchesr   appenderror_on_mismatch_contains_instance_ofpattern_classr   )	cert_patternsobligatory_idsoptional_idsmsgr&   matchesmatchmatched_idsis	            r#   verify_service_identityr4   )   s     Cs##FM:]> G 299##K9MM##!#4  
 $9??%
 %
 MM##!#4  v..N- :s   Cc           	         / nU H<  nU  H3  nUR                  U5      (       d  M  UR                  [        XCS95        M5     M>     U$ )zt
Search for matching certificate patterns and service_ids.

Args:
    service_ids: List of service IDs like DNS_ID.
)r   r   )verifyr(   r   )r,   service_idsr0   sidcids        r#   r'   r'   W   sE     G Czz# cB !  Nr"   c                .   ^ [        U4S jU  5       5      $ )Nc              3  <   >#    U  H  n[        UT5      v   M     g 7fN)
isinstance).0ecls     r#   	<genexpr>(_contains_instance_of.<locals>.<genexpr>m   s     .#Qz!R  #s   )any)seqr@   s    `r#   r*   r*   l   s    .#...r"   c                   [        U [        5      (       a   U R                  S5      n  [	        U 5        g! [         a     gf = f! [
         a     Of = f [        R                  " U R                  SS5      5        g! [
         a     gf = f)z
Check whether *pattern* could be/match an IP address.

Args:
    pattern: A pattern for a host name.

Returns:
    `True` if *pattern* could be an IP address, else `False`.
asciiFT*1)	r=   bytesdecodeUnicodeErrorint
ValueError	ipaddress
ip_addressreplacepatterns    r#   _is_ip_addressrS   p   s     '5!!	nnW-GG   		
  
W__S#67   s2   5 A 
AA
AA&A= =
B
	B
c                  ~    \ rS rSr% Sr\R                  " 5       rS\S'   \	R                  " S5      r\S	S j5       rSrg)

DNSPattern   z/
A DNS pattern as extracted from certificates.
rI   rR      ^[a-z0-9\-_.]+$c                   [        U[        5      (       d  Sn[        U5      eUR                  5       nUS:X  d  [	        U5      (       d  SU;   a  SU< S3n[        U5      eUR                  [        5      nSU;   a  [        U5        U " US9$ )Nz'The DNS pattern must be a bytes string.r"       zInvalid DNS pattern .   *rQ   )	r=   rI   	TypeErrorstriprS   r	   	translate_TRANS_TO_LOWER_validate_pattern)clsrR   r/   s      r#   
from_bytesDNSPattern.from_bytes   s    '5));CC. --/c>^G448H(15C"3''##O47?g&7##r"   r   N)rR   rI   returnrU   )r   r   r   r   r   r   r   rR   r    recompile_RE_LEGAL_CHARSclassmethodrb   r!   r   r"   r#   rU   rU      s:    
 WWYGUjj!45O$ $r"   rU   c                  Z    \ rS rSr% Sr\R                  " 5       rS\S'   \	SS j5       r
Srg)	IPAddressPattern   z7
An IP address pattern as extracted from certificates.
-ipaddress.IPv4Address | ipaddress.IPv6AddressrR   c                z     U " [         R                  " U5      S9$ ! [         a    SU< S3n[        U5      S ef = f)NrQ   zInvalid IP address pattern rZ   )rN   rO   rM   r	   )ra   bsr/   s      r#   rb   IPAddressPattern.from_bytes   sG    	2y33B788 	2/vQ7C"3'T1	2s    :r   N)rn   rI   rd   rj   )r   r   r   r   r   r   r   rR   r    rh   rb   r!   r   r"   r#   rj   rj      s-    
 >BWWYG:F2 2r"   rj   c                      \ rS rSr% Sr\R                  " 5       rS\S'   \R                  " 5       r	S\S'   \
S
S j5       rSrg	)
URIPattern   z0
An URI pattern as extracted from certificates.
rI   protocol_patternrU   dns_patternc                B   [        U[        5      (       d  Sn[        U5      eUR                  5       R	                  [
        5      nSU;  d  SU;   d  [        U5      (       a  SU< S3n[        U5      eUR                  S5      u  p4U " U[        R                  U5      S9$ )Nz'The URI pattern must be a bytes string.   :r[   zInvalid URI pattern rZ   )rs   rt   r=   rI   r\   r]   r^   r_   rS   r	   splitrU   rb   )ra   rR   r/   rs   hostnames        r#   rb   URIPattern.from_bytes   s    '5));CC. --/++O<w$'/^G5L5L(15C"3''%,]]4%8"-"--h7
 	
r"   r   N)rR   rI   rd   rq   )r   r   r   r   r   r   r   rs   r    rt   rh   rb   r!   r   r"   r#   rq   rq      s<    
 #ggie'"ggiK'
 
r"   rq   c                      \ rS rSr% Sr\R                  " 5       rS\S'   \R                  " 5       r	S\S'   \
S
S j5       rSrg	)
SRVPattern   z0
An SRV pattern as extracted from certificates.
rI   name_patternrU   rt   c                \   [        U[        5      (       d  Sn[        U5      eUR                  5       R	                  [
        5      nUS   S:w  d  SU;  d  SU;   d  [        U5      (       a  SU< S3n[        U5      eUR                  SS5      u  p4U " USS  [        R                  U5      S	9$ )
Nz'The SRV pattern must be a bytes string.r   _      .r[   zInvalid SRV pattern rZ   r   )r~   rt   rw   )ra   rR   r/   namery   s        r#   rb   SRVPattern.from_bytes   s    '5));CC. --/++O< AJ'!7"wg&&(15C"3'' tQ/abz/D/DX/N
 	
r"   r   N)rR   rI   rd   r|   )r   r   r   r   r   r   r   r~   r    rt   rh   rb   r!   r   r"   r#   r|   r|      s;    
 '')L%#"ggiK'
 
r"   r|   c                  F    \ rS rSr\SS j5       r\SS j5       rS	S jrSrg)
r   i	  c                    g r<   r   selfs    r#   r+   ServiceID.pattern_class  s    9<r"   c                    g r<   r   r   s    r#   r)   ServiceID.error_on_mismatch  s    36r"   c                    g r<   r   r   rR   s     r#   r6   ServiceID.verify  s    3r"   r   N)rd   ztype[CertificatePattern])rd   ztype[Mismatch]rR   r   rd   bool)	r   r   r   r   propertyr+   r)   r6   r!   r   r"   r#   r   r   	  s!    < <6 6>r"   r   F)initr   c                      \ rS rSr% Sr\R                  " 5       rS\S'   \	R                  " S5      r\r\rS
S jrSS jrSrg	)DNS_IDi  z!
A DNS service ID, aka hostname.
rI   ry   rW   c                   [        U[        5      (       d  Sn[        U5      eUR                  5       nU(       a  [	        U5      (       a  Sn[        U5      e[        S U 5       5      (       a/  [        (       a  [        R                  " U5      nOSn[        U5      eUR                  S5      nUR                  [        5      U l        U R                  R                  U R                  5      c  Sn[        U5      eg )NzDNS-ID must be a text string.zInvalid DNS-ID.c              3  >   #    U  H  n[        U5      S :  v   M     g7f)   N)ord)r>   cs     r#   rA   "DNS_ID.__init__.<locals>.<genexpr>+  s     .Xs1v|Xs   z+idna library is required for non-ASCII IDs.rF   )r=   strr\   r]   rS   rM   rC   idnaencodeImportErrorr^   r_   ry   rg   r1   )r   ry   r/   ascii_ids       r#   __init__DNS_ID.__init__!  s    (C((1CC. >>#>(33#CS/!.X...t;;x0C!#&&w/H **?;%%dmm4<#CS/! =r"   c                x    [        XR                  5      (       a   [        UR                  U R                  5      $ g)z3
https://tools.ietf.org/search/rfc6125#section-6.4
F)r=   r+   _hostname_matchesrR   ry   r   s     r#   r6   DNS_ID.verify9  s-     g1122$W__dmmDDr"   )ry   N)ry   r   r   )r   r   r   r   r   r   r   ry   r    re   rf   rg   rU   r+   r
   r)   r   r6   r!   r   r"   r#   r   r     s?     ggiHe jj!45OM#"0r"   r   c                  j    \ rS rSr% Sr\R                  " \R                  S9r	S\
S'   \r\rS	S jrSrg)
IPAddress_IDiC  z
An IP address service ID.
)	converterrl   ipc                j    [        XR                  5      (       a  U R                  UR                  :H  $ g)z3
https://tools.ietf.org/search/rfc2818#section-3.1
F)r=   r+   r   rR   r   s     r#   r6   IPAddress_ID.verifyP  s+     g112277goo--r"   r   Nr   )r   r   r   r   r   r   r   rN   rO   r   r    rj   r+   r   r)   r6   r!   r   r"   r#   r   r   C  s:     9=&&9B5  %M)r"   r   c                      \ rS rSr% Sr\R                  " 5       rS\S'   \R                  " 5       r	S\S'   \
r\rSS jrSS jrS	rg
)URI_IDiZ  z
An URI service ID.
rI   protocolr   dns_idc                d   [        U[        5      (       d  Sn[        U5      eUR                  5       nSU;  d  [	        U5      (       a  Sn[        U5      eUR                  S5      u  p4UR                  S5      R                  [        5      U l
        [        UR                  S5      5      U l        g )NzURI-ID must be a text string.:zInvalid URI-ID.rF   /)r=   r   r\   r]   rS   rM   rx   r   r^   r_   r   r   r   )r   urir/   protry   s        r#   r   URI_ID.__init__f  s    #s##1CC. iikc>^C00#CS/!3G,66GX^^C01r"   c                    [        XR                  5      (       aE  UR                  U R                  :H  =(       a%    U R                  R                  UR                  5      $ g)z5
https://tools.ietf.org/search/rfc6125#section-6.5.2
F)r=   r+   rs   r   r   r6   rt   r   s     r#   r6   URI_ID.verifyu  sN     g1122((DMM9 <KK&&w':':;
 r"   )r   r   N)r   r   r   )r   r   r   r   r   r   r   r   r    r   rq   r+   r   r)   r   r6   r!   r   r"   r#   r   r   Z  s>     ggiHeWWYFFM#2
r"   r   c                      \ rS rSr% Sr\R                  " 5       rS\S'   \R                  " 5       r	S\S'   \
r\rSS jrSS jrS	rg
)SRV_IDi  z
An SRV service ID.
rI   r   r   r   c                `   [        U[        5      (       d  Sn[        U5      eUR                  5       nSU;  d  [	        U5      (       d	  US   S:w  a  Sn[        U5      eUR                  SS5      u  p4USS  R                  S5      R                  [        5      U l
        [        U5      U l        g )NzSRV-ID must be a text string.rZ   r   _zInvalid SRV-ID.r   rF   )r=   r   r\   r]   rS   rM   rx   r   r^   r_   r   r   r   )r   srvr/   r   ry   s        r#   r   SRV_ID.__init__  s    #s##1CC. iikc>^C00CFcM#CS/!3*HOOG,66G	X&r"   c                    [        XR                  5      (       aE  U R                  UR                  :H  =(       a%    U R                  R                  UR                  5      $ g)z5
https://tools.ietf.org/search/rfc6125#section-6.5.1
F)r=   r+   r   r~   r   r6   rt   r   s     r#   r6   SRV_ID.verify  sP     g112299 4 44 9K9K##:  r"   )r   r   N)r   r   r   )r   r   r   r   r   r   r   r   r    r   r|   r+   r   r)   r   r6   r!   r   r"   r#   r   r     s>     '')D%WWYFFM#'	r"   r   c                    SU ;   aL  U R                  SS5      u  p#UR                  SS5      u  pEX5:w  a  gUR                  S5      (       a  gUSU4;   $ X:H  $ )zL
:return: `True` if *cert_pattern* matches *actual_hostname*, else `False`.
r[   r   r   Fs   xn--)rx   
startswith)r   actual_hostname	cert_head	cert_tailactual_headactual_tails         r#   r   r     sl     |+11$:	#2#8#8q#A #!!'**T;///**r"   c                B   U R                  S5      nUS:  a  SU < S3n[        U5      eU R                  S5      n[        U5      S:  a  SU < S3n[        U5      eSUS   ;  a  SU < S	3n[        U5      e[	        S
 U 5       5      (       a  SU < S3n[        U5      eg)z\
Check whether the usage of wildcards within *cert_pattern* conforms with
our expectations.
r[   r   zCertificate's DNS-ID z contains too many wildcards.r      z0 has too few host components for wildcard usage.r   z+ has a wildcard outside the left-most part.c              3  B   #    U  H  n[        U5      (       + v   M     g 7fr<   )len)r>   ps     r#   rA   $_validate_pattern.<locals>.<genexpr>  s     
%u!s1v::us   z contains empty parts.N)countr	   rx   r   rC   )r   cntr/   partss       r#   r`   r`     s    
 

T
"C
Qw%l%55RSs##t$E
5zA~%l%55efs##58%l%55`as##

%u
%%%%l%55KLs## &r"   s   ABCDEFGHIJKLMNOPQRSTUVWXYZs   abcdefghijklmnopqrstuvwxyz)r,   Sequence[CertificatePattern]r-   Sequence[ServiceID]r.   r   rd   list[ServiceMatch])r,   r   r7   r   rd   r   )rD   zSequence[object]r@   typerd   r   )rR   zstr | bytesrd   r   )r   rI   r   rI   rd   r   )r   rI   rd   None)*r   
__future__r   rN   re   typingr   r   r   r   r   
exceptionsr	   r
   r   r   r   r   r   r   r   sr   r4   r'   r*   rS   rU   rj   rq   r|   r   r   r   r   r   r   r   r`   rI   	maketransr_   r   r"   r#   <module>r      s5   #  	 ? ?   
 d1 1 1+/+'+ &+ 	+\/$ */> d$ $ $: d2 2 2" d
 
 
< d
 
 
B 
J(88  ? ? ? U$+ +  +\ d  , U$$ $  $N U$# #  #L+$$. //!#@o  Ds   F F%$F%