Ë
    #fd¾  ã                   ó¦   — d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
Z
e
j                  d   dk  rddlZnddlZd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zy)z'applications.py: common classes for ufwé    N)ÚdebugÚwarn)ÚUFWErroré   c                 óÎ  — t         j                  j                  | «      st        d«      }t	        |«      ‚d}i }t        j
                  | «      }|j                  «        d}t        j                  d«      }|D �]  }| dz   |z   }t         j                  j                  |«      sŒ,|j                  |«      rt        d|z  «       ŒL|j                  d«      sU|j                  d«      sD|j                  d	«      s3|j                  d
«      s"|j                  d«      s|j                  d«      rt        d|z  «       ŒÁd}		 t        j                  |«      t        j                     }	|	|kD  rt        d«      |z  }
t!        |
«       �Œ
||	z   |kD  rt        d«      |z  }
t!        |
«       �Œ-||	z  }t"        j$                  d   dk  rt'        j(                  «       }nt+        j(                  «       }	 |j-                  |«       |j/                  «       D ]ˆ  }t1        |«      dkD  rt        d«      |z  }
t!        |
«       Œ+t3        |«      st        d«      |z  }
t!        |
«       ŒP	 t4        j6                  j9                  |«       t        d«      |z  }
t!        |
«       ŒŠ �Œ  |S # t        $ r t        d«      |z  }
t!        |
«       Y �ŒHw xY w# t        $ r t        d«      |z  }
t!        |
«       Y �Œqw xY w# t        $ r Y nw xY wd}|j;                  |«      D ]^  \  }}t1        |«      dkD  rt        d«      |z  }
t!        |
«       d} n0t1        |«      dkD  sŒ@t        d«      ||dœz  }
t!        |
«       d} n |r�Œi||v rt        d«      |z  }
t!        |
«       i }|j;                  |«      D ]
  \  }}|||<   Œ 	 t=        ||«       |||<   �Œº# t        $ r}t!        |«       Y d}~�ŒÔd}~ww xY w)zwGet profiles found in profiles database.  Returns dictionary with
       profile name as key and tuples for fields
    z!Profiles directory does not existi    r   z^\.ú/zSkipping '%s': hidden filez	.dpkg-newz	.dpkg-oldz
.dpkg-distz.rpmnewz.rpmsaveú~zSkipping '%s'zSkipping '%s': couldn't statzSkipping '%s': too bigz*Skipping '%s': too many files read alreadyr   zSkipping '%s': couldn't processé@   zSkipping '%s': name too longzSkipping '%s': invalid namez$Skipping '%s': also in /etc/servicesFzSkipping '%s': field too longTi   z4Skipping '%(value)s': value too long for '%(field)s')ÚvalueÚfieldz(Duplicate profile '%s', using last foundN)ÚosÚpathÚisdirÚ_r   ÚlistdirÚsortÚreÚcompileÚisfileÚsearchr   ÚendswithÚstatÚST_SIZEÚ	Exceptionr   ÚsysÚversion_infoÚConfigParserÚRawConfigParserÚconfigparserÚreadÚsectionsÚlenÚvalid_profile_nameÚufwÚutilÚget_services_protoÚitemsÚverify_profile)Úprofiles_dirÚerr_msgÚmax_sizeÚprofilesÚfilesÚ
total_sizeÚpatÚfÚabs_pathÚsizeÚwarn_msgÚcdictÚpÚskipÚkeyr   ÚpdictÚes                     ú2/usr/lib/python3/dist-packages/ufw/applications.pyÚget_profilesr;       s¿  € ô �7‰7�=‰=˜Ô&ÜÐ7Ó8ˆÜ�wÓÐà€HØ€Hä�J‰J�|Ó$€EØ	‡J�J„Là€JÜ
�*‰*�VÓ
€CØó cˆØ #Ñ%¨Ñ)ˆÜ�w‰w�~‰~˜hÔ'Øà�:‰:�aŒ=ÜÐ.°!Ñ4Ô5Øà�:‰:�kÔ" a§j¡j°Ô&=Ø�:‰:�lÔ# q§z¡z°)Ô'<Ø�:‰:�jÔ! Q§Z¡Z°¤_Ü�/ QÑ'Ô(Øð ˆð	Ü—7‘7˜8Ó$¤T§\¡\Ñ2ˆDð �(Š?ÜÐ1Ó2°aÑ8ˆHÜ�ŒNÙà˜Ñ˜xÒ'ÜÐEÓFÈ!ÑLˆHÜ�ŒNÙà�dÑˆ
ä×Ñ˜AÑ Ò"Ü ×0Ñ0Ó2‰Eä ×0Ñ0Ó2ˆEð	Ø�J‰J�xÔ ð —‘Ó!ò 1	ˆAÜ�1‹v˜Š{ÜÐ;Ó<ÀÑB�Ü�X”Øä% aÔ(ÜÐ:Ó;¸qÑA�Ü�X”ØðÜ—‘×+Ñ+¨AÔ.ÜÐCÓDÈÑJ�Ü�X”Øò1	ðecðJ €Oøôc ò 	ÜÐ7Ó8¸AÑ>ˆHÜ�ŒNÚð	ûô0 ò 	ÜÐ:Ó;¸qÑAˆHÜ�ŒNÚð	ûô, ò Ùðúð ˆDØ#Ÿk™k¨!›nò ‘
��UÜ�s“8˜b’=Ü Ð!@ÓAÀQÑG�HÜ˜”NØ�DÙÜ�u“: Ó$Ü ð "/ó  0à,-¸Ñ"<ñ >�Hô ˜”NØ�DÙðñ Ùà�H‰}ÜÐGÓHÈAÑN�Ü�X”àˆEØ#Ÿk™k¨!›nò #‘
��Uà"��c’
ð#ðÜ˜q %Ô(Ø#�˜“øÜò Ü�Q—’ûðúsN   Ä<&JÇ*KÉ8K-Ê"KË KË"K*Ë)K*Ë-	K9Ë8K9Î2OÏ	O$ÏOÏO$c                 óv   — | dk(  ry	 t        | «       y# t        $ r Y nw xY wt        j                  d| «      ryy)z0Only accept a limited set of characters for nameÚallFz ^[a-zA-Z0-9][a-zA-Z0-9 _\-\.+]*$T)Úintr   r   Úmatch)Únames    r:   r#   r#   ˜   sF   € ð ˆu‚}ØðÜˆDŒ	ØøÜò Ùðúô
 
