3
\|                 @   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kr"| j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 j }|S )N   r   )len
ValueErrorUFWParserResponselower)r	   argvrr
   r
   r   parse5   s    zUFWCommand.parsec             C   s   t dd S )Nz!UFWCommand.help: need to override)r   )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   s   d}t j| || d S )Nrule)r   r   )r	   r   r   r
   r
   r   r   C   s    zUFWCommandRule.__init__c           A   C   s  d}d}d}d}d}d}d}d}	d}
d}t |dkrR|d j dkrR|j|d  t |dkr`|d j dkrt |dkrd}|j|d  d }yt|d }W n tk
r   |d }Y nX |d k	rtd	| }|S n~|d j d
kr<t |dk rt |d }	|	dks|	dkr.td|	 }t||d= |d= n|d j dkrXdG}	|d= |d }|dkr|dkr|dkr|dkrt t |}|dk rt d}|dkr|d j dks|d j dkr|d j }|dkr:|d dkr:|d j dks |d j dkr:|d j }|d= t |}d}|dkr|j	ddksh|j	ddkrtd}|d j dkr|d j dkrt||dk s|d j dkrt||d= t |}d}d}|r|dkr|d j dks
|d j dkrd}n2|dkrB|d j dks>|d j dkrBd}|dkrf|| j }
||= t |}d|krtd}t|d|krtd}t|d}d|kr|j
d}|t |d krtd}t|||d  }d |krtd!}t|||d = ||= t |}|dk s&|d"kr,t |}|
dkrF|d#|
 7 }tjj|dd|tjj|d$}|rr||_n2|	dkry|j|	 W n tk
r    Y nX |dkrtjj|d r
ytjj|d  W n4 tk
r   d%}|d |_|j|d d& Y nX |jdk
rytjj|d \}}W n, tk
rZ } zt|W Y d d }~X nX tjd'|sd(|ks~d)|krtd*}t||}y|j| |j|d& d%}W n& tk
r   td+}t|Y nX n|d d dkrtd,}t|nd-|kr>d.|kr>d|kr>d|kr>td/}t|nd0d-d.d1d2ddg}|j	d.dks|j	d-dks|j	d0dks|j	d1dks|j	ddks|j	ddks|j	d2dks|j	d2dkr|j	d0dkrtd3}t|d}d}xb|D ]X}|d dkr:|| |kr:td4||  }t||d0kr|d |k ry|j||d   W n tk
r    Y nX ntd5}t|n|dks|dkr0|d |k ryB|dkr|jd||d   n|dkr|jd||d   W n tk
r    Y nX ntd6| }t|n |d-kr|d |k ryL||d  j }|dkrnd7}d}ntjj|d8rd9}nd:}|j| W n tk
r    Y nX d;}ntd<}t|n|d.k	r^|d |k 	rLyL||d  j }|dk	rd7}d}ntjj|d8	rd9}nd:}|j| W n tk
	rD    Y nX d&}ntd=}t|n|d1k	sr|d2k
rP|d |k 
r@|dk	rtd>| }t|||d  }|d2k	r|d;k	r||_n||_nFtjd'|
sd(|k	sd)|k
r td*}t||d;k
r|}n|}y|j|| W n tk

r<    Y nX ntd?}t||d7 }q W |dk
rx|dk
rxd%}nN|dk
r|dk
r||k
rtd@}t|n|dk
r|}n|dk
r|}|dk
s|dkr*d}|dkr ytjj|}W n& tk
r   tdA}t|Y nX |dkr|dks>|dkrxytjj|}W n& tk
rt   tdA}t|Y nX nnytjj|}W n& tk
r   tdA}t|Y nX |dks||kr|}n|dkrntdB}t||jdkr|j| n,|dkr*|j|kr*tdC|j }t||rf|jtjj kr\|d%kr\t!dD|j  d:}|j"| t|}| j#|j$dE< ||j$d< ||j$dF< |S )HN anyFr   r   deleter   Tz	delete-%dinsert   0z-1z#Cannot insert rule at position '%s'Z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 "'"   _)	directionr-   Z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protoportappzImproper rule syntaxzInvalid token '%s'zInvalid 'proto' clausezInvalid '%s' clausez	0.0.0.0/06Zv6Z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   Ziptype)%r   r   removeint	Exceptionr   r   r0   r   countindexufwcommonZUFWRuleutilZ
hex_encodeZset_positionZapplicationsZvalid_profile_nameZget_services_protodappZset_portZparse_port_protorematchZset_protocolset_interfaceZvalid_addressZset_srcZset_dstsappprotocolZipv4_only_protocolsr   Zverifyr   data) r	   r   actionr   r   Z	from_typeZto_typeZfrom_serviceZ
to_serviceZ
insert_poslogtyper=   Zrule_numr   err_msgnargsZrule_directionZhas_interfaceZlog_idxr-   Zcomment_idxZrule_actionr8   r7   ekeysilocargZfaddrZsaddrtmpr
   r
   r   r   G   s>   

**$"












 


























zUFWCommandRule.parsec             C   s  | j }| jdks| jdko^| jdks.| jdko^| jdko^| jdko^| jdko^| jdko^| jdkr| jdkrz|d| j 7 }| j	dkr|d| j	 7 }| j
dkrd| j
kr|d| j
 7 }q|d| j
 7 }n&|d| j 7 }| 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rB|d| j 7 }n| jdkr\|d| j 7 }| j	dkrv|d| j	 7 }xdD ]}|dkr| j}| j}| j}d}n| j}| j}| j
}d}|dks|dkrd}|dks|dks|dkr||d||f 7 }|dkr.d|kr |d| 7 }n|d| 7 }n|dkr||d| 7 }q|W d|kr~d|kr~| jdkr~| jdkr~|d7 }| jdkr| j
dkr| jdkr|d| j 7 }| jdkr|d
| j  7 }|S )zGet command string for rulez	0.0.0.0/0z::/0r   r   r)   z %s z '%s'z/%sz comment '%s'z	 in on %sz
 out on %sr;   r2   r5   r6   z %s %sz	 app '%s'z app %sz port %sz to z from z to anyz	 proto %s)r;   r2   )rL   r2   r;   ZsportrI   Zinterface_inZinterface_outZdportr1   rM   rE   rJ   r-   Zget_comment)r   resrR   rS   r8   r9   dirr
   r
   r   get_command  sr    













$zUFWCommandRule.get_commandN)r   r   r   r   r   r   rY   staticmethodr
   r
   r
   r   r   A   s      Mr   c               @   s    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 j| | d| _d S )Nroute)r   r   r   )r	   r   r
   r
   r   r     s    zUFWCommandRouteRule.__init__c       	      C   s  |d dkst d|krl|jd}d}t||krly$t||d   td}t|W n tk
rj   Y nX d }d }d }dj|}d|krd	|krd
}|jd|jd
krd}||j|d  }|d|j| ||j|d d   }nJtj	d| r0tj	d| r0d|ksd|kr0td}t|n|}d|d< t
j| |}d|jkr~d|jd _|r~|r~|jd j|| |S )Nr   r\   r   r   r   z9'route delete NUM' unsupported. Use 'delete NUM' instead.rV   z in on z out on r)   r(   r'   r+   z (in|out) on z app (in|out) z in z out z'Invalid interface clause for route ruler   T)AssertionErrorrA   r   r>   r0   r   r   joinrF   searchr   r   rK   forwardrH   )	r	   r   idxrN   Z	rule_argvZ	interfacestripsr   r
   r
   r   r     sD    

*
zUFWCommandRouteRule.parseN)r   r   r   r   r   r   r
   r
   r
   r   r[     s   r[   c               @   s    e Zd ZdZdd Zdd ZdS )UFWCommandAppz*Class for parsing ufw application commandsc             C   s   d}t j| || d S )Nr9   )r   r   )r	   r   r   r
   r
   r   r   Z  s    zUFWCommandApp.__init__c             C   sP  d}d}d}|d dkrt  |d= t|}|d j }|dksH|dkr|dkrr|d d	krrd
}|jd	 t|}|dk rt  t|d jd}|r|d7 }|dkr|dkrt  |dkr.|dk rt  |d j dkrd}nL|d j dkrd}n6|d j dkrd}n|d j dkr(d}nt  t|}| j|jd< ||jd< |S )zParse applications command.r   Fr   r9   infoupdater+   r   z	--add-newTr'   z[']z	-with-newlistdefaultr#   zdefault-allowr$   zdefault-denyr%   zdefault-rejectskipzdefault-skipr   name)	r   r   r   r=   strrb   r   r   rK   )r	   r   rj   rL   ZaddnewrO   r   r
   r
   r   r   ^  sH    


zUFWCommandApp.parseN)r   r   r   r   r   r   r
   r
   r
   r   rd   X  s   rd   c               @   s    e Zd ZdZdd Zdd ZdS )UFWCommandBasicz$Class for parsing ufw basic commandsc             C   s   d}t j| || d S )NZbasic)r   r   )r	   r   r   r
   r
   r   r     s    zUFWCommandBasic.__init__c             C   s   t |dkrt tj| |S )Nr   )r   r   r   r   )r	   r   r
   r
   r   r     s    zUFWCommandBasic.parseN)r   r   r   r   r   r   r
   r
   r
   r   rl     s   rl   c               @   s    e Zd ZdZdd Zdd ZdS )UFWCommandDefaultz&Class for parsing ufw default commandsc             C   s   d}t j| || d S )Nrh   )r   r   )r	   r   r   r
   r
   r   r     s    zUFWCommandDefault.__init__c             C   sP  t |dk rt d}d}t |dkr|d j dkr|d j dkr|d j dkr|d j dkr|d j dkr|d j dkrt |d j jd	rd}nJ|d j jd
rd}n2|d j dks|d j dkrd}n|d j }|d j dkrd}n6|d j dkrd}n|d j dkr6d}nt |d| 7 }t|S )Nr'   r   ZincominginputZroutedr`   outputZoutgoingr(   r)   r   r$   zdefault-denyr#   zdefault-allowr%   zdefault-rejectz-%s)r   r   r   
startswithr   )r	   r   rL   r1   r
   r
   r   r     s8     zUFWCommandDefault.parseN)r   r   r   r   r   r   r
   r
   r
   r   rm     s   rm   c               @   s    e Zd ZdZdd Zdd ZdS )UFWCommandLoggingz&Class for parsing ufw logging commandsc             C   s   d}t j| || d S )NZlogging)r   r   )r	   r   r   r
   r
   r   r     s    zUFWCommandLogging.__init__c             C   s   d}t |dk rt n|d j dkr.d}n|d j dks~|d j dks~|d j dks~|d j d	ks~|d j d
