o
    �Faê|  ã                   @   sÞ   d dl Z d dlZd dlZd dlmZ d dlmZ G dd„ dƒZG dd„ deƒZG dd	„ d	eƒZ	G d
d„ deƒZ
G dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZdS )é    N©ÚUFWError)Údebugc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú
UFWCommandz"Generic class for parser commands.c                 C   s,   || _ g | _|| jvr| j |¡ || _d S ©N)ÚcommandÚtypesÚappendÚtype)Úselfr
   r   © r   ú,/usr/lib/python3/dist-packages/ufw/parser.pyÚ__init__.   s
   

zUFWCommand.__init__c                 C   s&   t |ƒdk r	tƒ ‚t|d  ¡ ƒ}|S )Né   r   )ÚlenÚ
ValueErrorÚUFWParserResponseÚlower©r   ÚargvÚrr   r   r   Úparse5   s   zUFWCommand.parsec                 C   s   t dƒ‚)Nz!UFWCommand.help: need to overrider   )r   Úargsr   r   r   Úhelp=   s   zUFWCommand.helpN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   ,   s
    r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ ZeeƒZdS )	ÚUFWCommandRulez#Class for parsing ufw rule commandsc                 C   ó   d}t  | ||¡ d S )NÚrule©r   r   ©r   r   r
   r   r   r   r   C   ó   zUFWCommandRule.__init__c               
   C   s  d}d}d}d}d}d}d}d}	d}
d}t |ƒdkr)|d  ¡ dkr)| |d ¡ t |ƒdkrª|d  ¡ dkrkt |ƒdkrkd}| |d ¡ d }zt|d ƒ}W n ty]   |d }Y nw |d urjtd	| ƒ}|S n;|d  ¡ d
kr™t |ƒdk r|tƒ ‚|d }	|	dksˆ|	dkr’tdƒ|	 }t|ƒ‚|d= |d= n|d  ¡ dkr¦d}	|d= |d }|dkr½|dkr½|dkr½|dkr½tƒ ‚t |ƒ}|dk rÈtƒ ‚d}|dkrä|d  ¡ dksÞ|d  ¡ dkrä|d  ¡ }|dk�r|d dk�r|d  ¡ dk�s|d  ¡ dk�r|d  ¡ }|d= t |ƒ}d}|dk�r[| 	d¡dk�s&| 	d¡dk�r[tdƒ}|d  ¡ dk�r@|d  ¡ dk�r@t|ƒ‚|dk �sN|d  ¡ dk�rRt|ƒ‚|d= t |ƒ}d}d}|�rz|dk�rz|d  ¡ dk�sw|d  ¡ dk�rzd}n|dk�r“|d  ¡ dk�s‘|d  ¡ dk�r“d}|dk�r¥||  ¡ }
||= t |ƒ}d|v �r²tdƒ}t|ƒ‚d|v �r¿tdƒ}t|ƒ‚d}d|v �rû| 
d¡}|t |ƒd k�rÜtd ƒ}t|ƒ‚||d  }d!|v �rïtd"ƒ}t|ƒ‚||d = ||= t |ƒ}|dk �s|d#k�rtƒ ‚|}|
dk�r|d$|
 7 }tjj|dd|tj |¡d%�}|�r+||_n|	dk�rAz| |	¡ W n	 t�y@   ‚ w |dk�rÕtj |d ¡�rsz
