<!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jM                 @   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
mZmZmZmZmZ ddlmZmZ ddlmZmZmZmZ dd	l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# G dd  d eZ$G dd deZ%dddZ&dddZ'dS )Zonezone_readerzone_writer    N)config)checkIPnMaskcheckIP6nMaskcheckInterfaceuniqifymax_zone_name_len
u2b_if_py2	check_mac)DEFAULT_ZONE_TARGETZONE_TARGETS)PY2	IO_ObjectIO_Object_ContentHandlerIO_Object_XMLGenerator)common_startElementcommon_endElementcommon_check_configcommon_writer)rich)log)errors)FirewallErrorc                   sf  e Zd ZdZd@dAdBdCdDd	dgfd
dEgfddgfdFddGgfddgfddgfddgfddgfddHgfdIdJfZdddgZddddgddgdgdgdddgdgddddgddgddddddgdgddZddddg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ed.d/ Z	 fd0d1Z
d2d3 Zd4d5 Z fd6d7Z fd8d9Zd:d; Z fd<d=Zd>d? Z  ZS )Kr   z Zone class version shortdescriptionUNUSEDFtargetservicesportsicmp_blocks
masqueradeforward_ports
interfacessources	rules_str	protocolssource_portsicmp_block_inversionforward_-/Nnameportprotocolvalueset)r   r   zoneservicer1   z
icmp-blockz	icmp-typer,   zforward-port	interfacerulesourcedestinationr2   zsource-portr   ZauditZacceptrejectZdropZmarklimitzicmp-block-inversion	immutableZenabledzto-portzto-addrfamilyZpriorityaddressmacinvertipsetprefixleveltypeZburst)	r5   r$   zforward-portr8   r9   r:   r   r;   r<   c             C   s8   x&t tjD ]\}\}}|| kr|S qW ttjdd S )Nz
index_of())	enumerater   IMPORT_EXPORT_STRUCTUREr   r   ZUNKNOWN_ERROR)elementiZelZdummy rJ   /usr/lib/python3.6/zone.pyindex_ofd   s    zZone.index_ofc                s   t t| j  d| _d| _d| _d| _t| _g | _	g | _
g | _g | _d| _d| _g | _g | _g | _g | _d | _g | _g | _d| _d| _d| _d S )Nr   F)superr   __init__r   r   r   r   r   r    r!   r"   r)   r#   r,   r$   r%   r*   r&   r'   	fw_configrulesr(   r+   combinedapplied)self)	__class__rJ   rK   rN   k   s,    zZone.__init__c             C   s   d| _ d| _d| _d| _t| _| jd d = | jd d = | jd d = | j	d d = d| _
d| _| jd d = | jd d = | jd d = | jd d = d | _| jd d = | jd d = d| _d| _d| _d S )Nr   F)r   r   r   r   r   r    r!   r"   r)   r#   r,   r$   r%   r*   r&   r'   rO   rP   r(   r+   rQ   rR   )rS   rJ   rJ   rK   cleanup   s*    zZone.cleanupc             C   s   t | j| _t | j| _t | j| _t | j| _dd | jD | _dd | jD | _dd | jD | _dd | jD | _dd | j	D | _	dd | j
D | _
dd | jD | _d	d | jD | _d
d | jD | _dd | jD | _dS )z HACK. I haven't been able to make sax parser return
            strings encoded (because of python 2) instead of in unicode.
            Get rid of it once we throw out python 2 support.c             S   s   g | ]}t |qS rJ   )r   ).0srJ   rJ   rK   