krd}|d j dkr|d|d j  7 }nt t|S )Nr   r'   r   Zoffzlogging-offr*   ZlowZmediumZhighZfullz
logging-onr0   )r   r   r   r   )r	   r   rL   r
   r
   r   r     s      zUFWCommandLogging.parseN)r   r   r   r   r   r   r
   r
   r
   r   rq     s   rq   c               @   s    e Zd ZdZdd Zdd ZdS )UFWCommandStatusz%Class for parsing ufw status commandsc             C   s   d}t j| || d S )Nstatus)r   r   )r	   r   r   r
   r
   r   r     s    zUFWCommandStatus.__init__c             C   sf   t j| |}t|dkr d|_nBt|dkrb|d j dkrDd|_n|d j dkr\d|_nt |S )Nr   rs   verbosezstatus-verboseZnumberedzstatus-numbered)r   r   r   rL   r   r   )r	   r   r   r
   r
   r   r     s    zUFWCommandStatus.parseN)r   r   r   r   r   r   r
   r
   r
   r   rr     s   rr   c               @   s    e Zd ZdZdd Zdd ZdS )UFWCommandShowz#Class for parsing ufw show commandsc             C   s   d}t j| || d S )NZshow)r   r   )r	   r   r   r
   r
   r   r     s    zUFWCommandShow.__init__c             C   s   d}t |dkrt n|d j dkr.d}n|d j dkrDd}n|d j dkrZd}nt|d j d	krpd
}n^|d j dkrd}nH|d j dkrd}n2|d j dkrd}n|d j dkrd}nt t|S )Nr   r   rawzshow-rawzbefore-ruleszshow-beforez
user-rulesz	show-userzafter-rulesz
show-afterzlogging-ruleszshow-loggingbuiltinszshow-builtinsZ	listeningzshow-listeningZaddedz
show-added)r   r   r   r   )r	   r   rL   r
   r
   r   r     s*    zUFWCommandShow.parseN)r   r   r   r   r   r   r
   r
   r
   r   ru     s   ru   c               @   s    e Zd ZdZdd Zdd ZdS )r   zClass for ufw parser responsec             C   s    |j  | _d| _d| _i | _d S )NF)r   rL   dryrunforcerK   )r	   rL   r
   r
   r   r     s    
