<!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jU                 @   s  d Z 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mZmZ ddl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! ddlm"Z" ddl#m$Z$ G dd deZ%G dd deZ&dd Z'dddZ(dS )z$ipset io XML handler, reader, writerIPSetipset_readeripset_writer    N)config)	checkIPcheckIP6checkIPnMaskcheckIP6nMask
u2b_if_py2	check_mac
check_portcheckInterfacecheckProtocol)PY2	IO_ObjectIO_Object_ContentHandlerIO_Object_XMLGenerator)IPSET_TYPESIPSET_CREATE_OPTIONS)check_icmp_namecheck_icmp_type_codecheck_icmpv6_namecheck_icmpv6_type_code)log)errors)FirewallErrorc                   s   e Zd Zddd d!dddifddgffZdZd	d
ddgZdddgdgddZdgdgdZ fddZdd Z	dd Z
edd Zdd Z fddZ  ZS )"r   version shortdescriptiontypeoptionsentriesz(ssssa{ss}as)_-:.Nname)r   r   ipsetoptionentryvalue)r(   r)   c                s<   t t| j  d| _d| _d| _d| _g | _i | _d| _	d S )Nr   F)
superr   __init__r   r   r   r    r"   r!   applied)self)	__class__ /usr/lib/python3.6/ipset.pyr-   C   s    zIPSet.__init__c             C   s8   d| _ d| _d| _d| _| jd d = | jj  d| _d S )Nr   F)r   r   r   r    r"   r!   clearr.   )r/   r1   r1   r2   cleanupM   s    
zIPSet.cleanupc             C   s\   t | j| _t | j| _t | j| _t | j| _dd | j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   i | ]\}}t |t |qS r1   )r
   ).0kvr1   r1   r2   
<dictcomp>^   s   z(IPSet.encode_strings.<locals>.<dictcomp>c             S   s   g | ]}t |qS r1   )r
   )r5   er1   r1   r2   
<listcomp>`   s    z(IPSet.encode_strings.<locals>.<listcomp>N)r
   r   r   r   r    r!   itemsr"   )r/   r1   r1   r2   encode_stringsV   s    zIPSet.encode_stringsc             C   sr  d}d|kr|d dkrd}|j ds6ttjd| |dd  jd}| jd}t|t|ksnt|d	k rttjd
| |f xtt|D ]}|| }|| }|dkrd|ko|dkrh|d	krttjd|| |f |jd}	t|	dkrttjd|| ||f x|	D ]J}
|dkr2t|
 sH|dkrt	|
 rttjd|
| ||f qW nh|dkr|dkrttjd|| ||f |dkrt
}nt}nt	}||sjttjd|| ||f q|dkr@d|kr|jd}	t|	dkrttjd|| ||f |dkr0t|	d  sJ|dkrft	|	d  rfttjd|	d | ||f |dkrt
|	d	  s|dkr>t|	d	  r>ttjd|	d	 | ||f n|jdr|dko|dko|dksttjd|| ||f |dkrt
| s&|dkrjt| rjttjd|| ||f q|dkrvt| s`|dkrjttjd|| f q|dkrld|krL|jd}	t|	dkrttjd| |	d dkrP|dkrttjd|| f t|	d	  rd|	d	 krttjd|	d	 | f n6|	d	 jd\}}t||sJttjd|	d	 | f qj|	d d2kr|dkr|ttjd|| f t|	d	  rd|	d	 krttjd"|	d	 | f n6|	d	 jd\}}t||sJttjd"|	d	 | f n^|	d d3kr$t|	d  r$ttjd'|	d | f n&t|	d	 sjttjd(|	d	 | f nt|sjttjd)|| f q|d*kr |j d+ryt|d,}W n* tk
r   ttjd-|| f Y nX n8yt|}W n* tk
r   ttjd-|| f Y nX |dk s
|d.krjttjd-|| f q|d/krZt| sDt|d0krjttjd1|| f qttjd| qW d S )4NZipv4familyinet6Zipv6zhash:zipset type '%s' not usable   ,   z)entry '%s' does not match ipset type '%s'Zipr$   z invalid address '%s' in '%s'[%d]   z.invalid address range '%s' in '%s' for %s (%s)z(invalid address '%s' in '%s' for %s (%s)z0.0.0.0r   Znetz/0zhash:net,ifaceZmacz00:00:00:00:00:00z invalid mac address '%s' in '%s'Zportr%   zinvalid port '%s'Zicmpz(invalid protocol for family '%s' in '%s'/zinvalid icmp type '%s' in '%s'icmpv6	ipv6-icmpz invalid icmpv6 type '%s' in '%s'tcpsctpudpudplitezinvalid protocol '%s' in '%s'zinvalid port '%s'in '%s'zinvalid port '%s' in '%s'ZmarkZ0x   zinvalid mark '%s' in '%s'l    Ziface   zinvalid interface '%s' in '%s')rD   rE   )rF   rG   rH   rI   )
startswithr   r   INVALID_IPSETsplitlenZINVALID_ENTRYranger   r   r   r	   endswithr   r   r   r   r   r   r   int
ValueErrorr   )r*   r!   Z
ipset_typer=   flagsr;   iflagitemZsplitsZ_splitZip_checkZ_type_codeZint_valr1   r1   r2   check_entryb   sT   























