
    	^c+                        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j                            ej                            ej        j                  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
j%        z    ed2          e          d3             Z&d4 Z'd5 Z(d6 Z)dS )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dS )gpgNc                 0    || _         |rd|z  pd| _        d S )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                 N    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'    -DH0EEtV,,,r   c                 .   dx}}	 t          j        dd          \  }}t          j        |d          }|                    |           |                                 t          j        dd          \  }}t          j        |d          }|                    |           |                                 d| j        ||fz  }t          j        d|          }||fD ])}		 |	rt          j	        |	           # t          $ r Y &w xY wn3# ||fD ])}		 |	rt          j	        |	           # t          $ r Y &w xY ww xY wg }
d	\  }}|                                D ]%}|                    d
          s|dd         }|                    d          r|                                d         }S|                    d          r6|                    dd          dd         }|                    d           d}|                    d          s?|                    d          s*|                    d          s|                    d          r3||
                    ||gz              |                    dd          }d}'||
                    ||gz              |
S )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MMMKB2t$$BHHSMMMHHJJJ#+:gNNNLB2t$$BHHTNNNHHJJJHI  /#v..Cx(   %	!   D	gx(   %	!   D	 %[!! 	# 	#A <<,, !""A||K(( #ggiimi(( #ggdA&&rr*

3"Z((	#<<	**	# <<--	# <<	**		# ?KK{m 3444ggdA&&"?KK{m+,,,sB   CD C44
D DD5D$#D5$
D1	.D50D1	1D5)N)__name__
__module____qualname__r   r!   rD    r   r   r   r   C   sJ        B B B B- - -8 8 8 8 8r   r   c                     |                      dd          }|                    d          }|s|                      dd          }t          ||          S )zcreate a new gpg instancer   r   r   r   )configgetr   )uioptsgpgpathgpgkeys       r   newgpgrP      sO    ii''GXXe__F +66**wr   c              #     K   d }|                      d          }t          |                                          D ]L}dt          |          z  } ||                    |                                          |          D ]}|V  M	 d} ||                     |          |          D ]}|V  dS # t          $ r Y dS w xY w)zb
    walk over every sigs, yields a couple
    ((node, version, sig), (filename, linenumber))
    c              3   `   K   d}| D ]&}|s|                     dd          ||ffV  |dz  }'d S )N   r)   r+   )r8   )fileitercontextlnrC   s       r   	parsefilezsigwalk.<locals>.parsefile   s]       	 	A 774##gr]3333!GBB		 	r      .hgsigss
   .hgsigs|%s	   localsigsN)filereversedheadsr   readr6   vfsIOError)reporW   flrfnitems         r   sigwalkre      s         
:		Bbhhjj!!  U1XX%Ibggajj3355r:: 	 	DJJJJ	IdhhrllB// 	 	DJJJJ	 	   s   
(B4 4
CCc                    |\  }}|\  }}}	d||fz  }
t          |          }t          |||          }t          j        |	          }	|                    ||	          }g }|D ]}|d         dk    r.|                     t          d          |
|d         fz             =|d         dk    r.|                     t          d          |
|d         fz             w|d         d	k    r.|                     t          d
          |
|d         fz             n9|d         dk    r-|                     t          d          |
|d         fz             |                    |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t99DD$((D

c
"
"C<<c""DI 3 3q6YHHQ455Q8HHIIIq6YHHQ899VSV<LLMMMq6YHHIJJ3q6"#    V|##HHHII3q6"#   	#a&#a&#a&12222r   s   sigss   hg sigs)helpcategoryc           	         t          |           }i }t          |          D ]\  }}|\  }}}|\  }	}
	 |                    |          }n7# t          $ r* |                     t          d          |	|
fz             Y Zw xY w|j                            |          }t          | ||||          }|s|	                    |g            ||         
                    |           t          |d          D ]a}||         D ]V}d|t          |j                            |                    fz  }|                     dt          | |          |fz             WbdS )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      s    2JJED   g!gsB	D!!AA 	 	 	GGA455R@AAAH	 Nq!!r4g66 	2QtdD))) 9 9c 	9 	9AS#dn&9&9#&>&>"?"?@@AHH]fRmmQ%778888	99 9s   A1A<;A<s   sigchecks   hg sigcheck REVc                 ,   t          |           }|                    |          }t          |          }g }t          |          D ];\  }}|\  }}	}
||k    r*t	          | ||||          }|r|                    |           <|s4|                     t          d          t          |          z             dS |                     t          d          t          |          z             |D ](}|                     dt          | |          z             )dS )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!    2JJE
++c

CXXFD   g!gs6>>D%w77A A 
122U3ZZ?@@@ HHQ$%%c

2333 - -
F2sOO+,,,,- -r   c                 P    |\  }}}|                      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{     s=    "E4ii,,G T7O++r   s   sign   l   locals   make the signature local   f   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   m   messages   use text as commit messages   TEXT   es   editFs    invoke editor on commit messagess   hg sign [OPTION]... [REV]...c                     |                                 5  t          | |g|R i |cddd           S # 1 swxY w Y   dS )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!     s    < 
 0 0r4/$///$//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   377c                    t          | fi |}t          j        |          }d}d}|                    d          }|rt	          j        |          |d<   |rfd|D             }nufdj                                        D             }t          |          dk    r!t          j
        t          d                    |sj                                        g}|D ]}	t          |	          }
|                     t          d          j                            |	          t#          |	          fz             t%          |	|          }|                    |          }|s!t          j
        t          d	                    t)          j        |          }|                    d
d          }|d|
||fz  z  }|d         rj                            d|           d S |d         sjt3          j        dg          }t7                              |dd                    r0t          j
        t          d          t          d                                        dd          }|                    |           |                                 dj        vrd                              dg           |d         rd S |d         }|sd
                     d |D                       }	 tC          j"        dddit          j#        |          }$                    ||d         |d         ||           d S # tJ          $ r+}t          j
        t          j&        |                    d }~ww xY w)N   0r   s   datec                 :    g | ]}                     |          S rH   )rs   ).0r}   r`   s     r   
