
    #fd|                     d   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          Z G d de          Z G d d	e          Z	 G d
 de          Z
 G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d          Z G d d          ZdS )    NUFWError)debugc                   $    e Zd ZdZd Zd Zd ZdS )
UFWCommandz"Generic class for parser commands.c                 v    || _         g | _        || j        vr| j                            |           || _        d S N)commandtypesappendtype)selfr   r
   s      ,/usr/lib/python3/dist-packages/ufw/parser.py__init__zUFWCommand.__init__.   s>    
tz!!Jd###			    c                     t          |          dk     rt                      t          |d                                                   }|S )N   r   )len
ValueErrorUFWParserResponselowerr   argvrs      r   parsezUFWCommand.parse5   s9    t99q==,,d1gmmoo..r   c                      t          d          )Nz!UFWCommand.help: need to overrider   )r   argss     r   helpzUFWCommand.help=   s    :;;;r   N)__name__
__module____qualname____doc__r   r   r    r   r   r   r   ,   sG        ,,    < < < < <r   r   c                   :    e Zd ZdZd Zd Zd Z ee          ZdS )UFWCommandRulez#Class for parsing ufw rule commandsc                 B    d}t                               | ||           d S )Nruler   r   r   r
   r   s      r   r   zUFWCommandRule.__init__C   %    D$00000r   c           	      6   d}d}d}d}d}d}d}d}	d}
d}t          |          dk    r9|d                                         dk    r|                    |d                    t          |          dk    r<|d                                         dk    rxt          |          dk    red}|                    |d                    d }	 t          |d                   }n# t          $ r |d         }Y nw xY w|t          d	|z            }|S n|d                                         d
k    r]t          |          dk     rt                      |d         }	|	dk    s|	dk    r!t          d          |	z  }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    rV|d                                         dk    s|d                                         dk    r|d                                         }|dk    rt|d         dk    rh|d                                         dk    s|d                                         dk    r,|d                                         }|d= t          |          }d}|dk    r|	                    d          dk    s|	                    d          dk    rt          d          }|d                                         dk    r-|d                                         dk    rt          |          |dk     s|d                                         dk    rt          |          |d= t          |          }d}d}|rE|dk    r?|d                                         dk    s|d                                         dk    rd}nD|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z
  k    rt          d           }t          |          ||dz            }d!|v rt          d"          }t          |          ||dz   = ||= t          |          }|dk     s|d#k    rt                      |}|
dk    r|d$|
z   z  }t          j                            |dd|t          j                            |          %          }|r||_        n,|	dk    r&	 |                    |	           n# t          $ r  w xY w|dk    rxt          j                            |d                   rb	 t          j                            |d                    n;# t          $ r. d&}|d         |_        |                    |d         d'           Y nw xY w|j        dk    r	 t          j                            |d                   \  }}n!# t          $ r}t          |          d }~ww xY wt/          j        d(|          s(d)|v sd*|v rt          d+          }t          |          |}	 |                    |           |                    |d'           d&}nI# t          $ r t          d,          }t          |          w xY wn|dz   dz  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    s|	                    d.          dk    s|	                    d2          dk    s|	                    d3          dk    s}|	                    d          dk    sd|	                    d          dk    sK|	                    d4          dk    s2|	                    d4          dk    r7|	                    d2          dk    rt          d5          }t          |          d}d}|D ]h}|dz  dk    r1||         |vr't          d6          ||         z  }t          |          |d2k    rW|dz   |k     r0	 |                    ||dz                       n# t          $ r  w xY wt          d7          }t          |          |dk    s|dk    r|dz   |k     r]	 |dk    r |                    d||dz                       n%|dk    r|                    d||dz                       nf# t          $ r  w xY wt          d8          |z  }t          |          |d.k    r|dz   |k     rw	 ||dz                                            }|dk    rd9}d}n%t          j                            |d:          rd;}nd<}|                    |           n# t          $ r  w xY wd=}nt          d>          }t          |          |d/k    r|dz   |k     rw	 ||dz                                            }|dk    rd9}d}n%t          j                            |d:          rd;}nd<}|                    |           n# t          $ r  w xY wd'}nt          d?          }t          |          |d3k    s|d4k    r|dz   |k     r|dk    r!t          d@          |z  }t          |          ||dz            }|d4k    r|d=k    r||_        nN||_        nFt/          j        d(|          s1d)|v sd*|v rt          d+          }t          |          |d=k    r|}n|}	 |                    ||           n-# t          $ r  w xY wt          dA          }t          |          |dz  }j|dk    r	|dk    rd&}nA|dk    r*|dk    r$||k    rt          dB          }t          |          |dk    r|}n|dk    r|}|dk    s|dk    rd}|dk    rM	 t          j                            |          }n,# t          $ r t          dC          }t          |          w xY w|dk    r|dk    s|dk    rM	 t          j                            |          }n# t          $ r t          dC          }t          |          w xY w	 t          j                            |          }n,# t          $ r t          dC          }t          |          w xY w|dk    s||k    r|}n%|dk    rnt          dD          }t          |          |j        dk    r|                    |           n7|dk    r1|j        |k    r&t          dE          |j        z  }t          |          |rL|j        t          j        j         v r|d&k    rtC          dF|j        z             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 "'"   _)	directionr>   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)protorG   rH   portappr9   r:   rI   rJ   rK   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   rA   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logtyperR   rule_numr   err_msgnargsrule_directionhas_interfacelog_idxr>   comment_idxrule_actionrJ   rI   ekeysilocargfaddrsaddrtmps                                    r   r   zUFWCommandRule.parseG   sk   	

