
    0fdX                         d Z ddlZddlZddlZddlmZ dZdZdZeZ	dZ
dZd	Zd
Z G d de          Z G d d          ZdS )z!common.py: common classes for ufw    N)debugufwz/lib/ufwz/usr/share/ufwz/etcz/usrz	/usr/sbinTc                       e Zd ZdZd Zd ZdS )UFWErrorz$This class represents ufw exceptionsc                     || _         d S N)value)selfr	   s     ,/usr/lib/python3/dist-packages/ufw/common.py__init__zUFWError.__init__#   s    


    c                 *    t          | j                  S r   )reprr	   r
   s    r   __str__zUFWError.__str__&   s    DJr   N)__name__
__module____qualname____doc__r   r    r   r   r   r   !   s8        ..           r   r   c                       e Zd ZdZ	 	 	 d!dZd Zd	 Zd
 Zd Zd Z	d"dZ
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd S )#UFWRulez$This class represents firewall rulesany	0.0.0.0/0inF c
                    d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        || _        d| _        	 |                     |           |                     |           |                     |           |                     |d           |                     |           |                     |           |                     |           |                     |	           d S # t4          $ r  w xY w)NFr   r   src)removeupdatedv6dstr   dportsportprotocolmultidappsappactionpositionlogtypeinterface_ininterface_out	directionforwardcomment
set_actionset_protocolset_portset_srcset_dstset_directionset_commentr   )
r
   r)   r%   r#   r"   r$   r   r.   r/   r0   s
             r   r   zUFWRule.__init__,   sL    


		
	OOF###h'''MM%   MM%'''LLLLy)))W%%%%% 	 	 		s   B)D2 2D>c                 *    |                                  S r   )format_ruler   s    r   r   zUFWRule.__str__O   s    !!!r   c                     d| z  }t          | j                  }|                                 |D ]}|d|d| j        |         z  }|S )zPrint rule to stdoutz'%s'z, =)list__dict__sort)r
   reskeysks       r   _get_attribzUFWRule._get_attribR   s\    oDM""		 	5 	5AC4=#3#344CC
r   c                    t          | j        | j                  }| j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j	        |_	        | j
        |_
        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        |S )zReturn a duplicate of a rule)r   r)   r%   r   r    r!   r"   r   r#   r$   r&   r'   r(   r*   r+   r,   r-   r.   r/   r0   )r
   rules     r   dup_rulezUFWRule.dup_rule[   s    t{DM22k|'88Z
Z
Z
I	I	| -!/||r   c                    d}| j         dk    r|d| j         z  z  }| j        dk    r|d| j        z  z  }| j        dk    r|dz  }n|d| j        z   z  }| j        rl|dz  }| j        dk    r+| j        dk    r |d| j        z   z  }|dz  }|d	| j        z   z  }n1| j        dk    r|d| j        z   z  }n| j        dk    r|d	| j        z   z  }| j        d
k    r| j        dk    r|d| j        z   z  }| j        s| j        dk    r|d| j        z   z  }| j        d
k    r| j        dk    r|d| j        z   z  }| j        s| j        dk    r|d| j        z   z  }d}| j        dk    r
d| j        z   }| j	        dk    r	|d|z  z  }n@| j	        dk    r|d|z  z  }| j        dk    r|dz  }n| j	        dk    r	|d|z  z  }n|d|z  z  }| j
        dk    s| j        dk    rd}t          j        d          }| j
        dk    r!|d|                    d| j
                  z   z  }| j
        dk    r| j        dk    r|dz  }| j        dk    r!|d|                    d| j                  z   z  }|d z  }|d|z   z  }|                                S )!zFormat rule for later parsingr   z -i %sz -o %sr   z -p allz -p z -m multiportz
 --dports z
 --sports r   ::/0z -d z	 --dport z -s z	 --sport _allowz -j ACCEPT%srejectz -j REJECT%stcpz --reject-with tcp-resetlimitz -j LIMIT%sz
 -j DROP%sz-m comment --comment ' dapp_z%20,sapp_')r,   r-   r%   r&   r#   r$   r"   r   r+   r)   r'   r(   recompilesubstrip)r
   rule_strlstrr0   	pat_spaces        r   r9   zUFWRule.format_ruler   s   ""D$566H##D$677H =E!!	!HH..Hz 	:O+:&&4:+>+>tz 99H/Htz 99HHZ5((tz 99HHZ5((tz 99H8{""tx6'9'9))Hz 	1djE11dj00H8{""tx6'9'9))Hz 	1djE11dj00H<2%D;'!!$//HH[H$$$//H}%%66[G##..HH--H9??di2oo.G
