
VÅVÐz  ã               @   s1  d  d l  Z  d  d l Z d  d l Z d  d l m Z d  d l m Z Gd d „  d ƒ Z Gd d „  d e ƒ Z Gd d	 „  d	 e ƒ Z	 Gd
 d „  d e ƒ Z
 Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d „  d ƒ Z Gd 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 r1 |  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   s5   t  | ƒ d k  r t ƒ  ‚ t | d j ƒ  ƒ } | S)Né   r   )ÚlenÚ
ValueErrorÚUFWParserResponseÚlower)r	   ÚargvÚrr
   r
   r   Úparse4   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               @   sF   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   A   s    zUFWCommandRule.__init__c           A   C   s‚  d } d } d } d } d } d } d } d }	 d }
 d } t  | ƒ d k ru | d j ƒ  d k ru | j | d ƒ t  | ƒ d k r| d j ƒ  d k r"t  | ƒ d k r"d } | j | d ƒ d  } y t | d ƒ } Wn t k
 rþ | d } Yn X| d  k r“t d	 | ƒ } | Snq | d j ƒ  d
 k r“t  | ƒ d k  rSt ƒ  ‚ | d }	 |	 d k r…t d ƒ |	 } t | ƒ ‚ | d =| d =| d } | d k rÖ| d k rÖ| d k rÖ| d k rÖt ƒ  ‚ t  | ƒ } | d k  r÷t ƒ  ‚ d } | d k rE| d j ƒ  d k s5| d j ƒ  d k rE| 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 rw| j	 d ƒ d k sì| j	 d ƒ d k rwt d ƒ } | d j ƒ  d k r0| d j ƒ  d k r0t | ƒ ‚ | d k  sR| d j ƒ  d k r^t | ƒ ‚ | d =t  | ƒ } d } d } | rÄ| d k rÄ| d j ƒ  d k s»| d j ƒ  d k rÄd } n> | d k r| d j ƒ  d k sü| d j ƒ  d k rd } | d k r1| | j ƒ  }
 | | =t  | ƒ } d | k rUt d ƒ } t | ƒ ‚ d | k ryt d ƒ } t | ƒ ‚ d } d | k rô| j
 d ƒ } | t  | ƒ d k rÈt d ƒ } t | ƒ ‚ | | d } | | d =| | =t  | ƒ } | d k  s| d k rt ƒ  ‚ | } |
 d k r5| d |
 7} t j j | d d d  | d t j j | ƒ ƒ} | rw| | _ n5 |	 d k r¬y | j |	 ƒ Wn t k
 r«‚  Yn X| d k r$t j j | d ƒ r"y t j j | d ƒ Wn9 t k
 r!d! } | d | _ | j | d d" ƒ Yn X| j d k rBy  t j j | d ƒ \ } } Wn1 t k
 r„} z t | ƒ ‚ WYd  d  } ~ Xn Xt j d# | ƒ sÍd$ | k s¯d% | k rÇt d& ƒ } t | ƒ ‚ | } y' | j | ƒ | j | d" ƒ d! } WqBt k
 r t d' ƒ } t | ƒ ‚ YqBXn| d d d k rSt d( ƒ } t | ƒ ‚ nïd) | k ržd* | k ržd | k ržd | k ržt d+ ƒ } t | ƒ ‚ n¤d, d) d* d- d. d d g } | j	 d* ƒ d k sv| j	 d) ƒ d k sv| j	 d, ƒ d k sv| j	 d- ƒ d k sv| j	 d ƒ d k sv| j	 d ƒ d k sv| j	 d. ƒ d k sv| j	 d. ƒ d k rŽ| j	 d, ƒ d k rŽt d/ ƒ } t | ƒ ‚ d } d } x| D]} | d d k rç| | | k rçt d0 ƒ | | } t | ƒ ‚ | d, k rR	| d | k  r7	y | j | | d ƒ WqO	t k
 r3	‚  YqO	Xq­t d1 ƒ } t | ƒ ‚ n[| d k sj	| d k r
| d | k  rä	yO | d k r¤	| j d | | d ƒ n$ | d k rÈ	| j d | | d ƒ Wq 
t k
 rà	‚  Yq 
Xq­t d2 ƒ | } t | ƒ ‚ nª| d) k r¿
| d | k  r¤
yd | | d j ƒ  } | d k rQ
d3 } d } n$ t j j | d4 ƒ ro
d5 } n d6 } | j | ƒ Wn t k
 rš
