
    e|                         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y)    NUFWError)debugc                   "    e Zd ZdZd Zd Zd Zy)
UFWCommandz"Generic class for parser commands.c                     || _         g | _        || j                  vr| j                  j                  |       || _        y N)commandtypesappendtype)selfr   r
   s      ,/usr/lib/python3/dist-packages/ufw/parser.py__init__zUFWCommand.__init__.   s5    
tzz!JJd#	    c                 n    t        |      dk  r
t               t        |d   j                               }|S )N   r   )len
ValueErrorUFWParserResponselowerr   argvrs      r   parsezUFWCommand.parse5   s.    t9q=,d1gmmo.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   ,   s    ,<r   r   c                   2    e Zd ZdZd Zd Zd Z ee      Zy)UFWCommandRulez#Class for parsing ufw rule commandsc                 6    d}t         j                  | ||       y )Nruler   r   r   r
   r   s      r   r   zUFWCommandRule.__init__C       D$0r   c           	      <   d}d}d}d}d}d}d}d}	d}
d}t        |      dkD  r*|d   j                         dk(  r|j                  |d          t        |      dkD  r|d   j                         dk(  rGt        |      dkD  r9d}|j                  |d          d }	 t        |d         }|t        d	|z        }|S |d   j                         d
k(  rGt        |      dk  r
t               |d   }	|	dk(  s|	dk(  rt        d      |	z  }t        |      |d= |d= n|d   j                         dk(  rd}	|d= |d   }|dk7  r|dk7  r|dk7  r|dk7  r
t               t        |      }|dk  r
t               d}|dkD  r?|d   j                         dk(  s|d   j                         dk(  r|d   j                         }|dkD  rU|d   dk7  rM|d   j                         dk(  s|d   j                         dk(  r!|d   j                         }|d= t        |      }d}|dkD  r|j                  d      dkD  s|j                  d      dkD  rxt        d      }|d   j                         dk7  r!|d   j                         dk7  rt        |      |dk  s|d   j                         dk7  rt        |      |d= t        |      }d}d}|r4|dkD  r/|d   j                         dk(  s|d   j                         dk(  rd}n3|dkD  r.|d   j                         dk(  s|d   j                         dk(  rd}|dkD  r!||   j                         }
||= t        |      }d|v rt        d      }t        |      d|v rt        d      }t        |      d}d|v rn|j                  d      }|t        |      dz
  k(  rt        d       }t        |      ||dz      }d!|v rt        d"      }t        |      ||dz   = ||= t        |      }|dk  s|d#kD  r
t               |}|
dk7  r|d$|
z   z  }t        j                  j                  |dd|t        j                  j                  |      %      }|r||_        n|	dk7  r	 |j!                  |	       |dk(  rt        j"                  j%                  |d         r#	 t        j                  j'                  |d          |j(                  dk(  rr	 t        j                  j-                  |d         \  }}t/        j0                  d(|      s d)|v sd*|v rt        d+      }t        |      |}	 |j3                  |       |j+                  |d'       d&}n|dz   dz  dk7  rt        d-      }t        |      d.|vr"d/|vrd|vrd|vrt        d0      }t        |      g d1}|j                  d/      dkD  s|j                  d.      dkD  s|j                  d2      dkD  sx|j                  d3      dkD  sd|j                  d      dkD  sP|j                  d      dkD  s<|j                  d4      dkD  s(|j                  d4      dkD  r*|j                  d2      dkD  rt        d5      }t        |      d}d}|D ]  }|dz  dk7  r#||   |vrt        d6      ||   z  }t        |      |d2k(  r8|dz   |k  r	 |j3                  ||dz             n4t        d7      }t        |      |dk(  s|dk(  r_|dz   |k  r>	 |dk(  r|j5                  d||dz             n|dk(  r|j5                  d||dz             nt        d8      |z  }t        |      |d.k(  ry|dz   |k  r[	 ||dz      j                         }|dk(  rd9}d}n%t        j                  j7                  |d:      rd;}nd<}|j9                  |       d=}nMt        d>      }t        |      |d/k(  rx|dz   |k  rZ	 ||dz      j                         }|dk(  rd9}d}n%t        j                  j7                  |d:      rd;}nd<}|j;                  |       d'}nt        d?      }t        |      |d3k(  s|d4k(  r|dz   |k  r|dk(  rt        d@      |z  }t        |      ||dz      }|d4k(  r|d=k(  r||_        nF||_        n>t/        j0                  d(|      s(d)|v sd*|v rt        d+      }t        |      |d=k(  r|}n|}	 |j+                  ||       nt        dA      }t        |      |dz  } |dk(  r|dk(  rd&}n4|dk7  r |dk7  r||k7  rt        dB      }t        |      |dk7  r|}n|dk7  r|}|dk7  s|dk7  rd}|dk7  r 	 t        j                  j'                  |      }|dk7  rt|dk(  s|dk(  r!	 t        j                  j'                  |      }nI	 t        j                  j'                  |      }|dk(  s||k(  r|}n|dk(  rnt        dD      }t        |      |j>                  dk(  r|j3                  |       n7|dk7  r2|j>                  |k7  r#t        dE      |j>                  z  }t        |      |rV|j>                  t        j                  j@                  v r|d&k(  rtC        dF|j>                  z         d<}|jE                  |       t        |      }| jF                  |jH                  dG<   ||jH                  d<   ||jH                  dH<   |S # t        $ r	 |d   }Y 
Gw xY w# t        $ r  w xY w# t        $ r% d&}|d   |_        |j+                  |d   d'       Y pw xY w# t        $ r}t        |      d }~ww xY w# t        $ r t        d,      }t        |      w xY w# t        $ r  w xY w# t        $ r  w xY w# t        $ r  w xY w# t        $ r  w xY w# t        $ r  w xY w# t        $ r t        dC      }t        |      w xY w# t        $ r t        dC      }t        |      w xY w# t        $ r t        dC      }t        |      w xY w)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   s   	

