o
    �Fa¾  ã                   @   sœ   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 r0ddlZnddlZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ ZdS )z'applications.py: common classes for ufwé    N)ÚdebugÚwarn)ÚUFWErroré   c                 C   s6  t j | ¡stdƒ}t|ƒ‚d}i }t  | ¡}| ¡  d}t d¡}|D �]s}| d | }t j 	|¡s4q$| 
|¡r@td| ƒ q$| d¡s^| d¡s^| d	¡s^| d
¡s^| d¡s^| d¡retd| ƒ q$d}	z
t  |¡tj }	W n ty„   tdƒ| }
t|
ƒ Y q$w |	|kr”tdƒ| }
t|
ƒ q$||	 |kr¥tdƒ| }
t|
ƒ q$||	7 }tjd dk rµt ¡ }nt ¡ }z| |¡ W n tyÓ   tdƒ| }
t|
ƒ Y q$w | ¡ D ]¿}t|ƒdkrëtdƒ| }
t|
ƒ qØt|ƒsútdƒ| }
t|
ƒ qØztj |¡ tdƒ| }
t|
ƒ W qØ t�y   Y nw d}| |¡D ]2\}}t|ƒdk�r7tdƒ| }
t|
ƒ d} nt|ƒdk�rOtdƒ||dœ }
t|
ƒ d} n�q|�rUqØ||v �rdtdƒ| }
t|
ƒ i }| |¡D ]	\}}|||< �qkzt||ƒ |||< W qØ t�y— } z
t|ƒ W Y d}~qØd}~ww q$|S )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Úe© r8   ú2/usr/lib/python3/dist-packages/ufw/applications.pyÚget_profiles    sÎ   



ÿÿþþý
ýÿþú

€ÿÐ3r:   c                 C   sB   | dkrdS zt | ƒ W dS  ty   Y nw t d| ¡rdS dS )z0Only accept a limited set of characters for nameÚallFz ^[a-zA-Z0-9][a-zA-Z0-9 _\-\.+]*$T)Úintr   r   Úmatch)Únamer8   r8   r9   r!   ˜   s   ÿr!   c              
   C   sò   g d¢}|D ]$}||vrt dƒ| |dœ }t|ƒ‚|| s*t dƒ| |dœ }t|ƒ‚q|d  d¡}z,|D ]&}tj |¡\}}|dkrOd|v sKd	|v rOt|ƒ‚tj d
||¡}	t|	ƒ q5W dS  t	yx }
 zt|
ƒ t dƒ|  }t|ƒ‚d}
~
ww )z'Make sure profile has everything needed)ÚtitleÚdescriptionÚportsz/Profile '%(fn)s' missing required field '%(f)s')Úfnr.   z1Profile '%(fn)s' has empty required field '%(f)s'rA   ú|Úanyú:ú,ÚACCEPTzInvalid ports in profile '%s'NT)
r   r   Úsplitr"   r#   Úparse_port_protoÚcommonÚUFWRuler   r   )r>   ÚprofileÚ
app_fieldsr.   r(   rA   r3   ÚportÚprotoÚruler7   r8   r8   r9   r&   ¬   s:   ÿÿý
úû€ýr&   c                 C   ó$   d}d}|| v r| | r| | }|S )z#Retrieve the title from the profileÚ r?   r8   ©rL   Úsr
   r8   r8   r9   Ú	get_titleÌ   ó
   rU   c                 C   rQ   )z)Retrieve the description from the profilerR   r@   r8   rS   r8   r8   r9   Úget_descriptionÕ   rV   rW   c                 C   s*   g }d}|| v r| | r| |   d¡}|S )z'Retrieve a list of ports from a profilerA   rC   )rH   )rL   rA   r
   r8   r8   r9   Ú	get_portsÞ   s
   rX   )Ú__doc__r   r   r   Úufw.utilr"   r   r   Ú
ufw.commonr   r   r   r   r   r:   r!   r&   rU   rW   rX   r8   r8   r8   r9   Ú<module>   s"    
x 		