3IyB7Y]]5$)%D%DDDyB49??3yB7Y]]5$)%D%DDDsNGg%H~~r   c                 *   |                                                     d          }|d         dk    s|d         dk    s|d         dk    r|d         | _        nd| _        d}t          |          dk    r|d         }|                     |           d	S )
zSets action of the rulerH   r   rI   rJ   rL   denyr      N)lowersplitr)   lenset_logtype)r
   r)   tmpr+   s       r   r1   zUFWRule.set_action   s    llnn""3''q6WA( 2 2c!f6G6Ga&DKK DKs88a<<!fG!!!!!r   r"   c                    t          d          |z  }|dk    rn@|dk    r	| j        rn1|dk    r	| j        rn"t          j        d|          st          j        d|          rt          |          |                    d          |                    d          z   d	k    rt          |          |                    d          }t          |          d
k    rd| _	        d}|D ]t}t          j        d|          rd| _	        |                    d          }|D ]7}t          |          d
k     st          |          dk    rt          |          8t          |d                   t          |d
                   k    rt          |          nt          j        d|          r6t          |          d
k     st          |          dk    rt          |          nWt          j        d|          r3	 t          j        |          }n,# t          $ r t          |          w xY wt          |          |r|dt          |          z   z  }et          |          }v|}|dk    rt          |          | _        dS t          |          | _        dS )z:Sets port and location (destination or source) of the rulezBad port '%s'r   r"   r   z^[,:]z[,:]$rO   :   r[   Tr   z	^\d+:\d+$i  r   z^\d+$z
^\w[\w\-]+N)rH   r'   r(   rR   matchr   countr]   r^   r&   intsocketgetservbyname	Exceptionstrr$   r#   )	r
   portlocerr_msgportsr`   pranqs	            r   r3   zUFWRule.set_port   s   O$$-5==E\\di\E\\di\Xh%% %	(D)A)A %	7###jjoo

3/2557###JJsOOE5zzA~~!
C ! !8L!,, ,!%DJ''#,,C  4 4q66A::Q%"*7"3"33 *83q6{{c#a&kk11&w/// 2Xgq)) 	,1vvzzSVVe^^&w/// &4XmQ// ,0"033$ 0 0 0&w///0 #7+++ !3Q<'CCa&&CCD%<<TDJJJTDJJJs   .HHc                     |t           j        j        dgz   v r	|| _        dS t	          d          |z  }t          |          )zSets protocol of the ruler   zUnsupported protocol '%s'N)r   utilsupported_protocolsr%   rH   r   )r
   r%   rm   s      r   r2   zUFWRule.set_protocol   sE    sx3ug===$DMMM344AG7###r   c                 H   | j         rN| j        r| j        dk    s| j        dk    rd| _        | j        r| j        dk    s| j        dk    rd| _        dS dS dS | j        r| j        dk    s| j        dk    rd| _        | j        r| j        dk    s| j        dk    rd| _        dS dS dS )zAdjusts src and dst based on v6r   r   rG   N)r!   r"   r   r   s    r   _fix_anywherezUFWRule._fix_anywhere   s    7 		'x "TX..$(k2I2I!x "TX..$(k2I2I!" "2I2I x 'TX..$(f2D2D&x 'TX..$(f2D2D&' '2D2Dr   c                 <    || _         |                                  dS )zXSets whether this is ipv6 rule, and adjusts src and dst
           accordingly.
        N)r!   rv   )r
   r!   s     r   set_v6zUFWRule.set_v6  s#     r   c                     |                                 }|dk    r>t          j                            |d          st	          d          }t          |          || _        |                                  dS )zSets source address of ruler   zBad source addressN)r\   r   rs   valid_addressrH   r   r   rv   r
   addrr`   rm   s       r   r4   zUFWRule.set_src  si    jjll%<< 6 6sE B B<,--G7###r   c                     |                                 }|dk    r>t          j                            |d          st	          d          }t          |          || _        |                                  dS )z Sets destination address of ruler   zBad destination addressN)r\   r   rs   rz   rH   r   r"   rv   r{   s       r   r5   zUFWRule.set_dst  si    jjll%<< 6 6sE B B<122G7###r   c                 B   |dk    r$|dk    rt          d          }t          |          dt          |          v rt          d          }t          |          dt          |          v rt          d          }t          |          t          |          dk    st          |          d	k    rt          d
          }t          |          t          t          |                    dk    rt          d          }t          |          t          t          |                    dk    rt          d          }t          |          t	          j        dt          |                    st          d          }t          |          |dk    r	|| _        dS || _        dS )zSets an interface for ruler   outzBad interface type!z+Bad interface name: reserved character: '!'rb   z/Bad interface name: can't use interface aliases.z..z)Bad interface name: can't use '.' or '..'r   z+Bad interface name: interface name is empty   z+Bad interface name: interface name too longz^[a-zA-Z0-9_\-\.\+,=%@]+$zBad interface nameN)rH   r   rj   r^   rR   rd   r,   r-   )r
   if_typenamerm   s       r   set_interfacezUFWRule.set_interface'  s    d??w%//,--G7### #d))EFFG7####d))IJJG7###t99s4yyD00CDDG7###D		NNaEFFG7###D		NNREFFG7### x4c$ii@@ 	$,--G7###d?? $D!%Dr   c                     t          |          dk    rCt          j        dt          |                    s!t          d          |z  }t	          |          t          |          | _        dS )zSets the position of the rulez-1z^[0-9]+z,Insert position '%s' is not a valid positionN)rj   rR   rd   rH   r   rf   r*   )r
   numrm   s      r   set_positionzUFWRule.set_positionW  s^    
 s88tBHZS$B$BFGG3OG7###Cr   c                     |                                 dk    s|                                 dk    s|dk    r|                                 | _        dS t          d          |z  }t          |          )zSets logtype of the rulelogzlog-allr   zInvalid log type '%s'N)r\   r+   rH   r   )r
   r+   rm   s      r   r_   zUFWRule.set_logtypea  sd    ==??e##w}})'C'Cb=="==??DLLL/00G<G7###r   c                 n    |dk    s|dk    r	|| _         dS t          d          |z  }t          |          )zSets direction of the ruler   r   zUnsupported direction '%s'N)r.   rH   r   )r
   r.   rm   s      r   r6   zUFWRule.set_directionj  sC    	U 2 2&DNNN455CG7###r   c                 J    t           j                            | j                  S )zGet decoded comment of the rule)r   rs   
