Ë
    �ïeX  ã                   óv   — 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y)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y)ÚUFWErrorz$This class represents ufw exceptionsc                 ó   — || _         y ©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   € Ü�D—J‘JÓÐr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   © r   r   r   r   !   s   „ Ù.òó 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y)ÚUFWRulez$This class represents firewall rulesc
                 ó>  — d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        || _        d| _        	 | j'                  |«       | j)                  |«       | j+                  |«       | j+                  |d«       | j-                  |«       | j/                  |«       | j1                  |«       | j3                  |	«       y # t4        $ r ‚ w xY w)NFÚ 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,   r-   s
             r   r   zUFWRule.__init__,   s
  € ð ˆŒØˆŒØˆŒØˆŒØˆŒØˆŒ
ØˆŒ
ØˆŒØˆŒ
ØˆŒ	ØˆŒ	ØˆŒØˆŒØˆŒØˆÔØˆÔØˆŒØˆŒØˆŒð
	Ø�O‰O˜FÔ#Ø×Ñ˜hÔ'Ø�M‰M˜%Ô Ø�M‰M˜% Ô'Ø�L‰L˜ÔØ�L‰L˜ÔØ×Ñ˜yÔ)Ø×Ñ˜WÕ%øÜò 	Øð	ús   ÂB	D ÄDc                 ó"   — | j                  «       S r   )Úformat_ruler   s    r   r   zUFWRule.__str__O   s   € Ø×ÑÓ!Ð!r   c                 ó˜   — d| z  }t        | j                  «      }|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   sN   € à˜‰oˆÜ�D—M‘MÓ"ˆØ�	‰	ŒØò 	5ˆAÙ¢ 4§=¡=°Ò#3Ð4Ñ4‰Cð	5àˆ
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,   r-   )r
   Úrules     r   Údup_rulezUFWRule.dup_rule[   sÜ   € ä�t—{‘{ D§M¡MÓ2ˆØ—k‘kˆŒØ—|‘|ˆŒØ—'‘'ˆŒØ—8‘8ˆŒØ—8‘8ˆŒØ—Z‘ZˆŒ
Ø—Z‘ZˆŒ
Ø—Z‘ZˆŒ
Ø—I‘IˆŒ	Ø—I‘IˆŒ	ØŸ™ˆŒØ—|‘|ˆŒØ ×-Ñ-ˆÔØ!×/Ñ/ˆÔØŸ™ˆŒØ—|‘|ˆŒØ—|‘|ˆŒàˆr   c                 ó:  — d}| j                   dk7  r|d| j                   z  z  }| j                  dk7  r|d| j                  z  z  }| j                  dk(  r|dz  }n®|d| j                  z   z  }| j                  r�|dz  }| j                  dk7  r9| j
                  dk7  r*|d| j                  z   z  }|dz  }|d	| j
                  z   z  }nC| j                  dk7  r|d| j                  z   z  }n!| j
                  dk7  r|d	| j
                  z   z  }| j                  d
