
    q&f+                     <   d Z ddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
mZmZmZmZmZ ddlmZmZ i Z ej(                  e      ZdZi Z ej.                  e      Z edd	d
        eddd
        edddd       dZej2                  j5                  ej2                  j7                  ej(                  j8                        e       dej:                  e<    G d d      Zd Zd Z d Z! edg  ed      e      d        Z" edg  ed      e      d        Z#d Z$ edddd ed       fd!d"d ed#      fd$d%d ed&      fd'dd$ ed(       ed)      fd*d+d$ ed,       ed-      fd.d/d0 ed1      fge
jJ                  z    ed2      e      d3        Z&d4 Z'd5 Z(d6 Z)y)7z&commands to sign and verify changesets    N)_)binhexshort)cmdutilerrorhelpmatchpycompat	registrar)dateutilprocutils   ships-with-hg-core   gpg   cmd)default   keys   .*T)r   generics   Signing changes (GPG)c                        e Zd ZddZd Zd Zy)gpgNc                 6    || _         |xr d|z  xs d| _        y )Ns    --local-user "%s"    )pathkey)selfr   r   s      +/usr/lib/python3/dist-packages/hgext/gpg.py__init__zgpg.__init__D   s     	93c9Acr   c                 d    d| j                   | j                  fz  }t        j                  ||      S )Ns   %s --sign --detach-sign%s)r   r   r   filter)r   datagpgcmds      r   signzgpg.signH   s*    -DHH0EEtV,,r   c                    dx}}	 t        j                  dd      \  }}t        j                  |d      }|j	                  |       |j                          t        j                  dd      \  }}t        j                  |d      }|j	                  |       |j                          d| j                  ||fz  }t        j                  d|      }||fD ]  }		 |	rt        j                  |	        	 g }
d	\  }}|j                         D ]  }|j                  d
      s|dd }|j                  d      r|j                         d   }?|j                  d      r)|j                  dd      dd }|j                  d       d}y|j                  d      s4|j                  d      s#|j                  d      s|j                  d      s||
j                  ||gz          |j                  dd      }d} ||
j                  ||gz          |
S # t        $ r Y Ew xY w# ||fD ])  }		 |	rt        j                  |	       # t        $ r Y 'w xY w w xY w)z&returns of the good and bad signaturesNs   hg-gpg-s   .sig)prefixsuffixwbs   .txts1   %s --logger-fd 1 --status-fd 1 --verify "%s" "%s"r   )NNs   [GNUPG:]	   s   VALIDSIG
      ERRSIG          s   GOODSIG   EXPSIG	   EXPKEYSIG   BADSIG)r   mkstemposfdopenwritecloser   r   r   unlinkOSError
splitlines
startswithsplitappend)r   r   sigsigfiledatafilefdfpr    retfkeysr   fingerprintls                 r   verifyz
gpg.verifyL   s;   !!(	"***WMKB2t$BHHSMHHJ#++:gNLB2t$BHHTNHHJHII  //#v.Cx( 		! %[! 	#A <<,!"A||K(ggimi(ggdA&r*

3"Z(<<	*<<-<<	*?KK{m 34ggdA&"-	#. ?KK{m+,;  	 x( 		! 	sB   C
H H	HHI&H>=I>	I
	I	I
	
I)N)__name__
__module____qualname__r   r!   rD    r   r   r   r   C   s    B-8r   r   c                     | j                  dd      }|j                  d      }|s| j                  dd      }t        ||      S )zcreate a new gpg instancer   r   r   r   )configgetr   )uioptsgpgpathgpgkeys       r   newgpgrP      s?    ii'GXXe_F66*wr   c              #   P  K   d }| j                  d      }t        |j                               D ]?  }dt        |      z  } ||j	                  |      j                         |      D ]  }|  A 	 d} || j                  |      |      D ]  }|  y# t        $ r Y yw xY ww)zb
    walk over every sigs, yields a couple
    ((node, version, sig), (filename, linenumber))
    c              3   ^   K   d}| D ]"  }|s|j                  dd      ||ff |dz  }$ y w)N   r)   r+   )r8   )fileitercontextlnrC   s       r   	parsefilezsigwalk.<locals>.parsefile   sC      	A774#gr]33!GB		s   +-   .hgsigss
   .hgsigs|%s	   localsigsN)filereversedheadsr   readr6   vfsIOError)reporW   flrfnitems         r   sigwalkre      s      
