U
    gK'                     @   s$  U d dl mZ d dlmZ d dlmZmZmZmZm	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mZ d d	lmZ d d
lmZ d dlmZmZmZ eG dd dZeddG dd dZd ZZ eedZ!ee"ee f e#d< edddZ$e%e%dddZ&e%e%dddZ'dS )    )	dataclass)	timedelta)DictListOptionalTypeUnionN)ValidationContext)ConfigurationError)	LogConfigparse_logging_config)DEFAULT_TIME_TOLERANCEparse_trust_config)DEFAULT_SIGNING_STAMP_STYLE)KeyUsageConstraints)BaseStampStyleQRStampStyleTextStampStylec                   @   s   e Zd ZU dZeeef ed< eeef ed< eed< eed< eed< e	ed< eed< dd
dZ
dee e	dddZdee edddZdee eeef dddZd	S )	CLIConfigz%
    CLI configuration settings.
    validation_contextsstamp_stylesdefault_validation_contextdefault_stamp_styletime_toleranceretroactive_revinfo
raw_configNc                 C   s@   |p| j }z| j| W S  tk
r:   td| dY nX d S )Nz&There is no validation context named ''.)r   r   KeyErrorr
   )selfname r    6/tmp/pip-unpacked-wheel-owvgwkas/pyhanko/cli/config.py_get_validation_settings_raw\   s    

z&CLIConfig._get_validation_settings_rawF)r   as_dictc                 C   s,   |  |}t|| j| j}|r"|S tf |S )a  
        Retrieve a validation context by name.

        :param name:
            The name of the validation context. If not supplied, the value
            of :attr:`default_validation_context` will be used.
        :param as_dict:
            If ``True`` return the settings as a keyword argument dictionary.
            If ``False`` (the default), return a
            :class:`~pyhanko_certvalidator.context.ValidationContext`
            object.
        )r"   r   r   r   r	   )r   r   r#   	vc_configZ	vc_kwargsr    r    r!   get_validation_contexte   s    
  z CLIConfig.get_validation_context)r   returnc                 C   s   |  |}zt|d }W n tk
r2   i }Y nX z|d }|d| W n tk
r`   Y nX z|d }|d| W n tk
r   Y nX t|S )a:  
        Get a set of key usage constraints for a given validation context.

        :param name:
            The name of the validation context. If not supplied, the value
            of :attr:`default_validation_context` will be used.
        :return:
            A :class:`.KeyUsageConstraints` object.
        zsigner-key-usage-policyzsigner-key-usagez	key-usagezsigner-extd-key-usagezextd-key-usage)r"   dictr   
setdefaultr   from_config)r   r   r$   Zpolicy_settingsZkey_usage_stringsr    r    r!   get_signer_key_usagesz   s     

zCLIConfig.get_signer_key_usagesc              
   C   s   |p| j }| j|d}|dkr0td| dzt|}W n8 ttfk
rt } ztd| d|W 5 d}~X Y nX t|dd }|	|S )a  
        Retrieve a stamp style by name.

        :param name:
            The name of the style. If not supplied, the value
            of :attr:`default_stamp_style` will be used.
        :return:
            A :class:`TextStampStyle` or `QRStampStyle` object.
        NzThere is no stamp style named 'r   z%Could not process stamp style named ''typetext)
r   r   getr
   r'   	TypeError
ValueErrorSTAMP_STYLE_TYPESpopr)   )r   r   configZstyle_configeclsr    r    r!   get_stamp_style   s    

zCLIConfig.get_stamp_style)N)NF)N)N)__name__
__module____qualname____doc__r   strr'   __annotations__r   boolr"   r   r%   r   r*   r   r   r   r6   r    r    r    r!   r      s2   


     & 
r   T)frozenc                   @   s:   e Zd ZU dZeed< eee e	f ed< e
e ed< dS )CLIRootConfigzs
    Config settings that are only relevant tothe CLI root and are not exposed
    to subcommands and plugins.
    r3   
log_configplugin_endpointsN)r7   r8   r9   r:   r   r<   r   r   r;   r   r   r    r    r    r!   r?      s
   
r?   default)Zqrr-   r1   )r&   c              	   C   s6   t | pi }tf t|dtf t|d|iiS )Nr3   r   )yamlZ	safe_loadr?   process_root_config_settingsr   process_config_dict)Zyaml_strconfig_dictr    r    r!   parse_cli_config   s    rG   )rF   r&   c                 C   s,   |  dg }|  di }t|}t||dS )Npluginslogging)r@   rA   )r.   r   r'   )rF   rH   Zlog_config_specr@   r    r    r!   rD      s    rD   c           
      C   s   t i i}z| d }|| W n tk
r2   Y nX ttjddi}z| d }|| W n tk
rn   Y nX | dt }| dt}| dtj}t	|t
stdt|d	}t| d
d}	t||||	||dS )Nzvalidation-contextsZ	__stamp__)z
stamp-textZ
backgroundzstamp-styleszdefault-validation-contextzdefault-stamp-styleztime-tolerancez5time-tolerance parameter must be specified in seconds)secondszretroactive-revinfoF)r   r   r   r   r   r   )DEFAULT_VALIDATION_CONTEXTupdater   DEFAULT_STAMP_STYLEr   Z
stamp_textr.   r   rJ   
isinstanceintr
   r   r=   r'   )
rF   vcsZvc_specsZstamp_configsZstamp_specsZ
default_vcr   Ztime_tolerance_secondsr   r   r    r    r!   rE     sT       

rE   )(Zdataclassesr   datetimer   typingr   r   r   r   r   rC   Zpyhanko_certvalidatorr	   Zpyhanko.config.errorsr
   Zpyhanko.config.loggingr   r   Zpyhanko.config.trustr   r   Zpyhanko.sign.signersr   Z pyhanko.sign.validation.settingsr   Zpyhanko.stampr   r   r   r   r?   rK   rM   r1   r;   r<   rG   r'   rD   rE   r    r    r    r!   <module>   s.     ),