tj |d ¡ W n t�yr   d&}|d |_| |d d'¡ Y nw |jdk�rÓztj |d ¡\}}W n t�y– } zt|ƒ‚d }~ww t d(|¡�s²d)|v �s¨d*|v �r°td+ƒ}t|ƒ‚|}z| |¡ | |d'¡ d&}W �nc t�yÒ   td,ƒ}t|ƒ‚w �nQ|d d dk�rætd-ƒ}t|ƒ‚d.|v�rd/|v�rd|v�rd|v�rtd0ƒ}t|ƒ‚g d1¢}| 	d/¡dk�sN| 	d.¡dk�sN| 	d2¡dk�sN| 	d3¡dk�sN| 	d¡dk�sN| 	d¡dk�sN| 	d4¡dk�sN| 	d4¡dk�rV| 	d2¡dk�rVtd5ƒ}t|ƒ‚d}d}|D �]•}|d dk�ry|| |v�rytd6ƒ||  }t|ƒ‚|d2k�r£|d |k �r›z| ||d  ¡ W �n[ t�yš   ‚ w td7ƒ}t|ƒ‚|dk�s­|dk�rê|d |k �ràz"|dk�rÅ| d||d  ¡ n|dk�rÔ| d||d  ¡ W �n t�yß   ‚ w td8ƒ| }t|ƒ‚|d.k�r1|d |k �r)z&||d   ¡ }|dk�r	d9}d}ntj |d:¡�rd;}nd<}| |¡ W n	 t�y%   ‚ w d=}nÄtd>ƒ}t|ƒ‚|d/k�rx|d |k �rpz&||d   ¡ }|dk�rPd9}d}ntj |d:¡�r[d;}nd<}| |¡ W n	 t�yl   ‚ w d'}n}td?ƒ}t|ƒ‚|d3k�s‚|d4k�rí|d |k �rå|dk�r˜td@ƒ| }t|ƒ‚||d  }|d4k�r°|d=k�r¬||_n'||_n#t d(|¡�sÓd)|v �sÁd*|v �rÉtd+ƒ}t|ƒ‚|d=k�rÑ|}n|}z| ||¡ W n t�yä   ‚ w tdAƒ}t|ƒ‚|d7 }�q\|dk�r |dk�r d&}n&|dk�r|dk�r||k�rtdBƒ}t|ƒ‚|dk�r|}n|dk�r&|}|dk�s0|dk�rÎd}|dk�rPztj |¡}W n t�yO   tdCƒ}t|ƒ‚w |dk�r¬|dk�s_|dk�rxztj |¡}W nD t�yw   tdCƒ}t|ƒ‚w ztj |¡}W n t�y�   tdCƒ}t|ƒ‚w |dk�s›||k�rž|}n|dk�r¤ntdDƒ}t|ƒ‚|jdk�r¸| |¡ n|dk�rÎ|j|k�rÎtdEƒ|j }t|ƒ‚|�rì|jtjj v �rç|d&k�rçt!dF|j ƒ d<}| "|¡ t|ƒ}| j#|j$dG< ||j$d< ||j$dH< |S )INÚ ÚanyFr   r    Údeleter   Tz	delete-%dÚinserté   Ú0z-1z#Cannot insert rule at position '%s'ÚprependéÿÿÿÿÚallowÚdenyÚrejectÚlimité   ÚinÚoutÚonzInvalid interface clauseé   Úlogzlog-allzOption 'log' not allowed herez!Option 'log-all' not allowed hereÚcommentz*Option 'comment' missing required argumentú'zComment may not contain "'"é   Ú_)Ú	directionr6   ÚbothÚdstz^\d([0-9,:]*\d+)*$ú,ú:zPort ranges must be numericzBad portzWrong number of argumentsÚfromÚtozNeed 'to' or 'from' clause)Úprotor?   r@   ÚportÚappr1   r2   rA   rB   rC   zImproper rule syntaxzInvalid token '%s'zInvalid 'proto' clausezInvalid '%s' clauseú	0.0.0.0/0Ú6Úv6Úv4ÚsrczInvalid 'from' clausezInvalid 'to' clausezNeed 'from' or 'to' with '%s'zInvalid 'port' clausez%Mixed IP versions for 'from' and 'to'zCould not find protocolzProtocol mismatch (from/to)z,Protocol mismatch with specified protocol %sz*Adjusting iptype to 'v4' for protocol '%s'r
   Úiptype)%r   r   ÚremoveÚintÚ	Exceptionr   r   r9   r   ÚcountÚindexÚufwÚcommonÚUFWRuleÚutilÚ
hex_encodeÚset_positionÚapplicationsÚvalid_profile_nameÚget_services_protoÚdappÚset_portÚparse_port_protoÚreÚmatchÚset_protocolÚset_interfaceÚvalid_addressÚset_srcÚset_dstÚsappÚprotocolÚipv4_only_protocolsr   Úverifyr
   Údata) r   r   Úactionr    r
   Ú	from_typeÚto_typeÚfrom_serviceÚ
