a
    4i`                  
   @   s@  d dl Z d dlmZ d dlmZ d dlT d dlmZ G dd dZG dd dZG dd	 d	e	Z
G d
d dZedkr<d dlZejd dkreejd Ze Ze  eddZee nzejd dkr<z4eejd dddZeejd  eed W n4 e	y: Z zeejd   W Y dZ[n
dZ[0 0 dS )    N)*)copyc                   @   s   e Zd ZdZed Zi ZdZdZdZdZ	dZ
dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )	PolicyLex)ZPOLICYZALGORITHM_POLICYZZONEZ	ALGORITHMZ	DIRECTORYZKEYTTLZKEY_SIZEZROLL_PERIODZPRE_PUBLISHZPOST_PUBLISHZCOVERAGEZSTANDBYZNONE)	Z
DATESUFFIXZKEYTYPEZALGNAMESTRQSTRINGNUMBERLBRACERBRACESEMIz 	z	(//|\#).*z\{z\};c                 C   s   |j  j|jd7  _dS )z\n+
Nlexerlinenovaluecountselft r   ,/usr/lib/python3/dist-packages/isc/policy.py	t_newline;   s    zPolicyLex.t_newlinec                 C   s   |j  j|jd7  _dS )z/\*(.|\n)*?\*/r   Nr   r   r   r   r   	t_comment?   s    zPolicyLex.t_commentc                 C   s"   t d|jt jd |_|S )z(?<=[0-9 \t])(y(?:ears|ear|ea|e)?|mo(?:nths|nth|nt|n)?|w(?:eeks|eek|ee|e)?|d(?:ays|ay|a)?|h(?:ours|our|ou|o)?|mi(?:nutes|nute|nut|nu|n)?|s(?:econds|econd|econ|eco|ec|e)?)\bz(y|mo|w|d|h|mi|s)([a-z]*)   )rematchr   
IGNORECASEgrouplowerr   r   r   r   t_DATESUFFIXC   s
    zPolicyLex.t_DATESUFFIXc                 C   s   |j  |_ |S )z\b(KSK|ZSK)\br   upperr   r   r   r   	t_KEYTYPEL   s    zPolicyLex.t_KEYTYPEc                 C   s   |j  |_ |S )zc\b(DH|ECC|RSASHA1|NSEC3RSASHA1|RSASHA256|RSASHA512|ECDSAP256SHA256|ECDSAP384SHA384|ED25519|ED448)\br    r   r   r   r   	t_ALGNAMEQ   s    zPolicyLex.t_ALGNAMEc                 C   s   | j |jd|_|S )z[A-Za-z._-][\w._-]*r   reserved_mapgetr   typer   r   r   r   t_STRV   s    zPolicyLex.t_STRc                 C   s&   | j |jd|_|jdd |_|S )z"([^"\n]|(\\"))*"r   r   r$   r   r   r   r   	t_QSTRING[   s    zPolicyLex.t_QSTRINGc                 C   s   t |j|_|S )z\d+)intr   r   r   r   r   t_NUMBERa   s    zPolicyLex.t_NUMBERc                 C   s"   t d|jd   |jd d S )NzIllegal character '%s'r   r   )printr   r   skipr   r   r   r   t_errorf   s    zPolicyLex.t_errorc                 K   sh   dt tv rtdd}n
tdd}| jD ]}|| j| |< q*tjf | tj	tj
B d|| _d S )N	maketrans_-)objectZreflags)dirstrr0   reservedr%   r   	translatelexr   VERBOSEr   r   )r   kwargsZtransrr   r   r   __init__j   s    

zPolicyLex.__init__c                 C   s*   | j | | j  }|sq&t| qd S N)r   inputtokenr-   )r   textr   r   r   r   tests   s
    
zPolicyLex.testN)__name__
__module____qualname__r6   tokensr%   Zt_ignoreZt_ignore_olcommentZt_LBRACEZt_RBRACEZt_SEMIr   r   r   r"   r#   r(   r*   r,   r/   r<   rA   r   r   r   r   r      s&   		r   c                	   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZddgddgddgddgdddddZdddZd	d
 Zdd Zdd Zdd Zdd ZdS )PolicyFNi   i   i   )RSASHA1NSEC3RSASHA1	RSASHA256	RSASHA512ECDSAP256SHA256ECDSAP384SHA384ED25519ED448c                 C   s   || _ || _|| _d S r=   )name	algorithmparent)r   rO   rP   rQ   r   r   r   r<      s    zPolicy.__init__c                 C   sF  d| j rdp"| jrdp"| jr dp"d| jp*d| jr8| jjp:d| jrRdt| j d pTd| jp\d| jrlt| jpnd| j	r~t| j	pd| j
rt| j
pd| jrt| jpd| jrt| jpd| jrt| jpd| jrt| jpd| jrt| jpd| jrt| jpd| jrt| jpd| jr(t| jp*d| jr>t| jp@df S )	Na  %spolicy %s:
	inherits %s
	directory %s
	algorithm %s
	coverage %s
	ksk_keysize %s
	zsk_keysize %s
	ksk_rollperiod %s
	zsk_rollperiod %s
	ksk_prepublish %s
	ksk_postpublish %s
	zsk_prepublish %s
	zsk_postpublish %s
	ksk_standby %s
	zsk_standby %s
	keyttl %s
zconstructed zzone z
algorithm  ZUNKNOWNNone")is_constructedis_zoneis_algrO   rQ   	directoryr5   rP   coverageksk_keysizezsk_keysizeksk_rollperiodzsk_rollperiodksk_prepublishksk_postpublishzsk_prepublishzsk_postpublishksk_standbyzsk_standbykeyttlr   r   r   r   __repr__   s<    zPolicy.__repr__c                 C   s    |d |  ko|d kS   S )Nr   r   r   )r   Zkey_sizeZ
size_ranger   r   r   Z__verify_size   s    zPolicy.__verify_sizec                 C   s   | j S r=   )rO   re   r   r   r   get_name   s    zPolicy.get_namec                 C   s   | j S r=   )rU   re   r   r   r   constructed   s    zPolicy.constructedc                 C   s  | j r:| jdur:| j| j kr:t| j  dd| j| j f fS | j rj| jdurj| j| j krjdd| j| j f fS | jr| jdur| j| jkrdd| j| jf fS | jr| jdur| j| jkrdd| j| jf fS | j r| jr| jr| j| j | j krdd| j| j| j f fS | jrR| jrR| jrR| j| j | jkrRdd| j| j| jf fS | jdur| j	| j}|dur| 
| j|sdd	| j|f fS | 
| j|sdd
| j|f fS | jdv rd| _d| _dS )zqCheck if the values in the policy make sense
        :return: True/False if the policy passes validation
        NFz6KSK pre-publish period (%d) exceeds rollover period %dz7KSK post-publish period (%d) exceeds rollover period %dz6ZSK pre-publish period (%d) exceeds rollover period %dz7ZSK post-publish period (%d) exceeds rollover period %dzGKSK pre/post-publish periods (%d/%d) combined exceed rollover period %dzGZSK pre/post-publish periods (%d/%d) combined exceed rollover period %dz&KSK key size %d outside valid range %sz&ZSK key size %d outside valid range %s)rK   rL   rM   rN   )TrR   )r\   r^   r-   r_   r]   r`   ra   rP   valid_key_sz_per_algor&   _Policy__verify_sizerZ   r[   )r   Zkey_sz_ranger   r   r   validate   s    


	

	

	

	
