
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
³Y„j5  ã               @   s  d Z ddddddddgZd	d
ljZd	d
ljjZd	d
lZd	d
l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 ejdk ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dejjƒZG dd„ dejƒZdd„ Zdd„ Zdd„ Z dd„ Z!d
S )z5Generic io_object handler, io specific check methods.ÚPY2Ú	IO_ObjectÚIO_Object_ContentHandlerÚIO_Object_XMLGeneratorÚ
check_portÚcheck_tcpudpÚcheck_protocolÚcheck_addressé    N)ÚOrderedDict)Ú	functions)Úb2u)Úerrors)ÚFirewallErrorÚ3c               @   s|   e Zd ZdZf ZdZg Zi Zi 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S )r   z; Abstract IO_Object as base for icmptype, service and zone z()c             C   s"   d| _ d| _d| _d| _d| _d S )NÚ F)ÚfilenameÚpathÚnameÚdefaultZbuiltin)Úself© r   ú/usr/lib/python3.6/io_object.pyÚ__init__2   s
    zIO_Object.__init__c             C   s6   g }x(| j D ]}|jtjt| |d ƒƒƒ qW t|ƒS )Nr	   )ÚIMPORT_EXPORT_STRUCTUREÚappendÚcopyÚdeepcopyÚgetattrÚtuple)r   ÚretÚxr   r   r   Úexport_config9   s    zIO_Object.export_configc             C   sX   i }t dd„ | jD ƒƒ}x:|D ]2}t| |ƒs<tt| |ƒtƒrtjt| |ƒƒ||< qW |S )Nc             S   s   g | ]}|d  |d f‘qS )r	   é   r   )Ú.0r    r   r   r   ú
<listcomp>A   s    z0IO_Object.export_config_dict.<locals>.<listcomp>)Údictr   r   Ú
isinstanceÚboolr   r   )r   ÚconfÚtype_formatsÚkeyr   r   r   Úexport_config_dict?   s    
zIO_Object.export_config_dictc             C   sœ   | j |ƒ xŒt| jƒD ]~\}\}}t|| tƒr~g }tƒ }x,|| D ] }||krD|j|ƒ |j|ƒ qDW ~t| |t	j
|ƒƒ qt| |t	j
|| ƒƒ qW d S )N)Úcheck_configÚ	enumerater   r&   ÚlistÚsetr   ÚaddÚsetattrr   r   )r   r(   ÚiÚelementZdummyZ_confZ_setr    r   r   r   Úimport_configG   s    

zIO_Object.import_configc          	   C   s~   | j |ƒ xn|D ]f}t| |ƒs0ttjdj|ƒƒ‚t|| tƒr`t| |tt	j
tj|| ƒƒƒƒ qt| |tj|| ƒƒ qW d S )Nz-Internal error. '{}' is not a valid attribute)Úcheck_config_dictÚhasattrr   r   ZUNKNOWN_ERRORÚformatr&   r.   r1   r
   Úfromkeysr   r   )r   r(   r*   r   r   r   Úimport_config_dictW   s    


"zIO_Object.import_config_dictc             C   sz   t |tƒs(ttjd|tdƒt|ƒf ƒ‚t|ƒdk r@ttjdƒ‚x4|D ],}|jƒ  rF|| j	krFttjd||f ƒ‚qFW d S )Nz'%s' not of type %s, but %sr   r"   zname can't be emptyz'%s' is not allowed in '%s')
r&   Ústrr   r   ÚINVALID_TYPEÚtypeÚlenZINVALID_NAMEÚisalnumÚADDITIONAL_ALNUM_CHARS)r   r   Úcharr   r   r   Ú
check_namec   s    


zIO_Object.check_namec             C   sj   t |ƒt | jƒkr0ttjdt |ƒt | jƒf ƒ‚i }x&t| jƒD ]\}\}}|| ||< q@W | j|ƒ d S )Nz structure size mismatch %d != %d)r=   r   r   r   r;   r-   r5   )r   r(   Z	conf_dictr2   r    Úyr   r   r   r,   p   s    zIO_Object.check_configc             C   sr   t dd„ | jD ƒƒ}xX|D ]P}|dd„ | jD ƒkrDttjdj|ƒƒ‚| j|| || ƒ | j|| ||ƒ qW d S )Nc             S   s   g | ]}|d  |d f‘qS )r	   r"   r   )r#   r    r   r   r   r$   |   s    z/IO_Object.check_config_dict.<locals>.<listcomp>c             S   s   g | ]\}}|‘qS r   r   )r#   r    rB   r   r   r   r$   ~   s    zoption '{}' is not valid)r%   r   r   r   ZINVALID_OPTIONr7   Ú_check_config_structureÚ_check_config)r   r(   r)   r*   r   r   r   r5   {   s    
zIO_Object.check_config_dictc             C   s   d S )Nr   )r   Zdummy1Zdummy2Zdummy3r   r   r   rD   ƒ   s    zIO_Object._check_configc       	      C   s`  t |t|ƒƒs,ttjd|t|ƒt|ƒf ƒ‚t |tƒrrt|ƒdkrRttjd| ƒ‚x|D ]}| j||d ƒ qXW nêt |tƒrÌt|ƒt|ƒkr¤ttjd|t|ƒf ƒ‚x¶t	|ƒD ]\}}| j|| |ƒ q®W n�t |t
ƒ�r\t|jƒ ƒd \}}xn|jƒ D ]b\}}t |t|ƒƒ�s,ttjd|t|ƒt|ƒf ƒ‚t |t|ƒƒsöttjd|t|ƒt|ƒf ƒ‚qöW d S )Nz'%s' not of type %s, but %sr"   zlen('%s') != 1r	   zlen('%s') != %d)r&   r<   r   r   r;   r.   r=   rC   r   r-   r%   Úitems)	r   r(   Z	structurer    r2   ÚvalueZskeyZsvaluer*   r   r   r   rC   ‡   s8    



