U
    Nf                     @   s   d dl Z d dlmZ d dlmZmZ d dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZmZ d dlmZmZ d dlmZ eee e dddZ!eeedddZ"eej#dddZ$dS )    N)datetime)ListOptional)pem)
CLIContext)get_text_paramsopen_for_signing)SigningCommandPlugin)pyhanko_exception_manager)readable_filewritable_file)
PdfHandler)	PdfSignerfields)PdfCMSSignedAttributesselect_suitable_signing_md)HTTPTimeStamper)handlernamewill_createc           
      C   s   d}zXt tj| |d\}}}tj| d}t|\}}	|rD|	sZt| d| dW nJ tk
r   |st| dn |st| d| d| dY nX d S )	Nz3You seem to be trying to create a visible signature)	with_name)Z	sig_fieldz, but the field 'ze' in the PDF is not a visible one. Please specify another field name if you need a visible signature.z, but the PDF did not contain any signature fields, and you did not specify a bounding box. Please specify the field as --field "PAGE/X1,Y1,X2,Y2/NAME" to create a visible signature field at the coordinates provided.z' does not exist in the PDF file, and you did not specify a bounding box. Please specify the field as --field "PAGE/X1,Y1,X2,Y2/zB" to create a visible signature field at the coordinates provided.)	nextr   Zenumerate_sig_fieldsZget_sig_field_annotZ
get_objectZannot_width_heightclickZClickExceptionStopIteration)
r   r   r   prefixZfq_name_Z	field_refZ	sig_annotwh r   G/tmp/pip-unpacked-wheel-fbovo6ns/pyhanko/cli/commands/signing/plugin.py_ensure_field_visible   s(    
r    )plugininfileoutfilec                 K   s  t  }|j}|j}|d k	r&t|}nd }| j|f|N}|j}	|	d kr|d k	rXd }
ntjt	
 d}
t|d@}|j}|d k	st|j|t|j|t|
dd}t|}W 5 Q R X | }|jrtd|}t|d}|| W 5 Q R X nt||jd|}|jjr"t||	j|jd k	 t |	|||j!|jdj"||j#t$|d	}t|d }|% }|| |&  W 5 Q R X W 5 Q R X W 5 Q R X d S )
N)tzrb)Zsigning_time)timestamperZsigned_attr_settingsZPKCS7wb)Zinfile_pathlenient)signerr&   stamp_stylenew_field_spec)existing_fields_onlyZappearance_text_params)'r   Zget_current_contextobjtimestamp_urlr   Zcreate_signerZsig_settingsr   nowtzlocalZget_localzoneopenZsigning_certAssertionErrorZasync_sign_general_datar   Z
public_keyr   asynciorundumpZ
detach_pemr   Zarmorwriter   r(   ZuxZvisible_signature_desiredr    
field_namer+   r   r*   Zsign_pdfr,   r   	getbufferrelease)r!   r"   r#   kwargsctxZcli_ctxr.   r&   r)   Zpdf_sig_settingsZtimestamp_attrinfcertZsignature_job	signatureZoutput_bytesoutr   resultoutfbufr   r   r   _callback_logic;   sn    
 

rC   )r!   returnc                    sb   t t d fdd}tjdtdtjdtdg}|   |   tj j	| j
|dS )N)r"   r#   c              	      s&   t   t | |f| W 5 Q R X d S )N)r
   rC   )r"   r#   r:   r!   r   r   	_callback   s    z&command_from_plugin.<locals>._callback)r"   )type)r#   )r   callbackhelpparams)strr   ZArgumentr   r   extendZclick_extra_argumentsZclick_optionsCommandsubcommand_nameZhelp_summary)r!   rF   rJ   r   rE   r   command_from_plugin   s    rO   )%r3   r   typingr   r   r   r0   Z
asn1cryptor   Zpyhanko.cli._ctxr   Z"pyhanko.cli.commands.signing.utilsr   r   Zpyhanko.cli.plugin_apir	   Zpyhanko.cli.runtimer
   Zpyhanko.cli.utilsr   r   Zpyhanko.pdf_utils.rw_commonr   Zpyhanko.signr   r   Zpyhanko.sign.signers.pdf_cmsr   r   Zpyhanko.sign.timestampsr   rK   boolr    rC   rM   rO   r   r   r   r   <module>   s.     %  F