<listcomp>   s    z'Zone.encode_strings.<locals>.<listcomp>c             S   s    g | ]\}}t |t |fqS rJ   )r   )rV   poprrJ   rJ   rK   rX      s    c             S   s   g | ]}t |qS rJ   )r   )rV   rZ   rJ   rJ   rK   rX      s    c             S   s   g | ]}t |qS rJ   )r   )rV   rI   rJ   rJ   rK   rX      s    c             S   s0   g | ](\}}}}t |t |t |t |fqS rJ   )r   )rV   Zp1Zp2Zp3Zp4rJ   rJ   rK   rX      s    c             S   s    g | ]\}}t |t |fqS rJ   )r   )rV   rY   rZ   rJ   rJ   rK   rX      s    c             S   s   g | ]}t |qS rJ   )r   )rV   rI   rJ   rJ   rK   rX      s    c             S   s   g | ]}t |qS rJ   )r   )rV   rW   rJ   rJ   rK   rX      s    c             S   s   g | ]}t |qS rJ   )r   )rV   rW   rJ   rJ   rK   rX      s    c             S   s   g | ]}t |qS rJ   )r   )rV   rW   rJ   rJ   rK   rX      s    N)r   r   r   r   r    r!   r"   r)   r#   r%   r*   r&   r'   rP   r(   )rS   rJ   rJ   rK   encode_strings   s    zZone.encode_stringsc                sN   |dkr8dd |D | _ tt| j|dd | j D  ntt| j|| d S )Nr(   c             S   s   g | ]}t j|d qS ))Zrule_str)r   Z	Rich_Rule)rV   rW   rJ   rJ   rK   rX      s    z$Zone.__setattr__.<locals>.<listcomp>c             S   s   g | ]}t |qS rJ   )str)rV   rW   rJ   rJ   rK   rX      s    )rP   rM   r   __setattr__)rS   r0   r3   )rT   rJ   rK   r]      s     zZone.__setattr__c                s   t t| j }|d= |S )Nr   )rM   r   export_config_dict)rS   Zconf)rT   rJ   rK   r^      s    zZone.export_config_dictc             C   sL  t | ||| |dkr.|tkr*ttj|n|dkrxl|D ]d}t|sTttj|| jr<xD| jj D ]6}|| j	krvqf|| jj
|jkrfttjdj||qfW q<W n|dkrHx|D ]}t| rt| rt| r|jd rttj|| jrxL| jj D ]>}|| j	krq|| jj
|jkrttjdj||qW qW d S )Nr    r&   z)interface '{}' already bound to zone '{}'r'   zipset:z&source '{}' already bound to zone '{}')r   r   r   r   INVALID_TARGETr   ZINVALID_INTERFACErO   Z	get_zonesr0   Zget_zoner&   formatr   r   r   
startswithINVALID_ADDRr'   )rS   r   itemZ
all_configr7   r5   r9   rJ   rJ   rK   _check_config   s6    



zZone._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| nnd|kr|d |j	d }n|}t
|t krttjd|t
|t | j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 '/'   zmore than one '/' in '%s'z'Zone of '%s' has %d chars, max is %d %sz+Zones can't have the same name as a policy.)rM   r   
check_namera   r   r   INVALID_NAMEendswithcountfindlenr
   rQ   rO   Zget_policy_objectsZNAME_CONFLICT)rS   r0   Zchecked_name)rT   rJ   rK   rf      s,    

zZone.check_namec       
      C   s  d| _ d | _d| _d| _d| _x$|jD ]}|| jkr&| jj| q&W x$|jD ]}|| jkrL| jj| qLW x$|jD ]}|| jkrr| jj| qrW x$|j	D ]}|| j	kr| j	j| qW x$|j
D ]}|| j
kr| j
j| qW x$|jD ]}|| jkr| jj| qW |jrd| _|jrd| _x(|jD ]}|| jkr&| jj| q&W x(|jD ]}|| jkrP| jj| qPW x,|jD ]"}	| jj|	 | jjt|	 qzW |jrd| _d S )NTr   )rQ   filenamer   r   r   r&   appendr'   r!   r"   r)   r#   r,   r$   r%   r*   rP   r(   r\   r+   )
rS   r5   r7   r9   r6   r1   protoZicmpr,   r8   rJ   rJ   rK   combine   sL    