t9q=T!W]]_6KKQ  t9q=Aw}}(*s4y1}DG$%"47|H
 ')+*@AAHaH,t9q=$,&!!W
 $
d(: EF!+-G"7++ GGaI-
G!WFW6!1f6HW,D	19, 19$q'--/T1q'--/U2!!W]]_N 19aDd1gmmo.E.21gmmo.F!!W]]_NQIE 19$**T*Q.$**U2Ca2G23GAw}}$&47==?e+Cw''qyDGMMOt3w''QIE MUQYDGMMOu,D,0GMMOy,HGQYDGMMOu47==?i7GQ;7m))+GWIED=78G7##;<G7##**Y/Kc$i!m+HIw'';q=)G g~;< ))[]#[!IE19
,b=3=(Kzz!!+ue,:*-((*=*=g*F " H  DK2!!*- A:2247;2HH//Q8
 yyB&$'HH$=$=d1g$FMT5 xx 5t<d{cTk"#$A"B&w//!%J,%%e,MM$.!D ai1_!34G7##4D$4T9I$45G7## ID zz$!#zz&!A%zz'"Q&zz&!A%zz$!#zz% 1$zz% 1$zz% 1$G)<q)@23w''AC kq5A:$q'"5 45aAG"7++'>sU{" --d1Q3i8 #$$<"=&w//D[C5LsU{""d{ $ 2 24ac C!$ $ 2 25$qs) D #$$9":c"B&w//F]sU{"$(1IOO$5E$~(3,1	#&88#9#9%#E04I04I LL/ $
 #$$;"<&w//D[sU{"$(1IOO$5E$~(3*/#&88#9#9%#E.2G.2G LL/ $
 #$$9":&w//F]cUlsU{"9&'(G&H),'.G"*7"33"1Q3i%<"e|,/	,/	!#*?!E"czSCZ*+,I*J&.w&7 7"e|/2-0
" MM#s3 #$$;"<&w//QWk\ E!g&6e#5(8g%CDw''e# E! |r1ER,HH77
CE r!E>Ub[0 # ; ;L I0!hh99,G ~# #"#$A"B&w// }}%!!%(%DMMU$:JK!]],w'' }} < <<v~B}}& ' KKf%vvxO ! %!!WF%l   ! 2!D $QDIMM$q'512 " &"1+%&   ,
mG"7++,H  ) "!"  ) "!"*  ) "!",  ) "!"B  ) "!"8 ! ,   9:G"7++, % 0 #$$=">&w//0 % 0 #$$=">&w//0s   k !k1 "k? %l0 )%m (m/*;m=AnAnn'n5 ?o  o; k.-k.1k<?*l-,l-0	m	9mm	 m,/m:=nnn$'n25 o o8; pc                 l   | j                   }| j                  dk(  s| j                  dk(  rK| 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k7  r| j                  dk(  r|d| j                  z  z  }| j                  dk7  r|d| j                  z  z  }| j                  dk7  r4d| j                  v r|d| j                  z  z  }nF|d| j                  z  z  }n3|d| j                  z  z  }| j                  dk7  r|d	| j                  z  z  }| j                  dk7  r|d
| j                         z  z  }|S | j
                  dk7  r|d| j
                  z  z  }| j                  dk7  r|d| j                  z  z  }n!| j                  dk(  r|d| j                  z  z  }| j                  dk7  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k7  s|dk7  s|dk7  sq|d|d|z  }|dk7  rd|v r	|d|z  z  }|d|z  z  }|dk7  s|d|z  z  } d|vr'd|vr#| j
                  dk(  r| j                  dk(  r|dz  }| j                  dk7  r0| j                  dk(  r!| j                  dk(  r|d| j                  z  z  }| j                  dk7  r|d
| j                         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   hhEE[ AEEVOEE[ AEEVO77e66R<>>R??b 77e{{e#uq{{**yyBuqyy((vv|!&&=7QVV++C5166>)Cuqww&::&51::--CyyB88d 
_ ~~#{Q^^33"$|aoo55%uq{{**yyBuqyy((# 1:%%C77D&&C C%%C77D&&CC+%C%<45=C2IsC00Cby#:;#44C9s?2CzD00/18 S XS%8NNb(Q__-By zzU"qvv|"{QZZ//yyB88
r   N)r   r    r!   r"   r   r   r   staticmethodr#   r   r   r%   r%   A   s$    -1~@LZ {+Kr   r%   c                       e Zd ZdZd Zd Zy)UFWCommandRouteRulez)Class for parsing ufw route rule commandsc                 >    t         j                  | |       d| _        y )Nroute)r%   r   r   )r   r
   s     r   r   zUFWCommandRouteRule.__init__  s    g.	r   c                 @   |d   dk(  sJ d|v rI|j                  d      }d}t        |      |kD  r(	 t        ||dz             t        d      }t	        |      d }d }d }dj                  |      }d|v rod	|v rkd
}|j                  d      |j                  d
      kD  rd}||j                  |      dz      }|d|j                  |       ||j                  |      dz   d  z   }nLt        j                  d|      s4t        j                  d|      sd|v sd|v rt        d      }t	        |      |}d|d<   t        j                  | |      }d|j                  v r7d|j                  d   _        |r!|r|j                  d   j                  ||       |S # t
        $ r Y Dw xY w)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4y3S1W& [\G"7++ 		 HHTN>jAoEzz$$**U"33
 TZZ.23IQtzz%01DE9J19L9M4NNI+Q/,a0kW\ ABG7##I	!  y1QVV%)AFF6N"v,,UI>W " s   'F 	FFNr   r    r!   r"   r   r   r#   r   r   r   r     s    38r   r   c                       e Zd ZdZd Zd Zy)UFWCommandAppz*Class for parsing ufw application commandsc                 6    d}t         j                  | ||       y )NrK   r(   r)   s      r   r   zUFWCommandApp.__init__Z  s    D$0r   c                    d}d}d}|d   dk7  r
t               |d= t        |      }|d   j                         }|dk(  s|dk(  r^|dk\  r&|d   d	k(  rd
}|j                  d	       t        |      }|dk  r
t               t	        |d         j                  d      }|r|dz  }|dk(  r|dk7  r
t               |dk(  r}|dk  r
t               |d   j                         dk(  rd}nU|d   j                         dk(  rd}n<|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   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^  ss   7e,GD	aVv1zd1g4K(D	qy l" tAw<%%e,D+%V
,Yqy l"Aw}}')(aF*'aH,)aF*' l"f%vvr   Nr   r#   r   r   r   r   X  s    412r   r   c                       e Zd ZdZd Zd Zy)UFWCommandBasicz$Class for parsing ufw basic commandsc                 6    d}t         j                  | ||       y )Nbasicr(   r)   s      r   r   zUFWCommandBasic.__init__  s    D$0r   c                 ^    t        |      dk7  r
t               t        j                  | |      S )Nr   )r   r   r   r   )r   r   s     r   r   zUFWCommandBasic.parse  s(    t9>,d++r   Nr   r#   r   r   r   r     s    .1,r   r   c                       e Zd ZdZd Zd Zy)UFWCommandDefaultz&Class for parsing ufw default commandsc                 6    d}t         j                  | ||       y )Nr   r(   r)   s      r   r   zUFWCommandDefault.__init__      D$0r   c                 \   t        |      dk  r
t               d}d}t        |      dkD  r|d   j                         dk7  rx|d   j                         dk7  rb|d   j                         dk7  rL|d   j                         dk7  r6|d   j                         dk7  r |d   j                         dk7  r
t               |d   j                         j                  d	      rd}ng|d   j                         j                  d
      rd}nB|d   j                         dk(  s|d   j                         dk(  rd}n|d   j                         }|d   j                         dk(  rd}n<|d   j                         dk(  rd}n#|d   j                         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  sz   t9q=, 	t9q=Aw}}*,Aw}}')Aw}}(*Aw}})+Aw}}(*Aw}}*, l"Aw}}))$/&	a++E2&	aH,Q90L$	 GMMO	 7==?f$#F!W]]_'$F!W]]_(%F,%9%% ((r   Nr   r#   r   r   r   r     s    01%)r   r   c                       e Zd ZdZd Zd Zy)UFWCommandLoggingz&Class for parsing ufw logging commandsc                 6    d}t         j                  | ||       y )Nloggingr(   r)   s      r   r   zUFWCommandLogging.__init__  r   r   c                    d}t        |      dk  r
