ó
´$Nc           @   s  d  d l  Z  d  d l Z d  d l m Z d  d l m Z d  d l Z d f  d „  ƒ  YZ d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ	 d
 e f d „  ƒ  YZ
 d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d f  d „  ƒ  YZ d f  d „  ƒ  YZ d S(   iÿÿÿÿN(   t   UFWError(   t   debugt
   UFWCommandc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s"   Generic class for parser commands.c         C   sA   | |  _  g  |  _ | |  j k r4 |  j j | ƒ n  | |  _ d  S(   N(   t   commandt   typest   appendt   type(   t   selfR   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyt   __init__.   s
    		c         C   s8   t  | ƒ d k  r t ƒ  ‚ n  t | d j ƒ  ƒ } | S(   Ni   i    (   t   lent
   ValueErrort   UFWParserResponset   lower(   R   t   argvt   r(    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyt   parse5   s    c         C   s   t  d ƒ ‚ d  S(   Ns!   UFWCommand.help: need to override(   R    (   R   t   args(    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyt   help=   s    (   t   __name__t
   __module__t   __doc__R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   ,   s   		t   UFWCommandRulec           B   s5   e  Z d  Z d „  Z d „  Z d „  Z e e ƒ Z RS(   s#   Class for parsing ufw rule commandsc         C   s   d } t  j |  | | ƒ d  S(   Nt   rule(   R   R   (   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   B   s    c      -   C   sw  d } d } d } d } d } d } d } d }	 d }
 t  } t | ƒ d k rx | d j ƒ  d k rx | j | d ƒ n  t | ƒ d k r«| d j ƒ  d k r$t | ƒ d k r$t } | j | d ƒ d  } y t | d ƒ } Wn t k
 r | d } n X| d  k ržt d | ƒ } | Snz | d j ƒ  d k ržt | ƒ d	 k  rXt	 ƒ  ‚ n  | d }	 |	 d
 k rt
 d ƒ |	 } t | ƒ ‚ n  | d =| d =n  | d } n  | d k rÓ|  j } | j d | ƒ n  | d k r| d k r| d k r| d k rt	 ƒ  ‚ n  t | ƒ } | d k  r3t	 ƒ  ‚ n  d } | d k r„| d j ƒ  d k sq| d j ƒ  d k r„| d j ƒ  } n  | d k rò| d d k rò| d j ƒ  d k sÌ| d j ƒ  d k rò| d j ƒ  } | d =t | ƒ } n  t  } | d k rÂ| j d ƒ d k s.| j d ƒ d k rÂt
 d ƒ } | d j ƒ  d k ru| d j ƒ  d k rut | ƒ ‚ n  | d k  s—| d j ƒ  d k r¦t | ƒ ‚ n  | d =t | ƒ } t } n  d } | r| d k r| d j ƒ  d k s| d j ƒ  d k rd } nA | d k rP| d j ƒ  d k sG| d j ƒ  d k rPd } n  | d k r‚| | j ƒ  }
 | | =t | ƒ } n  d | k r©t
 d ƒ } t | ƒ ‚ n  d | k rÐt
 d ƒ } t | ƒ ‚ n  | d k  sè| d k rôt	 ƒ  ‚ n  | } |
 d k r| d |
 7} n  t j j | d d d | ƒ} | rG| | _ n7 |	 d k r~y | j |	 ƒ Wq~t k
 rz‚  q~Xn  | d k r)t j j | d ƒ röy t j j | d ƒ Wqöt k
 ròd } | d | _ | j | d d ƒ qöXn  | j d k rõy  t j j | d ƒ \ } } Wn) t k
 rPt
 d ƒ } t | ƒ ‚ n Xt j d  | ƒ sŸd! | k s{d" | k r–t
 d# ƒ } t | ƒ ‚ n  | } n  y' | j | ƒ | j | d ƒ d } Wqõt k
 rñt
 d ƒ } t | ƒ ‚ qõXn  | j dE k rZt
 d' ƒ | j } t | ƒ ‚ qZn1| d d d k rX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 s{| j d) ƒ d k s{| j d, ƒ d k s{| j d- ƒ d k s{| j d ƒ d k s{| j d ƒ d k s{| j d. ƒ d k s{| j d. ƒ d k r–| j d, ƒ d k r–t
 d/ ƒ } t | ƒ ‚ n  d } d } x+| D]#} | d d k rò| | | k ròt
 d0 ƒ | | } t | ƒ ‚ n  | d, k r\	| d | k  rA	y | j | | d ƒ WqY	t k
 r=	‚  qY	XqÂt
 d1 ƒ } t | ƒ ‚ nf| d k st	| d k r
