B ㊇c~ã@stdZddlZddlZy ddlZWnek r8dZYnXdZGdd„deƒZddd„Zd d „Z d d „Z d d„Z dS)zJThe match_hostname() function from Python 3.3.3, essential when using SSL.éNz3.5.0.1c@s eZdZdS)ÚCertificateErrorN)Ú__name__Ú __module__Ú __qualname__©rrúz/private/var/folders/8c/hx9_v10d5x38qmnzt13b7b8j1k3n5b/T/pip-target-x6xd5gna/lib/python/urllib3/util/ssl_match_hostname.pyrsréc Csög}|s dS| d¡}|d}|dd…}| d¡}||krLtdt|ƒƒ‚|s`| ¡| ¡kS|dkrt| d¡n>| d ¡sˆ| d ¡rš| t |¡¡n| t |¡  d d ¡¡x|D]}| t |¡¡q¸Wt  d d   |¡dtj ¡} |   |¡S)zhMatching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 FÚ.rrNÚ*z,too many wildcards in certificate DNS name: z[^.]+zxn--z\*z[^.]*z\Az\.z\Z)ÚsplitÚcountrÚreprÚlowerÚappendÚ startswithÚreÚescapeÚreplaceÚcompileÚjoinÚ IGNORECASEÚmatch) ÚdnÚhostnameÚ max_wildcardsÚpatsÚpartsÚleftmostÚ remainderÚ wildcardsÚfragÚpatrrrÚ_dnsname_matchs*     r"cCs&t|tƒr"tjdkr"t|ddd}|S)N)éÚasciiÚstrict)ÚencodingÚerrors)Ú isinstanceÚstrÚsysÚ version_infoÚunicode)ÚobjrrrÚ _to_unicodeOsr.cCst t|ƒ ¡¡}||kS)zˆExact matching of IP addresses. RFC 6125 explicitly doesn't define an algorithm for this (section 1.7.2 - "Out of Scope"). )Ú ipaddressÚ ip_addressr.Úrstrip)ÚipnameÚhost_ipÚiprrrÚ_ipaddress_matchVsr5c Cs~|s tdƒ‚yt t|ƒ¡}Wn>ttfk r:d}Yn$tk r\tdkrVd}n‚YnXg}| dd¡}xb|D]Z\}}|dkr¦|dkršt||ƒršdS| |¡qt|dkrt|dk rÄt ||ƒrÄdS| |¡qtW|s"xH| dd¡D]8}x2|D]*\}}|dkrðt||ƒrdS| |¡qðWqæWt |ƒd krNt d |d   t t|ƒ¡fƒ‚n,t |ƒd krrt d ||d fƒ‚nt dƒ‚dS)a)Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. ztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDNÚsubjectAltNamerÚDNSz IP AddressÚsubjectÚ commonNamerz&hostname %r doesn't match either of %sz, zhostname %r doesn't match %rrz=no appropriate commonName or subjectAltName fields were found)Ú ValueErrorr/r0r.Ú UnicodeErrorÚAttributeErrorÚgetr"rr5ÚlenrrÚmapr )Úcertrr3ÚdnsnamesÚsanÚkeyÚvalueÚsubrrrÚmatch_hostnamebsJ   rF)r) Ú__doc__rr*r/Ú ImportErrorÚ __version__r:rr"r.r5rFrrrrÚs   6