<!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Ϣ                 @   s   d ddgZ ddlj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
 ddlmZmZmZ ddlmZmZmZ dd	lmZmZmZmZmZmZ dd
lmZ ddlmZ ddlmZ ddlmZ dd Z dd Z!dd Z"dd Z#dd Z$G dd  d eZ%G dd deZ&dddZ'dddZ(dS ) Policypolicy_readerpolicy_writer    N)config)checkIPcheckIP6)uniqifymax_policy_name_lenportStr)DEFAULT_POLICY_TARGETPOLICY_TARGETSDEFAULT_POLICY_PRIORITY)	IO_ObjectIO_Object_ContentHandlerIO_Object_XMLGenerator
check_portcheck_tcpudpcheck_protocol)rich)log)errors)FirewallErrorc          	   C   s  |dkrn|dkrn|dkr| j r`| j jrJtjdt| j  d| _dS tj|d | j _dS |d | jj	kr| jj	j
|d  ntjd|d  n|dkrN| j r| j jrtjdt| j  d| _dS tj|d |d	 | j _dS t|d  t|d	  t|d d
|d	 f}|| jjkr4| jjj
| ntjd|d |d	  nN|d	kr| j r| j jrtjdt| j  d| _dS tj|d | j _nBt|d  |d | jjkr| jjj
|d  ntjd|d  n|dkrh| j r.| j jrtjdt| j  d| _dS tj|d | j _dS |d | jjkrT| jjj
|d  ntjd|d  n4|dkr| j r| j jrtjdt| j  d| _dS tj|d | j _dS tjd|d  n|dkr2| j r| j jrtjdt| j  d| _dS tj | j _n| jjr&tjd nd| j_nj|dkrd}d|krR|d }d}d|krh|d }| j r| j jrtjdt| j  d| _dS tj|d |d	 ||| j _dS t|d  t|d	  |rt| |r
t| r
t| r
ttjd| t|d d
|d	 t|d
t|f}|| jjkrL| jjj
| n6tjd|d |d	 |rld| nd|r|d| nd n|dkr@| j r| j jrtjdt| j  d| _dS tj|d |d	 | j _dS t|d  t|d	  t|d d
|d	 f}|| jj kr&| jj j
| ntjd|d |d	  n\|dkr| j sftjd d| _dS | j j!rtjd t| j  dS d!}d }d"|kr|d" }d }d#|kr|d# }d$|kr|d$ j" dLkrd}tj#|||| j _!n|dMkr| j stjd+ d| _dS | j j$r0tjd, d| _dS |d'krHtj% | j _$nh|d(krxd }	d-|krh|d- }	tj&|	| j _$n8|d)krtj' | j _$n |d*kr|d. }
tj(|
| j _$| j j$| _)n|d/kr^| j stjd0 dS | j jrtjd1 dS d }d2|kr*|d2 }|dNkr*tjd; d| _dS d<|kr<|d< nd }tj*||| j _| j j| _)n>|d=kr| j s~tjd> dS | j j+rtjd?t| j  d| _dS tj, | j _+| j j+| _)n|d@kr,d }dA}dB|kr|dB }|dOkrtjdE|dB  d| _dS dF|krt-|dF }tj.||dG| _ np|dHkr| j)sRtjdI d| _dS | j)j/rxtjdJt| j  d| _dS |d }tj0||j1dK| j)_/nd!S dS )PNshortdescriptionservicez;Invalid rule: More than one element in rule '%s', ignoring.Tnamez#Service '%s' already set, ignoring.portprotocol-z#Port '%s/%s' already set, ignoring.valuez$Protocol '%s' already set, ignoring.z
icmp-blockz&icmp-block '%s' already set, ignoring.z	icmp-typez-Invalid rule: icmp-block '%s' outside of rule
masqueradez!Masquerade already set, ignoring.zforward-port zto-portzto-addrz#to-addr '%s' is not a valid addressz-Forward port %s/%s%s%s already set, ignoring.z >%sz @%szsource-portz*Source port '%s/%s' already set, ignoring.destinationz)Invalid rule: Destination outside of rulez?Invalid rule: More than one destination in rule '%s', ignoring.Faddressipsetinvertyestrueacceptrejectdropmarkz$Invalid rule: Action outside of rulez"Invalid rule: More than one actiontypesetr   z!Invalid rule: Log outside of rulezInvalid rule: More than one loglevelemergalertcriterrorwarningnoticeinfodebugzInvalid rule: Invalid log levelprefixauditz#Invalid rule: Audit outside of rulez9Invalid rule: More than one audit in rule '%s', ignoring.ruler   familyipv4ipv6z&Invalid rule: Rule family "%s" invalidpriority)r:   r=   limitz4Invalid rule: Limit outside of action, log and auditz9Invalid rule: More than one limit in rule '%s', ignoring.burst)r&   r'   )r(   r)   r*   r+   )r/   r0   r1   r2   r3   r4   r5   r6   )r;   r<   )2_ruleelementr   r3   str_rule_errorr   Rich_Serviceitemservicesappend	Rich_Portr   r   r
   portsRich_Protocolr   	protocolsRich_IcmpBlockicmp_blocksRich_IcmpTypeRich_Masquerader    Rich_ForwardPortr   r   r   r   INVALID_ADDRforward_portsRich_SourcePortsource_portsr"   lowerZRich_DestinationactionRich_AcceptRich_Reject	Rich_Drop	Rich_Mark	_limit_okZRich_Logr8   Z
Rich_Auditint	Rich_Ruler>   Z
Rich_Limitget)objr   attrsentryto_portZto_addrr%   r#   r$   Z_typeZ_setr.   r7   r:   r=   r    rc   /usr/lib/python3.6/policy.pycommon_startElement   s   


















































re   c             C   s   |dkr| j sy| jj  W n6 tk
rR } ztjd|t| j W Y d d }~X nLX t| j| jjkr| jj	j
| j | jjj
t| j ntjdt| j d | _d| _ n|dkrd | _d S )Nr9   z%s: %sz Rule '%s' already set, ignoring.Fr(   r)   r*   r+   r   r8   )r(   r)   r*   r+   r   r8   )rC   r@   Zcheck	Exceptionr   r3   rB   rE   	rules_strrulesrG   r[   )r_   r   erc   rc   rd   common_endElement  s    &rj   c             C   s  t | trdnd}|dkrT| jrT| jj }x$|D ]}||kr0ttjd| q0W n|dkrx$|D ]}t|d  t|d  qbW nb|dkrx|D ]}t	| qW n@|d	kr| jr| jj
 }	x$|D ]}
|
|	krttjd
|
 qW n|dkrx|D ]}t|d  t|d  |d  r>|d  r>ttjd| |d rTt|d  |d rt|d  rt|d  rttjd|d  qW nT|dkrx&|D ]}t|d  t|d  qW n|dkrx|D ]}tj|d}| jr|jrt |jtjst |jtjr| jj
 }	|jj|	krLttjd
|jj nH|jr| jj|jj}|jr|j|jkrttjd|j|jjf nL| jrt |jtjr| jj }|jj|krttjdj|| j|jjqW d S )Nr   ZZonerF   z '%s' not among existing servicesrI   r      rK   rM   z"'%s' not among existing icmp typesrR         z$'%s' is missing to-port AND to-addr z#to-addr '%s' is not a valid addressrT   rg   
rich_rules)rule_strz3rich rule family '%s' conflicts with icmp type '%s'z){} '{}': '{}' not among existing services)rg   rn   )
isinstancer   	fw_configZget_servicesr   r   ZINVALID_SERVICEr   r   r   Zget_icmptypesZINVALID_ICMPTYPEINVALID_FORWARDr   r   rQ   r   r]   rA   rL   rN   r   r:   Zget_icmptyper"   rD   format)r_   r   rE   
all_configZobj_typeZexisting_servicesr   r   protoZexisting_icmptypesZicmptypefwd_portr9   Zobj_richZictrc   rc   rd   common_check_config2  s    












 

rw   c             C   s0   d|j i}|j}|d k	r ||d< | jd| d S )Nr   r?   r>   )r   r?   simpleElement)handlerr>   dr?   rc   rc   rd   _handler_add_rich_limitx  s
    
r{   c             C   s  | j rF| j dkrF|jd |jdi  |j| j  |jd |jd | jr| jdkr|jd |jdi  |j| j |jd |jd x6t| jD ](}|jd |jdd|i |jd qW x@t| j	D ]2}|jd |jd|d	 |d
 d |jd qW x8t| j
D ]*}|jd |jdd|i |jd qW x8t| jD ]*}|jd |jdd|i |jd qLW | jr|jd |jdi  |jd xt| jD ]}|jd |d	 |d
 d}|d r|d dkr|d |d< |d r|d dkr|d |d< |jd| |jd qW xBt| jD ]4}|jd |jd|d	 |d
 d |jd q>W xT| jD ]H}i }|jr|j|d< |jd	krt|j|d< |jd |jd| |jd |jrVi }|jjr|jj|d< |jjr|jj|d< |jjr$|jj|d< |jjr6d|d< |jd |jd| |jd |jri }|jjrx|jj|d< |jjr|jj|d< |jjrd|d< |jd |jd | |jd |jrxd}	i }t|jtjkrd}	|jj|d< nbt|jtjkr(d}	|jj|d< |jj |d< n0t|jtj!krNd}	|jj"|d< n
t|jtj#krfd}	nt|jtj$krd}	|jj|d< nt|jtj%krd!}	|jj|d< nt|jtj&krd}	|jj|d< |jj |d< |jj'dkr|jj'|d< |jj(dkrX|jj(|d< nFt|jtj)krBd}	|jj|d< |jj |d< nt*t+j,d"t|j |jd |j|	| |jd |j-ri }|j-j.r|j-j.|d#< |j-j/r|j-j/|d$< |j-j0r|jd |jd%| |jd& t1||j-j0 |jd' |jd% n|jd |jd%| |jd |j2ri }|j2j0rx|jd |jd(i  |jd& t1||j2j0 |jd' |jd( n|jd |jd(| |jd |j3rd}
i }t|j3tj4krd)}
n|t|j3tj5krd*}
|j3jr<|j3j|d+< nNt|j3tj6krd,}
n6t|j3tj7kr*d-}
|j3j8|d.< nt-j9d/t|j3 |j3j0r|jd |j|
| |jd& t1||j3j0 |jd' |j|
 n|jd |j|
| |jd |jd |jd |jd qW d S )0Nr!   z  r   
r   r   r   r   r   rk   )r   r   r   r   z
icmp-blockr    rl   zto-portrm   zto-addrzforward-portzsource-portr:   r=   r9   r#   macr$   Truer%   z    sourcer"   z	icmp-typez"Unknown element '%s' in obj_writerr7   r.   r   z
      z
    r8   r(   r)   r,   r*   r+   r-   zUnknown action '%s'):r   ignorableWhitespacestartElementZ
characters
endElementr   r   rF   rx   rI   rK   rM   r    rR   rT   rh   r:   r=   rB   r   addrr}   r$   r%   r"   rA   r,   r   rD   r   rH   r   r   rJ   r   rO   rL   rN   rP   rb   
to_addressrS   r   r   ZINVALID_OBJECTr   r7   r.   r>   r{   r8   rV   rW   rX   rY   rZ   r-   r3   )r_   ry   r   r   r   ZicmpZforwardr`   r9   rA   rV   rc   rc   rd   common_writer  s\   




















