k7  r!| j                  dk7  r|d| j                  z   z  }| j                  s!| j                  dk7  r|d| j                  z   z  }| j                  d
k7  r!| j                  dk7  r|d| j                  z   z  }| j                  s!| j
                  dk7  r|d| j
                  z   z  }d}| j                  dk7  rd| j                  z   }| j                  dk(  r	|d|z  z  }nL| 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k7  s| j                  dk7  r©d}t        j                  d«      }| j                  dk7  r"|d|j                  d| j                  «      z   z  }| j                  dk7  r| j                  dk7  r|dz  }| j                  dk7  r"|d|j                  d| j                  «      z   z  }|d z  }|d|z   z  }|j                  «       S )!zFormat rule for later parsingr   z -i %sz -o %sÚanyz -p allz -p z -m multiportz
 --dports z
 --sports ú	0.0.0.0/0ú::/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Úlstrr-   Ú	pat_spaces        r   r6   zUFWRule.format_ruler   sý  € àˆà×Ñ Ò"Ø˜ D×$5Ñ$5Ñ6Ñ6ˆHØ×Ñ Ò#Ø˜ D×$6Ñ$6Ñ7Ñ7ˆHð �=‰=˜EÒ!Ø˜	Ñ!‰Hà˜ §¡Ñ.Ñ.ˆHà�zŠzØ˜OÑ+�Ø—:‘: Ò&¨4¯:©:¸Ò+>Ø ¨t¯z©zÑ 9Ñ9�HØ Ñ/�HØ ¨t¯z©zÑ 9Ñ9‘HØ—Z‘Z 5Ò(Ø ¨t¯z©zÑ 9Ñ9‘HØ—Z‘Z 5Ò(Ø ¨t¯z©zÑ 9Ñ9�Hà�8‰8�{Ò" t§x¡x°6Ò'9Ø˜ §¡Ñ)Ñ)ˆHØ�zŠz˜dŸj™j¨EÒ1Ø˜ d§j¡jÑ0Ñ0ˆHØ�8‰8�{Ò" t§x¡x°6Ò'9Ø˜ §¡Ñ)Ñ)ˆHØ�zŠz˜dŸj™j¨EÒ1Ø˜ d§j¡jÑ0Ñ0ˆHàˆØ�<‰<˜2ÒØ˜Ÿ™Ñ%ˆDØ�;‰;˜'Ò!Ø˜¨$Ñ/Ñ/‰HØ�[‰[˜HÒ$Ø˜¨$Ñ/Ñ/ˆHØ�}‰} Ò%àÐ6Ñ6‘Ø�[‰[˜GÒ#à˜¨Ñ.Ñ.‰Hà˜¨Ñ-Ñ-ˆHà�9‰9˜Š?˜dŸi™i¨2šoà.ˆGÜŸ
™
 3›ˆIØ�y‰y˜BŠØ˜7 Y§]¡]°5¸$¿)¹)Ó%DÑDÑD�Ø�y‰y˜BŠ 4§9¡9°¢?Ø˜3‘�Ø�y‰y˜BŠØ˜7 Y§]¡]°5¸$¿)¹)Ó%DÑDÑD�Ø�s‰NˆGà˜˜g™Ñ%ˆHà�~‰~ÓÐr   c                 óâ   — |j                  «       j                  d«      }|d   dk(  s|d   dk(  s|d   dk(  r|d   | _        nd| _        d}t        |«      dkD  r|d   }| j	                  |«       y	)
zSets action of the rulerG   r   rH   rI   rK   Údenyr   é   N)ÚlowerÚsplitr&   ÚlenÚset_logtype)r
   r&   Útmpr(   s       r   r.   zUFWRule.set_actionµ   ss   € à�l‰l‹n×"Ñ" 3Ó'ˆØˆq‰6�WÒ  A¡¨(Ò 2°c¸!±fÀÒ6GØ˜a™&ˆD�Kà ˆDŒKàˆÜˆs‹8�aŠ<Ø˜!‘fˆGØ×Ñ˜Õ!r   c                 ó^  — t        d«      |z  }|dk(  r�nÚ|dk(  r| j                  r�nÇ|dk(  r| j                  r�n´t        j                  d|«      st        j                  d|«      rt        |«      ‚|j                  d«      |j                  d«      z   d	kD  rt        |«      ‚|j                  d«      }t        |«      d
kD  rd| _	        d}|D �]  }t        j                  d|«      rnd| _	        |j                  d«      }|D ])  }t        |«      d
k  st        |«      dkD  sŒ t        |«      ‚ t        |d   «      t        |d
   «      k\  r€t        |«      ‚t        j                  d|«      r't        |«      d
