<!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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 d dl	m
Z
mZmZ d dl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
lmZ G dd deZG dd deZdS )    N)config)LastUpdatedOrderedDict)	splitArgsjoinArgs
u2b_if_py2)	IO_ObjectIO_Object_ContentHandlerIO_Object_XMLGenerator)log)	ipXtables)ebtables)errors)FirewallErrorc               @   s$   e Zd Zdd Zdd Zdd ZdS )direct_ContentHandlerc             C   s   t j| | d| _d S )NF)r   __init__direct)selfitem r   /usr/lib/python3.6/direct.pyr   (   s    zdirect_ContentHandler.__init__c             C   s  t j| || | jj|| |dkr@| jr6ttjdd| _n>|dkr| js\tj	d d S |d }|d }|d }| jj
t|t|t| n|dkr6| jstj	d	 d S |d }|dkrttjd| |d }|d }yt|d }W n( tk
r   tj	d|d   d S X t|t|t||g| _nH|dkrl| jsVtj	d d S |d }t|g| _ntj	d|  d S d S )Nr   zMore than one direct tag.Tchainz$Parse Error: chain outside of directipvtablerulez#Parse Error: rule outside of directipv4ipv6ebz"'%s' not from {'ipv4'|'ipv6'|'eb'}priorityz'Parse Error: %s is not a valid prioritypassthroughz&Parse Error: command outside of directzUnknown XML element %s)r   r   r   )r   startElementr   Zparser_check_element_attrsr   r   r   ZPARSE_ERRORr
   error	add_chainr   INVALID_IPVint
ValueError_rule_passthrough)r   nameZattrsr   r   r   r   r   r   r   r   ,   sT    






z"direct_ContentHandler.startElementc             C   s   t j| | |dkrX| jrF| jjdd t| jD  | jj| j  n
tj	d d | _nJ|dkr| jr| j
jdd t| jD  | jj| j
  n
tj	d	 d | _
d S )
Nr   c             S   s   g | ]}t |qS r   )r   ).0xr   r   r   
<listcomp>d   s   z4direct_ContentHandler.endElement.<locals>.<listcomp>z2Error: rule does not have any arguments, ignoring.r   c             S   s   g | ]}t |qS r   )r   )r(   r)   r   r   r   r*   m   s   z0Error: passthrough does not have any arguments, z	ignoring.z9Error: passthrough does not have any arguments, ignoring.)r   
endElementZ_elementr%   appendr   r   add_ruler
   r    r&   add_passthrough)r   r'   r   r   r   r+   ^   s     
z direct_ContentHandler.endElementN)__name__
__module____qualname__r   r   r+   r   r   r   r   r   '   s   2r   c                   s<  e Zd ZdZddBgfddddddgfgfdddgfgffZdZdd	d
dgd	d
ddgd	gdZi Z fddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!  Z"S )CDirectz Direct class chains rulesr   passthroughsz(a(sss)a(sssias)a(sas))Nr   r   r   r   )r   r   r   r   c                s0   t t| j  || _t | _t | _t | _d S )N)superr2   r   filenamer   r3   r5   r6   )r   r8   )	__class__r   r   r      s
    zDirect.__init__c             C   s   d S )Nr   )r   confr   Zall_confr   r   r   _check_config   s    zDirect._check_configc             C   s  g }g }x>| j D ]4}x.| j | D ] }|jtt|t|g  q W qW |j| g }xR| jD ]H}xB| j| D ]4}|jt|d |d |d |d t|d f qnW q^W |j| g }x8| jD ].}x(| j| D ]}|jt|t|f qW qW |j| t|S )Nr         )r3   r,   tuplelistr5   r6   )r   retr)   keyr   r   r   r   r   export_config   s$    $