t               |d   j                         dk(  rd}t        |      S |d   j                         dk(  sX|d   j                         dk(  sB|d   j                         dk(  s,|d   j                         d	k(  s|d   j                         d
k(  r<d}|d   j                         dk7  r.|d|d   j                         z   z  }t        |      S 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    t9q=,!W]]_%"F !(( !W]]_$Q5(@!W]]_(DGMMOv,E!W]]_&!FAw}}$&#Q// !(( , ((r   Nr   r#   r   r   r   r     s    01)r   r   c                       e Zd ZdZd Zd Zy)UFWCommandStatusz%Class for parsing ufw status commandsc                 6    d}t         j                  | ||       y )Nstatusr(   r)   s      r   r   zUFWCommandStatus.__init__  s    D$0r   c                    t         j                  | |      }t        |      dk(  r	d|_        |S t        |      dkD  rH|d   j	                         dk(  r	d|_        |S |d   j	                         dk(  r	d|_        |S 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(t9>AH  Y]Aw}})++
 	 aJ.,  !l"r   Nr   r#   r   r   r   r     s    /1r   r   c                       e Zd ZdZd Zd Zy)UFWCommandShowz#Class for parsing ufw show commandsc                 6    d}t         j                  | ||       y )Nshowr(   r)   s      r   r   zUFWCommandShow.__init__  r*   r   c                 z   d}t        |      dk(  r
t               |d   j                         dk(  rd}t        |      S |d   j                         dk(  rd}t        |      S |d   j                         dk(  rd}t        |      S |d   j                         d	k(  rd
}t        |      S |d   j                         dk(  rd}t        |      S |d   j                         dk(  rd}t        |      S |d   j                         dk(  rd}t        |      S |d   j                         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   s      r   r   zUFWCommandShow.parse  sR   t9>,!W]]_%F$ !((# !W]]_."F  !(( !W]]_, F !(( !W]]_-!F !(( !W]]_/#F !(( !W]]_
*$F !(( !W]]_+%F !(( !W]]_'!F !(( ,r   Nr   r#   r   r   r   r     s    -1)r   r   c                       e Zd ZdZd Zd Zy)r   zClass for ufw parser responsec                 X    |j                         | _        d| _        d| _        i | _        y )NF)r   ro   dryrunforcern   )r   ro   s     r   r   zUFWParserResponse.__init__  s$    lln
	r   c                     d| j                   z  }t        | j                  j                               }|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__!  sf    T[[)DIINN$%		 	0Aq$))A,//A	0	T	Awr   N)r   r    r!   r"   r   r   r#   r   r   r   r     s    'r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)	UFWParserzClass for ufw parserc                     i | _         y r	   )commands)r   s    r   r   zUFWParser.__init__.  s	    r   c                    |j                         t        | j                  j                               vr