z!IO_Object._check_config_structurec             C   sÒ   |j ƒ }d}|| jkrdd}| j| d k	rdx:| j| D ],}||krL|j|ƒ q4ttjd||f ƒ‚q4W || jkr˜d}x$| j| D ]}||kr~|j|ƒ q~W |s¬ttjd| ƒ‚x |D ]}ttjd||f ƒ‚q²W d S )NFTzMissing attribute %s for %szUnexpected element %sz%s: Unexpected attribute %s)ZgetNamesÚPARSER_REQUIRED_ELEMENT_ATTRSÚremover   r   ZPARSE_ERRORÚPARSER_OPTIONAL_ELEMENT_ATTRS)r   r   ÚattrsZ_attrsÚfoundr    r   r   r   Úparser_check_element_attrs¨   s,    



z$IO_Object.parser_check_element_attrsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ZDBUS_SIGNATUREr?   rG   rI   r   r!   r+   r4   r9   rA   r,   r5   rD   rC   rL   r   r   r   r   r   )   s"   !c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚUnexpectedElementErrorc                s   t t| ƒjƒ  || _d S )N)ÚsuperrQ   r   r   )r   r   )Ú	__class__r   r   r   Æ   s    zUnexpectedElementError.__init__c             C   s
   d| j  S )NzUnexpected element '%s')r   )r   r   r   r   Ú__str__É   s    zUnexpectedElementError.__str__)rM   rN   rO   r   rT   Ú__classcell__r   r   )rS   r   rQ   Å   s   rQ   c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚMissingAttributeErrorc                s   t t| ƒjƒ  || _|| _d S )N)rR   rV   r   r   Ú	attribute)r   r   rW   )rS   r   r   r   Í   s    zMissingAttributeError.__init__c             C   s   d| j | jf S )Nz$Element '%s': missing '%s' attribute)r   rW   )r   r   r   r   rT   Ñ   s    zMissingAttributeError.__str__)rM   rN   rO   r   rT   rU   r   r   )rS   r   rV   Ì   s   rV   c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚUnexpectedAttributeErrorc                s   t t| ƒjƒ  || _|| _d S )N)rR   rX   r   r   rW   )r   r   rW   )rS   r   r   r   Ö   s    z!UnexpectedAttributeError.__init__c             C   s   d| j | jf S )Nz'Element '%s': unexpected attribute '%s')r   rW   )r   r   r   r   rT   Ú   s    z UnexpectedAttributeError.__str__)rM   rN   rO   r   rT   rU   r   r   )rS   r   rX   Õ   s   rX   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )r   c             C   s   || _ d| _d S )Nr   )ÚitemÚ_element)r   rY   r   r   r   r   ß   s    z!IO_Object_ContentHandler.__init__c             C   s
   d| _ d S )Nr   )rZ   )r   r   r   r   ÚstartDocumentã   s    z&IO_Object_ContentHandler.startDocumentc             C   s
   d| _ d S )Nr   )rZ   )r   r   rJ   r   r   r   ÚstartElementæ   s    z%IO_Object_ContentHandler.startElementc             C   s*   |dkr| j | j_n|dkr&| j | j_d S )NÚshortÚdescription)rZ   rY   r]   r^   )r   r   r   r   r   Ú
endElementé   s    z#IO_Object_ContentHandler.endElementc             C   s   |  j |jddƒ7  _ d S )NÚ
ú )rZ   Úreplace)r   Úcontentr   r   r   Ú
charactersï   s    z#IO_Object_ContentHandler.charactersN)rM   rN   rO   r   r[   r\   r_   rd   r   r   r   r   r   Þ   s
   c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )r   c             C   sN   t jjj| ƒ |j| _|j| _i g| _| jd | _	g | _