hex_decoder0   r   s    r   get_commentzUFWRule.get_commentr  s    x""4<000r   c                     || _         dS )zSets comment of the ruleN)r0   )r
   r0   s     r   r7   zUFWRule.set_commentv  s    r   c                 6   d}| j         ri	 t          j                            | j         | j                  \  | _         }n,# t
          $ r t          d          }t          |          w xY w|r|| _        | j	        ri	 t          j                            | j	        | j                  \  | _	        }n,# t
          $ r t          d          }t          |          w xY w|r|| _        | j
        rS| j
                            d          }t          j                            |           d                    |          | _
        | j        rU| j                            d          }t          j                            |           d                    |          | _        dS dS )z&Normalize src and dst to standard formFz"Could not normalize source addressz'Could not normalize destination addressrO   N)r   r   rs   normalize_addressr!   ri   rH   r   r    r"   r#   r]   
human_sortjoinr$   )r
   changedrm   rn   s       r   	normalizezUFWRule.normalizez  s   8 		'(&)h&@&@AE'J 'J#77 ( ( (@AAw'''(  '&8 		'(&)h&@&@CG7'L 'L#77 ( ( (EFFw'''(  '&: 	)J$$S))EH&&&%DJ: 	)J$$S))EH&&&%DJJJ	) 	)s   2> )A';2B. .)Cc                     | r|st                      d| d|d}| j        |j        k    rt          |           dS | j        |j        k    rt          |           dS | j        |j        k    rt          |           dS | j        |j        k    rt          |           dS | j        |j        k    rt          |           dS | j        |j        k    rt          |           dS | j        |j        k    rt          |           dS | j	        |j	        k    rt          |           dS | j
        |j
        k    rt          |           dS | j        |j        k    rt          |           dS | j        |j        k    rt          |           dS | j        |j        k    rt          |           dS | j        |j        k    r@| j        |j        k    r0| j        |j        k    r t#          d          }t          |           dS | j        |j        k    r@| j        |j        k    r0| j        |j        k    r t#          d          }t          |           dS t#          d	          | j        |j        | j        |j        | j        |j        d
z  }t          |           dS )zCheck if rules match
        Return codes:
          0  match
          1  no match
         -1  match all but action, log-type and/or comment
         -2  match all but comment
        z