to_serviceÚ
insert_posÚlogtyperJ   Úrule_numr   Úerr_msgÚnargsÚrule_directionÚhas_interfaceÚlog_idxr6   Úcomment_idxÚrule_actionrB   rA   ÚeÚkeysÚiÚlocÚargÚfaddrÚsaddrÚtmpr   r   r   r   G   sj  ÿþÿ**$"








þ
ÿ

ý€ÿ

þð
 

ÿ

€ÿ

ÿ

ÿ
ÿ


ÿ



û
ûû
ÿ
ÿ


zUFWCommandRule.parsec                 C   s´  | j }| jdks| jdkr„| jdks| jdkr„| jdkr„| jdkr„| jdkr„| jdkr„| jdkr„| jdkr<|d| j 7 }| j	dkrH|d| j	 7 }| j
dkrbd| j
v rZ|d| j
 7 }n|d| j
 7 }n|d| j 7 }| jdkru|d	| j 7 }| jdkr‚|d
|  ¡  7 }|S | jdkr�|d| j 7 }| jdkr�|d| j 7 }n| jdkr©|d| j 7 }| j	dkrµ|d| j	 7 }dD ]_}|dkrÉ| j}| j}| j}d}n| j}| j}| j
}d}|dksÜ|dkrÞd}|dksë|dksë|dk�r|d||f 7 }|dk�rd|v �r|d| 7 }q·|d| 7 }q·|dk�r|d| 7 }q·d|v�r1d|v�r1| jdk�r1| jdk�r1|d7 }| jdk�rJ| j
dk�rJ| jdk�rJ|d| j 7 }| jdk�rX|d
|  ¡  7 }|S )zGet command string for rulerD   z::/0r%   r$   r2   z %sú z '%s'z/%sz comment '%s'z	 in on %sz
 out on %s)rH   r<   rH   r?   r@   z %s %sz	 app '%s'z app %sz port %sz to z from z to anyz	 proto %s)rg   r<   rH   Úsportrb   Úinterface_inÚinterface_outÚdportr:   rm   rX   rc   r6   Úget_comment)r   Úresrx   ry   rB   rC   Údirr   r   r   Úget_commandÇ  sv   










2
Ñ





€$zUFWCommandRule.get_commandN)r   r   r   r   r   r   r†   Ústaticmethodr   r   r   r   r   A   s       Mr   c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )ÚUFWCommandRouteRulez)Class for parsing ufw route rule commandsc                 C   s   t  | |¡ d| _d S )NÚroute)r   r   r
   )r   r   r   r   r   r     s   
zUFWCommandRouteRule.__init__c           	      C   sh  |d dksJ ‚d|v r3|  d¡}d}t|ƒ|kr3zt||d  ƒ tdƒ}t|ƒ‚ ty2   Y nw d }d }d }d |¡}d|v rrd	|v rrd
}|  d¡|  d
¡krTd}||  |¡d  }|d|  |¡… ||  |¡d d …  }nt d|¡sŽt d|¡sŽd|v s†d|v rŽtdƒ}t|ƒ‚|}d|d< t	 
| |¡}d|jv r²d|jd _|r²|r²|jd  ||¡ |S )Nr   rŠ   r&   r$   r   z9'route delete NUM' unsupported. Use 'delete NUM' instead.r~   z in on z out on r2   r1   r0   r4   z (in|out) on z app (in|out) z in z out z'Invalid interface clause for route ruler    T)rN   r   rK   r9   r   r   Újoinr[   Úsearchr   r   rf   Úforwardr^   )	r   r   Úidxro   Ú	rule_argvÚ	interfaceÚstripÚsr   r   r   r   r     sH   
þ	
*
ÿ
zUFWCommandRouteRule.parseN©r   r   r   r   r   r   r   r   r   r   r‰     ó    r‰   c                   @   rˆ   )ÚUFWCommandAppz*Class for parsing ufw application commandsc                 C   r   )NrC   r!   r"   r   r   r   r   Z  r#   zUFWCommandApp.__init__c                 C   sJ  d}d}d}|d dkrt ƒ ‚|d= t|ƒ}|d  ¡ }|dks$|dkrO|dkr9|d d	kr9d
}| d	¡ t|ƒ}|dk r@t ƒ ‚t|d ƒ d¡}|rO|d7 }|dkrZ|dkrZt ƒ ‚|dkr”|dk ret ƒ ‚|d  ¡ dkrpd}n$|d  ¡ dkr{d}n|d  ¡ dkr†d}n|d  ¡ dkr‘d}nt ƒ ‚t|ƒ}| j|jd< ||jd< |S )zParse applications command.r$   Fr   rC   ÚinfoÚupdater4   r   z	--add-newTr0   z[']z	-with-newÚlistÚdefaultr,   údefault-allowr-   údefault-denyr.   údefault-rejectÚskipzdefault-skipr
   Úname)	r   r   r   rJ   Ústrr‘   r   r
   rf   )r   r   rž   rg   Úaddnewrp   r   r   r   r   r   ^  sH   