:	Bbhhj! U1X%bggaj335r: 	DJ	dhhrlB/ 	DJ	 s*   A0B&3#B B&	B# B&"B##B&c                 J   |\  }}|\  }}}	d||fz  }
t        |      }t        |||      }t        j                  |	      }	|j	                  ||	      }g }|D ]  }|d   dk(  r#| j                  t        d      |
|d   fz         .|d   dk(  r#| j                  t        d      |
|d   fz         Y|d   d	k(  r#| j                  t        d
      |
|d   fz         n*|d   dk(  r"| j                  t        d      |
|d   fz         |j                  |d   |d   |d   f        |S )zget the keys who signed a datas   %s:%dr   r(   s   %s Unknown key ID "%s"
rS   r.   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*   )r   node2txtbinascii
a2b_base64rD   r2   r   r9   )rL   r`   mygpgsigdatarU   rc   rV   nodeversionr:   r#   r   rA   	validkeysr   s                  r   getkeysro      s_   FB D'3R Ft9DD$(D


c
"C<<c"DI 3q6YHHQ45Q8HHIq6YHHQ89VSV<LLMq6YHHIJ3q6"# V|#HHHI3q6"# 	#a&#a&#a&12#3$ r   s   sigss   hg sigs)helpcategoryc           	      L   t        |       }i }t        |      D ]u  \  }}|\  }}}|\  }	}
	 |j                  |      }|j                  j                  |      }t        | ||||      }|sP|j                  |g        ||   j                  |       w t        |d      D ]U  }||   D ]K  }d|t        |j                  j                  |            fz  }| j                  dt        | |      |fz         M W y# t        $ r# | j	                  t        d      |	|
fz         Y 	w xY w)zlist signed changesetss   %s:%d node does not exist
T)reverses   %5d:%ss	   %-30s %s
N)rP   re   lookupKeyErrorwarnr   	changelogrevro   
setdefaultextendsortedr   rl   r2   keystr)rL   r`   rj   revsr   rU   rl   rm   r:   rc   rV   nrb   rA   rw   ks                   r   sigsr      s6    2JED  g!gsB	D!A NNq!r4g62Qt dD) 9c 	9AS#dnn&9&9#&>"?@@AHH]fRmQ%778	99  	GGA45R@A	s   C77(D#"D#s   sigchecks   hg sigcheck REVc                    t        |       }|j                  |      }t        |      }g }t        |      D ]4  \  }}|\  }}	}
||k(  st	        | ||||      }|s$|j                  |       6 |s'| j                  t        d      t        |      z         y| j                  t        d      t        |      z         |D ]   }| j                  dt        | |      z         " y)z@verify all the signatures there may be for a particular revisions   no valid signature for %s
Ns   %s is signed by:
s    %s
)
rP   rs   r   re   ro   ry   r2   r   r   r{   )rL   r`   rw   rj   hexrevrA   r   rU   rl   rm   r:   r~   r   s                r   sigcheckr      s     2JE
++c
CXFD  g!gs6>D%w7AA 
12U3Z?@ HHQ$%c
23 -
F2sO+,-r   c                 H    |\  }}}| j                  d|      }|rd||fz  S |S )z/associate a string to a key (username, comment)r   s   %s (%s))rJ   )rL   r   keyiduserrB   comments         r   r{   r{     s5    "E4ii,GT7O++r   s   sign   ls   locals   make the signature local   fs   forces$   sign even if the sigfile is modifiedr   s	   no-commits'   do not commit the sigfile after signing   ks   the key id to sign withs   ID   ms   messages   use text as commit messages   TEXT   es   editFs    invoke editor on commit messagess   hg sign [OPTION]... [REV]...c                 n    |j                         5  t        | |g|i |cddd       S # 1 sw Y   yxY w)at  add 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)rL   r`   r|   rM   s       r   r!   r!     s6    < 
 0r4/$/$/0 0 0s   +4c           	         t        | fi |}d}d}|j                  d      }|rt        j                  |      |d<   |r|D cg c]  }|j	                  |       }	}n|j
                  j                         D 
