o ]Lb, @sdZddlmZddlZddlZddlmZddlmZm Z m Z ddl m Z m Z mZmZmZmZddlmZmZiZeeZdZiZeeZed d d d ed d dd ed d dddd Zejejejjedeje<Gddde Z!ddZ"ddZ#ddZ$edgededddZ%edgededd d!Z&d"d#Z'ed$d%d&ded'fd(d)ded*fd+d,ded-fd.d d+ed/ed0fd1d2d+ed3ed4fd5d6d7ed8fge j(ed9edd:d;Z)dd?Z+d@dAZ,dS)Bz&commands to sign and verify changesets)absolute_importN)_)binhexshort)cmdutilerrorhelpmatchpycompat registrar)dateutilprocutilsships-with-hg-coregpgcmd)defaultkeys.*T)rgenericsSigning changes (GPG)c@s&eZdZdddZddZddZdS) gpgNcCs||_|r d|p d|_dS)Ns --local-user "%s")pathkey)selfrrr+/usr/lib/python3/dist-packages/hgext/gpg.py__init__Esz gpg.__init__cCsd|j|jf}t||S)Ns%s --sign --detach-sign%s)rrrfilter)rdatagpgcmdrrrsignIs zgpg.signcCsd}}zYtjddd\}}t|d}|||tjddd\}}t|d}|||d|j||f}td|}W||fD]} z | rRt | WqHt y\YqHwn||fD]} z | rlt | Wqbt yvYqbwwg} d \} } | D]Y} | d sq| d d} | d r| d } q| dr| dddd} | dd} q| ds| ds| ds| dr| dur| | | g| dd} d} q| dur| | | g| S)z&returns of the good and bad signaturesNshg-gpg-s.sig)prefixsuffixwbs.txts1%s --logger-fd 1 --status-fd 1 --verify "%s" "%s"r)NNs[GNUPG:] sVALIDSIG ERRSIG sGOODSIGEXPSIG EXPKEYSIGBADSIG)r mkstemposfdopenwritecloserrrunlinkOSError splitlines startswithsplitappend)rrsigsigfiledatafilefdfprretfkeysr fingerprintlrrrverifyMs~                z gpg.verify)N)__name__ __module__ __qualname__rrrArrrrrDs  rcKs0|dd}|d}|s|dd}t||S)zcreate a new gpg instancerrrr)configgetr)uioptsgpgpathgpgkeyrrrnewgpgs    rKccsdd}|d}t|D]}dt|}||||D]}|Vq"qzd}||||D]}|Vq4WdStyFYdSw)zb walk over every sigs, yields a couple ((node, version, sig), (filename, linenumber)) css8d}|D]}|s q|dd||ffV|d7}qdS)Nr&r()r5)fileitercontextlnr@rrr parsefiles zsigwalk..parsefile.hgsigss .hgsigs|%s localsigsN)filereversedheadsrreadr3vfsIOError)reporPflrfnitemrrrsigwalks    r^cCs|\}}|\}}} d||f} t|}t|||} t| } || | } g} | D]_}|ddkr>|td| |dfq(|ddkrR|td| |dfq(|dd krf|td | |dfn|dd kry|td | |df| |d|d|d fq(| S)zget the keys who signed a datas%s:%drr%s%s Unknown key ID "%s" rLr+s%s Bad signature from "%s" r(r)s1%s Note: Signature has expired (signed by: "%s") r*s0%s Note: This key has expired (signed by: "%s") r')rnode2txtbinascii a2b_base64rAr/rr6)rGrYmygpgsigdatarNr\rOnodeversionr7r rr> validkeysrrrrgetkeyss:           rgssigsshg sigs) helpcategoryc Cst|}i}t|D]G\}}|\}}}|\} } z||} Wnty2|td| | fYq w|j| } t|||||} | sDq | | g||  | q t |ddD]!}||D]}d|t |j |f} |dt||| fq^qXdS)zlist signed changesetss%s:%d node does not exist T)reverses%5d:%ss %-30s %s N)rKr^lookupKeyErrorwarnr changelogrevrg setdefaultextendsortedrrdr/keystr)rGrYrbrevsrrNrdrer7r\rOnr[r>rnkrrrsigss.     rvssigcheckshg sigcheck REVc Cst|}||}t|}g}t|D]\}}|\}} } ||kr/t|||||} | r/|| q|s?|tdt|dS|tdt||D] } |dt || qLdS)z@verify all the signatures there may be for a particular revisionsno valid signature for %s Ns%s is signed by: s %s ) rKrjrr^rgrpr/rrrr) rGrYrnrbhexrevr>rrNrdrer7rurrrrsigchecks$   rxcCs*|\}}}|d|}|rd||fS|S)z/associate a string to a key (username, comment)rs%s (%s))rE)rGrkeyiduserr?commentrrrrrs   rrssignllocalsmake the signature localfforces$sign even if the sigfile is modifiedrs no-commits'do not commit the sigfile after signingksthe key id to sign withsIDmmessagesuse text as commit messagesTEXTeseditFs invoke editor on commit messagesshg sign [OPTION]... [REV]...cOsD|t||g|Ri|WdS1swYdS)atadd 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)wlock_dosign)rGrYrsrHrrrr s $rc s@t|fi|}t|}d}d}|d}|rt||d<|r+fdd|D}n!fddjD}t|dkrDt t d|sLj g}|D]?} t| } |t d j | t| ft| |} || } | syt t d t| } | d d} |d | || f7}qN|d rjd|dS|dstdg} tj| dddrt j t dt dddd}|||djvrֈddg|drdS|d}|sd dd|D}zt!j"dddit#|}j$||d|d| |dWdSt%y}zt t&|d}~ww)N0rsdatecsg|]}|qSr)rj.0rtrYrr :sz_dosign..csg|] }|jkr|qSr)nullid)rrdrrrr<srLs6uncommitted merge - please provide a specific revisionssigning %d:%s serror while signing s %s %s %s r}rRrrQT)r unknownignoreds#working copy of .hgsigs is changed splease commit .hgsigs manually)hintsabs no_commitrcSsg|]}dt|qS)s Added signature for changeset %s)rrrrrrmseditformsgpg.signsuser)r editorr)'rKr byteskwargsrFr parsedatedirstateparentslenrAbortrrmtiprr/rnrr_rr` b2a_base64replacerWr6r exactanystatuswvfsr0addjoinrgetcommiteditor strkwargscommit ValueErrorbytestr)rGrYrsrHrbsigver sigmessagedatenodesrthexnoderr7msigssigsfilemessagerinstrrrr/s~     "          rcCs"|dkr dt|Sttd)zmap a manifest into some textrs%s sunknown signature version)rrrr)rYrdverrrrr_zs r_cCs&tjtjtjtdtjt<dS)Ns GPG signing)r CATEGORY_ORDERinsertindexcommandCATEGORY_MAINTENANCE_HELP_CATEGORYCATEGORY_NAMES)rGrrrextsetupsr)-__doc__ __future__rr`r-mercurial.i18nrmercurial.noderrr mercurialrrr r r r mercurial.utilsr rcmdtabler testedwith configtable configitemrrrr CATEGORY_HELProbjectrrKr^rgrvrxrr commitopts2rrr_rrrrrs      D "     K