bgCdZddlmZddlmZddlmZddlmZddlmZgdZddl Z ddl Z d Z d Z d Z gd Zgd ZdddddddddddddddZdZdZdZdZdZGddeZGddeZdS)zcEmail address parsing code. Lifted directly from rfc822.py. This should eventually be rewritten. )unicode_literals)print_function)division)absolute_import)int) mktime_tz parsedate parsedate_tzquoteN z, )janfebmaraprmayjunjulaugsepoctnovdecjanuaryfebruarymarchaprilrjunejulyaugust septemberoctobernovemberdecember)montuewedthufrisatsunipii iiDi)UTUTCGMTZASTADTESTEDTCSTCDTMSTMDTPSTPDTc`t|}|sdS|dd|d<t|S)zQConvert a date string to a time tuple. Accounts for military timezones. N r) _parsedate_tztuple)dataress r/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/future/backports/email/_parseaddr.pyr r 3s<   C  1v~A ::c f|sdS|}|dds!|dtvr|d=n7|dd}|dkr|d|dzd|d<t |dkr;|dd}t |dkr ||ddz}t |dkrm|d}|d}|d kr|d}|dkr|d|||dg|dd<n|d t |d krdS|dd }|\}}}}}|}|tvr!||}}|tvrdSt |dz}|d kr|d z}|d dkr |dd }|d }|dkr||}}|d dkr |dd }|d s||}}|d dkr |dd }|d }t |dkr|\} } d} nt |dkr|\} } } not |dkrZd|dvrP|dd}t |dkr|\} } d} nt |dkr|\} } } ndS t|}t|}t| } t| } t| } n#t$rYdSwxYw|dkr|dkr|dz }n|dz }d} | }|tvrt|} n> t|} n#t$rYnwxYw| dkr|drd} | r"| dkrd } | } nd} | | dzdz| dzdzzz} |||| | | ddd | g S)aConvert date to extended time tuple. The last (additional) element is the time zone offset in seconds, except if the timezone was specified as -0000. In that case the last element is None. This indicates a UTC timestamp that explicitly declaims knowledge of the source timezone, as opposed to a +0000 timestamp that indicates the source timezone really was UTC. Nr,-+r  :0.dDilii<)splitendswithlower _daynamesrfindlenfindappend _monthnamesindexisdigitr ValueErrorupper _timezones startswith)r>istuffsddmmyytmtzthhtmmtsstzoffsettzsigns r@r<r<?s  ::< 2wwHH    D  Q;;2==--;HJ a<<F yHHFx}d2hnb5HHI BS#q!R ::s%$A M00 M>=M>O O#"O#cbt|}t|tr |ddS|S)z&Convert a time string to a time tuple.Nr;)r isinstancer=r>ts r@r r s3TA!U!u rAc|dtj|dddzStj|}||dz S)zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r;N)rI)timemktimecalendartimegmrqs r@rrsE Aw{48e+,,, OD ! !47{rAcV|ddddS)zPrepare string to be used in a quoted string. Turns backslash and double quote characters into quoted pairs. These are the only characters that need to be quoted inside a quoted string. Does not add the surrounding double quotes. \z\\"z\")replace)strs r@r r s( ;;tV $ $ , ,S% 8 88rAcdeZdZdZdZdZdZdZdZdZ dZ dd Z d Z d Z d ZddZdZdS) AddrlistClassaAddress parser class by Ben Escoto. To understand what this class does, it helps to have a copy of RFC 2822 in front of you. Note: this class interface is deprecated and may be removed in the future. Use email.utils.AddressList instead. cd|_d|_d|_d|_|j|jz|_|j|jz|jz|_|jdd|_||_g|_ dS)zInitialize a new instance. `field' is an unparsed address header field, containing one or more addresses. z ()<>@,:;."[]rz z rOr N) specialsposLWSCRFWSatomendsr| phraseendsfield commentlistselfrs r@__init__zAddrlistClass.__init__sw ( 8dg% 047: -//R88 rAcg}|jt|jkr|j|j|jdzvrJ|j|jdvr%||j|j|xjdz c_nD|j|jdkr-|j|nn|jt|jkt|S)z&Skip white space and extract comments.z rD() rrXrrrZr getcomment EMPTYSTRINGjoin)rwslists r@gotonextzAddrlistClass.gotonextshTZ((z$(#tx&'888:dh'v55MM$*TX"6777A DH%,, ''(9(9::::hTZ(('''rAcg}|jt|jkrN|}|r||z }n|d|jt|jkN|S)zVParse all addresses. Returns a list containing all of the addresses. )r r )rrXr getaddressrZ)rresultads r@ getaddrlistzAddrlistClass.getaddrlistsp hTZ((""B ("  h''' hTZ((  rAc g|_||j}|j}|}|g}|jt |jkr,|r(t |j|dfg}n|j|jdvrF||_||_|}t |j|fg}n|j|jdkrg}t |j}|xjdz c_|jt |jkrz||j|kr'|j|jdkr|xjdz c_n4|| z}|jt |jkzn|j|jdkrx| }|jr?t |dzd|jzd z|fg}nrt ||fg}nT|r)t |j|dfg}n)|j|j|j vr|xjdz c_||jt |jkr&|j|jd kr|xjdz c_|S) zParse the next address.rz.@rLrD;$zz%0047"xx(899 :#*E*E HHMHHrAc|j|jdkrdSd}|xjdz c_|d}|jt|jkr|r|d}n|j|jdkr|xjdz c_n|j|jdkr|xjdz c_d}nL|j|jd kr|xjdz c_n%|}|xjdz c_n1||jt|jk|S) zParse a route address (Return-path value). This method just skips all the route stuff and returns the addrspec. rNFrDr >@TrL)rrrrX getdomainr)r expectrouteadlists r@rzAddrlistClass.getrouteaddrEs: :dh 3 & & F  A  hTZ((    # DH%,,A DH%,,A " DH%,,A ))++A  MMOOO!hTZ(($ rAcg}||jt|jkrzd}|j|jdkrX|r.|ds||d|xjdz c_d}n|j|jdkr8|dt|znq|j|j|j vr1|r.|ds|nr|| |}|r|r|||jt|jkz|jt|jks|j|jdkrt |S|d|xjdz c_|t || zS) zParse an RFC 2822 addr-spec.TrOrIrDFr{z"%s"r)rrrXrstrippoprZr getquotergetatomrrr)raslist preserve_wswss r@rzAddrlistClass.getaddrspeces hTZ((Kz$(#s**!&*"2"2"4"4!JJLLL c"""A # DH%,, fuT]]__'='==>>>>DH%66!&*"2"2"4"4!JJLLL dllnn---B "r " b!!!%hTZ((( 8s4: & &$*TX*>#*E*E##F++ + c A  ''$..*:*:::rAcg}|jt|jkrF|j|j|jvr|xjdz c_n|j|jdkr-|j|n|j|jdkr(||n}|j|jdkr&|xjdz c_|dnA|j|j|jvrnE|| |jt|jkFt |S)z-Get the complete domain name from an address.rDr[rO) rrXrrrrZrgetdomainliteralrrrr)rsdlists r@rzAddrlistClass.getdomainsHhTZ((z$(#tx//A DH%,, ''(9(9::::DH%,, d33556666DH%,,A  c""""DH%66 dllnn---hTZ(('''rATc|j|j|krdSdg}d}|xjdz c_|jt|jkr|r(||j|jd}n|j|j|vr|xjdz c_n|r>|j|jdkr(|||j|jdkrd}n%||j|j|xjdz c_|jt|jkt |S)aParse a header fragment delimited by special characters. `beginchar' is the start character for the fragment. If self is not looking at an instance of `beginchar' then getdelimited returns the empty string. `endchars' is a sequence of allowable end-delimiting characters. Parsing stops when one of these is encountered. If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed within the parsed fragment. r FrDrrzT)rrrXrZrrr)r begincharendchars allowcommentsslistr s r@ getdelimitedzAddrlistClass.getdelimitedsI :dh 9 , ,2 A hTZ(( 3 TZ1222DH%11A  34:dh#73#>#> T__..///DH%-- TZ1222 HHMHHhTZ(( &&&rAc0|dddS)z1Get a quote-delimited fragment from self's field.r{z" Frrs r@rzAddrlistClass.getquotes  eU333rAc0|dddS)z7Get a parenthesis-delimited fragment from self's field.rz) Trrs r@rzAddrlistClass.getcomments  eT222rAc6d|dddzS)z!Parse an RFC 2822 domain-literal.z[%s]rz] Frrs r@rzAddrlistClass.getdomainliterals))#ue<<<rs ('''''%%%%%%&&&&&&      III > = = AQA$$$$$     r;r;r;j999bbbbbFbbbH -'-'-'-'-'--'-'-'-'-'rA