t	               |j                         t        | j                  |   j                               vr
t	               |j                         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  sc    ::<tDMM$6$6$899,99;d4==#6#;#;#=>>,yy{r   c                    d}t        |      dkD  r,|d   j                         dk(  rd}|j                  |d          d}t        |      dkD  rB|d   j                         dk(  s|d   j                         dk(  rd}|j                  |d          d}d}|d   j                         }t        |      dkD  rt|t        | j                  j                               v rO|d   j                         t        | j                  |   j                               v r|}|d   j                         }n|}t        | j                  j                               D ]W  }|| j                  |   v st        | j                  |   |   t              r t        | j                  |   |   d	      d
k7  rU|} n |dk(  rd
}| j                  ||      }| j                  |   |   }|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   t9q=T!W]]_;FKKQ t9q=d1gmmo:"1gmmo5EKKQ 1gmmot9q=SD););)=$>>Q4c(:(?(?(A#BBDq'--/C C$--,,./ 	$--** "$--"23"7Ht}}Q/4f=G D	 rz%%dC0mmD!&)99T? r   c                 z   |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                     |<   y)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    99		R!&&/C!))$C66&$&DMM!&&!$--''56#>G7##%&affc"r   N)r   r    r!   r"   r   r   r   r   r#   r   r   r   r   ,  s    ,\'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      s   J 
    < <*S,Z S,l>. >B8J 8v	,j 	,+)
 +)\)
 )0z ()Z )@ &J' J'r   