U
    }F`                     @   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	rzd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 n4d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k
r   dZY nX dZdddZG dd dere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krt}t| }t jd|d}z$|dk r@| }n||d }W n tk
rl   tdY nX |	  |	  |dkrt
||krtd|S )zrgzip encoded data -> unencoded data

    Decode data using the gzip content encoding as described in RFC 1952
    NrbmodeZfileobjr   r   zinvalid dataz#max gzipped payload length exceeded)gzipNotImplementedErrorMAX_DATAioBytesIOGzipFilereadIOError
ValueErrorcloselen)datalimitfZgzfZdecoded r    0lib/python3.8/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 k	r|nt | _}|dk r6| }d | _n||d }d| _|dkrft||krft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__)selfZresponser   r   r    r    r!   r'   K   s    z#DefusedGzipDecodedResponse.__init__c                 C   sn   | j dkr\| j | j }t||d }tj| |}|  jt|7  _| j| j krXtd|S tj| |S d 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.close)N)__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   sZ   t | | || _|| _|| _| j}| jr2| j|_| jrH| j|_	| j
|_| jrV| j|_d S r,   )r	   r'   
forbid_dtdforbid_entitiesforbid_externalZ_parserdefused_start_doctype_declZStartDoctypeDeclHandlerdefused_entity_declZEntityDeclHandlerdefused_unparsed_entity_declZUnparsedEntityDeclHandler#defused_external_entity_ref_handlerZExternalEntityRefHandler)r(   targetr2   r3   r4   parserr    r    r!   r'   n   s    zDefusedExpatParser.__init__c                 C   s   t |||d S r,   )r   )r(   namesysidpubidZhas_internal_subsetr    r    r!   r5   |   s    z-DefusedExpatParser.defused_start_doctype_declc                 C   s   t ||||||d S r,   r   )r(   r;   Zis_parameter_entityvaluebaser<   r=   notation_namer    r    r!   r6      s    z&DefusedExpatParser.defused_entity_declc                 C   s   t |d ||||d S r,   r>   )r(   r;   r@   r<   r=   rA   r    r    r!   r7      s    z/DefusedExpatParser.defused_unparsed_entity_declc                 C   s   t ||||d S r,   )r   )r(   contextr@   r<   r=   r    r    r!   r8      s    z6DefusedExpatParser.defused_external_entity_ref_handlerN)FTT)r-   r.   r/   r'   r5   r6   r7   r8   r    r    r    r!   r1   m   s
   
r1   c                   C   s    t t_tt_tt_trtt_d S r,   )r1   xmlrpc_client
FastParserr#   r   r"   r   xmlrpc_serverr    r    r    r!   monkey_patch   s
    rF   c                   C   s    d t _tt _tt _trtt_d S r,   )rC   rD   _OrigGzipDecodedResponser   _orig_gzip_decoder   rE   r    r    r    r!   unmonkey_patch   s
    rI   )N)!r0   Z
__future__r   r   r   commonr   r   r   r   Z
__origin__Zxmlrpc.clientr	   Zxmlrpcr
   rC   r   rE   r   rH   r   rG   r   r   ImportErrorr   r"   r   objectr#   r1   rF   rI   r    r    r    r!   <module>   s4   

'