zUFWCommandApp.parseNr“   r   r   r   r   r•   X  r”   r•   c                   @   rˆ   )ÚUFWCommandBasicz$Class for parsing ufw basic commandsc                 C   r   )NÚbasicr!   r"   r   r   r   r   •  r#   zUFWCommandBasic.__init__c                 C   s   t |ƒdkr	tƒ ‚t | |¡S )Nr   )r   r   r   r   )r   r   r   r   r   r   ™  s   zUFWCommandBasic.parseNr“   r   r   r   r   r¡   “  r”   r¡   c                   @   rˆ   )ÚUFWCommandDefaultz&Class for parsing ufw default commandsc                 C   r   )Nr™   r!   r"   r   r   r   r   ¡  r#   zUFWCommandDefault.__init__c                 C   sJ  t |ƒdk r	tƒ ‚d}d}t |ƒdkrw|d  ¡ dkrF|d  ¡ dkrF|d  ¡ dkrF|d  ¡ dkrF|d  ¡ dkrF|d  ¡ dkrFtƒ ‚|d  ¡  d	¡rRd}n%|d  ¡  d
¡r^d}n|d  ¡ dksn|d  ¡ dkrqd}n|d  ¡ }|d  ¡ dkr‚d}n|d  ¡ dkr�d}n|d  ¡ dkr˜d}ntƒ ‚|d| 7 }t|ƒS )Nr0   r$   ÚincomingÚinputÚroutedr�   ÚoutputÚoutgoingr1   r2   r   r-   r›   r,   rš   r.   rœ   z-%s)r   r   r   Ú
startswithr   )r   r   rg   r:   r   r   r   r   ¥  s8    zUFWCommandDefault.parseNr“   r   r   r   r   r£   Ÿ  r”   r£   c                   @   rˆ   )ÚUFWCommandLoggingz&Class for parsing ufw logging commandsc                 C   r   )NÚloggingr!   r"   r   r   r   r   Ï  r#   zUFWCommandLogging.__init__c                 C   s¸   d}t |ƒdk rtƒ ‚|d  ¡ dkrd}t|ƒS |d  ¡ dksA|d  ¡ dksA|d  ¡ dksA|d  ¡ d	ksA|d  ¡ d
krYd}|d  ¡ dkrU|d|d  ¡  7 }t|ƒS tƒ ‚)Nr$   r0   r   Úoffzlogging-offr3   ÚlowÚmediumÚhighÚfullz
logging-onr9   ©r   r   r   r   ©r   r   rg   r   r   r   r   Ó  s   
 ÷ þzUFWCommandLogging.parseNr“   r   r   r   r   rª   Í  r”   rª   c                   @   rˆ   )ÚUFWCommandStatusz%Class for parsing ufw status commandsc                 C   r   )NÚstatusr!   r"   r   r   r   r   ç  r#   zUFWCommandStatus.__init__c                 C   sl   t  | |¡}t|ƒdkrd|_|S t|ƒdkr4|d  ¡ dkr$d|_|S |d  ¡ dkr1d|_|S tƒ ‚|S )Nr   r´   Úverbosezstatus-verboseÚnumberedzstatus-numbered)r   r   r   rg   r   r   r   r   r   r   r   ë  s   ùüÿzUFWCommandStatus.parseNr“   r   r   r   r   r³   å  r”   r³   c                   @   rˆ   )ÚUFWCommandShowz#Class for parsing ufw show commandsc                 C   r   )NÚshowr!   r"   r   r   r   r   û  r#   zUFWCommandShow.__init__c                 C   sü   d}t |ƒdkrtƒ ‚|d  ¡ dkrd}t|ƒS |d  ¡ dkr'd}t|ƒS |d  ¡ dkr5d}t|ƒS |d  ¡ d	krCd
}t|ƒS |d  ¡ dkrQd}t|ƒS |d  ¡ dkr_d}t|ƒS |d  ¡ dkrmd}t|ƒS |d  ¡ dkr{d}t|ƒS tƒ ‚)Nr$   r   Úrawzshow-rawzbefore-ruleszshow-beforez
user-rulesz	show-userzafter-rulesz
show-afterzlogging-ruleszshow-loggingÚbuiltinszshow-builtinsÚ	listeningzshow-listeningÚaddedz
show-addedr±   r²   r   r   r   r   ÿ  s8   ïñóõ
÷ùûþzUFWCommandShow.parseNr“   r   r   r   r   r·   ù  r”   r·   c                   @   rˆ   )r   zClass for ufw parser responsec                 C   s    |  ¡ | _d| _d| _i | _d S )NF)r   rg   ÚdryrunÚforcerf   )r   rg   r   r   r   r     s   

