
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
³Y„j'K  ã            #   @   s  d ddddddddd	d
dddddddddddddddddddddd d!d"g#Z d#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d%l	m
Z
 d#d&lmZmZ ejd'k Zd(d)„ ed#d*ƒD ƒZd+d„ Zd,d„ ZdXd.d„Zd/d0„ Zd1d2„ Zd3d4„ Zd5d„ Zd6d„ Zd7d8„ Zd9d„ Zd:d„ Zd;d"„ Zd<d„ Zd=d	„ Zd>d
„ Z d?d„ Z!d@d„ Z"dAd„ Z#dBd„ Z$dCd„ Z%dDd„ Z&dEdF„ Z'dGd„ Z(dHd„ Z)dId„ Z*dJd„ Z+dKd„ Z,dLd„ Z-dMd!„ Z.dNd„ Z/dOd„ Z0dPd„ Z1dQd„ Z2dRd„ Z3dSd„ Z4dTd„ Z5dUd„ Z6dVd„ Z7dWd „ Z8d$S )YÚPY2Ú	getPortIDÚgetPortRangeÚportStrÚgetServiceNameÚcheckIPÚcheckIP6ÚcheckIPnMaskÚcheckIP6nMaskÚcheckProtocolÚcheckInterfaceÚcheckUINT32Úfirewalld_is_activeÚtempFileÚreadfileÚ	writefileÚenable_ip_forwardingÚ
check_portÚcheck_addressÚcheck_single_addressÚ	check_macÚuniqifyÚppid_of_pidÚmax_zone_name_lenÚ	checkUserÚcheckUidÚcheckCommandÚcheckContextÚjoinArgsÚ	splitArgsÚb2uÚu2bÚ
u2b_if_py2Úmax_policy_name_lenÚstripNonPrintableCharactersé    N)Úlog)ÚFIREWALLD_TEMPDIRÚFIREWALLD_PIDFILEÚ3c             C   s"   i | ]}|d ko|dk sd|“qS )é   é   N© )Ú.0Úir+   r+   ú/usr/lib/python3.6/functions.pyú
<dictcomp>.   s   r/   é    c             C   st   t | tƒr| }nT| r| jƒ } yt| ƒ}W n: tk
rb   ytj| ƒ}W n tjk
r\   dS X Y nX |dkrpdS |S )zÎ Check and Get port id from port string or port id using socket.getservbyname

    @param port port string or port id
    @return Port id if valid, -1 if port can not be found and -2 if port is too big
    é   iÿÿ  é   éÿÿÿÿéþÿÿÿ)Ú