‚  Yn Xd7 } q­t d8 ƒ } t | ƒ ‚ nî| d* k r{| d | k  r`yd | | d j ƒ  } | d k rd3 } d } n$ t j j | d4 ƒ r+d5 } n d6 } | j | ƒ Wn t k
 rV‚  Yn Xd" } q­t d9 ƒ } t | ƒ ‚ n2| d- k s“| d. k r­| d | k  r•| d k rËt d: ƒ | } t | ƒ ‚ | | d } | d. k r	| d7 k rý| | _ qf| | _ n] t j d# | ƒ sfd$ | k s3d% | k rKt d& ƒ } t | ƒ ‚ | d7 k r`| } n | } y | j | | ƒ Wq­t k
 r‘‚  Yq­Xn t d; ƒ } t | ƒ ‚ | d 7} q¡W| d k rÜ| d k rÜd! } nf | d k r| d k r| | k rt d< ƒ } t | ƒ ‚ n' | d k r0| } n | d k rB| } | d k sZ| d k rýd } | d k r¯y t j j | ƒ } Wn* t k
 r®t d= ƒ } t | ƒ ‚ Yn X| d k r¤| d k sÓ| d k ry t j j | ƒ } Wq¤t k
 rt d= ƒ } t | ƒ ‚ Yq¤Xn‹ y t j j | ƒ } Wn* t k
 r[t d= ƒ } t | ƒ ‚ Yn X| d k st| | k r}| } n' | d k rŒn t d> ƒ } t | ƒ ‚ | j d k rÃ| j | ƒ n: | d k rý| j | k rýt d? ƒ | j } t | ƒ ‚ | rH| j t j j  k r;| d! k r;t! d@ | j ƒ d6 } | j" | ƒ t | ƒ } |  j# | j$ dA <| | j$ d <| | j$ dB <| S)CNÚ ÚanyFr   r   Údeleter   Tz	delete-%dÚinserté   Ú0z#Cannot insert rule at position '%s'Ú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é   Ú_Ú	directionZ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   r/   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_actionr7   r6   ÚeÚkeysÚiÚlocÚargZfaddrZsaddrÚtmpr
   r
   r   r   E   s2   ((	
	
$		"26,"(	"	 
$* 												
zUFWCommandRule.parsec             C   s§  |  j  } |  j d k s' |  j d k rm|  j d k sE |  j d k rm|  j d k rm|  j d k rm|  j d k rm|  j d k rm|  j d k rm|  j d k r° | d |  j 7} |  j	 d k rÐ | d |  j	 7} |  j
 d k rd |  j
 k r| d |  j
 7} qG| d |  j
 7} n1 | d |  j 7} |  j d k rG| d	 |  j 7} |  j d k r£| d
 |  j ƒ  7} n6|  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} xd d g D]} | d k r3|  j } |  j } |  j } d } n! |  j } |  j } |  j
 } d } | d k sl| d k rrd } | d k s–| d k s–| d k rý| d | | f 7} | d k räd | k rÓ| d | 7} qþ| d | 7} qý| d k rý| d | 7} qýWd | k rBd | k rB|  j d k rB|  j d k rB| 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:   r1   r4   r5   z %s %sz	 app '%s'z app %sz port %sz to z from z to anyz	 proto %s)rJ   r1   r:   ZsportrG   Zinterface_inZinterface_outZdportr0   rK   rC   rH   r-   Zget_comment)r   ÚresrP   rQ   r7   r8   Údirr
   r
   r   Úget_command»  sr    								$
-zUFWCommandRule.get_commandN)r   r   r   r   r   r   rW   Ústaticmethodr
   r
   r
   r   r   ?   s   ÿ w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 rŒ | j d ƒ } d } t | ƒ | k rŒ y. t | | d ƒ t d ƒ } t | ƒ ‚ Wn t k
 r‹ Yn Xd  } d  } d  } d j | ƒ } d | k r=d	 | k r=d
 } | j d ƒ | j d
 ƒ k rï d } | | j | ƒ d } | d | j | ƒ … | | j | ƒ d d  … } n_ t j	 d | ƒ r–t j	 d | ƒ r–d | k s{d | k r–t d ƒ } t | ƒ ‚ n | } d | d <t
 j |  | ƒ } d | j k rúd | j d _ | rú| rú| j d j | | ƒ | S)Nr   rZ   r   r   r   z9'route delete NUM' unsupported. Use 'delete NUM' instead.rT   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)ÚAssertionErrorr?   r   r<   r/   r   r   ÚjoinrD   Úsearchr   r   rI   ÚforwardrF   )	r	   r   ÚidxrL   Z	rule_argvZ	interfaceÚstripÚsr   r
   r
   r   r     sD    7
