^c+dZddlZddlZddlmZddlmZmZmZddl m Z m Z m Z m Z mZmZddlmZmZiZejeZdZiZejeZedd d edd d edd dd dZe je jejjede je<GddZdZdZ dZ!edgededZ"edgededZ#dZ$edddded fd!d"ded#fd$d%ded&fd'd d$ed(ed)fd*d+d$ed,ed-fd.d/d0ed1fge j%zed2ed3Z&d4Z'd5Z(d6Z)dS)7z&commands to sign and verify changesetsN)_)binhexshort)cmdutilerrorhelpmatchpycompat registrar)dateutilprocutilsships-with-hg-coregpgcmd)defaultkeys.*T)rgenericsSigning changes (GPG)c"eZdZddZdZdZdS)gpgNc0||_|rd|zpd|_dS)Ns --local-user "%s")pathkey)selfrrs +/usr/lib/python3/dist-packages/hgext/gpg.py__init__z gpg.__init__Ds$ 93c9AcrcNd|j|jfz}tj||S)Ns%s --sign --detach-sign%s)rrrfilter)rdatagpgcmds rsignzgpg.signHs'-DH0EEtV,,,rc.dx}} tjdd\}}tj|d}|||tjdd\}}tj|d}|||d|j||fz}tjd|}||fD])} | rtj | #t$rY&wxYwn3#||fD])} | rtj | #t$rY&wxYwwxYwg} d \} } | D]%} | d s| d d} | d r| d } S| dr6| dddd} | dd} | ds?| ds*| ds| dr3| | | | gz| dd} d} '| | | | gz| 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)rrsigsigfiledatafilefdfpr retfkeysr fingerprintls rverifyz gpg.verifyLs!!( "**WMMMKB2t$$B HHSMMM HHJJJ#+:gNNNLB2t$$B HHTNNN HHJJJHI /#v..Cx(  % ! D  gx(  % ! D   %[!! # #A<< ,, !""A||K(( #ggiim i(( #ggdA&&rr* 3"  Z(( #<< ** #<< -- #<< ** # ?KK{m 3444ggdA&&" ? KK{m+ , , , sBCDC44 DDD5 D$#D5$ D1 .D50D1 1D5)N)__name__ __module__ __qualname__rr!rDrrrrCsJBBBB---88888rrc |dd}|d}|s|dd}t||S)zcreate a new gpg instancerrrr)configgetr)uioptsgpgpathgpgkeys rnewgpgrPsOii''G XXe__F +66** w  rc#Kd}|d}t|D]L}dt|z}||||D]}|VM d}||||D]}|VdS#t$rYdSwxYw)zb walk over every sigs, yields a couple ((node, version, sig), (filename, linenumber)) c3`Kd}|D]&}|s|dd||ffV|dz }'dS)Nr)r+)r8)fileitercontextlnrCs r parsefilezsigwalk..parsefiles]   A 774##gr]3 3 3 3 !GBB   r.hgsigss .hgsigs|%s localsigsN)filereversedheadsrreadr6vfsIOError)reporWflrfnitems rsigwalkres  :  B bhhjj ! ! U1XX %Ibggajj3355r::  DJJJJ  IdhhrllB//  DJJJJ        s (B44 CCc|\}}|\}}} d||fz} t|}t|||} tj| } || | } g} | D]}|ddkr.|t d| |dfz=|ddkr.|t d| |dfzw|dd kr.|t d | |dfzn9|dd kr-|t d | |dfz| |d|d|d f| S)zget the keys who signed a datas%s:%drr(s%s Unknown key ID "%s" rSr.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_base64rDr2rr9)rLr`mygpgsigdatarUrcrVnodeversionr:r#rrA validkeysrs rgetkeysros FB D'3 R F t99D D$ ( (D  c " "C <<c " "DI33 q6Y   HHQ455Q8HH I I I  q6Y   HHQ899VSV&>"?"?@@A HH]fRmmQ%77 8 8 8 8 999sA1A<;A<ssigcheckshg sigcheck REVc,t|}||}t|}g}t|D];\}}|\}} } ||kr*t |||||} | r|| <|s4|tdt|zdS|tdt|z|D](} |dt|| z)dS)z@verify all the signatures there may be for a particular revisionsno valid signature for %s Ns%s is signed by: s %s ) rPrsrreroryr2rrr{) rLr`rwrjhexrevrArrUrlrmr:r~rs rsigcheckrs! 2JJE ++c  C XXF D  g!gs 6>>D%w77A  A  122U3ZZ?@@@HHQ$ % %c 2333-- F2sOO+,,,,--rcP|\}}}|d|}|rd||fzS|S)z/associate a string to a key (username, comment)rs%s (%s))rJ)rLrkeyiduserrBcomments rr{r{s="E4ii ,,GT7O++ rssignllocalsmake 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]...c|5t||g|Ri|cdddS#1swxYwYdS)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)rLr`r|rMs rr!r! s< 00r4/$///$//000000000000000000s 377ct|fi|}tj|}d}d}|d}|rt j||d<|rfd|D}nufdjD}t|dkr!tj td|sj g}|D]} t| } |tdj | t#| fzt%| |} || } | s!tj td t)j| } | d d} |d | || fzz }|d rjd |dS|dsjt3jdg} t7| ddr0tj tdtddd}|||djvrddg|drdS|d}|sd d|D} tCj"ddditj#|}$||d|d| |dS#tJ$r+}tj tj&|d}~wwxYw)N0rsdatec:g|]}|SrH)rs).0r}r`s r z_dosign..9s#...AQ...rc*g|]}|jk |SrH)nullid)rrlr`s rrz_dosign..;s,    8K8KD8K8K8KrrSs6uncommitted merge - please provide a specific revisionssigning %d:%s serror while signing s %s %s %s rrYrrXT)r unknownignoreds#working copy of .hgsigs is changed splease commit .hgsigs manually)hintsabs no_commitrc2g|]}dt|zS)s Added signature for changeset %s)r)rr}s rrz_dosign..ls$ K K K 0588 ; K K Kreditformsgpg.signsuser)r editorrH)'rPr byteskwargsrKr parsedatedirstateparentslenrAbortrrvtiprr2rwrrgr!rh b2a_base64replacer^r9r exactanystatuswvfsr3addjoinrgetcommiteditor strkwargscommit ValueErrorbytestr)rLr`r|rMrjsigver sigmessagedatenodesr}hexnoderr:msigssigsfilemessagerinsts ` rrr.s 2    E   % %D FJ 88G  D 1 *400W  +.......    !]2244    u::>>+KLL  +^''))*E  = =a&& %&&$.*<* ZL)) t{{d{CC D D +899899  yyU++H NN: NN&& T  |$$$ L:G  ** K KU K K K  2(    $,$6t$<$<   T']DMv       222k(*4001112s(A L55 M*?&M%%M*ct|dkrdt|zStjtd)zmap a manifest into some textrs%s sunknown signature version)rrrr)r`rlvers rrgrgys5 d{{T""k!899:::rctjtjtjt dtjt <dS)Ns GPG signing)r CATEGORY_ORDERinsertindexcommandCATEGORY_MAINTENANCE_HELP_CATEGORYCATEGORY_NAMES)rLs rextsetuprsK !!'">??+9D'''r)*__doc__rhr0mercurial.i18nrmercurial.noderrr mercurialrrr r r r mercurial.utilsr rcmdtabler testedwith configtable configitemrrrr CATEGORY_HELPrrrPrerorrr{ commitopts2r!rrgrrHrrrs -,    ) H % % #  !Y !+ . .             i/=>>'?N#AAAAAAAAH      :D "aa mm.AAA99BA92 b!!.//nMMM--NM-0  xqq!<==> xqq!HIIJ    A8 9 9  vsAA89911U88D z3"? @ @!!G**M wqq!DEEF  A%&&#& 0 0'& 0H2H2H2V;;;99999r