isinstanceÚintÚstripÚ
ValueErrorÚsocketZgetservbynameÚerror)ÚportZ_idr+   r+   r.   r   7   s    
c             C   sÀ  t | tƒst | tƒr| S t | tƒs*| jƒ rDt| ƒ}|dkr@|fS |S | jdƒ}t|ƒdkrÀ|d jƒ rÀ|d jƒ rÀt|d ƒ}t|d ƒ}|dkrÀ|dkrÀ||k rª||fS ||krº||fS |fS g }xÎtt|ƒddƒD ]º}tdj	|d|… ƒƒ}dj	||d… ƒ}t|ƒdk�rnt|ƒ}|dk�r�|dk�r�||k �rF|j
||fƒ n&||k�r`|j
||fƒ n|j
|fƒ qÖ|dkrÖ|j
|fƒ |t|ƒkrÖP qÖW t|ƒdk �r¦dS t|ƒdk�r¸dS |d S )aI   Get port range for port range string or single port id

    @param ports an integer or port string or port range string
    @return Array containing start and end port id for a valid range or -1 if port can not be found and -2 if port is too big for integer input or -1 for invalid ranges or None if the range is ambiguous.
    r$   ú-r2   r1   Nr3   r3   )r5   ÚtupleÚlistr6   Úisdigitr   ÚsplitÚlenÚrangeÚjoinÚappend)ZportsZid1ÚsplitsZid2Zmatchedr-   Zport2r+   r+   r.   r   N   sL    
$

ú:c             C   sX   | dkrdS t | ƒ}t|tƒr*|dk r*dS t|ƒdkr>d| S d|d ||d f S dS )a   Create port and port range string

    @param port port or port range int or [int, int]
    @param delimiter of the output string for port ranges, default ':'
    @return Port or port range string, empty string if port isn't specified, None if port or port range is not valid
    Ú r$   Nr1   z%sz%s%s%s)r   r5   r6   rA   )r;   Z	delimiterÚ_ranger+   r+   r.   r   ˆ   s    c             C   s  t | ƒ}t |ƒ}t|ƒdkr‚t|ƒdkr@t|d ƒt|d ƒkS t|ƒdkrþt|d ƒt|d ƒkrþt|d ƒt|d ƒkrþdS n|t|ƒdkrþt|ƒdkrþt|d ƒt|d ƒkrþt|d ƒt|d ƒkrþt|d ƒt|d ƒkrþt|d ƒt|d ƒkrþdS dS )Nr1   r$   r2   TF)r   rA   r   )r;   rB   Z_portrH   r+   r+   r.   ÚportInPortRangeš   s    000rI   c             C   sT  t | ƒ}t|ƒdkr$|d |d f}tt |ƒ}ttdd„ |ƒdd„ d�}g }xÎ|D ]Æ}|d |d kr‚|d |d kr‚|j|ƒ qR|d |d krÎ|d |d k rÎ|d |d krÎ|j|ƒ |d |d f}qR|d |d koü|d |d koü|d |d krR|j|ƒ |d |d f}qRW ttdd„ |ƒƒ}|d |d k�rJ|d f}|g|fS )zû Coalesce a port range with existing list of port ranges

        @param new_range tuple/list/string
        @param ranges list of tuple/list/string
        @return tuple of (list of ranges added after coalescing, list of removed original ranges)
    r1   r$   c             S   s    t | ƒdkr| d | d fS | S )Nr1   r$   )rA   )Úxr+   r+   r.   Ú<lambda>¹   s    z#coalescePortRange.<locals>.<lambda>c             S   s   | d S )Nr$   r+   )rJ   r+   r+   r.   rK   ¹   s    )Úkeyc             S   s   | d | d kr| d fS | S )Nr$   r1   r+   )rJ   r+   r+   r.   rK   Ì   s    )r   rA   ÚmapÚsortedrD   r>   )Z	new_rangeÚrangesZcoalesced_rangeÚ_rangesÚremoved_rangesrB   r+   r+   r.   ÚcoalescePortRange¬   s*    

  
 

rR   c             C   sÊ  t | ƒ} t| ƒdkr$| d | d f} tt |ƒ}ttdd„ |ƒdd„ d�}g }g }�xJ|D �]@}| d |d krŠ| d |d krŠ|j|ƒ qX| d |d krà| d |d k rà| d |d krà|j|ƒ |j| d d |d fƒ qX| d |d k�r<| d |d k�r<| d |d k�r<|j|ƒ |j|d | d d fƒ qX| d |d krX| d |d k rX|j|ƒ |j|d | d d fƒ |j| d d |d fƒ qXW ttdd„ |ƒƒ}ttdd„ |ƒƒ}||fS )	zü break a port range from existing list of port ranges

        @param remove_range tuple/list/string
        @param ranges list of tuple/list/string
        @return tuple of (list of ranges added after breaking up, list of removed original ranges)
    r1   r$   c             S   s    t | ƒdkr| d | d fS | S )Nr1   r$   )rA   )rJ   r+   r+   r.   rK   ß   s    z breakPortRange.<locals>.<lambda>c             S   s   | d S )Nr$   r+   )rJ   r+   r+   r.   rK   ß   s    )rL   c             S   s   | d | d kr| d fS | S )Nr$   r1   r+   )rJ   r+   r+   r.   rK   ø   s    c             S   s   | d | d kr| d fS | S )Nr$   r1   r+   )rJ   r+   r+   r.   rK   ù   s    )r   rA   rM   rN   rD   r>   )Zremove_rangerO   rP   rQ   Zadded_rangesrB   r+   r+   r.   ÚbreakPortRangeÒ   s2    
  
$
 
rS   c             C   s0   yt jt| ƒ|ƒ}W n t jk
r*   dS X |S )zÞ Check and Get service name from port and proto string combination using socket.getservbyport

    @param port string or id
    @param protocol string
    @return Service name if port and protocol are valid, else None
    N)r9   Zgetservbyportr6   r:   )r;   ÚprotoÚnamer+   r+   r.   r   ý   s
    c             C   s.   yt jt j| ƒ W n t jk
r(   dS X dS )zl Check IPv4 address.
    
    @param ip address string
    @return True if address is valid, else False
    FT)r9   Ú	inet_ptonZAF_INETr:   )Úipr+   r+   r.   r     s
    c             C   s
   | j dƒS )z� Normalize the IPv6 address

    This is mostly about converting URL-like IPv6 address to normal ones.
    e.g. [1234::4321] --> 1234:4321
    z[])r7   )rW   r+   r+   r.   ÚnormalizeIP6  s    rX   c             C   s2   yt jt jt| ƒƒ W n t jk
r,   dS X dS )zl Check IPv6 address.
    
    @param ip address string
    @return True if address is valid, else False
    FT)r9   rV   ZAF_INET6rX   r:   )rW   r+   r+   r.   r      s
    c             C   s°   d| krN| d | j dƒ… }| | j dƒd d … }t|ƒdk sHt|ƒdk rVdS n| }d }t|ƒsbdS |r¬d|krvt|ƒS yt|ƒ}W n tk
r–   dS X |dk s¨|dkr¬dS dS )Nú/r1   FÚ.r$   é    T)ÚindexrA   r   r6   r8   )rW   ÚaddrÚmaskr-   r+   r+   r.   r   -  s&    c             C   s
   | j tƒS )N)Ú	translateÚNOPRINT_TRANS_TABLE)Zrule_strr+   r+   r.   r#   D  s    c             C   s    d| krN| d | j dƒ… }| | j dƒd d … }t|ƒdk sHt|ƒdk rVdS n| }d }t|ƒsbdS |rœyt|ƒ}W n tk
r†   dS X |dk s˜|dkrœdS dS )NrY   r1   Fr$   é€   T)r\   rA   r   r6   r8   )rW   r]   r^   r-   r+   r+   r.   r	   G  s"    c             C   s`   yt | ƒ}W n: tk
rF   ytj| ƒ W n tjk
r@   dS X Y nX |dk sX|dkr\dS dS )NFr$   éÿ   T)r6   r8   r9   Zgetprotobynamer:   )Zprotocolr-   r+   r+   r.   r
   \  s    c             C   s4   |  st | ƒdkrdS xdD ]}|| krdS qW dS )	z¬ Check interface string

    @param interface string
    @return True if interface is valid (maximum 16 chars and does not contain ' ', '/', '!', ':', '*'), else False
    é   Fú rY   ú!Ú*T)rd   rY   re   rf   )rA   )ZifaceÚchr+   r+   r.   r   k  s    
