o
    p¨Êhp  ã                   @   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 }|D ]}t||ƒrq|V  qd S ©N)Ú	blacklistÚ
isinstance)ÚselfÚiteratorr   Úchildr   r   úA/var/www/html/env/lib/python3.10/site-packages/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                    ó   t t| ƒj||d�}|  |¡S )N)ÚtagÚreversed)r   r
   Úiterchildrenr   )r   r   r   r   r   r   r   r   *   ó   
ÿ
zRestrictedElement.iterchildrenc                    ó    t t| ƒj|d|iŽ}|  |¡S ©Nr   )r   r
   Úiterr   ©r   r   Útagsr   r   r   r   r    /   s   
zRestrictedElement.iterc                    r   r   )r   r
   Úiterdescendantsr   r!   r   r   r   r#   3   s   ÿÿÿ
z!RestrictedElement.iterdescendantsc                    r   )N)r   Ú	preceding)r   r
   Úitersiblingsr   )r   r   r$   r   r   r   r   r%   8   r   zRestrictedElement.itersiblingsc                    s   t t| ƒ ¡ }t|  |¡ƒS r   )r   r
   r   Úlistr   r   r   r   r   Úgetchildren=   s   zRestrictedElement.getchildrenc                    s   t t| ƒ |¡}|  |¡S r   )r   r
   Úgetiteratorr   )r   r   r   r   r   r   r(   A   s   
zRestrictedElement.getiterator)NFr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__Ú_etreeÚ_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
    Úresolve_entitiesFc                 C   s<   t jdi | j¤Ž}| j}| jd urt j|d�}| |¡ |S )N)Úelementr   )r.   Ú	XMLParserÚparser_configÚelement_classÚElementDefaultClassLookupÚset_element_class_lookup)r   Úparserr6   Úlookupr   r   r   ÚcreateDefaultParserQ   s   

z#GlobalParserTLS.createDefaultParserc                 C   s
   || _ d S r   )Ú_default_parser©r   r9   r   r   r   ÚsetDefaultParserY   s   
z GlobalParserTLS.setDefaultParserc                 C   s*   t | dd ƒ}|d u r|  ¡ }|  |¡ |S )Nr<   )Úgetattrr;   r>   r=   r   r   r   ÚgetDefaultParser\   s
   
z GlobalParserTLS.getDefaultParserN)
r)   r*   r+   r,   r5   r
   r6   r;   r>   r@   r   r   r   r   r1   F   s    ÿr1   FTc              	   C   s|   | j }|jr|rt|j|j|jƒ‚|rtstdƒ‚|r:|j|jfD ]}|du r(q!| 	¡ D ]}t
|j|jddddƒ‚q!dS d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   Ú
system_urlÚ	public_idÚLXML3r   ÚinternalDTDÚexternalDTDÚiterentitiesr   ÚnameÚcontent)ÚelementtreeÚ
forbid_dtdÚforbid_entitiesrA   ÚdtdÚentityr   r   r   Úcheck_docinfoh   s(   þÿÿürP   c                 C   s.   |d u rt ƒ }tj| ||d�}t|||ƒ |S ©N)Úbase_url)r@   r.   ÚparserP   )Úsourcer9   rR   rL   rM   rK   r   r   r   rS   ‚   s
   rS   c                 C   s6   |d u rt ƒ }tj| ||d�}| ¡ }t|||ƒ |S rQ   )r@   r.   Ú
fromstringÚgetroottreerP   )Útextr9   rR   rL   rM   ÚrootelementrK   r   r   r   rU   ‹   s   rU   c                  O   s   t dƒ‚)Nz*defused lxml.etree.iterparse not available)r   )ÚargsÚkwargsr   r   r   Ú	iterparse˜   s   r[   )FT)NNFT)r,   Ú
__future__r   r   Ú	threadingÚlxmlr   r.   Úcommonr   r   r   ÚLXML_VERSIONrE   Ú
__origin__ÚtostringÚElementBaser
   Úlocalr1   Ú_parser_tlsr@   rP   rS   rU   ÚXMLr[   r   r   r   r   Ú<module>   s*   .

ÿ	
ÿ
