\x89\x50\x4E\x47\x0D\x0A\x1A\x0A PNG  \x89\x50\x4E\x47\x0D\x0A\x1A\x0A  13\c @@sbdZddlmZddlZddlZddlmZddlmZm Z m Z m Z m Z mZmZddlmZmZiZejeZdZiZejeZedd d dedd d dedd d dd edZdefdYZdZdZdZedgeddedZ edgeddedZ!dZ"eddddedfddded fd!d"ded#fd$d d!ed%ed&fd'd(d!ed)ed*fd+d,e#ed-fgej$ed.ded/Z%d0Z&d1Z'd2Z(dS(3s&commands to sign and verify changesetsi(tabsolute_importN(t_(tcmdutilterrorthelptmatchtnodetpycompatt registrar(tdateutiltprocutilsships-with-hg-coretgpgtcmdtdefaulttkeys.*tgenericcB@s&eZddZdZdZRS(cC@s&||_|rd|pd|_dS(Ns --local-user "%s"t(tpathR(tselfRR((s//usr/lib64/python2.7/site-packages/hgext/gpg.pyt__init__6s cC@s&d|j|jf}tj||S(Ns%s --sign --detach-sign%s(RRR tfilter(Rtdatatgpgcmd((s//usr/lib64/python2.7/site-packages/hgext/gpg.pytsign:sc C@sSd }}ztjdddd\}}tj|d}|j||jtjdddd\}}tj|d}|j||jd|j||f}tj d|}Wd xB||fD]4} y| rtj | nWqt k rqXqWXg} d\} } x |j D]} | j d sGq,n| d } | j d rs| jd } q,| j dr| jddd } | jdd } q,| j ds| j ds| j ds| j dr,| d k r | j| | gn| jdd} d } q,q,W| d k rO| j| | gn| S(s' returns of the good and bad signaturestprefixshg-gpg-tsuffixs.sigtwbs.txts1%s --logger-fd 1 --status-fd 1 --verify "%s" "%s"RNs[GNUPG:]i tVALIDSIGi tERRSIGt iitGOODSIGtEXPSIGt EXPKEYSIGtBADSIG(NN(tNoneRtmkstemptostfdopentwritetcloseRR RtunlinktOSErrort splitlinest startswithtsplittappend(RRtsigtsigfiletdatafiletfdtfpRtrettftkeysRt fingerprinttl((s//usr/lib64/python2.7/site-packages/hgext/gpg.pytverify>sT              N(t__name__t __module__R"RRR8(((s//usr/lib64/python2.7/site-packages/hgext/gpg.pyR 5s  cK@sI|jdd}|jd}|s<|jdd}nt||S(screate a new gpg instanceR R R(tconfigtgetR (tuitoptstgpgpathtgpgkey((s//usr/lib64/python2.7/site-packages/hgext/gpg.pytnewgpgps cc@sd}|jd}x[t|jD]G}dtj|}x+||j|j|D] }|VqcWq+Wy2d}x%||j||D] }|VqWWntk rnXdS(sb walk over every sigs, yields a couple ((node, version, sig), (filename, linenumber)) cs@sNd}xA|D]9}|sq n|jdd||ffV|d7}q WdS(NiRi(R,(tfileitertcontexttlnR7((s//usr/lib64/python2.7/site-packages/hgext/gpg.pyt parsefile}s  s.hgsigss .hgsigs|%st localsigsN( tfiletreversedtheadsthgnodetshorttreadR*tvfstIOError(trepoREtfltrtfntitem((s//usr/lib64/python2.7/site-packages/hgext/gpg.pytsigwalkxs %   cC@s|\}}|\}}} d||f} tj|}t|||} tj| } |j| | } g} x| D]}|ddkr|jtd| |dfqzn|ddkr|jtd| |dfqzn|dd kr"|jtd | |dfn4|dd krV|jtd | |dfn| j|d|d|d fqzW| S(sget the keys who signed a datas%s:%diRs%s Unknown key ID "%s" iR!s%s Bad signature from "%s" iRs1%s Note: Signature has expired (signed by: "%s") R s0%s Note: This key has expired (signed by: "%s") i( RJtbintnode2txttbinasciit a2b_base64R8R&RR-(R=ROtmygpgtsigdataRCRRRDRtversionR.RRR5t validkeysR((s//usr/lib64/python2.7/site-packages/hgext/gpg.pytgetkeyss.  !!&tsigsshg sigst helpcategorycC@sct|}i}xt|D]\}}|\}}}|\} } y|j|} Wn1tk r|jtd| | fqnX|jj| } t|||||} | sqn|j | g|| j | qWxtt |dt D]`}xW||D]K}d|t j|jj|f} |jdt||| fq WqWdS(slist signed changesetss%s:%d node does not exist treverses%5d:%ss %-30s %s N(RARTtlookuptKeyErrortwarnRt changelogtrevR]t setdefaulttextendtsortedtTrueRJthexRR&tkeystr(R=RORYtrevsRRCRR[R.RRRDtnRQR5Retk((s//usr/lib64/python2.7/site-packages/hgext/gpg.pyR^s(   %tsigcheckshg sigcheck REVc C@st|}|j|}tj|}g}xft|D]X\}}|\}} } ||kr=t|||||} | r|j| qq=q=W|s|jtdtj |dS|jtdtj |x(|D] } |jdt || qWdS(s@verify all the signatures there may be for a particular revisionsno valid signature for %s Ns%s is signed by: s %s ( RARaRJRjRTR]RgR&RRKRk( R=ROReRYthexrevR5RRCRR[R.RnR((s//usr/lib64/python2.7/site-packages/hgext/gpg.pyRos      cC@s=|\}}}|jd|}|r5d||fS|SdS(s/associate a string to a key (username, comment)R s%s (%s)N(R;(R=RtkeyidtuserR6tcomment((s//usr/lib64/python2.7/site-packages/hgext/gpg.pyRks RR7tlocalsmake the signature localR4tforces$sign even if the sigfile is modifiedRs no-commits'do not commit the sigfile after signingRnsthe key id to sign withtIDtmtmessagesuse text as commit messagetTEXTtetedits invoke editor on commit messagesshg sign [OPTION]... [REV]...c O@s*|jt||||SWdQXdS(stadd a signature for the current or given revision If no revision is given, the parent of the working directory is used, or tip if no revision is checked out. The ``gpg.cmd`` config setting can be used to specify the command to run. A default key can be specified with ``gpg.key``. See :hg:`help dates` for a list of formats valid for -d/--date. N(twlockt_dosign(R=RORlR>((s//usr/lib64/python2.7/site-packages/hgext/gpg.pyRs cO@sjt||}tj|}d}d}|jd}|rUtj||dRYtsigvert sigmessageRRmtnodesRthexnodeRR.tmsigstsigsfileRxRtinst((s//usr/lib64/python2.7/site-packages/hgext/gpg.pyR}sh%   $     )   cC@s6|dkrdtj|StjtddS(smap a manifest into some textR~s%s sunknown signature versionN(RJRjRRR(RORtver((s//usr/lib64/python2.7/site-packages/hgext/gpg.pyRVIs cC@s3tjjtjjtjtdtjtsR  4    ;   ''     E