k  st        |«      dkD  rCt        |«      ‚t        j                  d|«      r	 t        j                  |«      }nt        |«      ‚|r|dt        |«      z   z  }�Œt        |«      }�Œ |}|dk(  rt        |«      | _        yt        |«      | _        y# t        $ r t        |«      ‚w xY w)z:Sets port and location (destination or source) of the rulezBad port '%s'rD   r   r   z^[,:]z[,:]$rN   ú:é   rZ   Tr   z	^\d+:\d+$iÿÿ  r   z^\d+$z
^\w[\w\-]+N)rG   r$   r%   rQ   Úmatchr   Úcountr\   r]   r#   ÚintÚsocketÚgetservbynameÚ	ExceptionÚstrr!   r    )	r
   ÚportÚlocÚerr_msgÚportsr_   ÚpÚranÚqs	            r   r0   zUFWRule.set_portÂ   sî  € ä�OÓ$¨Ñ-ˆØ�5Š=ÙØ�EŠ\˜dŸišiÙØ�EŠ\˜dŸišiÙÜ�X‰X�h Ô%¬¯©°(¸DÔ)AÜ˜7Ó#Ð#Ø�j‰j˜‹o §
¡
¨3£Ñ/°2Ò5ä˜7Ó#Ð#à—J‘J˜s“OˆEÜ�5‹z˜AŠ~Ø!�”
àˆCØó !�Ü—8‘8˜L¨!Ô,à!%�D”JØŸ'™' #›,�CØ ò 4˜Ü˜q›6 Aš:¬¨Q«°%«Ü"*¨7Ó"3Ð3ð4ô ˜3˜q™6“{¤c¨#¨a©&£kÒ1Ü& wÓ/Ð/Ü—X‘X˜h¨Ô*Ü˜1“v ’z¤S¨£V¨e¢^Ü& wÓ/Ð/Ü—X‘X˜m¨QÔ/ð0Ü"×0Ñ0°Ó3™ô # 7Ó+Ð+áØ˜3¤ Q£™<Ñ'’Cä˜a›&’Cð1!ð4 ˆDà�%Š<Ü˜T›ˆD�Jä˜T›ˆD�Jøô %ò 0Ü& wÓ/Ð/ð0ús   Æ*HÈH,c                 ó„   — |t         j                  j                  dgz   v r|| _        yt	        d«      |z  }t        |«      ‚)zSets protocol of the rulerD   zUnsupported protocol '%s'N)r   ÚutilÚsupported_protocolsr"   rG   r   )r
   r"   rl   s      r   r/   zUFWRule.set_protocol÷   s=   € à”s—x‘x×3Ñ3°u°gÑ=Ñ=Ø$ˆD�MäÐ3Ó4¸ÑAˆGÜ˜7Ó#Ð#r   c                 ó®  — | j                   re| j                  r%| j                  dk(  s| j                  dk(  rd| _        | j                  r'| j                  dk(  s| j                  dk(  rd| _        yyy| j                  r%| j                  dk(  s| j                  dk(  rd| _        | j                  r'| j                  dk(  s| j                  dk(  rd| _        yyy)zAdjusts src and dst based on v6rD   rE   rF   N)r   r   r   r   s    r   Ú_fix_anywherezUFWRule._fix_anywhereÿ   s«   € à�7Š7Ø�xŠx˜TŸX™X¨Ò.°$·(±(¸kÒ2IØ!�”Ø�xŠx˜TŸX™X¨Ò.°$·(±(¸kÒ2IØ!�•ð 3Jˆxð �xŠx˜TŸX™X¨Ò.°$·(±(¸fÒ2DØ&�”Ø�xŠx˜TŸX™X¨Ò.°$·(±(¸fÒ2DØ&�•ð 3Eˆxr   c                 ó2   — || _         | j                  «        y)zXSets whether this is ipv6 rule, and adjusts src and dst
           accordingly.
        N)r   ru   )r
   r   s     r   Úset_v6zUFWRule.set_v6  s   € ð ˆŒØ×ÑÕr   c                 óÈ   — |j                  «       }|dk7  r6t        j                  j                  |d«      st	        d«      }t        |«      ‚|| _        | j                  «        y)zSets source address of rulerD   zBad source addressN)r[   r   rr   Úvalid_addressrG   r   r   ru   ©r
   Úaddrr_   rl   s       r   r1   zUFWRule.set_src  sP   € à�j‰j‹lˆà�%Š<¤§¡× 6Ñ 6°s¸EÔ BÜÐ,Ó-ˆGÜ˜7Ó#Ð#ØˆŒØ×ÑÕr   c                 óÈ   — |j                  «       }|dk7  r6t        j                  j                  |d«      st	        d«      }t        |«      ‚|| _        | j                  «        y)z Sets destination address of rulerD   zBad destination addressN)r[   r   rr   ry   rG   r   r   ru   rz   s       r   r2   zUFWRule.set_dst  sP   € à�j‰j‹lˆà�%Š<¤§¡× 6Ñ 6°s¸EÔ BÜÐ1Ó2ˆGÜ˜7Ó#Ð#ØˆŒØ×ÑÕr   c                 óz  — |dk7  r|dk7  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kD  rt        d«      }t        |«      ‚t	        j
                  dt        |«      «      st        d«      }t        |«      ‚|dk(  r|| _        y|| _        y)zSets an interface for ruleÚinÚoutzBad interface typeú!z+Bad interface name: reserved character: '!'ra   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)rG   r   ri   r]   rQ   rc   r)   r*   )r
   Úif_typeÚnamerl   s       r   Úset_interfacezUFWRule.set_interface'  s)  € ð �dŠ?˜w¨%Ò/ÜÐ,Ó-ˆGÜ˜7Ó#Ð#ð ”#�d“)ÑÜÐEÓFˆGÜ˜7Ó#Ð#à”#�d“)ÑÜÐIÓJˆGÜ˜7Ó#Ð#äˆt‹9˜Òœs 4›y¨DÒ0ÜÐCÓDˆGÜ˜7Ó#Ð#ä”�D“	‹N˜aÒÜÐEÓFˆGÜ˜7Ó#Ð#ä”�D“	‹N˜RÒÜÐEÓFˆGÜ˜7Ó#Ð#ô �x‰xÐ4´c¸$³iÔ@ÜÐ,Ó-ˆGÜ˜7Ó#Ð#à�dŠ?Ø $ˆDÕà!%ˆDÕr   c                 ó°   — t        |«      dk7  r8t        j                  dt        |«      «      st        d«      |z  }t	        |«      ‚t        |«      | _        y)zSets the position of the rulez-1z^[0-9]+z,Insert position '%s' is not a valid positionN)ri   rQ   rc   rG   r   re   r'   )r
   Únumrl   s      r   Úset_positionzUFWRule.set_positionW  sG   € ô
 ˆs‹8�tÒ¤B§H¡H¨Z¼¸S»Ô$BÜÐFÓGÈ3ÑOˆGÜ˜7Ó#Ð#Ü˜C›ˆ�r   c                 ó¶   — |j                  «       dk(  s|j                  «       dk(  s|dk(  r|j                  «       | _        yt        d«      |z  }t        |«      ‚)zSets logtype of the ruleÚlogzlog-allr   zInvalid log type '%s'N)r[   r(   rG   r   )r
   r(   rl   s      r   r^   zUFWRule.set_logtypea  sL   € à�=‰=‹?˜eÒ# w§}¡}£¸)Ò'CØ�bŠ=Ø"Ÿ=™=›?ˆD�LäÐ/Ó0°GÑ<ˆGÜ˜7Ó#Ð#r   c                 óX   — |dk(  s|dk(  r|| _         yt        d«      |z  }t        |«      ‚)zSets direction of the ruler~   r   zUnsupported direction '%s'N)r+   rG   r   )r
   r+   rl   s      r   r3   zUFWRule.set_directionj  s3   € à˜Ò 	¨UÒ 2Ø&ˆD�NäÐ4Ó5¸ÑCˆGÜ˜7Ó#Ð#r   c                 óT   — t         j                  j                  | j                  «      S )zGet decoded comment of the rule)r   rr   Ú
hex_decoder-   r   s    r   Úget_commentzUFWRule.get_commentr  s   € ä�x‰x×"Ñ" 4§<¡<Ó0Ð0r   c                 ó   — || _         y)zSets comment of the ruleN)r-   )r
   r-   s     r   r4   zUFWRule.set_commentv  s	   € àˆ�r   c                 óN  — d}| j                   rF	 t        j                  j                  | j                   | j                  «      \  | _         }|r|| _        | j                  rF	 t        j                  j                  | j                  | j                  «      \  | _	        }|r|| _        | j                  rP| j                  j                  d«      }t        j                  j                  |«       dj                  |«      | _
        | j                  rQ| j                  j                  d«      }t        j                  j                  |«       dj                  |«      | _        yy# t
        $ r t        d«      }t        |«      ‚w xY w# t
        $ r t        d«      }t        |«      ‚w xY w)z&Normalize src and dst to standard formFz"Could not normalize source addressz'Could not normalize destination addressrN   N)r   r   rr   Únormalize_addressr   rh   rG   r   r   r   r    r\   Ú