zUFWParserResponse.__init__c             C   sT   d| j  }t| jj }|j  x"|D ]}|d|| j| f 7 }q&W |d7 }t|S )Nzaction='%s'z,%s='%s'
)rL   rg   rK   rQ   sortrepr)r	   rc   rQ   rR   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 )N)commands)r	   r
   r
   r   r   .  s    zUFWParser.__init__c             C   sD   |j  t| jj krt |j  t| j| j kr<t |j  S )z=Return command if it is allowed, otherwise raise an exception)r   rg   r   rQ   r   )r	   r   cmdr
   r
   r   allowed_command1  s
    zUFWParser.allowed_commandc       
      C   sz  d}t |dkr2|d j dkr2d}|j|d  d}t |dkrt|d j dksb|d j dkrtd}|j|d  d}d}|d j }t |dkr|t| jj kr|d j t| j| j kr|}|d j }np|}x\t| jj D ]J}|| j| krt| j| | tr.t| j| | d	d
kr.q|}P qW |dkrFd
}| j	||}| j| | }|j
|}	||	_||	_|	S )z(Parse command. Returns a UFWParserActionFr   z	--dry-runTz--forcez-fr   r   r   r   )r   r   r=   rg   r   rQ   
isinstancer   getattrr   r   rx   ry   )
r	   r   rx   ry   r   r   rU   rR   rL   Zresponser
   r
   r   parse_command;  s@    

zUFWParser.parse_commandc             C   sz   |j dks|j dkr d|j }n
d|j  }|j| jkrBi | j|j< || j|j krftd| }t||| j|j |< dS )z"Register a command with the parserNr   z%szCommand '%s' already exists)r   r   r   r0   r   )r	   ckeyrN   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~   )rF   Zufw.utilrB   Zufw.applicationsZ
ufw.commonr   r   r   r   r[   rd   rl   rm   rq   rr   ru   r   r~   r
   r
   r
   r   <module>%   s$      YA;. 