| d | k  rð	yR | d k r®	| j d | | d ƒ n' | d k rÕ	| j d | | d ƒ n  Wq
t k
 rì	‚  q
XqÂt
 d2 ƒ | } 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
 r¥
‚  n Xd7 } qÂt
 d8 ƒ } t | ƒ ‚ nø| d* k r…| d | k  rjyd | | d j ƒ  } | d k rd3 } d } n$ t j j | d4 ƒ r6d5 } n d6 } | j! | ƒ Wn t k
 r`‚  n Xd } qÂt
 d9 ƒ } t | ƒ ‚ n=| d- k s| d. k rÂ| d | k  r§| d k rØt
 d: ƒ | } t | ƒ ‚ n  | | d } | d. k r| d7 k r
| | _" qy| | _ nc t j d  | ƒ syd! | k s@d" | k r[t
 d# ƒ } t | ƒ ‚ n  | d7 k rp| } qy| } n  y | j | | ƒ Wq¿t k
 r£‚  q¿XqÂt
 d; ƒ } t | ƒ ‚ n  | d 7} q©W| d k rñ| d k rñd } ni | d k r0| d k r0| | k r0t
 d< ƒ } t | ƒ ‚ n* | d k rE| } n | d k rZ| } n  | d k sr| d k rd } | d k rÉy t j j | ƒ } WqÉt k
 rÅt
 d= ƒ } t | ƒ ‚ qÉXn  | d k r¿| d k sí| d k r2y t j j | ƒ } Wq¼t k
 r.t
 d= ƒ } t | ƒ ‚ q¼Xq¿y t j j | ƒ } Wn) t k
 rst
 d= ƒ } t | ƒ ‚ n X| d k sŒ| | k r•| } q¿| d k r¤q¿t
 d> ƒ } t | ƒ ‚ n  | j d k rÞ| j | ƒ q| d k r| j | k rt
 d? ƒ | j } t | ƒ ‚ qn  | r—| j d k r—| j" d k sQ| j d k r—d } | j rl| j } n	 | j" } t
 d@ ƒ | j } t | ƒ ‚ n  | j d$ k r=| d5 k rÔt
 dA ƒ | j } t | ƒ ‚ n& | d k rút# dB | j ƒ d6 } n  | j$ d k s| j% d k r=t
 d' ƒ | j } t | ƒ ‚ q=n  t | ƒ } |  j& | j' dC <| | j' d <| | j' dD <| S(F   Nt    t   anyi    R   t   deletei   s	   delete-%dt   inserti   t   0s#   Cannot insert rule at position '%s't   allowt   denyt   rejectt   limiti   t   int   outt   ons   Invalid interface clausei   t   logs   log-alls   Option 'log' not allowed heres!   Option 'log-all' not allowed herei   t   _t	   directiont   botht   dsts   Bad ports   ^\d([0-9,:]*\d+)*$t   ,t   :s   Port ranges must be numerict   ipv6t   espt   ahs   Invalid port with protocol '%s's   Wrong number of argumentst   fromt   tos   Need 'to' or 'from' clauset   protot   portt   apps   Improper rule syntaxs   Invalid token '%s's   Invalid 'proto' clauses   Invalid '%s' clauses	   0.0.0.0/0t   6t   v6t   v4t   srcs   Invalid 'from' clauses   Invalid 'to' clauses   Need 'from' or 'to' with '%s's   Invalid 'port' clauses%   Mixed IP versions for 'from' and 'to's   Could not find protocols   Protocol mismatch (from/to)s,   Protocol mismatch with specified protocol %ss3   Improper rule syntax ('%s' specified with app rule)s'   Invalid IPv6 address with protocol '%s's*   Adjusting iptype to 'v4' for protocol '%s'R   t   iptype(   R*   R+   R,   ((   t   FalseR	   R   t   removet   Truet   Nonet   intt	   ExceptionR   R
   R$   R    R   R   t   countt   ufwt   commont   UFWRulet   set_positiont   applicationst   valid_profile_namet   utilt   get_services_protot   dappt   set_portt   parse_port_protot   ret   matcht   set_protocolt   protocolt   set_interfacet   valid_addresst   set_srct   set_dstt   sappR   t   dportt   sportR   t   data(   R   R   t   actionR   R   t	   from_typet   to_typet   from_servicet
   to_servicet
   insert_post   logtypeR8   t   rule_numR   t   err_msgt   nargst   rule_directiont   has_interfacet   log_idxt   rule_actionR0   R/   t   keyst   it   loct   argt   faddrt   saddrt   tmpR1   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   F   sJ   ((
	
	$"26,"	(	"		
 	
	
$* 

									
					
			
	
		
c         C   sø  |  j  } |  j d k s' |  j d k r0|  j d k sE |  j d k r0|  j d k r0|  j d k r0|  j d k r0|  j d k r0|  j d k r0|  j d k r³ | d |  j 7} n  |  j	 d k rÖ | d |  j	 7} n  |  j
 d k rù | d |  j
 7} qô| d |  j 7} |  j d k rô| d |  j 7} qônÄ|  j d k rS| d |  j 7} n  |  j d k rv| d	 |  j 7} n  |  j	 d k r™| d |  j	 7} n  xû d
 d g D]í } | d
 k rÜ|  j } |  j } |  j } d } n! |  j } |  j } |  j
 } d } | d k s| d k rd } n  | d k rE| d k rE| d k rEq¦| d | | f 7} | d k rv| d | 7} q¦| d k r¦| d | 7} q¦q¦W| |  j  k r³| d 7} n  |  j d k rô|  j
 d k rô|  j d k rô| d |  j 7} n  | S(   s   Get command string for rules	   0.0.0.0/0s   ::/0R   R   R!   s    %ss   /%ss	    in on %ss
    out on %sR5   R'   R-   R.   s    %s %ss    app %ss    port %ss    to anys	    proto %s(   RU   R'   R5   RS   RQ   t   interface_int   interface_outRR   R%   R[   RF   RL   (   R   t   resRd   Re   R0   R1   t   dir(    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyt   get_commandµ  s^    									$-(   R   R   R   R   R   Rn   t   staticmethod(    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   @   s   		ÿ p	?t   UFWCommandAppc           B   s    e  Z d  Z d „  Z d „  Z RS(   s*   Class for parsing ufw application commandsc         C   s   d } t  j |  | | ƒ d  S(   NR1   (   R   R   (   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   ù  s    c         C   së  d } d } t  } | d d k r. t ƒ  ‚ n  | d =t | ƒ } | d j ƒ  } | d k si | d k rî | d k r§ | d d k r§ t } | j d ƒ t | ƒ } n  | d	 k  r¿ t ƒ  ‚ n  t | d ƒ j d
 ƒ } | rî | d 7} qî n  | d k r| d k rt ƒ  ‚ n  | d k r¾| d	 k  r6t ƒ  ‚ n  | d j ƒ  d k rUd } q¾| d j ƒ  d k rtd } q¾| d j ƒ  d k r“d } q¾| d j ƒ  d k r²d } q¾t ƒ  ‚ n  t | ƒ } |  j	 | j
 d <| | j
 d <| S(   s   Parse applications command.R   i    R1   t   infot   updatei   i   s	   --add-newi   s   [']s	   -with-newt   listt   defaultR   s   default-allowR   s   default-denyR   s   default-rejectt   skips   default-skipR   t   name(   R7   R
   R	   R   R9   R8   t   strt   stripR   R   RT   (   R   R   Rv   RU   t   addnewR^   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   ý  sH    				(   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyRp   ÷  s   	t   UFWCommandBasicc           B   s   e  Z d  Z d „  Z RS(   s$   Class for parsing ufw basic commandsc         C   s   d } t  j |  | | ƒ d  S(   Nt   basic(   R   R   (   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   4  s    (   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyRz   2  s   t   UFWCommandDefaultc           B   s    e  Z d  Z d „  Z d „  Z RS(   s&   Class for parsing ufw default commandsc         C   s   d } t  j |  | | ƒ d  S(   NRt   (   R   R   (   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   :  s    c         C   su  t  | ƒ d k  r t ƒ  ‚ n  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  t ƒ  ‚ n  | d j ƒ  j d ƒ rÂ d } q÷ | d j ƒ  j d ƒ rä d } q÷ | d j ƒ  } n  | d	 j ƒ  d
 k rd } nG | d	 j ƒ  d k r5d } n( | d	 j ƒ  d k rTd } n	 t ƒ  ‚ | d | 7} t | ƒ S(   Ni   R   t   incomingt   inputt   outputt   outgoingR    R!   i   R   s   default-denyR   s   default-allowR   s   default-rejects   -%s(   R	   R
   R   t
   startswithR   (   R   R   RU   R%   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   >  s0    						(   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR|   8  s   	t   UFWCommandLoggingc           B   s    e  Z d  Z d „  Z d „  Z RS(   s&   Class for parsing ufw logging commandsc         C   s   d } t  j |  | | ƒ d  S(   Nt   logging(   R   R   (   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   c  s    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} qô n	 t ƒ  ‚ t | ƒ S(   NR   i   i   t   offs   logging-offR"   t   lowt   mediumt   hight   fulls
   logging-onR$   (   R	   R
   R   R   (   R   R   RU   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   g  s    	,,	(   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR‚   a  s   	t   UFWCommandStatusc           B   s    e  Z d  Z d „  Z d „  Z RS(   s%   Class for parsing ufw status commandsc         C   s   d } t  j |  | | ƒ d  S(   Nt   status(   R   R   (   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   z  s    c         C   s–   t  j |  | ƒ } t | ƒ d k r0 d | _ nb t | ƒ d k r’ | d j ƒ  d k rd d | _ q’ | d j ƒ  d k r† d | _ q’ t ƒ  ‚ n  | S(   Ni   RŠ   t   verboses   status-verboset   numbereds   status-numbered(   R   R   R	   RU   R   R
   (   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   ~  s    (   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR‰   x  s   	t   UFWCommandShowc           B   s    e  Z d  Z d „  Z d „  Z RS(   s%   Class for parsing ufw status commandsc         C   s   d } t  j |  | | ƒ d  S(   Nt   show(   R   R   (   R   R   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR     s    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
 } 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   i   t   raws   show-raws   before-ruless   show-befores
   user-ruless	   show-users   after-ruless
   show-afters   logging-ruless   show-loggingt   builtinss   show-builtinst	   listenings   show-listening(   R	   R
   R   R   (   R   R   RU   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   ‘  s&    								(   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   ‹  s   	R   c           B   s    e  Z d  Z d „  Z d „  Z RS(   s   Class for ufw parser responsec         C   s.   | j  ƒ  |  _ t |  _ t |  _ i  |  _ d  S(   N(   R   RU   R7   t   dryrunt   forceRT   (   R   RU   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   ª  s    		c         C   sV   d |  j  } x2 |  j j ƒ  D]! } | d | |  j | f 7} q W| d 7} t | ƒ S(   Ns   action='%s's   ,%s='%s's   
(   RU   RT   Rc   t   repr(   R   t   sRd   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyt   __str__°  s
    
(   R   R   R   R   R–   (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   ¨  s   	t	   UFWParserc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s   Class for ufw parserc         C   s   i  |  _  d  S(   N(   t   commands(   R   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR   º  s    c         C   s\   | j  ƒ  |  j j ƒ  k r' t ƒ  ‚ n  | j  ƒ  |  j | j ƒ  k rR t ƒ  ‚ n  | j  ƒ  S(   s=   Return command if it is allowed, otherwise raise an exception(   R   R˜   Rc   R
   (   R   R   t   cmd(    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyt   allowed_command½  s
    c      
   C   sö  t  } t | ƒ d k rH | d j ƒ  d k rH t } | j | d ƒ n  t  } t | ƒ d k r¦ | d j ƒ  d k sŒ | d j ƒ  d k r¦ t } | j | d ƒ n  d } d } | d j ƒ  } t | ƒ d k r%| |  j j ƒ  k r%| d j ƒ  |  j | j ƒ  k r%| } | d j ƒ  } nR | } x4 |  j j ƒ  D]# } | |  j | k r;| } Pq;q;W| d k rwd } n  y |  j | | ƒ } Wn0 t k
 r¿t	 d ƒ | }	 ‚  t
 |	 ƒ ‚ n X|  j | | } | j | ƒ }
 | |
 _ | |
 _ |
 S(	   s(   Parse command. Returns a UFWParserActioni    s	   --dry-runs   --forces   -fR   i   R   s   Invalid command '%s'(   R7   R	   R   R9   R8   R˜   Rc   Rš   R<   R$   R    R   R’   R“   (   R   R   R’   R“   R™   R   Ri   Rd   RU   R]   t   response(    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyt   parse_commandÇ  sD    (('#			c         C   s³   | j  d k s | j  d k r. d | j } n d | j  } |  j j | j ƒ sc i  |  j | j <n  |  j | j j | ƒ r› t d ƒ | } t | ƒ ‚ n  | |  j | j | <d S(   s"   Register a command with the parserR   s   %ss   Command '%s' already existsN(   R   R:   R   R˜   t   has_keyR$   R    (   R   t   ct   keyR]   (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyt   register_commandô  s    (   R   R   R   R   Rš   Rœ   R    (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyR—   ¸  s
   		
	-(   RI   t   ufw.utilR>   R?   R    R   t   sysR   R   Rp   Rz   R|   R‚   R‰   R   R   R—   (    (    (    s.   /usr/lib/python2.7/dist-packages/ufw/parser.pyt   <module>%   s   ÿ ¸;)