zZone.combine)r   r   )r   r   )r   r   )r   F)r    r   )r   r   )r$   F)r   r   r   r   )r   r   )r+   F)r,   F)__name__
__module____qualname____doc__rG   ZADDITIONAL_ALNUM_CHARSZPARSER_REQUIRED_ELEMENT_ATTRSZPARSER_OPTIONAL_ELEMENT_ATTRSstaticmethodrL   rN   rU   r[   r]   r^   rd   rf   ro   __classcell__rJ   rJ   )rT   rK   r   (   sx   


c               @   s$   e Zd Zdd Zdd Zdd ZdS )zone_ContentHandlerc             C   s"   t j| | d | _d| _d | _d S )NF)r   rN   _rule_rule_errorZ	_limit_ok)rS   rc   rJ   rJ   rK   rN      s    zzone_ContentHandler.__init__c       	      C   s  t j| || | jrd S | jj|| t| ||r6d S |dkrd|krVtjd|d  d|krj|d | j_d|krtjd|d  d|kr|d }|t	krt
tj||dkr|tkr|| j_n|d	kr| jjrtjd
 nd| j_n|dkrh| jrtjd d| _d S d|kr.tjd d| _d S |d | jjkrT| jjj|d  ntjd|d  n8|dkrf| jr | jjrt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 d|krBd|krBtjd d S d|krdd|krdtjd d S d|kr~tjd|d  d|krtjd d S d|krt|d  rt|d  rt|d  rt
tj|d d|kr$d|d  }|| jjkr| jjj| ntjd |d  d|kr|d }|| jjkrT| jjj| ntjd |d  n:|d!kr| jjrtjd" nd| j_ntjd#| d S d S )%Nr5   r0   z'Ignoring deprecated attribute name='%s'r   r=   z,Ignoring deprecated attribute immutable='%s'r    r   r,   zForward already set, ignoring.Tr7   z$Invalid rule: interface use in rule.z Invalid interface: Name missing.z%Interface '%s' already set, ignoring.r9   z:Invalid rule: More than one source in rule '%s', ignoring.FrA   yestruer?   r@   rB   )rA   z$Invalid source: No address no ipset.z"Invalid source: Address and ipset.r>   z)Ignoring deprecated attribute family='%s'z+Invalid source: Invertion not allowed here.zipset:%sz"Source '%s' already set, ignoring.zicmp-block-inversionz+Icmp-Block-Inversion already set, ignoring.zUnknown XML element '%s')ry   rz   )r   startElementrx   rc   Zparser_check_element_attrsr   r   Zwarningr   r   r   r   r_   r   r    r,   rw   r&   rm   r9   r\   lowerr   ZRich_Sourcer   r   r   rb   r'   r+   )	rS   r0   attrsr    rA   Zaddrr@   rB   entryrJ   rJ   rK   r{   &  s    

























z zone_ContentHandler.startElementc             C   s   t j| | t| | d S )N)r   
endElementr   )rS   r0   rJ   rJ   rK   r     s    zzone_ContentHandler.endElementN)rp   rq   rr   rN   r{   r   rJ   rJ   rJ   rK   rv     s   prv   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 ~~tr|j  |S )
Nz.xmlz'%s' is missing .xml suffix   FTz%s/%srbznot a valid zone file: %s)r   rh   r   r   rg   r0   rf   rl   pathra   r   ETC_FIREWALLDZbuiltindefaultrv   saxZmake_parserZsetContentHandleropenZInputSourceZsetByteStreamparseZSAXParseExceptionZINVALID_ZONEZgetExceptionr   r[   )
rl   r   Zno_check_namer5   handlerparserr0   fr9   msgrJ   rJ   rK   r     s:    




(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tkr*| j|d< |jd| |jd t| | x8t| jD ]*}	|jd |jdd|	i |jd qVW x\t| jD ]N}
|jd d|
kr|jdd|
dd  i n|jdd|
i |jd qW | jr
|jd |jdi  |jd | jr2|jd |jdi  |jd |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    r5   
z  r7   r0   zipset:r9   rB      r?   zicmp-block-inversionr,   )"r   rl   r0   osexistsshutilZcopy2	Exceptionr   errordirnamera   r   r   mkdirior   r   ZstartDocumentr   r    r   r{   ZignorableWhitespacer   r	   r&   ZsimpleElementr'   r+   r,   r   ZendDocumentclose)r5   r   _pathr0   r   dirpathr   r   r}   r7   r9   rJ   rJ   rK   r     s`     












)F)N)(__all__Zxml.saxr   r   r   r   Zfirewallr   Zfirewall.functionsr   r   r   r	   r
   r   r   Zfirewall.core.baser   r   Zfirewall.core.io.io_objectr   r   r   r   Zfirewall.core.io.policyr   r   r   r   Zfirewall.corer   Zfirewall.core.loggerr   r   Zfirewall.errorsr   r   rv   r   r   rJ   rJ   rJ   rK   <module>   s$   

$ x|