cg c]  }
|
|j                  k7  s|
 }	}
t        |	      dkD  rt        j                  t        d            |	s|j                  j                         g}	|	D ]  }t        |      }| j                  t        d      |j                  j!                  |      t#        |      fz         t%        |||      }|j'                  |      }|st        j                  t        d            t)        j*                  |      }|j-                  dd      }|d	|||fz  z  } |d
   r|j.                  j1                  d|       y t3        j4                  dg      }|d   sFt7        |j9                  |dd            r)t        j                  t        d      t        d            |j;                  dd      5 }|j                  |       d d d        d|j
                  vr9|j
                  j=                  |      5  |d    j?                  dg       d d d        |d   ry |d   }|s+djA                  |	D cg c]  }dt#        |      z   c}      }	 tC        jD                  dddi|}|jG                  ||d   |d   ||       y c c}w c c}
w # 1 sw Y   xY w# 1 sw Y   xY wc c}w # tH        $ r-}t        j                  tK        jL                  |            d }~ww xY w)N   0r   daterS   s6   uncommitted merge - please provide a specific revisions   signing %d:%s
s   error while signing   
s	   %s %s %s
localrY   rX   forceT)r
   unknownignoreds#   working copy of .hgsigs is changed s   please commit .hgsigs manually)hints   ab	no_commitmessages    Added signature for changeset %seditforms   gpg.signr   )r
   editorrH   )'rP   rK   r   	parsedaters   dirstateparentsnullidlenr   Abortr   rv   tipr   r2   rw   r   rg   r!   rh   
b2a_base64replacer^   r9   r
   exactanystatuswvfschanging_filesaddjoinr   getcommiteditorcommit
ValueErrorr   bytestr)rL   r`   r|   rM   rj   sigver
sigmessager   r}   nodesrl   hexnoder   r:   msigssigsfiler   r   insts                      r   r   r   .  s*   2EFJ88FD))$/V)-.AQ.. "]]224
8KD
 
 u:>++KL  ^^'')*E 
=a&
%&$..*<*<Q*?q)JJKa(jj++a 6788!!#&kk%%mw&<<<

= G}j1KK%E=t{{d{CD++8989 
 
:u	% #z"# &]]))$/ 	)JNNJ<(	) K9oG**EJK058;K
2((F+FFT&\4<uV 	 	
q /
H# #	) 	) L  2kk(**40112sH   L9LL5L8L2L%3L* LL"*	M 3(MM c                 d    |dk(  rdt        |      z  S t        j                  t        d            )zmap a manifest into some textr   s   %s
s   unknown signature version)r   r   r   r   )r`   rl   vers      r   rg   rg   x  s-    
d{T""kk!89::r   c                     t         j                  j                  t         j                  j                  t        j
                        t               dt         j                  t        <   y )Ns   GPG signing)r	   CATEGORY_ORDERinsertindexcommandCATEGORY_MAINTENANCE_HELP_CATEGORYCATEGORY_NAMES)rL   s    r   extsetupr     sD    !!'">">? +9D'r   )*__doc__rh   r0   mercurial.i18nr   mercurial.noder   r   r   	mercurialr   r   r	   r
   r   r   mercurial.utilsr   r   cmdtabler   
testedwithconfigtable
configitemr   r   r   r   CATEGORY_HELPr   r   rP   re   ro   r   r   r{   commitopts2r!   r   rg   r   rH   r   r   <module>r      s)   -  	  
 
 
)

H
%
 #
!Y!!+.
 



 


 
		      i//==> '?  N #A AH :D 	"a
m.A9 B92 	b!./nM- N-0 		xq!<=>	xq!HIJ89		
 
vsA891U8D	z3"? @!G*M	wq!DEF  %&#&0'&0G2T;9r   