zUFWParserResponse.__init__c                 C   sP   d| j  }t| j ¡ ƒ}| ¡  |D ]}|d|| j| f 7 }q|d7 }t|ƒS )Nzaction='%s'z,%s='%s'Ú
)rg   r˜   rf   rw   ÚsortÚrepr)r   r’   rw   rx   r   r   r   Ú__str__!  s   
zUFWParserResponse.__str__N)r   r   r   r   r   rÂ   r   r   r   r   r     s    r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú	UFWParserzClass for ufw parserc                 C   s
   i | _ d S r   )Úcommands)r   r   r   r   r   .  s   
zUFWParser.__init__c                 C   sD   |  ¡ t| j ¡ ƒvrtƒ ‚|  ¡ t| j|  ¡ ƒvrtƒ ‚|  ¡ S )z=Return command if it is allowed, otherwise raise an exception)r   r˜   rÄ   rw   r   )r   r
   Úcmdr   r   r   Úallowed_command1  s
   zUFWParser.allowed_commandc           
      C   sr  d}t |ƒdkr|d  ¡ dkrd}| |d ¡ d}t |ƒdkr:|d  ¡ dks1|d  ¡ dkr:d}| |d ¡ d}d}|d  ¡ }t |ƒdkrk|t| j ¡ ƒv rk|d  ¡ t| j|  ¡ ƒv rk|}|d  ¡ }n4|}t| j ¡ ƒD ]$}|| j| v r˜t| j| | tƒr”t| j| | d	ƒd
kr”qt|} nqt|dkrŸd
}|  	||¡}| j| | }| 
|¡}	||	_||	_|	S )z(Parse command. Returns a UFWParserActionFr   z	--dry-runTz--forcez-fr$   r   r
   r    )r   r   rJ   r˜   rÄ   rw   Ú
isinstancer   ÚgetattrrÆ   r   r½   r¾   )
r   r   r½   r¾   rÅ   r
   r}   rx   rg   Úresponser   r   r   Úparse_command;  sB   ø	
zUFWParser.parse_commandc                 C   sz   |j du s
|j dkrd|j }nd|j  }|j| jvr!i | j|j< || j|j v r3tdƒ| }t|ƒ‚|| j|j |< dS )z"Register a command with the parserNr$   z%szCommand '%s' already exists)r   r
   rÄ   r9   r   )r   ÚcÚkeyro   r   r   r   Úregister_commandi  s   
zUFWParser.register_commandN)r   r   r   r   r   rÆ   rÊ   rÍ   r   r   r   r   rÃ   ,  s    
.rÃ   )r[   Úufw.utilrO   Úufw.applicationsÚ
ufw.commonr   r   r   r   r‰   r•   r¡   r£   rª   r³   r·   r   rÃ   r   r   r   r   Ú<module>   s&   $   YA;. 