U
    jÕÕjL  ã                   @   sÊ   d Z ddlmZmZ ddl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ejd	ed
d� 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 )zkDEPRECATED Example code for lxml.etree protection

The code has NO protection against decompression bombs.
é    )Úprint_functionÚabsolute_importN)Úetreeé   )ÚDTDForbiddenÚEntitiesForbiddenÚNotSupportedErroré   z
lxml.etreezOdefusedxml.lxml is no longer supported and will be removed in a future release.é   )ÚcategoryÚ
stacklevelc                       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 )ÚRestrictedElementzEA restricted Element class that filters out instances of some classes© c                 c   s&   | j }|D ]}t||ƒrq
|V  q
d S ©N)Ú	blacklistÚ
isinstance)ÚselfÚiteratorr   Úchildr   r   ú3/tmp/pip-unpacked-wheel-xc2j09cz/defusedxml/lxml.pyÚ_filter(   s
    
zRestrictedElement._filterc                    s   t t| ƒ ¡ }|  |¡S r   )Ú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   3   s    zRestrictedElement.iterchildrenc                    s    t t| ƒj|d|iŽ}|  |¡S ©Nr   )r   r   Úiterr   ©r   r   Útagsr   r   r   r   r    7   s    zRestrictedElement.iterc                    s    t t| ƒj|d|iŽ}|  |¡S r   )r   r   Úiterdescendantsr   r!   r   r   r   r#   ;   s    z!RestrictedElement.iterdescendantsc                    s   t t| ƒj||d�}|  |¡S )N)r   Ú	preceding)r   r   Úitersiblingsr   )r   r   r$   r   r   r   r   r%   ?   s    zRestrictedElement.itersiblingsc                    s   t t| ƒ ¡ }t|  |¡ƒS r   )r   r   r   Úlistr   r   r   r   r   ÚgetchildrenC   s    zRestrictedElement.getchildrenc                    s   t t| ƒ |¡}|  |¡S r   )r   r   Úgetiteratorr   )r   r   r   r   r   r   r(   G   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 )ÚGlobalParserTLSz0Thread local context for custom parser instancesÚresolve_entitiesFc                 C   s8   t jf | jŽ}| j}| jd k	r4t j|d�}| |¡ |S )N)Úelement)r.   Ú	XMLParserÚparser_configÚelement_classZElementDefaultClassLookupZset_element_class_lookup)r   Úparserr5   Úlookupr   r   r   ÚcreateDefaultParserW   s    

z#GlobalParserTLS.createDefaultParserc                 C   s
   || _ d S r   )Ú_default_parser©r   r6   r   r   r   ÚsetDefaultParser_   s    z GlobalParserTLS.setDefaultParserc                 C   s*   t | dd ƒ}|d kr&|  ¡ }|  |¡ |S )Nr9   )Úgetattrr8   r;   r:   r   r   r   ÚgetDefaultParserb   s
    
z GlobalParserTLS.getDefaultParserN)
r)   r*   r+   r,   r4   r   r5   r8   r;   r=   r   r   r   r   r0   L   s    ÿr0   FTc              	   C   sz   | j }|jr2|r"t|j|j|jƒ‚|r2ts2tdƒ‚|rv|j|jfD ]2}|dkrPqB| 	¡ D ]}t
|j|jddddƒ‚qXqBdS )zµCheck 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)ÚdocinfoÚdoctyper   Z
system_urlÚ	public_idÚLXML3r   ZinternalDTDZexternalDTDZiterentitiesr   ÚnameÚcontent)ÚelementtreeÚ
forbid_dtdÚforbid_entitiesr>   ZdtdÚentityr   r   r   Úcheck_docinfon   s    rH   c                 C   s.   |d krt ƒ }tj| ||d�}t|||ƒ |S ©N)Úbase_url)r=   r.   ÚparserH   )Úsourcer6   rJ   rE   rF   rD   r   r   r   rK   „   s
    rK   c                 C   s6   |d krt ƒ }tj| ||d�}| ¡ }t|||ƒ |S rI   )r=   r.   Ú
fromstringZgetroottreerH   )Útextr6   rJ   rE   rF   ZrootelementrD   r   r   r   rM   Œ   s    rM   c                  O   s   t dƒ‚d S )Nz*defused lxml.etree.iterparse not available)r   )ÚargsÚkwargsr   r   r   Ú	iterparse˜   s    rQ   )FT)NNFT)NNFT)r,   Ú
__future__r   r   Ú	threadingÚwarningsÚlxmlr   r.   Úcommonr   r   r   ZLXML_VERSIONrA   Ú
__origin__ÚtostringÚwarnÚDeprecationWarningZElementBaser   Úlocalr0   Z_parser_tlsr=   rH   rK   rM   ÚXMLrQ   r   r   r   r   Ú<module>   s,   ý+


	