c             C   s<   yt | dƒ}W n tk
r"   dS X |dkr8|dkr8dS dS )Nr$   Fl   ÿÿ T)r6   r8   )ÚvalrJ   r+   r+   r.   r   ~  s    c              C   s¨   t jjtƒsdS y"ttdƒ�} | jƒ }W dQ R X W n tk
rF   dS X t jjd| ƒs\dS y&td| dƒ�} | jƒ }W dQ R X W n tk
r–   dS X d|kr¤dS dS )zv Check if firewalld is active

    @return True if there is a firewalld pid file and the pid is used by firewalld
    FÚrNz/proc/%sz/proc/%s/cmdlineZ	firewalldT)ÚosÚpathÚexistsr'   ÚopenÚreadlineÚ	Exception)ÚfdÚpidZcmdliner+   r+   r.   r   ˆ  s"    c              C   sb   y*t jjtƒst jtdƒ tjddtdd�S  tk
r\ }  ztj	d|  ƒ ‚ W Y d d } ~ X nX d S )Niè  Zwtztemp.F)ÚmodeÚprefixÚdirÚdeletez#Failed to create temporary file: %s)
rj   rk   rl   r&   ÚmkdirÚtempfileZNamedTemporaryFilero   r%   r:   )Úmsgr+   r+   r.   r   ¥  s    
c             C   sX   yt | dƒ�
}|jƒ S Q R X W n4 tk
rR } ztjd| |f ƒ W Y d d }~X nX d S )Nri   zFailed to read file "%s": %s)rm   Ú	readlinesro   r%   r:   )ÚfilenameÚfÚer+   r+   r.   r   ±  s    $c             C   s\   y$t | dƒ�}|j|ƒ W d Q R X W n2 tk
rV } ztjd| |f ƒ dS d }~X nX dS )NÚwz Failed to write to file "%s": %sFT)rm   Úwritero   r%   r:   )rz   Úliner{   r|   r+   r+   r.   r   ¹  s    c             C   s(   | dkrt ddƒS | dkr$t ddƒS dS )NÚipv4z/proc/sys/net/ipv4/ip_forwardz1
Úipv6z&/proc/sys/net/ipv6/conf/all/forwardingF)r   )Úipvr+   r+   r.   r   Â  s
    