t99q==T!W]]__66KKQ    t99q==Aw}}(**s4yy1}}DG$$$%"47||HH  % % %!!WFFF% ')+*@AAAH ( aH,,t99q==$,,&!!W
 $$
d(:(: EFF!+-G"7+++ GGGaI--
G!WFW6!1!1f6H6HW,,D		199,, 199$q'--//T11q'--//U22!!W]]__N 199aDd1gmmoo.E.E.21gmmoo.F.F!!W]]__NQIIE 199$**T**Q..$**U2C2Ca2G2G233GAw}}$&&47==??e+C+Cw'''qyyDGMMOOt33w'''QIIE M 	UQYYDGMMOOu,D,D,0GMMOOy,H,HGGQYYDGMMOOu447==??i77GQ;;7m))++GWIIED==788G7###;<<G7###**Y//Kc$ii!m++HIIw''';q=)G g~~;<< )))[]#[!IIE199

,,b==3=(Kz!!+ue,:*-(*=*=g*F*F " H H  	 DKK2!!*----   A::2247;; 22H//Q8888  2 2 2!D $QDIMM$q'5111112 yB&$'H$=$=d1g$F$FMT55! & & &"1++%& x 4d;; &d{{cTkk"#$A"B"B&w///!%J,%%e,,,MM$...!DD , , ,
mmG"7+++,! & ai1_!!344G7###4D$4$4T9I9I$455G7### IHHD zz$!##zz&!!A%%zz'""Q&&zz&!!A%%zz$!##zz%  1$$zz%  1$$zz%  1$$G)<)<q)@)@233w'''AC k kq5A::$q'"5"5 455aAG"7+++'>>sU{{" --d1Q3i8888( " " "!" #$$<"="=&w///D[[C5LLsU{{""d{{ $ 2 24ac C C C C!$ $ 2 25$qs) D D D( " " "!" #$$9":":c"B&w///F]]sU{{"$(1IOO$5$5E$~~(3,1		#&8#9#9%#E#E !504II04I LL////( " " "!"#
 #$$;"<"<&w///D[[sU{{"$(1IOO$5$5E$~~(3*/#&8#9#9%#E#E !3.2GG.2G LL////( " " "!"#
 #$$9":":&w///F]]cUllsU{{"99&'(G&H&H),'.G"*7"3"33"1Q3i%<<"e||,/		,/		!#*>!D!D 1"czzSCZZ*+,I*J*J&.w&7&7 7"e||/2-0
" MM#s3333( " " "!" #$$;"<"<&w///Q E!!g&6&6e##5(8(8g%%CDDw'''e## E!! |r11ER,H77
CCEE  , , ,   9::G"7+++, r!!E>>Ub[[0 # ; ;L I I$ 0 0 0 #$$=">">&w///00!h99,GG$ 0 0 0 #$$=">">&w///0 ~~# #"#$A"B"B&w/// }%%!!%((((%DMU$:$:JKK!],w'''  	} <<<v~~B}& ' ' ' KKf%%vvxs   C C10C1 W W"%X8 85Y0/Y0?(Z( (
[2[[-\6 6)]d22d>5AggA"i%%i1&A"l		l$o;;pr5 5)s4t )t=u! !)v
c                    | 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        z  z  }| j	        dk    r|d| j	        z  z  }| j
        dk    r%d| j
        v r|d| j
        z  z  }n3|d| j
        z  z  }n%|d| j        z  z  }| j        dk    r|d	| j        z  z  }| j        dk    r|d