human_sortÚjoinr!   )r
   Úchangedrl   rm   s       r   Ú	normalizezUFWRule.normalizez  sS  € àˆØ�8Š8ð(Ü&)§h¡h×&@Ñ&@ÀÇÁØAEÇÁó'JÑ#�”˜7ñ Ø&�”à�8Š8ð(Ü&)§h¡h×&@Ñ&@ÀÇÁØCGÇ7Á7ó'LÑ#�”˜7ñ Ø&�”à�:Š:Ø—J‘J×$Ñ$ SÓ)ˆEÜ�H‰H×Ñ Ô&ØŸ™ %›ˆDŒJà�:Š:Ø—J‘J×$Ñ$ SÓ)ˆEÜ�H‰H×Ñ Ô&ØŸ™ %›ˆD�Jð øô/ ò (ÜÐ@ÓA�Ü˜wÓ'Ð'ð(ûô ò (ÜÐEÓF�Ü˜wÓ'Ð'ð(ús   �<E! Á"<F Å! FÆ F$c                 óê  — | r|s
t        «       ‚d| ›d|›d�}| j                  |j                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j
                  |j
                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j                  |j                  k7  rt        |«       y| j                  |j                  k(  rI| j                  |j                  k(  r0| j                   |j                   k(  rt#        d«      }t        |«       y| j                  |j                  k(  rI| j                  |j                  k(  r0| j                   |j                   k7  rt#        d«      }t        |«       yt#        d	«      | j                  |j                  | j                  |j                  | j                   |j                   d
œz  }t        |«       y)zºCheck 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' 'rP   rZ   zFound exact matchr   z$Found exact match, excepting commentéþÿÿÿzZFound 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(   r-   rG   )ÚxÚyÚdbg_msgs      r   rc   zUFWRule.match�  s-  € ñ ™Ü“,Ðð ò +,ªQÐ/ˆØ�7‰7�a—g‘gÒÜ�'ŒNØØ�7‰7�a—g‘gÒÜ�'ŒNØØ�:‰:˜Ÿ™Ò#Ü�'ŒNØØ�5‰5�A—E‘EŠ>Ü�'ŒNØØ�5‰5�A—E‘EŠ>Ü�'ŒNØØ�4‰4�1—4‘4Š<Ü�'ŒNØØ�6‰6�Q—V‘VÒÜ�'ŒNØØ�6‰6�Q—V‘VÒÜ�'ŒNØØ�>‰>˜QŸ^™^Ò+Ü�'ŒNØØ�?‰?˜aŸo™oÒ-Ü�'ŒNØØ�;‰;˜!Ÿ+™+Ò%Ü�'ŒNØØ�9‰9˜Ÿ	™	Ò!Ü�'ŒNØØ�8‰8�q—x‘xÒ A§I¡I°·±Ò$:Ø—	‘	˜QŸY™YÒ&ÜÐ+Ó,ˆGÜ�'ŒNØØ�8‰8�q—x‘xÒ A§I¡I°·±Ò$:Ø—	‘	˜QŸY™YÒ&ÜÐ>Ó?ˆGÜ�'ŒNØäð Fó GàŸH™H¨A¯H©HØŸI™I¨Q¯Y©YØŸI™I¨Q¯Y©Yñ8ñ9ˆô
 	ˆgŒØr   c                 ó>  — d„ }| r|s
