ó €ˆtPc @s³dZddlZddlZddlZddlmZmZmZmZddlm Z ddl m Z iZ eje ƒZdZdefd„ƒYZd „Zd „Zd „Zed ge d ƒƒd„ƒZedge dƒƒd„ƒZd„Zedddde dƒfddde dƒfddde dƒfddde dƒe d ƒfd!d"de d#ƒe d$ƒfgeje d%ƒƒd&„ƒZd'„ZdS((s&commands to sign and verify changesetsiÿÿÿÿN(tutiltcommandstmatchtcmdutil(tnode(t_tinternaltgpgcBs&eZdd„Zd„Zd„ZRS(cCs&||_|rd|pd|_dS(Ns --local-user "%s"t(tpathtkey(tselfR R ((s-/sys/lib/python2.7/site-packages/hgext/gpg.pyt__init__s cCs&d|j|jf}tj||ƒS(Ns%s --sign --detach-sign%s(R R Rtfilter(R tdatatgpgcmd((s-/sys/lib/python2.7/site-packages/hgext/gpg.pytsignsc CsSd }}zºtjddddƒ\}}tj|dƒ}|j|ƒ|jƒtjddddƒ\}}tj|dƒ}|j|ƒ|jƒd|j||f}tj d|ƒ}Wd xB||fD]4} y| rótj | ƒnWqÔt k rqÔXqÔWXg} d\} } d} xî|j ƒD]à}|j d ƒsMq2n|d }|j d ƒrvtd ƒ} Pq2|j dƒr˜|jƒd} q2|j dƒsÔ|j dƒsÔ|j dƒsÔ|j dƒr2| d k r÷| j| | gƒn|jddƒ} d } q2q2W| r&| gfS| d k rI| j| | gƒn| | fS(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 tERRSIGserror while verifying signaturetVALIDSIGi tGOODSIGtEXPSIGt EXPKEYSIGtBADSIGt i(NN(tNonettempfiletmkstemptostfdopentwritetcloseR RR tunlinktOSErrort splitlinest startswithRtsplittappend(R RtsigtsigfiletdatafiletfdtfpRtrettftkeysR t fingerprintterrtl((s-/sys/lib/python2.7/site-packages/hgext/gpg.pytverifysX              N(t__name__t __module__RR RR3(((s-/sys/lib/python2.7/site-packages/hgext/gpg.pyRs  cKsO|jdddƒ}|jdƒ}|sB|jdddƒ}nt||ƒS(screate a new gpg instanceRtcmdR N(tconfigtgetRR(tuitoptstgpgpathtgpgkey((s-/sys/lib/python2.7/site-packages/hgext/gpg.pytnewgpgNs ccsÀd„}|jdƒ}x[t|jƒƒD]G}dtj|ƒ}x+||j|ƒjƒ|ƒD] }|VqcWq+Wy2d}x%||j|ƒ|ƒD] }|Vq˜WWntk r»nXdS(sb walk over every sigs, yields a couple ((node, version, sig), (filename, linenumber)) cssNd}xA|D]9}|sq n|jddƒ||ffV|d7}q WdS(NiRi(R&(tfileitertcontexttlnR2((s-/sys/lib/python2.7/site-packages/hgext/gpg.pyt parsefile[s  s.hgsigss .hgsigs|%st localsigsN( tfiletreversedtheadsthgnodetshorttreadR$topenertIOError(trepoRAtfltrtfntitem((s-/sys/lib/python2.7/site-packages/hgext/gpg.pytsigwalkVs %   cCss|\}}|\}}} d||f} tj|ƒ}t|||ƒ} tj| ƒ} |j| | ƒ\} } | r—|jd||| fƒd Sg}xÏ| D]Ç}|ddkrá|jt dƒ| |dfƒq¤n|ddkr|jt dƒ| |dfƒn4|dd krI|jt d ƒ| |dfƒn|j |d |d|d fƒq¤W|S(sget the keys who signed a datas%s:%ds %s:%d %s iRs%s Bad signature from "%s" iRs1%s Note: Signature has expired (signed by: "%s") Rs0%s Note: This key has expired (signed by: "%s") iiN( RFtbintnode2txttbinasciit a2b_base64R3twarnRR RR'(R9RKtmygpgtsigdataR?RNR@RtversionR(RRR1R/t validkeysR ((s-/sys/lib/python2.7/site-packages/hgext/gpg.pytgetkeysqs.  !&tsigsshg sigscCsct|ƒ}i}xÓt|ƒD]Å\}}|\}}}|\} } y|j|ƒ} Wn1tk rŒ|jtdƒ| | fƒqnX|jj| ƒ} t|||||ƒ} | sÃqn|j | gƒ|| j | ƒqWxtt |dt ƒD]`}xW||D]K}d|t j|jj|ƒƒf} |jdt||ƒ| fƒq WqûWdS(slist signed changesetss%s:%d node does not exist treverses%5d:%ss %-30s %s N(R=RPtlookuptKeyErrorRURt changelogtrevRZt setdefaulttextendtsortedtTrueRFthexRR tkeystr(R9RKRVtrevsRR?RRXR(RNR@tnRMR/R`tk((s-/sys/lib/python2.7/site-packages/hgext/gpg.pyR[Žs(   %tsigcheckshg sigcheck REVc Cs t|ƒ}|j|ƒ}tj|ƒ}g}xft|ƒD]X\}}|\}} } ||kr=t|||||ƒ} | r•|j| ƒq•q=q=W|sÃ|jtdƒtj |ƒƒdS|jdtj |ƒƒx(|D] } |jdt || ƒƒqäWdS(s@verify all the signatures there may be for a particular revisionsno valid signature for %s Ns%s is signed by: s %s ( R=R]RFReRPRZRbR RRGRf( R9RKR`RVthexrevR/RR?RRXR(RiR ((s-/sys/lib/python2.7/site-packages/hgext/gpg.pytcheck§s     cCs@|\}}}|jd|dƒ}|r8d||fS|SdS(s/associate a string to a key (username, comment)Rs%s (%s)N(R7R(R9R tkeyidtuserR0tcomment((s-/sys/lib/python2.7/site-packages/hgext/gpg.pyRf¿s RR2tlocalsmake the signature localR.tforces$sign even if the sigfile is modifiedRs no-commits'do not commit the sigfile after signingRiR sthe key id to sign withtIDtmtmessagescommit messagetTEXTshg sign [OPTION]... [REV]...cOs3t||}d}d}|jdƒ}|rFtj|ƒ|ds2$"=   !!   K