r   c                   sP  e Zd Zd7ZdZeZdgZd8d9d:d;d	dgfd
d<gfddgfd=dd>gfddgfddgfdd?gfd@ddgfddgffZdddgZ	dddgdgddgdgdgdddgddddgddgddddddgdgdgdgdZ
ddgdd gd!dgd"d#d$d!d%gd"d$d%gd&d'gd(gd)gd*Z fd+d,Zd-d. Z fd/d0Z fd1d2Zd3d4 Z fd5d6Z  ZS )Ar   i   i  r   versionr!   r   r   targetrF   rI   rM   r    FrR   rn   rK   rT   r=   ingress_zonesegress_zones_r   /Nr   r   r   r   r-   )r   r   policyr   r   z
icmp-blockz	icmp-typer    zforward-portr9   r   r"   r   zsource-portr   r8   r(   r)   r*   r+   r>   zingress-zonezegress-zonezto-portzto-addrr:   r#   r}   r%   r$   r7   r.   r,   r?   )r   zforward-portr9   r   r"   r   r)   r>   c                s   t t| j  d| _d| _d| _t| _g | _g | _	g | _
g | _d| _g | _g | _d | _g | _g | _d| _| j| _d | _g | _g | _d S )Nr!   F)superr   __init__r   r   r   r   r   rF   rI   rK   rM   r    rR   rT   rq   rh   rg   appliedpriority_defaultr=   Zderived_from_zoner   r   )self)	__class__rc   rd   r     s(    zPolicy.__init__c             C   s   d| _ d| _d| _t| _| jd d = | jd d = | jd d = | jd d = d| _	| j
d d = | jd d = d | _| jd d = | jd d = d| _| j| _| jd d = | jd d = d S )Nr!   F)r   r   r   r   r   rF   rI   rK   rM   r    rR   rT   rq   rh   rg   r   r   r=   r   r   )r   rc   rc   rd   cleanup  s$    zPolicy.cleanupc                s"   |dkr| j S ttt| |S d S )Nrn   )rg   getattrr   r   )r   r   )r   rc   rd   __getattr__  s    zPolicy.__getattr__c                sB   |dkr,dd |D | _ dd | j D | _ntt| j|| d S )Nrn   c             S   s   g | ]}t j|d qS ))ro   )r   r]   ).0src   rc   rd   
<listcomp>  s    z&Policy.__setattr__.<locals>.<listcomp>c             S   s   g | ]}t |qS rc   )rB   )r   r   rc   rc   rd   r     s    )rh   rg   r   r   __setattr__)r   r   r   )r   rc   rd   r     s    zPolicy.__setattr__c       
      C   s  t | ||| |dkr2|tkr.ttjd| n|dkrz|| jksX|| jksX|| jk rvttjd|| j| j| jf n|dkrhddg}| j	r|| j	j
 7 }x|D ]}||krttjd	| |dkrtddgt|@  s|dkrt|t|g rttjd