|                                 z  z  }nf| j        dk    r|d| j        z  z  }| j        dk    r|d| j        z  z  }n| j        dk    r|d| j        z  z  }| j	        dk    r|d| j	        z  z  }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    r5|d|d|z  }|dk    rd|v r	|d|z  z  }u|d|z  z  }~|dk    r|d|z  z  }d|vrd|vr| j        dk    r| j        dk    r|dz  }| j        dk    r#| j
        dk    r| j        dk    r|d| j        z  z  }| j        dk    r|d
|                                 z  z  }|S )zGet command string for rulerL   z::/0r-   r,   r:   z %s z '%s'z/%sz comment '%s'z	 in on %sz
 out on %s)rP   rD   rP   rG   rH   z	 app '%s'z app %sz port %sz to z from z to anyz	 proto %s)ro   rD   rP   sportrj   interface_ininterface_outdportrB   ru   r`   rk   r>   get_comment)r   resr   r   rJ   rK   dirs          r   get_commandzUFWCommandRule.get_command  s+   hE[  AEVOOE[  AEVOO7e6R<<>R?b  7e{e##uq{**yBuqy((v||!&==7QV++CC516>)CCuqw&:&&51:--CyB88 ~##{Q^33"$$|ao55%%uq{**yBuqy((# 1 1::%C7D&C CC%C7D&CC+%%C%<<45==C2IICsssCC00Cbyy#::;#44CC9s?2CCzD00
 S  XS%8%8Nb((Q_-B-By zU""qv||"{QZ//yB88
r   N)r   r    r!   r"   r   r   r   staticmethodr#   r   r   r%   r%   A   sZ        --1 1 1~ ~ ~@L L LZ ,{++KKKr   r%   c                       e Zd ZdZd Zd ZdS )UFWCommandRouteRulez)Class for parsing ufw route rule commandsc                 J    t                               | |           d| _        d S )Nroute)r%   r   r   )r   r
   s     r   r   zUFWCommandRouteRule.__init__  s#    g...			r   c                    |d         dk    sJ d|v rq|                     d          }d}t          |          |k    rG	 t          ||dz                       t          d          }t	          |          # t
          $ r Y nw xY wd }d }d }d                    |          }d|v rd	|v rd
}|                     d          |                     d
          k    rd}||                     |          dz            }|d|                     |                   ||                     |          dz   d          z   }nRt          j        d|          s;t          j        d|          s&d|v sd|v rt          d          }t	          |          |}d|d<   t          
                    | |          }d|j        v r7d|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 r:   r9   r8   r<   z (in|out) on z app (in|out) z in z out z'Invalid interface clause for route ruler'   T)rV   r   rS   rA   r   r   joinrc   searchr%   r   rn   forwardrf   )	r   r   idxrw   	rule_argv	interfacestripsr   s	            r   r   zUFWCommandRouteRule.parse  s"   Aw'!!!! t**X&&CG4yy3S1W&&& [\\G"7+++!   D 		 HHTNN>>jAooEzz$$**U"3"333
 TZZ..23IQtzz%0001DE9J9J19L9M9M4NNII+Q// 		,a00		kkW\\ ABBG7###I	!  y11QV%)AF6N" ? ?v,,UI>>>s   6A4 4
B BNr   r    r!   r"   r   r   r#   r   r   r   r     s8        33  8 8 8 8 8r   r   c                       e Zd ZdZd Zd ZdS )UFWCommandAppz*Class for parsing ufw application commandsc                 B    d}t                               | ||           d S )NrK   r(   r)   s      r   r   zUFWCommandApp.__init__Z  s%    D$00000r   c                    d}d}d}|d         dk    rt                      |d= t          |          }|d                                         }|dk    s|dk    r{|dk    r2|d         d	k    r&d
}|                    d	           t          |          }|dk     rt                      t	          |d                                       d          }|r|dz  }|dk    r|dk    rt                      |dk    r|dk     rt                      |d                                         dk    rd}nq|d                                         dk    rd}nP|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   rK   infoupdater<   r   z	--add-newTr8   z[']z	-with-newlistdefaultr4   default-allowr5   default-denyr6   default-rejectskipzdefault-skipr   name)	r   r   r   rR   strr   r   r   rn   )r   r   r   ro   addnewrx   r   s          r   r   zUFWCommandApp.parse^  s   7e,,GD		aVv11zzd1g44K(((D		qyy ll" tAw<<%%e,,D &+%V

,,Yqyy ll"Aw}}'))(aF**'aH,,)aF**' ll"f%%vvr   Nr   r#   r   r   r   r   X  s8        441 1 12 2 2 2 2r   r   c                       e Zd ZdZd Zd ZdS )UFWCommandBasicz$Class for parsing ufw basic commandsc                 B    d}t                               | ||           d S )Nbasicr(   r)   s      r   r   zUFWCommandBasic.__init__  s%    D$00000r   c                 z    t          |          dk    rt                      t                              | |          S )Nr   )r   r   r   r   )r   r   s     r   r   zUFWCommandBasic.parse  s1    t99>>,,d+++r   Nr   r#   r   r   r   r     s8        ..1 1 1, , , , ,r   r   c                       e Zd ZdZd Zd ZdS )UFWCommandDefaultz&Class for parsing ufw default commandsc                 B    d}t                               | ||           d S )Nr   r(   r)   s      r   r   zUFWCommandDefault.__init__  %    D$00000r   c                 z   t          |          dk     rt                      d}d}t          |          dk    r{|d                                         dk    r|d                                         dk    r|d                                         dk    rh|d                                         dk    rJ|d                                         dk    r,|d                                         dk    rt                      |d                                                             d	          rd}n|d                                                             d
          rd}nY|d                                         dk    s|d                                         dk    rd}n|d                                         }|d                                         dk    rd}nP|d                                         dk    rd}n/|d                                         dk    rd}nt                      |d|z  z  }t	          |          S )Nr8   r,   incominginputroutedr   outputoutgoingr9   r:   r   r5   r   r4   r   r6   r   z-%s)r   r   r   
startswithr   )r   r   ro   rB   s       r   r   zUFWCommandDefault.parse  s   t99q==,, 	t99q==Aw}}*,,Aw}}'))Aw}}(**Aw}})++Aw}}(**Aw}}*,, ll"Aw}}))$// ,&		a++E22 ,&		aH,,Q90L0L$		 GMMOO	 7==??f$$#FF!W]]__''$FF!W]]__((%FF,,%9%% (((r   Nr   r#   r   r   r   r     s8        001 1 1%) %) %) %) %)r   r   c                       e Zd ZdZd Zd ZdS )UFWCommandLoggingz&Class for parsing ufw logging commandsc                 B    d}t                               | ||           d S )Nloggingr(   r)   s      r   r   zUFWCommandLogging.__init__  r   r   c                 r   d}t          |          dk     rt                      |d                                         dk    rd}n|d                                         dk    sx|d                                         dk    sZ|d                                         dk    s<|d                                         d	k    s|d                                         d
k    rAd}|d                                         dk    r |d|d                                         z   z  }nt                      t          |          S )Nr,   r8   r   offzlogging-offr;   lowmediumhighfullz
logging-onrA   r   r   r   r   r   r   ro   s      r   r   zUFWCommandLogging.parse  s    t99q==,,!W]]__%%"FF!W]]__$$Q5(@(@!W]]__((DGMMOOv,E,E!W]]__&&!FAw}}$&&#Q//,, (((r   Nr   r#   r   r   r   r     s8        001 1 1) ) ) ) )r   r   c                       e Zd ZdZd Zd ZdS )UFWCommandStatusz%Class for parsing ufw status commandsc                 B    d}t                               | ||           d S )Nstatusr(   r)   s      r   r   zUFWCommandStatus.__init__  s%    D$00000r   c                 L   t                               | |          }t          |          dk    rd|_        nmt          |          dk    rZ|d                                         dk    rd|_        n4|d                                         dk    rd|_        nt                      |S )Nr   r   verbosezstatus-verbosenumberedzstatus-numbered)r   r   r   ro   r   r   r   s      r   r   zUFWCommandStatus.parse  s    T4((t99>>AHHYY]]Aw}})+++aJ.., ll"r   Nr   r#   r   r   r   r     s8        //1 1 1    r   r   c                       e Zd ZdZd Zd ZdS )UFWCommandShowz#Class for parsing ufw show commandsc                 B    d}t                               | ||           d S )Nshowr(   r)   s      r   r   zUFWCommandShow.__init__  r*   r   c                    d}t          |          dk    rt                      |d                                         dk    rd}n|d                                         dk    rd}n|d                                         dk    rd}n|d                                         d	k    rd
}n|d                                         dk    rd}nq|d                                         dk    rd}nP|d                                         dk    rd}n/|d                                         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-builtins	listeningzshow-listeningaddedz
show-addedr   r   s      r   r   zUFWCommandShow.parse  s(   t99>>,,!W]]__%%FF!W]]__.."FF!W]]__,, FF!W]]__--!FF!W]]__//#FF!W]]__
**$FF!W]]__++%FF!W]]__''!FF,, (((r   Nr   r#   r   r   r   r     s8        --1 1 1) ) ) ) )r   r   c                       e Zd ZdZd Zd ZdS )r   zClass for ufw parser responsec                 b    |                                 | _        d| _        d| _        i | _        d S )NF)r   ro   dryrunforcern   )r   ro   s     r   r   zUFWParserResponse.__init__  s*    llnn
			r   c                     d| j         z  }t          | j                                                  }|                                 |D ]}|d|d| j        |         dz  }|dz  }t          |          S )Nzaction='%s'rE   z='r?   
)ro   r   rn   r   sortrepr)r   r   r   r   s       r   __str__zUFWParserResponse.__str__!  sx    T[)DINN$$%%		 	0 	0AAqqq$)A,,,//AA	T	Awwr   N)r   r    r!   r"   r   r   r#   r   r   r   r     s8        ''      r   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )	UFWParserzClass for ufw parserc                     i | _         d S r	   )commands)r   s    r   r   zUFWParser.__init__.  s    r   c                 V   |                                 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   r   r   )r   r   cmds      r   allowed_commandzUFWParser.allowed_command1  s{    ::<<tDM$6$6$8$89999,,99;;d4=#6#;#;#=#=>>>>,,yy{{r   c                    d}t          |          dk    r;|d                                         dk    rd}|                    |d                    d}t          |          dk    rY|d                                         dk    s|d                                         dk    rd}|                    |d                    d}d}|d                                         }t          |          dk    r|t          | j                                                  v rc|d                                         t          | j        |                                                   v r|}|d                                         }n|}t          | j                                                  D ]a}|| j        |         v rPt          | j        |         |         t                    r&t          | j        |         |         d	          d
k    r]|} nb|dk    rd
}| 	                    ||          }| j        |         |         }|
                    |          }	||	_        ||	_        |	S )z(Parse command. Returns a UFWParserActionFr   z	--dry-runTz--forcez-fr,   r   r   r'   )r   r   rR   r   r   r   
isinstancer%   getattrr   r   r   r   )
r   r   r   r   r   r   r   r   ro   responses
             r   parse_commandzUFWParser.parse_command;  s    t99q==T!W]]__;;FKKQ   t99q==d1gmmoo::"1gmmoo55EKKQ   1gmmoot99q==SD););)=)=$>$>>>Q4c(:(?(?(A(A#B#BBBDq'--//CC C$-,,..// 	 	$-*** "$-"23"7HH !t}Q/4f==GG DE + rzz%%dC00mD!&)99T?? r   c                 "   |j         |j         dk    rd|j        z  }n
d|j         z  }|j        | j        vri | j        |j        <   || j        |j                 v r!t          d          |z  }t	          |          || j        |j                 |<   dS )z"Register a command with the parserNr,   z%szCommand '%s' already exists)r
   r   r   rA   r   )r   ckeyrw   s       r   register_commandzUFWParser.register_commandi  s    9	R!&/CC!)$C6&&$&DM!&!$-'''566#>G7###%&afc"""r   N)r   r    r!   r"   r   r   r   r   r#   r   r   r   r   ,  sW            , , ,\' ' ' ' 'r   r   )rc   ufw.utilrW   ufw.applications
ufw.commonr   r   r   r%   r   r   r   r   r   r   r   r   r   r#   r   r   <module>r      s3  J 
			                 < < < < < < < <*S, S, S, S, S,Z S, S, S,l> > > > >. > > >B8 8 8 8 8J 8 8 8v	, 	, 	, 	, 	,j 	, 	, 	,+) +) +) +) +)
 +) +) +)\) ) ) ) )
 ) ) )0    z   () ) ) ) )Z ) ) )@       &J' J' J' J' J' J' J' J' J' J'r   