c             C   s   | j ddƒj ddƒS )NÚ_r<   znf-conntrack-rG   )Úreplace)Úmoduler+   r+   r.   Úget_nf_conntrack_short_nameÉ  s    r†   c             C   s¶   t | ƒ}|d
ks<|dks<|d ks<t|ƒdkr²|d |d kr²|dkrTtjd|  ƒ nZ|dkrltjd|  ƒ nB|d kr„tjd|  ƒ n*t|ƒdkr®|d |d kr®tjd|  ƒ dS d	S )Nr2   r1   r$   z'%s': port > 65535z'%s': port is invalidz'%s': port is ambiguousz'%s': range start >= endFTr4   r3   r4   r3   )r   rA   r%   Zdebug2)r;   rH   r+   r+   r.   r   Ì  s    c             C   s(   | dkrt |ƒS | dkr t|ƒS dS d S )Nr€   r�   F)r   r	   )r‚   Úsourcer+   r+   r.   r   Û  s
    c             C   s(   | dkrt |ƒS | dkr t|ƒS dS d S )Nr€   r�   F)r   r   )r‚   r‡   r+   r+   r.   r   ã  s
    c             C   sR   t | ƒdkrNxdD ]}| | dkrdS qW xdD ]}| | tjkr0dS q0W dS dS )Né   é   r2   é   é   é   rF   Fr$   r1   é   é   é   é   é	   é
   é   é   rc   Té   )r2   r‰   rŠ   r‹   rŒ   )r$   r1   r�   rŽ   r�   r�   r‘   r’   rˆ   r“   r”   rc   )rA   ÚstringZ	hexdigits)Zmacr-   r+   r+   r.   r   ë  s    

c             C   s(   g }x| D ]}||kr
|j |ƒ q
W |S )N)rD   )Z_listÚoutputrJ   r+   r+   r.   r   ÷  s
    