zPolicy.validate)NNN)rB   rC   rD   rV   rW   rU   r\   r]   r^   r`   r_   ra   rZ   r[   rb   rc   rd   rY   rX   ri   r<   rf   rj   rg   rh   rk   r   r   r   r   rF      s>   
/rF   c                   @   s   e Zd ZdS )PolicyExceptionN)rB   rC   rD   r   r   r   r   rl   X  s   rl   c                   @   s.  e Zd Zi Zi Zi ZdZdZdZdEddZ	dd Z
dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Z d3d4 Z!d5d6 Z"d7d8 Z#d9d: Z$d;d< Z%d=d> Z&d?d@ Z'dAdB Z(dCdD Z)dS )Fdnssec_policyNTc                 K   s  t  | _| jj| _d|vr"d|d< d|vr2d|d< tjf d| i|| _| d t }d |_d|_d|_	d|_
t|| jd< d| jd _d| jd _t|| jd	< d	| jd	 _d	| jd	 _t|| jd
< d
| jd
 _d
| jd
 _t|| jd< d| jd _d| jd _t|| jd< d| jd _d| jd _d | jd _	d | jd _
t|| jd< d| jd _d| jd _d | jd _	d | jd _
t|| jd< d| jd _d| jd _d | jd _	d | jd _
t|| jd< d| jd _d| jd _d | jd _	d | jd _
|r| | d S )NdebugFwrite_tablesmodulea  policy global { algorithm rsasha256;
                                      key-size ksk 2048;
                                      key-size zsk 2048;
                                      roll-period ksk 0;
                                      roll-period zsk 1y;
                                      pre-publish ksk 1mo;
                                      pre-publish zsk 1mo;
                                      post-publish ksk 1mo;
                                      post-publish zsk 1mo;
                                      standby ksk 0;
                                      standby zsk 0;
                                      keyttl 1h;
                                      coverage 6mo; };
                      policy default { policy global; };Ti   rG   rH   rI   rJ   rK   rL   rM   rN   )r   plexrE   yaccparsersetuprF   rP   rW   rZ   r[   r   
alg_policyrO   load)r   filenamer:   pr   r   r   r<   d  sb    
zdnssec_policy.__init__c                 C   s\   || _ d| _t|.}| }d| jj_| j| W d    n1 sH0    Y  d | _ d S NTr   )	rw   initialopenreadrq   r   r   rs   parse)r   rw   fr@   r   r   r   rv     s    

*zdnssec_policy.loadc                 C   s    d| _ d| jj_| j| d S ry   )rz   rq   r   r   rs   r}   )r   r@   r   r   r   rt     s    
zdnssec_policy.setupc           	      K   s  |  }d }|| jv r | j| }|d u rBt| jd }||_d|_|jd u r~|jpZ| jd }|rn|jsn|j}q\|rx|jpzd |_|j| jv r| j|j }nt	d|j
d u r|jp| jd }|d ur|j
s|j}q|o|j
|_
|jd u r$|jp| jd }|r|js|j}q|r|jp |j|_|jd u rr|jp@| jd }|jr\|js\|j}qB|rj|jpn|j|_|jd u r|jp| jd }|jr|js|j}q|r|jp|j|_|jd u r|jp| jd }|jr|js|j}q|r|jp
|j|_|jd u r\|jp*| jd }|jrF|jsF|j}q,|rT|jpX|j|_|jd u r|jpx| jd }|jr|js|j}qz|r|jp|j|_|jd u r|jp| jd }|jr|js|j}q|r|jp|j|_|jd u rF|jp| jd }|jr0|js0|j}q|r>|jpB|j|_|jd u r|jpb| jd }|jr~|js~|j}qd|r|jp|j|_|jd u r|jp| jd }|d ur|js|j}q|o|j|_d|vs|d s| \}}|st	|d S |S )NdefaultTzalgorithm not foundZ
novalidate)r   zone_policyr   named_policyrO   rU   rP   rQ   ru   rl   rX   rY   rZ   r[   r\   r]   r^   r`   r_   ra   rd   rk   )	r   Zzoner:   zrx   rQ   ZapZvalidmsgr   r   r   policy  s    