<listcomp>z_dosign.<locals>.<listcomp>9  s#    ...AQ...r   c                 *    g | ]}|j         k    |S rH   )nullid)r   rl   r`   s     r   r   z_dosign.<locals>.<listcomp>;  s,     
 
 
8K8KD8K8K8Kr   rS   s6   uncommitted merge - please provide a specific revisions   signing %d:%s
s   error while signing   
s	   %s %s %s
r   rY   r   rX   T)r
   unknownignoreds#   working copy of .hgsigs is changed s   please commit .hgsigs manually)hints   abs	   no_commitr   c                 2    g | ]}d t          |          z  S )s    Added signature for changeset %s)r   )r   r}   s     r   r   z_dosign.<locals>.<listcomp>l  s$    KKK0588;KKKr   editforms   gpg.signs   user)r
   editorrH   )'rP   r   byteskwargsrK   r   	parsedatedirstateparentslenr   Abortr   rv   tipr   r2   rw   r   rg   r!   rh   
b2a_base64replacer^   r9   r
   exactanystatuswvfsr3   addjoinr   getcommiteditor	strkwargscommit
ValueErrorbytestr)rL   r`   r|   rM   rj   sigver
sigmessagedatenodesr}   hexnoder   r:   msigssigsfilemessager   insts    `                r   r   r   .  s   2E%%DFJ88GD 1 *400W +.......
 
 
 
!]2244
 
 
 u::>>+KLL    	+^''))*E 
= 
=a&&
%&&$.*<*<Q*?*?q)JJKKKa((jj 	9+a 677888!#&&kk%%%mw&<<<

 H~ j111> ZL))t{{d{CCDD 	+899899   
 yyU++HNN:NN&&T

|$$$L :G 
**KKUKKK
 
2( 
 
 
$,$6t$<$<
 
 	T']DMv 	 	
 	
 	
 	
 	
  2 2 2k(*4001112s   (AL5 5
M*?&M%%M*c                 t    |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   y  s5    
d{{T""k!899:::r   c                     t           j                            t           j                            t          j                  t                     dt           j        t          <   d S )Ns   GPG signing)r	   CATEGORY_ORDERinsertindexcommandCATEGORY_MAINTENANCE_HELP_CATEGORYCATEGORY_NAMES)rL   s    r   extsetupr     sK    !!'">??   +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 A A A A A AH       :  D 	"aa
mm.AAA9 9 BA92 	b!!.//nMMM- - NM-0   		xqq!<==>	xqq!HIIJA899		
 
vsAA89911U88D	z3"? @ @!!G**M	wqq!DEEF  A%&&#  &0 0' &0H2 H2 H2V; ; ;9 9 9 9 9r   