<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</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 rt|d }t|d }|dkr|dkr||k r||fS ||kr||fS |fS g }xt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rP qW t|dk rdS t|dkrd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rt|dkr@t|d t|d kS t|dkrt|d t|d krt|d t|d krdS n|t|dkrt|dkrt|d t|d krt|d t|d krt|d t|d krt|d t|d krd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 |rd|krvt|S yt|}W n tk
r   dS X |dk s|dkrd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 |ryt|}W n tk
r   dS X |dk s|dkrd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rd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rtjd|   n*t|dkr|d |d krt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 rd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   

:
&+
	




	