zDirect.export_configc             C   s   | j   | j| xt| jD ]x\}\}}|dkrNx|| D ]}| j|  q<W |dkrrx|| D ]}| j|  q`W |dkrx|| D ]}| j|  qW qW d S )Nr3   r5   r6   )cleanupZcheck_config	enumerateIMPORT_EXPORT_STRUCTUREr!   r-   r.   )r   r:   ielementZdummyr)   r   r   r   import_config   s    
zDirect.import_configc             C   s"   | j j  | jj  | jj  d S )N)r3   clearr5   r6   )r   r   r   r   rC      s    

zDirect.cleanupc             C   s   t d x4| jD ]*}t d|d |d dj| j| f  qW t d xZ| jD ]P}t d|d |d |d f  x,| j| D ]\}}t d	|d
j|f  q|W qNW t d x@| jD ]6}t d|  x$| j| D ]}t dd
j|  qW qW d S )Nr3   z  (%s, %s): %sr   r<   ,r5   z  (%s, %s, %s):r=   z    (%d, ('%s'))z','r6   z  %s:z
    ('%s'))printr3   joinr5   r6   )r   rA   r   argsr   r   r   output   s    zDirect.outputc             C   s*   dddg}||kr&t tjd||f d S )Nr   r   r   z'%s' not in '%s')r   r   r"   )r   r   Zipvsr   r   r   
_check_ipv   s    
zDirect._check_ipvc             C   sF   | j | |dkrtjj ntjj }||krBttjd||f d S )Nr   r   z'%s' not in '%s')r   r   )rO   r   ZBUILT_IN_CHAINSkeysr   r   r   ZINVALID_TABLE)r   r   r   Ztablesr   r   r   _check_ipv_table   s    

zDirect._check_ipv_tablec             C   sd   | j || ||f}|| jkr(g | j|< || j| krH| j| j| ntjd|||f d  d S )Nz(Chain '%s' for table '%s' with ipv '%s' zalready in list, ignoring)rQ   r3   r,   r
   warning)r   r   r   r   rA   r   r   r   r!      s    

zDirect.add_chainc             C   sn   | j || ||f}|| jkrX|| j| krX| j| j| t| j| dkrj| j|= ntd|||f d S )Nr   z4Chain '%s' with table '%s' with ipv '%s' not in list)rQ   r3   removelenr$   )r   r   r   r   rA   r   r   r   remove_chain   s    
zDirect.remove_chainc             C   s,   | j || ||f}|| jko*|| j| kS )N)rQ   r3   )r   r   r   r   rA   r   r   r   query_chain   s    zDirect.query_chainc             C   s<   | j || ||f}|| jkr(| j| S td||f d S )Nz&No chains for table '%s' with ipv '%s')rQ   r3   r$   )r   r   r   rA   r   r   r   
get_chains   s    

zDirect.get_chainsc             C   s   | j S )N)r3   )r   r   r   r   get_all_chains  s    zDirect.get_all_chainsc             C   s   | j || |||f}|| jkr,t | j|< |t|f}|| j| krV|| j| |< n*tjddj|||f d||f  d  d S )Nz(Rule '%s' for table '%s' and chain '%s' z',zwith ipv '%s' and priority %d zalready in list, ignoring)rQ   r5   r   r>   r
   rR   rL   )r   r   r   r   r   rM   rA   valuer   r   r   r-     s    

zDirect.add_rulec             C   s   | j || |||f}|t|f}|| jkrb|| j| krb| j| |= t| j| dkr| j|= n$tddj|||f d||f  d S )Nr   z(Rule '%s' for table '%s' and chain '%s' z',z)with ipv '%s' and priority %d not in list)rQ   r>   r5   rT   r$   rL   )r   r   r   r   r   rM   rA   rY   r   r   r   remove_rule  s    

zDirect.remove_rulec             C   sb   | j || |||f}|| jkr^x"| j| j D ]}| j| |= q0W t| j| dkr^| j|= d S )Nr   )rQ   r5   rP   rT   )r   r   r   r   rA   rY   r   r   r   remove_rules"  s    

zDirect.remove_rulesc             C   s:   | j || |||f}|t|f}|| jko8|| j| kS )N)rQ   r>   r5   )r   r   r   r   r   rM   rA   rY   r   r   r   
query_rule+  s    
zDirect.query_rulec             C   sF   | j || |||f}|| jkr*| j| S td||f d|  d S )Nz'No rules for table '%s' and chain '%s' zwith ipv '%s')rQ   r5   r$   )r   r   r   r   rA   r   r   r   	get_rules1  s    


zDirect.get_rulesc             C   s   | j S )N)r5   )r   r   r   r   get_all_rules:  s    zDirect.get_all_rulesc             C   s^   | j | || jkrg | j|< || j| kr>| j| j| ntjddj||f d  d S )NzPassthrough '%s' for ipv '%s'z',zalready in list, ignoring)rO   r6   r,   r
   rR   rL   )r   r   rM   r   r   r   r.   ?  s    


zDirect.add_passthroughc             C   sl   | j | || jkrN|| j| krN| j| j| t| j| dkrh| j|= ntddj||f d d S )Nr   zPassthrough '%s' for ipv '%s'z',znot in list)rO   r6   rS   rT   r$   rL   )r   r   rM   r   r   r   remove_passthroughI  s    

zDirect.remove_passthroughc             C   s"   | j | || jko || j| kS )N)rO   r6   )r   r   rM   r   r   r   query_passthroughS  s    
zDirect.query_passthroughc             C   s.   | j | || jkr| j| S td| d S )NzNo passthroughs for ipv '%s')rO   r6   r$   )r   r   r   r   r   get_passthroughsW  s    


zDirect.get_passthroughsc             C   s   | j S )N)r6   )r   r   r   r   get_all_passthroughs^  s    zDirect.get_all_passthroughsc             C   s   | j   | jjds&ttjd| j t| }tj }|j	| t
| j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 S )Nz.xmlz'%s' is missing .xml suffixrbzNot a valid file: %s)rC   r8   endswithr   r   ZINVALID_NAMEr   saxZmake_parserZsetContentHandleropenZInputSourceZsetByteStreamparseZSAXParseExceptionZINVALID_TYPEZgetException)r   handlerparserfsourcemsgr   r   r   readc  s     


zDirect.readc       
      C   sB  t jj| jr\ytj| jd| j  W n4 tk
rZ } ztd| j|f W Y d d }~X nX t jjtj	sxt j
tj	d tj| jddd}t|}|j  |jdi  |jd xR| jD ]H}|\}}x:| j| D ],}|jd	 |jd
|||d |jd qW qW x| jD ]}|\}}}xx| j| D ]j\}}	t|	dk r@q&|jd	 |jd|||d| d |jtjjt|	 |jd |jd q&W qW x|| jD ]r}xj| j| D ]\}	t|	dk rȐq|jd	 |jdd|i |jtjjt|	 |jd |jd qW qW |jd |jd |j  |j  ~d S )Nz%s.oldzBackup of '%s' failed: %si  ZwtzUTF-8)modeencodingr   
z  r   )r   r   r   r<   r   z%d)r   r   r   r   r   r   )ospathexistsr8   shutilZcopy2	ExceptionIOErrorr   ZETC_FIREWALLDmkdiriorf   r	   ZstartDocumentr   ZignorableWhitespacer3   ZsimpleElementr5   rT   re   Zsaxutilsescaper   r+   r6   ZendDocumentclose)
r   rl   rj   rh   rA   r   r   r   r   rM   r   r   r   writeu  sZ    $











zDirect.write)r4   r4   r4   )#r/   r0   r1   __doc__rE   ZDBUS_SIGNATUREZPARSER_REQUIRED_ELEMENT_ATTRSZPARSER_OPTIONAL_ELEMENT_ATTRSr   r;   rB   rH   rC   rN   rO   rQ   r!   rU   rV   rW   rX   r-   rZ   r[   r\   r]   r^   r.   r_   r`   ra   rb   rm   r{   __classcell__r   r   )r9   r   r2   u   sH   

			

r2   )Zxml.saxre   rq   rx   rt   Zfirewallr   Zfirewall.fw_typesr   Zfirewall.functionsr   r   r   Zfirewall.core.io.io_objectr   r   r	   Zfirewall.core.loggerr
   Zfirewall.corer   r   r   Zfirewall.errorsr   r   r2   r   r   r   r   <module>   s   
N