zdnssec_policy.policyc                 C   s   dS )z4policylist : init policy
        | policylist policyNr   r   rx   r   r   r   p_policylist#  s    zdnssec_policy.p_policylistc                 C   s
   d| _ dS )zinit :FN)rz   r   r   r   r   p_init(  s    zdnssec_policy.p_initc                 C   s   dS )z@policy : alg_policy
        | zone_policy
        | named_policyNr   r   r   r   r   p_policy,  s    zdnssec_policy.p_policyc                 C   s   |d |d< dS )z1name : STR
        | KEYTYPE
        | DATESUFFIXr   r   Nr   r   r   r   r   p_name2  s    zdnssec_policy.p_namec                 C   s,   |d   |d< td|d s(tddS )zEdomain : STR
        | QSTRING
        | KEYTYPE
        | DATESUFFIXr   r   z^[\w.-][\w.-]*$zinvalid domainN)stripr   r   rl   r   r   r   r   p_domain9  s    zdnssec_policy.p_domainc                 C   s   t  | _dS )znew_policy :N)rF   currentr   r   r   r   p_new_policyC  s    zdnssec_policy.p_new_policyc                 C   s(   |d | j _d| j _| j | j|d < dS )zFalg_policy : ALGORITHM_POLICY ALGNAME new_policy alg_option_group SEMI   TN)r   rO   rW   ru   r   r   r   r   p_alg_policyG  s    zdnssec_policy.p_alg_policyc                 C   s8   |d  d| j_d| j_| j| j|d  d < dS )z=zone_policy : ZONE domain new_policy policy_option_group SEMIr   .TN)rstripr   rO   rV   r   r   r   r   r   r   p_zone_policyN  s    zdnssec_policy.p_zone_policyc                 C   s$   |d | j _| j | j|d  < dS )z>named_policy : POLICY name new_policy policy_option_group SEMIr   N)r   rO   r   r   r   r   r   r   p_named_policyU  s    zdnssec_policy.p_named_policyc                 C   s   |d |d< dS )zduration : NUMBERr   r   Nr   r   r   r   r   p_duration_1[  s    zdnssec_policy.p_duration_1c                 C   s   d|d< dS )zduration : NONENr   r   r   r   r   r   p_duration_2`  s    zdnssec_policy.p_duration_2c                 C   s   |d dkr|d d |d< n|d dkr<|d d |d< n|d dkrZ|d d	 |d< n||d d
krx|d d |d< n^|d dkr|d d |d< n@|d dkr|d d |d< n"|d dkr|d |d< nt ddS )zduration : NUMBER DATESUFFIXr   yr   i3r   Zmoi ' wi:	 diQ hi  mi<   szinvalid durationN)rl   r   r   r   r   p_duration_3e  s    zdnssec_policy.p_duration_3c                 C   s   dS )z6policy_option_group : LBRACE policy_option_list RBRACENr   r   r   r   r   p_policy_option_groupx  s    z#dnssec_policy.p_policy_option_groupc                 C   s   dS )zWpolicy_option_list : policy_option SEMI
        | policy_option_list policy_option SEMINr   r   r   r   r   p_policy_option_list|  s    z"dnssec_policy.p_policy_option_listc                 C   s   dS )a  policy_option : parent_option
        | directory_option
        | coverage_option
        | rollperiod_option
        | prepublish_option
        | postpublish_option
        | keysize_option
        | algorithm_option
        | keyttl_option
        | standby_optionNr   r   r   r   r   p_policy_option  s    zdnssec_policy.p_policy_optionc                 C   s   dS )z0alg_option_group : LBRACE alg_option_list RBRACENr   r   r   r   r   p_alg_option_group  s    z dnssec_policy.p_alg_option_groupc                 C   s   dS )zKalg_option_list : alg_option SEMI
        | alg_option_list alg_option SEMINr   r   r   r   r   p_alg_option_list  s    zdnssec_policy.p_alg_option_listc                 C   s   dS )zalg_option : coverage_option
        | rollperiod_option
        | prepublish_option
        | postpublish_option
        | keyttl_option
        | keysize_option
        | standby_optionNr   r   r   r   r   p_alg_option  s    zdnssec_policy.p_alg_optionc                 C   s   | j |d   | j_dS )zparent_option : POLICY namer   N)r   r   r   rQ   r   r   r   r   p_parent_option  s    zdnssec_policy.p_parent_optionc                 C   s   |d | j _dS )z$directory_option : DIRECTORY QSTRINGr   N)r   rX   r   r   r   r   p_directory_option  s    z dnssec_policy.p_directory_optionc                 C   s   |d | j _dS )z#coverage_option : COVERAGE durationr   N)r   rY   r   r   r   r   p_coverage_option  s    zdnssec_policy.p_coverage_optionc                 C   s*   |d dkr|d | j _n|d | j _dS )z0rollperiod_option : ROLL_PERIOD KEYTYPE durationr   KSK   N)r   r\   r]   r   r   r   r   p_rollperiod_option  s    z!dnssec_policy.p_rollperiod_optionc                 C   s*   |d dkr|d | j _n|d | j _dS )z0prepublish_option : PRE_PUBLISH KEYTYPE durationr   r   r   N)r   r^   r`   r   r   r   r   p_prepublish_option  s    z!dnssec_policy.p_prepublish_optionc                 C   s*   |d dkr|d | j _n|d | j _dS )z2postpublish_option : POST_PUBLISH KEYTYPE durationr   r   r   N)r   r_   ra   r   r   r   r   p_postpublish_option  s    z"dnssec_policy.p_postpublish_optionc                 C   s*   |d dkr|d | j _n|d | j _dS )z(keysize_option : KEY_SIZE KEYTYPE NUMBERr   r   r   N)r   rZ   r[   r   r   r   r   p_keysize_option  s    zdnssec_policy.p_keysize_optionc                 C   s*   |d dkr|d | j _n|d | j _dS )z'standby_option : STANDBY KEYTYPE NUMBERr   r   r   N)r   rb   rc   r   r   r   r   p_standby_option  s    zdnssec_policy.p_standby_optionc                 C   s   |d | j _dS )zkeyttl_option : KEYTTL durationr   N)r   rd   r   r   r   r   p_keyttl_option  s    zdnssec_policy.p_keyttl_optionc                 C   s   |d | j _dS )z$algorithm_option : ALGORITHM ALGNAMEr   N)r   rP   r   r   r   r   p_algorithm_option  s    z dnssec_policy.p_algorithm_optionc                 C   sd   |r.t d| jpd| jrdnd|j|jf  n2| js`td| jp@d| jrJdnd|rV|jpXdf d S )Nz%s%s%d:syntax error near '%s'rR   :z%s%s%d:unexpected end of inputr   )r-   rw   r   r   rz   rl   r   r   r   r   p_error  s    zdnssec_policy.p_error)N)*rB   rC   rD   ru   r   r   r   rw   rz   r<   rv   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rm   \  sN   
O
a

rm   __main__r   r8   r   )rn   r}   T)ro   rn   r   znonexistent.zone)r   Zply.lexr8   Zply.yaccrr   stringr   r   rF   	Exceptionrl   rm   rB   sysargvr{   filer|   r@   closerq   rA   Zppr-   r   r   eargsr   r   r   r   <module>   s6   i Z   