zUFWCommandRouteRule.parseN)r   r   r   r   r   r   r
   r
   r
   r   rY     s   rY   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)Nr8   )r   r   )r	   r   r   r
   r
   r   r   K  s    zUFWCommandApp.__init__c             C   sÓ  d } d } d } | d d k r+ t  ƒ  ‚ | d =t | ƒ } | d j ƒ  } | d k sf | d k rß | d k r¡ | d d	 k r¡ d
 } | j d	 ƒ t | ƒ } | d k  r¶ t  ƒ  ‚ t | d ƒ j d ƒ } | rß | d 7} | d k r | d k r t  ƒ  ‚ | d k r¦| d k  r!t  ƒ  ‚ | d j ƒ  d k r@d } nf | d j ƒ  d k r_d } nG | 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   r8   Ú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;   Ústrr`   r   r   rI   )r	   r   rh   rJ   ZaddnewrM   r   r
   r
   r   r   O  sH    		
							zUFWCommandApp.parseN)r   r   r   r   r   r   r
   r
   r
   r   rb   I  s   rb   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   rj   „  s   rj   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)Nrf   )r   r   )r	   r   r   r
   r
   r   r   ‘  s    zUFWCommandDefault.__init__c             C   sÍ  t  | ƒ d k  r t ƒ  ‚ d } d } t  | ƒ d k rO| 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 rÆ t ƒ  ‚ | d j ƒ  j d	 ƒ rè d } ng | d j ƒ  j d
 ƒ r
d } nE | d j ƒ  d k s6| d j ƒ  d k r?d } n | d j ƒ  } | d j ƒ  d k rnd } nG | d j ƒ  d k rd } n( | d j ƒ  d k r¬d } 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   rJ   r0   r
   r
   r   r   •  s8    				,					zUFWCommandDefault.parseN)r   r   r   r   r   r   r
   r
   r
   r   rk     s   rk   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 rC 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 rè d } | 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-onr/   )r   r   r   r   )r	   r   rJ   r
   r
   r   r   Â  s    	,,	zUFWCommandLogging.parseN)r   r   r   r   r   r   r
   r
   r
   r   ro   ¼  s   ro   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   s“   t  j |  | ƒ } t | ƒ d k r0 d | _ n_ t | ƒ d k r | d j ƒ  d k rd d | _ n+ | d j ƒ  d k r† d | _ n	 t ƒ  ‚ | S)Nr   rq   Úverbosezstatus-verboseZnumberedzstatus-numbered)r   r   r   rJ   r   r   )r	   r   r   r
   r
   r   r   Ù  s    	zUFWCommandStatus.parseN)r   r   r   r   r   r   r
   r
   r
   r   rp   Ó  s   rp   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 rC d } nâ | d j ƒ  d k rb d } nÃ | d j ƒ  d k r d } n¤ | d j ƒ  d	 k r  d
 } n… | d j ƒ  d k r¿ d } nf | d j ƒ  d k rÞ d } nG | d j ƒ  d k rý d } n( | d j ƒ  d k rd } 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   rJ   r
   r
   r   r   ì  s*    									zUFWCommandShow.parseN)r   r   r   r   r   r   r
   r
   r
   r   rs   æ  s   rs   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   rJ   ÚdryrunÚforcerI   )r	   rJ   r
   r
   r   r     s    		zUFWParserResponse.__init__c             C   sl   d |  j  } t |  j j ƒ  ƒ } | j ƒ  x) | D]! } | d | |  j | f 7} q3 W| d 7} t | ƒ S)Nzaction='%s'z,%s='%s'Ú
)rJ   re   rI   rO   ÚsortÚrepr)r	   ra   rO   rP   r
   r
   r   Ú__str__  s    

zUFWParserResponse.__str__N)r   r   r   r   r   r{   r
   r
   r
   r   r     s   r   c               @   sF   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   sb   | j  ƒ  t |  j j ƒ  ƒ k r* t ƒ  ‚ | j  ƒ  t |  j | j ƒ  ƒ k rX t ƒ  ‚ | j  ƒ  S)z=Return command if it is allowed, otherwise raise an exception)r   re   r}   rO   r   )r	   r   Úcmdr
   r
   r   Úallowed_command  s
    !	%	zUFWParser.allowed_commandc       
      C   s  d } t  | ƒ d k rE | d j ƒ  d k rE d } | j | d ƒ d } t  | ƒ d k r  | d j ƒ  d k s‰ | d j ƒ  d k r  d } | j | d ƒ d } d } | d j ƒ  } t  | ƒ d k r+| t |  j j ƒ  ƒ k r+| d j ƒ  t |  j | j ƒ  ƒ k r+| } | d j ƒ  } n | } xt t |  j j ƒ  ƒ D]] } | |  j | k rGt |  j | | t ƒ rt |  j | | d	 ƒ d
 k rqG| } PqGW| d k rºd
 } |  j	 | | ƒ } |  j | | } | j
 | ƒ }	 | |	 _ | |	 _ |	 S)z(Parse command. Returns a UFWParserActionFr   z	--dry-runTz--forcez-fr   r   r   r   )r   r   r;   re   r}   rO   Ú
isinstancer   Úgetattrr   r   rv   rw   )
r	   r   rv   rw   r~   r   rS   rP   rJ   Zresponser
   r
   r   Úparse_command&  s@    ((-) 		zUFWParser.parse_commandc             C   s§   | j  d k s | j  d k r. d | j } n d | j  } | j |  j k r] i  |  j | j <| |  j | j k r t d ƒ | } t | ƒ ‚ | |  j | j | <d S)z"Register a command with the parserNr   z%szCommand '%s' already exists)r   r   r}   r/   r   )r	   ÚcÚkeyrL   r
   r
   r   Úregister_commandT  s    zUFWParser.register_commandN)r   r   r   r   r   r   r‚   r…   r
   r
   r
   r   r|     s
   
.r|   )rD   Zufw.utilr@   Zufw.applicationsZ
ufw.commonr   r   r   r   rY   rb   rj   rk   ro   rp   rs   r   r|   r
   r
   r
   r   Ú<module>%   s    ÿ Í>;-