| |dkr|dkr8d|kr8d|d ksT|dkrd|krd|d krttjdqW n|dkr|rd|krd|d krttjdnxd|krd|d krttjdxR|d D ]F}|dkrސq| j	j|}| j	rd| j	j|krttjdqW n|dkr4x|D ] }tj|d}|jrt|jtjrd|kr|d|d kr|ttjdnxd|kr,d|d krttjdxR|d D ]F}|dkrq| j	j|}| j	rd| j	j|krttjdqW q,|jrt|jtjrd|kr,d|d kr@|jjrttjdnt|d r,|jjs`ttjdd|d kr,x|d D ]8}| j	j|}| j	rxd| j	j|krxttjdqxW nv|jr,t|jtjr,d|kr,xR|d D ]F}|dkrq| j	j|}| j	rd| j	j|krttjdqW q,W n|dkrx|D ]}	d|krnd|d krnttjdnd|krDd|d kr|	d rttjdnt|d rD|	d sttjdd|d krDxD|d D ]8}| j	j|}| j	rd| j	j|krttjdqW qDW d S )Nr   z'%s' is invalid targetr=   zQ%d is invalid priority. Must be in range [%d, %d]. The following are reserved: %sr   r   ANYHOSTz'%s' not among existing zonesz>'%s' may only contain one of: many regular zones, ANY, or HOSTzF'HOST' can only appear in either ingress or egress zones, but not bothr    z.'masquerade' is invalid for egress zone 'HOST'z/'masquerade' is invalid for ingress zone 'HOST'Z
interfaceszR'masquerade' cannot be used in a policy if an ingress zone has assigned interfacesrn   )ro   zAA 'forward-port' with 'to-addr' is invalid for egress zone 'HOST'zC'forward-port' requires 'to-addr' if egress zone is 'ANY' or a zonezS'forward-port' cannot be used in a policy if an egress zone has assigned interfaceszR'mark' action cannot be used in a policy if an egress zone has assigned interfacesrR   z1'forward-port' is invalid for ingress zone 'HOST'rm   )r   r   )r   r   )r   r   )r   r   )rw   r   r   r   INVALID_TARGETpriority_reservedpriority_maxpriority_minZINVALID_PRIORITYrq   	get_zonesZINVALID_ZONEr-   Zget_zoneZget_zone_config_dictr   r]   rA   rp   rO   rP   r   rr   rV   rZ   )
r   r   rE   rt   Zexisting_zoneszoneZz_objr9   r_   rv   rc   rc   rd   _check_config  s    






"
















zPolicy._check_configc                s   t t| j| |jdr,ttjd| n|jdrHttjd| n|jddkrhttjd| njd|kr|d |j	d }n|}t
|t krttjd|t
|t f | jr|| jj krttjdd S )Nr   z'%s' can't start with '/'z'%s' can't end with '/'rk   zmore than one '/' in '%s'z&Policy of '%s' has %d chars, max is %dz,Policies can't have the same name as a zone.)r   r   
check_name
startswithr   r   INVALID_NAMEendswithcountfindlenr	   rq   r   ZNAME_CONFLICT)r   r   Zchecked_name)r   rc   rd   r   ,  s*    

zPolicy.check_namei )r   r!   )r   r!   )r   r!   )r   r!   )r!   r!   )r    F)r!   r!   r!   r!   )r!   r!   )r=   r   )__name__
__module____qualname__r   r   r   r   r   ZIMPORT_EXPORT_STRUCTUREZADDITIONAL_ALNUM_CHARSZPARSER_REQUIRED_ELEMENT_ATTRSZPARSER_OPTIONAL_ELEMENT_ATTRSr   r   r   r   r   r   __classcell__rc   rc   )r   rd   r   Z  sr   


^c               @   s$   e Zd Zdd Zdd Zdd ZdS )policy_ContentHandlerc             C   s"   t j| | d | _d| _d | _d S )NF)r   r   r@   rC   r[   )r   rE   rc   rc   rd   r   H  s    zpolicy_ContentHandler.__init__c             C   s   t j| || | jrd S | jj|| t| ||r6d S |dkrd|krR|d | j_d|krjt|d | j_d|kr|d }|t	krt
tj||r|| j_n^|dkr|d | jjkr| jjj|d  ntjd|d  n|dkr |d | jjkr| jjj|d  ntjd	|d  n|d
kr| jsFtjd d| _d S | jjrltjdt| j d| _d S d}d|kr|d j dkrd}d  } }}d|kr|d }d|kr|d }d|kr|d }tj||||d| j_d S tjd| d S d S )Nr   r   r=   r   zingress-zoner   z(Ingress zone '%s' already set, ignoring.zegress-zonez'Egress zone '%s' already set, ignoring.r   z$Invalid rule: Source outside of ruleTz:Invalid rule: More than one source in rule '%s', ignoring.Fr%   r&   r'   r#   r}   r$   )r%   zUnknown XML element '%s')r&   r'   )r   r   rC   rE   Zparser_check_element_attrsre   r   r\   r=   r   r   r   r   r   r   rG   r   r3   r   r@   r   rB   rU   r   ZRich_Source)r   r   r`   r   r%   r   r}   r$   rc   rc   rd   r   N  sf    