t        «       ‚| j                  |«      dk(  ryd| ›d| j                  ›d|›d|j                  ›d�	}|j                  dk7  rt	        d|z   d	z   «       y
|j
                  | j
                  k7  rt	        |dz   «       y
| j                  |j                  k7  r|j                  dk7  rt	        d|z   «       y
|j                  dk7  r, || j                  |j                  «      st	        d|z   «       y
|j                  dk(  �r| j                  dk(  r| j                  | j                  «      r�n>| j                  |j                  k7  rd|j                  vrt	        d|z   «       y
| j                  |j                  k7  �rîd|j                  v �rß| j                  |j                  k(  �rÅt        j                  j                  | j                  |j                  | j                  «      �s…t	        d|z   d| j                  ›d|j                  ›d�z   «       y
| j                  dk7  rF| j                  |j                  k7  r-t	        d|z   d| j                  ›d|j                  ›d�z   «       y
	 t        j                  j                  |j                  | j                  «      }|j                  |k7  r1d|j                  vr#t	        d|z   d|j                  ›d|›d�z   «       y
|j                  |k7  rd|j                  v rq| j                  |j                  k(  rXt        j                  j                  ||j                  | j                  «      s#t	        d|z   d|›d|j                  ›d�z   «       y
| j                  |j                  k7  r-t	        d|z   d| j                  ›d|j                  ›d�z   «       y
t	        d| ›d| j                  ›d|›d|j                  ›d�	«       y# t        $ r! t	        d|z   d|j                  z  z   «       Y y
w xY w)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yy|j                  d«      D ]S  }| |k(  r yd|v sŒ|j                  d«      \  }}t        | «      t        |«      k\  sŒ;t        | «      t        |«      k  sŒS y y)z:Returns True if p is an exact match or within a multi rulerN   ra   TF)r\   re   )Útest_pÚto_matchrj   ÚlowÚhighs        r   Ú_match_portsz-UFWRule.fuzzy_dst_match.<locals>._match_portsì  s~   € à�f‰}  v¡Ø˜XÒ%ØØà Ÿ™ sÓ+ò $�Ø˜T’>ÙØ˜$’;Ø"&§*¡*¨S£/‘K�S˜$Ü˜6“{¤c¨#£hÓ.´3°v³;Ä#ÀdÃ)Ó3KÙ#ð$ð r   r   zNo fuzzy match 'z (v6=z)' 'z)'r~   z(direction) z (not incoming)rZ   z (forward does not match)rD   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Ÿ   rc   r   r+   r   r,   r"   r    r)   Ú_is_anywherer   r   rr   Ú
in_networkÚget_ip_from_ifÚIOError)r    r¡   r©   r¢   Úif_ips        r   Úfuzzy_dst_matchzUFWRule.fuzzy_dst_matchà  sH  € ò	ñ" ™Ü“,Ðð �7‰7�1‹:˜Š?Øð ò �q—t“tšQ §£ð&ˆð �;‰;˜$ÒÜ�. 7Ñ*Ð->Ñ>Ô?Øð �9‰9˜Ÿ	™	Ò!Ü�'Ð7Ñ7Ô8Øð �:‰:˜Ÿ™Ò#¨¯
©
°eÒ(;Ü�- 'Ñ)Ô*Øð �7‰7�eÒ¡L°·±¸!¿'¹'Ô$BÜ�*˜wÑ&Ô'Øà�>‰>˜RÓð �~‰~ Ò#¨¯©°q·u±uÔ(=ñ Ø—‘˜!Ÿ%™%’ C¨q¯u©uÑ$4Ü�h Ñ(Ô)ØØ—‘˜!Ÿ%™%“ C¨1¯5©5¢L°Q·T±T¸Q¿T¹T³\Ü—8‘8×&Ñ& q§u¡u¨a¯e©e°Q·T±TÕ:Ü�h Ò(Ø—u“u˜aŸe›eð,%ñ %ô &àð �~‰~ Ò#¨¯©¸!¿.¹.Ò(HÜ�n wÒ.Ø—~“~ q§~£~ð27ñ 7ô 8àðÜŸ™×/Ñ/°·±ÀÇÁÓE�ð �u‰u˜Š~ #¨Q¯U©UÑ"2Ü�n wÒ.Ø—u“ušeð2%ñ %ô &àØ—‘˜%’ C¨1¯5©5¡L°Q·T±T¸Q¿T¹T²\Ü—8‘8×&Ñ& u¨a¯e©e°Q·T±TÔ:Ü�n wÒ.Ú7<¸a¿e»eÐDñEô Fàà�4‰4�1—4‘4Š<Ü�'˜GÒ#°q·u³u¸a¿e»eÐ&DÑDÔEØõ 	º1¸a¿d»dÂAÀqÇtÃtÐLÔMØøô+ ò Ü�n wÑ.Ð1EØ—~‘~ñ2'ñ 'ô (áðús   É=4O2 Ï2'PÐPc                 ó   — |dk(  s|dk(  ryy)zCheck if address is anywhererF   rE   TFr   )r
   r{   s     r   r¬   zUFWRule._is_anywhereN  s   € à�6Š>˜T [Ò0ØØr   c                 óª  — d}| j                   dk7  s| j                  dk7  �r1| j                   ›d| j                  ›d| j                  ›d| j                  ›�}| j                   dk(  r5| j                  ›d| j                  ›d| j                  ›d| j                  ›�}| j                  dk(  r5| j                   ›d| j                  ›d| j
                  ›d| j                  ›�}| j                  dk(  r#| j                  dk(  r|d| j                  z  z  }|S | j                  dk7  r|d| j                  z  z  }| j                  dk7  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   rL   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‰9˜Š?˜dŸi™i¨2›oØ$(§I£I¨t¯x«x¸¿»ÀDÇHÂHÐMˆDØ�y‰y˜BŠØ(,¯
«
°D·H³H¸d¿i»iØ)-¯ªð3�à�y‰y˜BŠØ(,¯	«	°4·8³8¸T¿Z»ZØ)-¯ªð3�ð × Ñ  BÒ&¨4×+=Ñ+=ÀÒ+CØ˜ §¡Ñ0Ñ0�ð ˆð ×$Ñ$¨Ò*Ø˜H¨×(9Ñ(9Ñ:Ñ:�DØ×%Ñ%¨Ò+Ø˜I¨×);Ñ);Ñ<Ñ<�Dàˆr   c                 ó  — | j                   dk7  rA| j                  dk7  s| j                  dk7  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 rB| j                  dk7  s| j                  dk7  r#t        d«      | j                   z  }t	        |«      ‚yy)zVerify rulerD   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$   rG   r   r   rr   Úipv4_only_protocolsÚportless_protocolsr    r!   )r
   Úrule_iptyperl   s      r   ÚverifyzUFWRule.verifyv  sà   € ð �=‰=˜EÒ!Ø�I‰I˜ŠO˜tŸy™y¨BšÜÐMÓNØŸ=™=ñ*ˆGä˜7Ó#Ð#à�=‰=œCŸH™H×8Ñ8Ñ8Ø˜$ÒäÐAÓBØŸ™ñ(ˆGä˜7Ó#Ð#à�=‰=œCŸH™H×7Ñ7Ñ7Ø�z‰z˜UÒ" d§j¡j°EÒ&9ÜÐ=Ó>Ø!Ÿ]™]ñ,�ä˜wÓ'Ð'ð ':ð 8r   N)rD   rE   rD   rE   r~   Fr   )r   )r   r   r   r   r   r   r?   rB   r6   r.   r0   r/   ru   rw   r1   r2   r…   rˆ   r^   r3   rŽ   r4   r•   rc   r±   r¬   rµ   rº   r   r   r   r   r   *   s‘   „ Ù.Ø:EØGLØó!òF"òòò.A òF"ó3#òj$ò'òòòò.&ò`!ò$ò$ò1òò!)òFAòFlò\ò óD(r   r   )r   rQ   rf   Úufw.utilr   r   ÚprogramNameÚ	state_dirÚ	share_dirÚ	trans_dirÚ
config_dirÚ
prefix_dirÚiptables_dirÚ	do_checksrh   r   r   r   r   r   ú<module>rÄ      sV   ðÙ 'ó" 
Û Û Ý à€Ø€	Ø€	Ø€	Ø€
Ø€
Ø€Ø€	ô ˆyô  ÷`	(ò `	(r   