U
    mu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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#   5/tmp/pip-unpacked-wheel-d6x4jz3i/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__)self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 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 |||d S r0   )r   )r+   namesysidpubidZhas_internal_subsetr#   r#   r$   r:   |   s    z-DefusedExpatParser.defused_start_doctype_declc                 C   s   t ||||||d S 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 ||||d S r0   rG   )r+   rD   rJ   rE   rF   rK   r#   r#   r$   r>      s    z/DefusedExpatParser.defused_unparsed_entity_declc                 C   s   t ||||d S r0   )r   )r+   contextrJ   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 r0   )r5   xmlrpc_client
FastParserr&   r   r%   r   xmlrpc_serverr#   r#   r#   r$   monkey_patch   s
    rP   c                   C   s    d t _tt _tt _trtt_d S r0   )rM   rN   _OrigGzipDecodedResponser   _orig_gzip_decoder   rO   r#   r#   r#   r$   unmonkey_patch   s
    rS   )N)!r4   
__future__r   r   r   commonr   r   r   r   
__origin__xmlrpc.clientr	   Zxmlrpcr
   rM   r   rO   r   rR   r   rQ   r   r   ImportErrorr   r%   r   objectr&   r5   rP   rS   r#   r#   r#   r$   <module>   s4   

'