‡x�xÐ3°TÔ:ØØs   ˆ ”	 Ÿ c                 ó  — g d¢}|D ]C  }||vrt        d«      | |dœz  }t        |«      ‚||   rŒ)t        d«      | |dœz  }t        |«      ‚ |d   j                  d«      }	 |D ]h  }t        j                  j                  |«      \  }}|dk(  rd|v sd	|v rt        «      ‚t        j                  j                  d
||«      }	t        |	«       Œj 	 y# t        $ r)}
t        |
«       t        d«      | z  }t        |«      ‚d}
~
ww xY w)z'Make sure profile has everything needed)ÚtitleÚdescriptionÚportsz/Profile '%(fn)s' missing required field '%(f)s')Úfnr0   z1Profile '%(fn)s' has empty required field '%(f)s'rD   ú|Úanyú:ú,ÚACCEPTzInvalid ports in profile '%s'NT)
r   r   Úsplitr$   r%   Úparse_port_protoÚcommonÚUFWRuler   r   )r@   ÚprofileÚ
app_fieldsr0   r*   rD   r5   ÚportÚprotoÚruler9   s              r:   r(   r(   ¬   s&  € â2€Jàò 	$ˆØ�GÑÜÐIÓJØ $¨1Ñ-ñ/ˆGô ˜7Ó#Ð#Ø˜“ÜÐKÓLØ"&¨QÑ/ñ1ˆGä˜7Ó#Ð#ð	$ð �GÑ×"Ñ" 3Ó'€Eð Øò 	ˆAÜŸH™H×5Ñ5°aÓ8‰MˆT�5à˜Š~ 3¨$¡;°#¸±+Ü˜wÓ'Ð'Ü—:‘:×%Ñ% h°°tÓ<ˆDÜ�$�Kñ	ð øô ò  ÜˆaŒÜÐ3Ó4¸Ñ=ˆÜ�wÓÐûð ús   Á"A-C Ã	DÃ$C>Ã>Dc                 ó*   — d}d}|| v r
| |   r| |   }|S )z#Retrieve the title from the profileÚ rB   © ©rO   Úsr   s      r:   Ú	get_titlerY   Ì   s(   € à
€AØ€EØ�Ñ˜G EšNØ�E‰NˆØ€Hó    c                 ó*   — d}d}|| v r
| |   r| |   }|S )z)Retrieve the description from the profilerU   rC   rV   rW   s      r:   Úget_descriptionr\   Õ   s(   € à
€AØ€EØ�Ñ˜G EšNØ�E‰NˆØ€HrZ   c                 óH   — g }d}|| v r| |   r| |   j                  d«      }|S )z'Retrieve a list of ports from a profilerD   rF   )rK   )rO   rD   r   s      r:   Ú	get_portsr^   Þ   s3   € à€EØ€EØ�Ñ˜G EšNØ˜‘×$Ñ$ SÓ)ˆà€LrZ   )Ú__doc__r   r   r   Úufw.utilr$   r   r   Ú
ufw.commonr   r   r   r   r   r;   r#   r(   rY   r\   r^   rV   rZ   r:   ú<module>rb      sY   ðÙ -ó" 
Û 	Û Û ß  Ý ã 
Ø×Ñ�AÑ˜ÒÜãòuòpò(ò@òórZ   