d| _d| _d| _d S )Nr"   zutf-8Féÿÿÿÿ)ÚsaxÚhandlerÚContentHandlerr   ÚwriteÚ_writeÚflushZ_flushZ_ns_contextsZ_current_contextZ_undeclared_ns_mapsZ	_encodingZ_pending_start_elementZ_short_empty_elements)r   Úoutr   r   r   r   ó   s    zIO_Object_XMLGenerator.__init__c             C   s*   t rdd„ |jƒ D ƒ}tjj| ||ƒ dS )a   saxutils.XMLGenerator.startElement() expects name and attrs to be
            unicode and bad things happen if any of them is (utf-8) encoded.
            We override the method here to sanitize this case.
            Can be removed once we drop Python2 support.
        c             S   s   i | ]\}}t |ƒt |ƒ“qS r   )r   )r#   r   rF   r   r   r   ú
<dictcomp>  s    z7IO_Object_XMLGenerator.startElement.<locals>.<dictcomp>N)r   rE   ÚsaxutilsÚXMLGeneratorr\   )r   r   rJ   r   r   r   r\     s    z#IO_Object_XMLGenerator.startElementc             C   s¢   t rX| jdt|ƒ ƒ x4|jƒ D ](\}}| jdt|ƒtjt|ƒƒf ƒ q W | jdƒ nF| jd| ƒ x,|jƒ D ] \}}| jd|tj|ƒf ƒ qpW | jdƒ dS )z* slightly modified startElement()
        ú<z %s=%sz/>N)r   rj   r   rE   rn   Z	quoteattr)r   r   rJ   rF   r   r   r   ÚsimpleElement  s    z$IO_Object_XMLGenerator.simpleElementc             C   s   t jj| t|ƒƒ dS )zú saxutils.XMLGenerator.endElement() expects name to be
            unicode and bad things happen if it's (utf-8) encoded.
            We override the method here to sanitize this case.
            Can be removed once we drop Python2 support.
        N)rn   ro   r_   r   )r   r   r   r   r   r_     s    z!IO_Object_XMLGenerator.endElementc             C   s   t jj| t|ƒƒ dS )zý saxutils.XMLGenerator.characters() expects content to be
            unicode and bad things happen if it's (utf-8) encoded.
            We override the method here to sanitize this case.
            Can be removed once we drop Python2 support.
        N)rn   ro   rd   r   )r   rc   r   r   r   rd   %  s    z!IO_Object_XMLGenerator.charactersc             C   s   t jj| t|ƒƒ dS )a   saxutils.XMLGenerator.ignorableWhitespace() expects content to be
            unicode and bad things happen if it's (utf-8) encoded.
            We override the method here to sanitize this case.
            Can be removed once we drop Python2 support.
        N)rn   ro   ÚignorableWhitespacer   )r   rc   r   r   r   rr   -  s    z*IO_Object_XMLGenerator.ignorableWhitespaceN)	rM   rN   rO   r   r\   rq   r_   rd   rr   r   r   r   r   r   ò   s   
c             C   sˆ   t j| ƒ}|dkr$ttjd|  ƒ‚n`|dkr>ttjd|  ƒ‚nF|d krXttjd|  ƒ‚n,t|ƒdkr„|d |d kr„ttjd|  ƒ‚d S )	Né   zport number in '%s' is too bigr"   z'%s' is invalid port rangezport range '%s' is ambiguousr	   éþÿÿÿre   )r   ZgetPortRanger   r   ZINVALID_PORTr=   )ZportZ
port_ranger   r   r   r   5  s    
c             C   s   | dkrt tjd|  ƒ‚d S )NÚtcpÚudpÚsctpÚdccpz)'%s' not from {'tcp'|'udp'|'sctp'|'dccp'})ru   rv   rw   rx   )r   r   ÚINVALID_PROTOCOL)Úprotocolr   r   r   r   D  s    c             C   s   t j| ƒsttj| ƒ‚d S )N)r   ZcheckProtocolr   r   ry   )rz   r   r   r   r   J  s    
c             C   s$   t j| |ƒs ttjd|| f ƒ‚d S )Nz'%s' is not valid %s address)r   r   r   r   ZINVALID_ADDR)ZipvZaddrr   r   r   r   N  s    )"rP   Ú__all__Zxml.saxrf   Zxml.sax.saxutilsrn   r   ÚsysÚcollectionsr
   Zfirewallr   Zfirewall.functionsr   r   Zfirewall.errorsr   Úversionr   Úobjectr   Ú	ExceptionrQ   rV   rX   rg   rh   r   ro   r   r   r   r   r   r   r   r   r   Ú<module>   s0   

 		C