
    #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    77==&78wHHJJ|$E	JJLJ
**V
C c#%)ww~~h'::a=.!45::k"ajj&=::l#qzz)'<::j!QZZ_/Q'( 	778$T\\2D (?12a8HNx'EF!LHNd
A" 002E 002E	JJx  ! 1	A1v{;<BX%a(:;qAX++A.CDJX1	ecJ Oc  	78A>HN	0  	:;qAHN	,   D#kk!n 
Us8b= !@AQGHNDu:$  "/  0,-"< >H ND H}GHANXE#kk!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	 
 
xx3T: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&   2J 	$GIJ $1-/G 7##KL"&Q/1G7##	$ G""3'E  	AHH55a8MT5~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GENEN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GENEN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GEN$$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   