c             C   sH   y.t jd|  ƒ}t|jƒ d jƒ ƒ} |jƒ  W n tk
rB   dS X | S )z Get parent for pid zps -o ppid -h -p %d 2>/dev/nullr$   N)rj   Úpopenr6   ry   r7   Úclosero   )rq   r{   r+   r+   r.   r   ÿ  s    c              C   sB   ddl m}  ddlm} ttt|jƒ ƒƒ}d|t| ƒ tdƒ  S )z¬
    iptables limits length of chain to (currently) 28 chars.
    The longest chain we create is POST_<policy>_allow,
    which leaves 28 - 11 = 17 chars for <policy>.
    r$   )ÚPOLICY_CHAIN_PREFIX)Ú	SHORTCUTSé   Z_allow)Zfirewall.core.ipXtablesrš   Úfirewall.core.baser›   ÚmaxrM   rA   Úvalues)rš   r›   Úlongest_shortcutr+   r+   r.   r"   	  s    c              C   s.   ddl m}  ttt| jƒ ƒƒ}d|tdƒ  S )z©
    Netfilter limits length of chain to (currently) 28 chars.
    The longest chain we create is FWDI_<zone>_allow,
    which leaves 28 - 11 = 17 chars for <zone>.
    r$   )r›   rœ   Z__allow)r�   r›   rž   rM   rA   rŸ   )r›   r    r+   r+   r.   r     s    c             C   sT   t | ƒdk st | ƒtjdƒkr"dS x,| D ]$}|tjkr(|tjkr(|d	kr(dS q(W dS )
Nr1   ÚSC_LOGIN_NAME_MAXFrZ   r<   rƒ   ú$T)rZ   r<   rƒ   r¢   )rA   rj   Úsysconfr–   Zascii_lettersZdigits)ÚuserÚcr+   r+   r.   r     s    


c             C   sD   t | tƒr,yt| ƒ} W n tk
r*   dS X | dkr@| dkr@dS dS )	NFr$   r2   r)   r1   Tl        iÿÿÿ)r5   Ústrr6   r8   )Zuidr+   r+   r.   r   (  s    
c             C   sJ   t | ƒdk st | ƒdkrdS xd
D ]}|| kr"dS q"W | d dkrFdS d	S )Nr1   i   Fú|Ú
ú r$   rY   T)r§   r¨   r©   )rA   )Zcommandrg   r+   r+   r.   r   2  s    
c             C   s†   | j dƒ}t|ƒdkrdS |d dkr>|d dd … dkr>dS |d	 dd … d
krVdS |d dd … dkrndS t|d ƒd	k r‚dS dS )NrF   rŽ   r‰   Fr$   Úrootr2   Z_ur1   Z_rZ_tr�   T)rŽ   r‰   r4   r4   r4   )r@   rA   )ÚcontextrE   r+   r+   r.   r   <  s    
 c             C   s8   dt tƒkr djdd„ | D ƒƒS djdd„ | D ƒƒS d S )NÚquoterd   c             s   s   | ]}t j|ƒV  qd S )N)Úshlexr¬   )r,   Úar+   r+   r.   ú	<genexpr>P  s    zjoinArgs.<locals>.<genexpr>c             s   s   | ]}t j|ƒV  qd S )N)Úpipesr¬   )r,   r®   r+   r+   r.   r¯   R  s    )rt   r­   rC   )Úargsr+   r+   r.   r   N  s    c             C   s8   t r*t| tƒr*t| ƒ} tj| ƒ}tt|ƒS tj| ƒS d S )N)r   r5   Úunicoder    r­   r@   rM   r   )Ú_stringrE   r+   r+   r.   r   T  s
    

c             C   s   t | tƒr| jddƒS | S )z bytes to unicode zUTF-8r„   )r5   ÚbytesÚdecode)r³   r+   r+   r.   r   ]  s    
c             C   s   t | tƒs| jddƒS | S )z unicode to bytes zUTF-8r„   )r5   r´   Úencode)r³   r+   r+   r.   r    c  s    
c             C   s   t rt| tƒr| jddƒS | S )z" unicode to bytes only if Python 2zUTF-8r„   )r   r5   r²   r¶   )r³   r+   r+   r.   r!   i  s    )rF   )9Ú__all__r9   rj   Zos.pathr­   r°   r–   Úsysrw   Zfirewall.core.loggerr%   Zfirewall.configr&   r'   Úversionr   rB   r`   r   r   r   rI   rR   rS   r   r   rX   r   r   r#   r	   r
   r   r   r   r   r   r   r   r†   r   r   r   r   r   r   r"   r   r   r   r   r   r   r   r   r    r!   r+   r+   r+   r.   Ú<module>   sz   

:
&+
	




	