B
    ݡXp                 @   s   d Z ddlmZmZ ddlZddlmZ ddlm	Z	m
Z
mZ ejd dkZdZejZG d	d
 d
ejZG dd dejZe ZejZdddZdddZdddZeZdd ZdS )z`Example code for lxml.etree protection

The code has NO protection against decompression bombs.
    )print_functionabsolute_importN)etree   )DTDForbiddenEntitiesForbiddenNotSupportedError   z
lxml.etreec                   s   e Zd ZdZdZejZdd Z fddZ	d fd	d
	Z
d fdd	Zd fdd	Zd fdd	Z fddZd fdd	Z  ZS )RestrictedElementzJA restricted Element class that filters out instances of some classes
     c             c   s*   | j }x|D ]}t||rq|V  qW d S )N)	blacklist
isinstance)selfiteratorr   Zchildr   r   .lib/python3.7/site-packages/defusedxml/lxml.py_filter   s
    

zRestrictedElement._filterc                s   t t|  }| |S )N)superr
   __iter__r   )r   r   )	__class__r   r   r   &   s    zRestrictedElement.__iter__NFc                s   t t| j||d}| |S )N)tagreversed)r   r
   iterchildrenr   )r   r   r   r   )r   r   r   r   *   s    

zRestrictedElement.iterchildrenc                s    t t| j|d|i}| |S )Nr   )r   r
   iterr   )r   r   tagsr   )r   r   r   r   /   s    zRestrictedElement.iterc                s    t t| j|d|i}| |S )Nr   )r   r
   iterdescendantsr   )r   r   r   r   )r   r   r   r   3   s    z!RestrictedElement.iterdescendantsc                s   t t| j||d}| |S )N)r   	preceding)r   r
   itersiblingsr   )r   r   r   r   )r   r   r   r   8   s    

zRestrictedElement.itersiblingsc                s   t t|  }t| |S )N)r   r
   r   listr   )r   r   )r   r   r   getchildren=   s    zRestrictedElement.getchildrenc                s   t t| |}| |S )N)r   r
   getiteratorr   )r   r   r   )r   r   r   r   A   s    zRestrictedElement.getiterator)NF)N)N)NF)N)__name__
__module____qualname____doc__	__slots___etreeZ_Entityr   r   r   r   r   r   r   r   r   __classcell__r   r   )r   r   r
      s   r
   c               @   s4   e Zd ZdZddiZeZdd Zdd Zdd	 Z	d
S )GlobalParserTLSz5Thread local context for custom parser instances
    Zresolve_entitiesFc             C   s8   t jf | j}| j}| jd k	r4t j|d}|| |S )N)element)r%   Z	XMLParserparser_configelement_classZElementDefaultClassLookupZset_element_class_lookup)r   parserr*   lookupr   r   r   createDefaultParserQ   s    

z#GlobalParserTLS.createDefaultParserc             C   s
   || _ d S )N)_default_parser)r   r+   r   r   r   setDefaultParserY   s    z GlobalParserTLS.setDefaultParserc             C   s*   t | dd }|d kr&|  }| | |S )Nr.   )getattrr-   r/   )r   r+   r   r   r   getDefaultParser\   s
    
z GlobalParserTLS.getDefaultParserN)
r    r!   r"   r#   r)   r
   r*   r-   r/   r1   r   r   r   r   r'   F   s   r'   FTc          	   C   s   | j }|jr2|r"t|j|j|j|r2ts2td|r~xF|j|jfD ]6}|dkrRqDx&|	 D ]}t
|j|jddddq\W qDW dS )zCheck docinfo of an element tree for DTD and entity declarations

    The check for entity declarations needs lxml 3 or newer. lxml 2.x does
    not support dtd.iterentities().
    z3Unable to check for entity declarations in lxml 2.xN)docinfoZdoctyper   Z
system_urlZ	public_idLXML3r   ZinternalDTDZexternalDTDZiterentitiesr   nameZcontent)elementtree
forbid_dtdforbid_entitiesr2   ZdtdZentityr   r   r   check_docinfoh   s    r8   c             C   s.   |d krt  }tj| ||d}t||| |S )N)base_url)r1   r%   parser8   )sourcer+   r9   r6   r7   r5   r   r   r   r:      s
    r:   c             C   s6   |d krt  }tj| ||d}| }t||| |S )N)r9   )r1   r%   
fromstringZgetroottreer8   )textr+   r9   r6   r7   Zrootelementr5   r   r   r   r<      s    r<   c              O   s   t dd S )Nz*defused lxml.etree.iterparse not available)r   )argskwargsr   r   r   	iterparse   s    r@   )FT)NNFT)NNFT)r#   Z
__future__r   r   Z	threadingZlxmlr   r%   commonr   r   r   ZLXML_VERSIONr3   Z
__origin__ZtostringZElementBaser
   Zlocalr'   Z_parser_tlsr1   r8   r:   r<   ZXMLr@   r   r   r   r   <module>	   s$   .
 
 
	