z"policy_ContentHandler.startElementc             C   s   t j| | t| | d S )N)r   r   rj   )r   r   rc   rc   rd   r     s    z policy_ContentHandler.endElementN)r   r   r   r   r   r   rc   rc   rc   rd   r   G  s   @r   Fc       
      C   s  t  }| jds ttjd|  | d d	 |_|s>|j|j | |_||_|j	t
jrZdnd|_|j|_t|}tj }|j| d|| f }t|db}tjd }|j| y|j| W n8 tjk
r }	 zttjd|	j  W Y d d }	~	X nX W d Q R X ~~|S )
Nz.xmlz'%s' is missing .xml suffix   FTz%s/%srbznot a valid policy file: %s)r   r   r   r   r   r   r   filenamepathr   r   ETC_FIREWALLDZbuiltindefaultr   saxZmake_parserZsetContentHandleropenZInputSourceZsetByteStreamparseZSAXParseExceptionZINVALID_POLICYZgetException)
r   r   Zno_check_namer   ry   parserr   fr   msgrc   rc   rd   r     s6    




(c       
      C   s  |r|n| j }| jr$d|| jf }nd|| jf }tj j|rytj|d|  W n0 tk
r } ztj	d|| W Y d d }~X nX tj j
|}|jtjrtj j| rtj jtjstjtjd tj|d tj|ddd}t|}|j  i }| jr| jd	kr| j|d
< | j| jkr0t| j|d< | j|d< |jd| |jd t| | x8t| jD ]*}	|jd |jdd|	i |jd qfW x8t| jD ]*}	|jd |jdd|	i |jd qW |jd |jd |j   |j!  ~d S )Nz%s/%sz	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %si  ZwtzUTF-8)modeencodingr!   r   r=   r   r   r|   z  zingress-zoner   zegress-zone)"r   r   r   osexistsshutilZcopy2rf   r   r2   dirnamer   r   r   mkdirior   r   ZstartDocumentr   r=   r   rB   r   r   r   r   r   r   rx   r   r   ZendDocumentclose)
r   r   _pathr   r   dirpathr   ry   r`   r   rc   rc   rd   r     sN     







)F)N))__all__Zxml.saxr   r   r   r   Zfirewallr   Zfirewall.functionsr   r   r   r	   r
   Zfirewall.core.baser   r   r   Zfirewall.core.io.io_objectr   r   r   r   r   r   Zfirewall.corer   Zfirewall.core.loggerr   r   Zfirewall.errorsr   re   rj   rw   r{   r   r   r   r   r   rc   rc   rc   rd   <module>   s4   

   F [ nL
