o
    e                     @   s  d Z ddlmZmZ ddlZddlmZmZmZm	Z	 e	r=d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 ndZ
ddlmZ ddlZdZdd
lmZ ddlmZ zddlZW n eyh   dZY nw dZdddZG dd derzejneZG dd deZdd Zdd Z dS )z*Defused xmlrpclib

Also defuses gzip bomb
    )print_functionabsolute_importN   )DTDForbiddenEntitiesForbiddenExternalReferenceForbiddenPY3zxmlrpc.client)ExpatParser)client)server)gzip_decode)GzipDecodedResponse	xmlrpclibi  c                 C   s   t st|du r
t}t| }t jd|d}z|dk r | }n||d }W n ty3   tdw |	  |	  |dkrJt
||krJtd|S )zrgzip encoded data -> unencoded data

    Decode data using the gzip content encoding as described in RFC 1952
    Nrbmodefileobjr   r   zinvalid dataz#max gzipped payload length exceeded)gzipNotImplementedErrorMAX_DATAioBytesIOGzipFilereadIOError
ValueErrorcloselen)datalimitfgzfdecoded r#   D/var/www/html/venv/lib/python3.10/site-packages/defusedxml/xmlrpc.pydefused_gzip_decode-   s&   

r%   c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
DefusedGzipDecodedResponsezha file-like object to decode a response encoded with the gzip
    method, as described in RFC 1952.
    Nc                 C   s   t st|d ur
|nt | _}|dk r| }d | _n
||d }d| _|dkr3t||kr3tdt	|| _
t jj| d| j
d d S )Nr   r   max payload length exceededr   r   )r   r   r   r   r   
readlengthr   r   r   r   stringior   __init__)selfresponser   r   r#   r#   r$   r*   K   s   z#DefusedGzipDecodedResponse.__init__c                 C   sj   | j dkr.| j | j }t||d }tj| |}|  jt|7  _| j| j kr,td|S tj| |S )Nr   r   r'   )r   r(   minr   r   r   r   r   )r+   nleftr   r#   r#   r$   r   \   s   
zDefusedGzipDecodedResponse.readc                 C   s   t j|  | j  d S N)r   r   r   r)   )r+   r#   r#   r$   r   h   s   z DefusedGzipDecodedResponse.closer0   )__name__
__module____qualname____doc__r*   r   r   r#   r#   r#   r$   r&   F   s
    
r&   c                   @   s6   e Zd ZdddZdd Zdd Zd	d
 Zdd ZdS )DefusedExpatParserFTc                 C   s^   t | | || _|| _|| _| j}| jr| j|_| jr$| j|_	| j
|_| jr-| j|_d S d S r0   )r	   r*   
forbid_dtdforbid_entitiesforbid_external_parserdefused_start_doctype_declStartDoctypeDeclHandlerdefused_entity_declEntityDeclHandlerdefused_unparsed_entity_declUnparsedEntityDeclHandler#defused_external_entity_ref_handlerExternalEntityRefHandler)r+   targetr6   r7   r8   parserr#   r#   r$   r*   n   s   zDefusedExpatParser.__init__c                 C   s   t |||r0   )r   )r+   namesysidpubidhas_internal_subsetr#   r#   r$   r:   |   s   z-DefusedExpatParser.defused_start_doctype_declc                 C   s   t ||||||r0   r   )r+   rD   is_parameter_entityvaluebaserE   rF   notation_namer#   r#   r$   r<      s   z&DefusedExpatParser.defused_entity_declc                 C   s   t |d ||||r0   rH   )r+   rD   rK   rE   rF   rL   r#   r#   r$   r>      s   z/DefusedExpatParser.defused_unparsed_entity_declc                 C   s   t ||||r0   )r   )r+   contextrK   rE   rF   r#   r#   r$   r@      s   z6DefusedExpatParser.defused_external_entity_ref_handlerN)FTT)r1   r2   r3   r*   r:   r<   r>   r@   r#   r#   r#   r$   r5   m   s    
r5   c                   C   s$   t t_tt_tt_trtt_d S d S r0   )r5   xmlrpc_client
FastParserr&   r   r%   r   xmlrpc_serverr#   r#   r#   r$   monkey_patch      
rQ   c                   C   s$   d t _tt _tt _trtt_d S d S r0   )rN   rO   _OrigGzipDecodedResponser   _orig_gzip_decoder   rP   r#   r#   r#   r$   unmonkey_patch   rR   rU   r0   )!r4   
__future__r   r   r   commonr   r   r   r   
__origin__xmlrpc.clientr	   xmlrpcr
   rN   r   rP   r   rT   r   rS   r   r   ImportErrorr   r%   r   objectr&   r5   rQ   rU   r#   r#   r#   r$   <module>   s8   
'