\x89\x50\x4E\x47\x0D\x0A\x1A\x0A PNG  \x89\x50\x4E\x47\x0D\x0A\x1A\x0A  13\c@@sddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZmZmZmZmZddlmZmZde jfdYZd e jfd YZd Zd Zd ZdZddZddZ dZ!dZ"de#dZ$dZ%dZ&dZ'de#dZ(ddZ)de#dZ*de#dZ+de#dZ,ej-rdZ.n dZ.dZ/dS( i(tabsolute_importNi(t_(tencodingterrortpycompattsslutiltutil(tprocutilt stringutiltSTARTTLScB@s)eZdZddZdddZRS(sDerived class to verify the peer certificate for STARTTLS. This class allows to pass any keyword arguments to SSL socket creation. cK@s)tjj||||_||_dS(N(tsmtplibtSMTPt__init__t_uit_host(tselftuithosttkwargs((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyR 's cC@s|jds'd}tj|n|jd\}}|dkrtj|j||d|jd|j|_tj |j|_ d|_ d|_ i|_d|_n||fS(Ntstarttlss*STARTTLS extension not supported by serverR iRtserverhostnamei(thas_extnR t SMTPExceptiontdocmdRt wrapsockettsockR Rt SSLFakeFiletfiletNonet helo_respt ehlo_resptesmtp_featurest does_esmtp(Rtkeyfiletcertfiletmsgtresptreply((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyR,s      N(t__name__t __module__t__doc__RR R(((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyR "s tSMTPScB@s)eZdZddddZdZRS(sDerived class to verify the peer certificate for SMTPS. This class allows to pass any keyword arguments to SSL socket creation. cK@sG||_||_tjj||||_tj|_||_dS(N( R!R"R R R Rt SMTP_SSL_PORTt default_portR (RRR!R"RR((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyR As     cC@s|jdkr/|jjd||ffntj||f|}tj||j|jd|jd|j }|j d|_ |S(Nis connect: %r RRtrb( t debuglevelR tdebugtsockettcreate_connectionRRR!R"RtmakefileR(RRtportttimeoutt new_socket((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt _get_socketJs    N(R&R'R(RR R5(((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyR)<s cC@s=y$ddl}t|dttSWntk r8tSXdS(s9Returns true iff Python has TLS support, false otherwise.iNtHAS_TLS(tssltgetattrtFalsetTruet ImportError(R7((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt _pyhastlsUs   c @s|jdd}|jdd}|dkp<tj|}|dk}|sW|ryt rytjtdn|jdd}|stjtdn|r|jtd t|d|d|n3|rt |d|d|nt j d||rd }nd }t j |jdd |}|jtd ||fjd|d ||r|jtdjjjn|s|r|jtdtjjn|jdd}|jdd} |r"| r"|j} n|r| r|jtd|yj|| Wqt jk r} tj| qXnfd} | S(s;build an smtp connection and return a function to send mailtsmtptlocal_hostnamettlsRtsmtpss/can't use TLS: Python SSL support not installedRs+smtp.host not configured - cannot send mails(using smtps) iiR2s$sending mail: smtp host %s, port %d s(using starttls) s(verifying remote certificate) tusernametpasswords&(authenticating to mail server as %s) c@syj|||SWn|tjk rq}g|jjD]}|d^q<}tjddj|n%tjk r}tj|nXdS(Nis ( tsendmailR tSMTPRecipientsRefusedt recipientstvaluesRtAborttjoinR(tsenderRER#tinsttr(ts(s4/usr/lib64/python2.7/site-packages/mercurial/mail.pytsends&(tconfigRt parseboolR<RRGRtnoteR)R R R RtgetporttconnecttehloRRtvalidatesocketRtgetpasstloginR( RR>R?RR@tmailhostt defaultporttmailportRARBRJRM((RLs4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt_smtp^sV         c C@s|jdd}d}d|||djt||f}|jtd|tj|d}|jtj ||j }|rt j dt jj|jd d d tj|fnd S( ssend mail using sendmail.temailtmethodcS@stjtj|S(N(RR[Rt strtolocal(tx((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pytss %s -f %s %st ssending mail: %s twbs%s %siiN(RNRHtmapRPRRtpopentwriteRt tonativeeoltcloseRRGtostpathtbasenametsplitRt explainexit( RRIRER#tprogramtstremailtcmdlinetfptret((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt _sendmails   cC@sxt|d}tjdtj}|jdtj|tj|f|j||jd|jdS(swrite mails to mboxsab+s%a %b %d %H:%M:%S %Ys From %s %s s N(topenttimetstrftimet localtimeRdRR]Rf(tmboxRIRER#Rotdate((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt_mboxs  c@sUr&tdjfdSjdddkrHtSfdS(snmake a mail connection. return a function to send mail. call as sendmail(sender, list-of-recipients, msg).Rac@st|||S(N(Rx(RLRKtm(Rv(s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyR_sR[R\R=c@st|||S(N(Rq(RLRKRy(R(s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyR_s(RrRfRNRZ(RRv((RvRs4/usr/lib64/python2.7/site-packages/mercurial/mail.pyRRs   cC@s"t|d|}||||S(NRv(RR(RRIRER#RvRM((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyRCscC@sz|jdd}|dkrK|jddsvtjtdqvn+tj|svtjtd|ndS(s=determine if we have enough config data to try sending email.R[R\R=Rs>smtp specified as email transport, but no smtp host configureds0%r specified as email transport, but not in PATHN(RNRRGRRtfindexe(RR\((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pytvalidateconfigs cC@sStjtjj|jj}|jdrO|jd rOd|dS|S(ttisosiso-i(RtsysbytesR[tcharsettCharsett input_charsettlowert startswith(tcs((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt codec2ianas$ tplaincC@sddtjtjg}|r*dg}nxR|D]J}y0|jtj|t||t|SWq1tk rzq1Xq1Wt||dS(s2Return MIME message suitable for a patch. Charset will be detected by first trying to decode as us-ascii, then utf-8, and finally the global encodings. If all those fail, fall back to ISO-8859-1, an encoding with that allows all byte sequences. Transfer encodings will be used if necessary.sus-asciisutf-8s iso-8859-1(RtfallbackencodingtdecodeRtsysstrt mimetextqpRtUnicodeDecodeError(RLtsubtypetdisplayRR((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt mimetextpatchs   cC@stjj|}tjj}|jtjd|x9|jD]+}t |dkrHtjj |_ PqHqHW|j |||S(s[Return MIME message. Quoted-printable transfer encoding will be used if necessary. stext/i( R[RRtmessagetMessagetset_typeRRt splitlinestlentQPt body_encodingt set_payload(tbodyRRRR#tline((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyRscC@sg|jddD]}|j^q}tjjtjjdg}x*|D]"}||krS|j|qSqSWg|D]}|jds|^qS(s;Obtains charsets to send mail parts not containing patches.R[tcharsetssutf-8tascii(t configlistRRRtappendtendswith(RRRt fallbacks((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt _charsetss+   cC@s|pt|}t|tsx||D]a}y |jtj||fSWq(tk raq(tk r|jt d|q(Xq(W|jddSny|j dWnt k rwxt j t j fD]}y|j |}Wnt k rqnXxi|D]a}y |jtj||fSWq tk rDq tk rk|jt d|q Xq WqWnX|dfS(sReturns (converted) string, charset tuple. Finds out best charset by cycling through sendcharsets in descending order. Tries both encoding and fallbackencoding for input. Only as last resort send as is in fake ascii. Caveat: Do not use for mail parts containing patches!s!ignoring invalid sendcharset: %s Rtbackslashreplacesus-ascii(Rt isinstancetbytestencodeRRtUnicodeEncodeErrort LookupErrortwarnRRRRR(RRLRt sendcharsetstocsticstu((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt_encodes4          'cC@s;|s7t|||\}}ttjj||S|S(s4Returns RFC-2047 compliant header from given string.(RtstrR[theadertHeader(RRLRRR((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt headencode.scC@st|||}yZ|jd\}}|jd|jtjtjjd}d||f}Wnxtk rtj t d|nOt k ry|jdWqtk rtj t d|qXnXtj t jj|tj|fS(Nt@Rtidnas%s@%ssinvalid email address: %ssinvalid local address: %s(RRjRRRRRRRRGRt ValueErrortbytesurlR[tutilst formataddrt strfromlocal(RtnametaddrRtacctdom((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt_addressencode6s $   !cC@sT|s | r|pdStjjtj|\}}t||tj||S(s-Turns address into RFC-2047 compliant header.R|(R[Rt parseaddrRRRR](RtaddressRRRR((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt addressencodeIs  !c C@sx|D]}qW|r@g|D]}|jr|j^qSg}xvtjjg|D]}tj|^qYD]F\}}|s|rut||tj||}|j|ququW|S(sTurns a list of addresses into a list of RFC-2047 compliant headers. A single element of input list may contain multiple addresses, but output always has one address per item( tstripR[Rt getaddressesRRRR]R( RtaddrsRRtatresultRRRK((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pytaddrlistencodePs ) / cC@s7d}|s't|||\}}nt|d|S(sgcreates mime text object, encodes it if needed, and sets charset and transfer-encoding accordingly.sus-asciiR(RR(RRLRRR((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt mimeencodeasc C@sYtjj}tj|dddddtd}z|j|SWd|jXdS(NRRterrorstsurrogateescapetnewlinei (R[tparsertParsertiot TextIOWrappertchrtparsetdetach(Rotep((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyRjs cC@stjj}|j|S(N(R[RRR(RoR((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyRvscC@sg}xtjj|D]\}}|dk rey|j|j|wWqetk raqeXnt|tdr|j|qny|j|jdwWntk rnX|j|jdqWt j dj |S(sDecodes RFC-2047 headerusUTF-8s ISO-8859-1u N( R[Rt decode_headerRRRRRttypeRt unitolocalRH(RLtupartstpartR((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pyt headdecodezs$    (0t __future__RR[t email.charsett email.headert email.messaget email.parserRRgR R/Rsti18nRR|RRRRRRRRR R R)R<RZRqRxRRRRCR{RR9RRRRRRRRRtispy3RR(((s4/usr/lib64/python2.7/site-packages/mercurial/mail.pytsH          ( :     *