No match 'z' 'rQ   r[   zFound exact matchr   z$Found exact match, excepting commentzZFound non-action/non-logtype/comment match (%(xa)s/%(ya)s/'%(xc)s' %(xl)s/%(yl)s/'%(yc)s'))xayaxlylxcyc)
ValueErrorr#   r   r$   r%   r   r"   r!   r'   r(   r,   r-   r.   r/   r)   r+   r0   rH   )xydbg_msgs      r   rd   zUFWRule.match  s     	 	,,	 +,!!QQQ/7ag'NNN17ag'NNN1:##'NNN15AE>>'NNN15AE>>'NNN1414<<'NNN16QV'NNN16QV'NNN1>Q^++'NNN1?ao--'NNN1;!+%%'NNN19	!!'NNN18qxAI$:$:	QY&&+,,G'NNN18qxAI$:$:	QY&&>??G'NNN2 F G GHAHIQYIQY8 89
 	grr   c                    d }| r|st                      |                     |          dk    rdS d| d| j        d|d|j        d	}|j        dk    rt	          d|z   d	z              d
S |j        | j        k    rt	          |dz              d
S | j        |j        k    r|j        dk    rt	          d|z              d
S |j        dk    r* || j        |j                  st	          d|z              d
S |j        dk    r| j        dk    r| 	                    | j
                  rn| j
        |j
        k    rd|j
        vrt	          d|z              d