zIPSet.check_entryc             C   s   |dkr |t kr ttjd| |dkrx|j D ]}|tkrNttjd| |dkryt|| }W n, tk
r   ttj	d||| f Y nX |d	k rttj	d
||| f q2|dkr2|| dkr2ttj
|| q2W d S )Nr    z'%s' is not valid ipset typer!   zipset invalid option '%s'timeouthashsizemaxelemz)Option '%s': Value '%s' is not an integerr   z#Option '%s': Value '%s' is negativer=   inetr>   )rZ   r[   r\   )r]   r>   )r   r   r   INVALID_TYPEkeysr   rM   rR   rS   INVALID_VALUEINVALID_FAMILY)r/   r   rW   Z
all_configkey	int_valuer1   r1   r2   _check_config&  s2    

zIPSet._check_configc                sr   d|d kr6|d d dkr6t |d dkr6ttjx&|d D ]}tj||d |d  q@W tt| j| d S )NrZ      0r?   r      )rO   r   r   ZIPSET_WITH_TIMEOUTr   rY   r,   import_config)r/   r   r*   )r0   r1   r2   rh   A  s    
zIPSet.import_config)r   r   )r   r   )r   r   )r    r   )__name__
__module____qualname__ZIMPORT_EXPORT_STRUCTUREZDBUS_SIGNATUREZADDITIONAL_ALNUM_CHARSZPARSER_REQUIRED_ELEMENT_ATTRSZPARSER_OPTIONAL_ELEMENT_ATTRSr-   r4   r<   staticmethodrY   rd   rh   __classcell__r1   r1   )r0   r2   r   ,   s,   


	 Ec               @   s   e Zd Zdd Zdd ZdS )ipset_ContentHandlerc             C   s  t j| || | jj|| |dkrpd|krX|d tkrLttjd|d  |d | j_d|krl|d | j_	nz|dkr|nn|dkrnb|dkrd}d	|kr|d	 }|d
 dkrttj
d|d
  | jjdko|d
 dk rttj
d|d
 | jjf |d
 dkr&| r&ttj
d|d
  |d
 dkryt|}W n. tk
rn   ttjd|d
 |f Y nX |dk rttjd|d
 |f |d
 dkr|dkrttj||d
 | jjkr|| jj|d
 < ntjd|d
  d S )Nr(   r    z%sr   r   r   r)   r   r+   r'   r=   rZ   r[   r\   zUnknown option '%s'zhash:macz%Unsupported option '%s' for type '%s'z&Missing mandatory value of option '%s'z)Option '%s': Value '%s' is not an integerr   z#Option '%s': Value '%s' is negativer]   r>   z Option %s already set, ignoring.)r=   rZ   r[   r\   )r=   )r=   rZ   r[   r\   )rZ   r[   r\   )r]   r>   )r   startElementrW   Zparser_check_element_attrsr   r   r   r^   r    r   ZINVALID_OPTIONrR   rS   r`   ra   r!   r   warning)r/   r'   attrsr+   rc   r1   r1   r2   ro   L  sd    

z!ipset_ContentHandler.startElementc             C   s(   t j| | |dkr$| jjj| j d S )Nr*   )r   
endElementrW   r"   appendZ_element)r/   r'   r1   r1   r2   rr     s    zipset_ContentHandler.endElementN)ri   rj   rk   ro   rr   r1   r1   r1   r2   rn   K  s   7rn   c          %   C   s  t  }| jds ttjd|  | d d |_|j|j | |_||_|j	t
jrVd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 ~~d	|jkrF|jd	 d
krFt|jdkrFtjd|j |jd d = d}	t }
x|	t|jk r|j|	 |
krtjd|j|	  |jj|	 nry|j |j|	 |j|j! W n< tk
r } ztjd| |jj|	 W Y d d }~X nX |
j"|j|	  |	d7 }	qRW ~
t#r|j$  |S )Nz.xmlz'%s' is missing .xml suffixre   FTz%s/%srbznot a valid ipset file: %srZ   rf   r   z6ipset '%s': timeout option is set, entries are ignoredzEntry %s already set, ignoring.z%s, ignoring.rA   )%r   rQ   r   r   ZINVALID_NAMEr'   Z
check_namefilenamepathrL   r   ETC_FIREWALLDZbuiltindefaultrn   saxZmake_parserZsetContentHandleropenZInputSourceZsetByteStreamparseZSAXParseExceptionrM   ZgetExceptionr!   rO   r"   r   rp   setpoprY   r    addr   r<   )rv   rw   r(   handlerparserr'   fsourcemsgrU   Zentries_setr9   r1   r1   r2   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  d	| ji}| jr| jd
kr| j|d< |jd| |jd | jrz| jd
krz|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 xZ| jj D ]L\}	}
|jd |
d
kr |jd|	|
d n|jdd|	i |jd qW xD| jD ]:}|jd |jdi  |j| |jd |jd q(W |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(   
z  r   r   r)   )r'   r+   r'   r*   )!rw   rv   r'   osexistsshutilZcopy2	Exceptionr   errordirnamerL   r   rx   mkdirior{   r   ZstartDocumentr    r   ro   ZignorableWhitespacer   Z
charactersrr   r   r!   r;   ZsimpleElementr"   ZendDocumentclose)r(   rw   _pathr'   r   dirpathr   r   rq   rb   r+   r*   r1   r1   r2   r     sf     















)N))__doc____all__Zxml.saxrz   r   r   r   Zfirewallr   Zfirewall.functionsr   r   r   r	   r
   r   r   r   r   Zfirewall.core.io.io_objectr   r   r   r   Zfirewall.core.ipsetr   r   Zfirewall.core.icmpr   r   r   r   Zfirewall.core.loggerr   r   Zfirewall.errorsr   r   rn   r   r   r1   r1   r1   r2   <module>   s&   

,  !=5