S | j
        |j
        k    rqd|j
        v rh| j        |j        k    rXt          j                            | j
        |j
        | j                  s(t	          d|z   d| j
        d|j
        dz              d
S nF| j        dk    r8| j        |j        k    r(t	          d|z   d| j        d|j        dz              d
S 	 t          j                            |j        | j                  }n.# t          $ r! t	          d|z   d|j        z  z              Y d
S w xY w|j
        |k    r,d|j
        vr#t	          d|z   d|j
        d|dz              d
S |j
        |k    rgd|j
        v r^| j        |j        k    rNt          j                            ||j
        | j                  s#t	          d|z   d|d|j
        dz              d
S | j        |j        k    r(t	          d|z   d| j
        d|j
        dz              d
S t	          d| d| j        d|d|j        d	           dS )a  This will match if x is more specific than y. Eg, for protocol if x
           is tcp and y is all or for address if y is a network and x is a
           subset of y (where x is either an address or network). Returns:

            0  match
            1  no match
           -1  fuzzy match

           This is a fuzzy destination match, so source ports or addresses
           are not considered, and (currently) only incoming.
        c                 *   d| v sd| v r
| |k    rdS dS |                     d          D ]j}| |k    r dS d|v r[|                     d          \  }}t          |           t          |          k    r#t          |           t          |          k    r dS kdS )z:Returns True if p is an exact match or within a multi rulerO   rb   TF)r]   rf   )test_pto_matchrk   lowhighs        r   _match_portsz-UFWRule.fuzzy_dst_match.<locals>._match_ports  s    f}}vX%%4u s++ $ $T>>44$;;"&**S//KS$6{{c#hh..3v;;#d))3K3K#tt5r   r   zNo fuzzy match 'z (v6=z)' 'z)'r   z(direction) z (not incoming)r[   z (forward does not match)r   z(protocol) z(dport) r   /z(dst) z ('z' not in network 'z')z(interface) z (z != )z %s does not existz(v6) z(fuzzy match) 'r   )r   rd   r!   r.   r   r/   r%   r#   r,   _is_anywherer"   r   rs   
in_networkget_ip_from_ifIOError)r   r   r   r   if_ips        r   fuzzy_dst_matchzUFWRule.fuzzy_dst_match  s,   	 	 	"  	 	,, 771::??1  AAqtttQQQ& ;$.7*->>???1 9	!!'778881 :##
e(;(;-')***1 7eLL!'$B$B*w&'''1>R ~##qu(=(=# !%Cqu$4$4h()))q!%C15LLQTQT\\8&&quaeQT:: 6Bh((uuuaeee,% % & & &q ~##!.(H(Hnw..~~~q~~~27 7 8 8 8q//EE   nw.1E~2' ' ( ( (qq
 u~~#QU"2"2nw..uuueee2% % & & &q%C15LLQTQT\\8&&uaeQT:: 6Bnw..7<uuaeeeDE F F Fq414<<'G##quuuaeee&DDEEE1 	111adddAAAqtttLMMMrs   *I 'I0/I0c                 "    |dk    s|dk    rdS dS )zCheck if address is anywhererG   r   TFr   )r
   r|   s     r   r   zUFWRule._is_anywhereN  s    6>>T[004ur   c                    d}| j         dk    s| j        dk    r| j         d| j        d| j        d| j        }| j         dk    r!| j        d| j        d| j        d| j        }| j        dk    r!| j         d| j        d| j        d| j        }| j        dk    r| j        dk    r|d| j        z  z  }n0| j        dk    r|d| j        z  z  }| j        dk    r|d| j        z  z  }|S )a  Returns a tuple to identify an app rule. Tuple is:
             dapp dst sapp src direction_iface|direction
           or
             dport dst sapp src direction_iface|direction
           or
             dapp dst sport src direction_iface|direction

           where direction_iface is of form 'in_eth0', 'out_eth0' or
           'in_eth0 out_eth0' (ie, both interfaces used). If no interfaces are
           specified, then tuple ends with the direction instead.
        r   rM   z %sz in_%sz out_%s)	r'   r(   r"   r   r#   r$   r,   r-   r.   )r
   tupls     r   get_app_tuplezUFWRule.get_app_tupleT  s    9??di2oo$(IIItxxxDHHMDyB(,


DHHHdiii)-3yB(,			4888TZZZ)-3  B&&4+=+C+C00 $**H(9::D%++I);<<Dr   c                    | j         dk    r<| j        dk    s| j        dk    r&t          d          | j         z  }t	          |          | j         t
          j        j        v r,|dk    r&t          d          | j         z  }t	          |          | j         t
          j        j        v r<| j	        dk    s| j
        dk    r(t          d          | j         z  }t	          |          dS dS )zVerify ruler   r   z3Improper rule syntax ('%s' specified with app rule)r!   z'Invalid IPv6 address with protocol '%s'zInvalid port with protocol '%s'N)r%   r(   r'   rH   r   r   rs   ipv4_only_protocolsportless_protocolsr#   r$   )r
   rule_iptyperm   s      r   verifyzUFWRule.verifyv  s     =E!!IOOtyBMNN=*G7###=CH888$ABB(G7###=CH777zU""djE&9&9=>>!],w'''	 87&9&9r   N)r   r   r   r   r   Fr   )r"   )r   r   r   r   r   r   rB   rE   r9   r1   r3   r2   rv   rx   r4   r5   r   r   r_   r6   r   r7   r   rd   r   r   r   r   r   r   r   r   r   *   s       ..:EGL! ! ! !F" " "    .A  A  A F" " "3# 3# 3# 3#j$ $ $' ' '      .& .& .&`! ! !$ $ $$ $ $1 1 1  !) !) !)FA A AFl l l\       D( ( ( ( (r   r   )r   rR   rg   ufw.utilr   r   programName	state_dir	share_dir	trans_dir
config_dir
prefix_diriptables_dir	do_checksri   r   r   r   r   r   <module>r      s    ' '" 
			        			

	         y      `	( `	( `	( `	( `	( `	( `	( `	( `	( `	(r   