B
    ,d                 @   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 y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}y$|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"   ^/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/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   zmax payload length exceededr   )r   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   zmax payload length exceeded)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 )N)r	   r(   
forbid_dtdforbid_entitiesforbid_external_parserdefused_start_doctype_declZStartDoctypeDeclHandlerdefused_entity_declZEntityDeclHandlerdefused_unparsed_entity_declZUnparsedEntityDeclHandler#defused_external_entity_ref_handlerZExternalEntityRefHandler)r)   targetr3   r4   r5   parserr"   r"   r#   r(   n   s    zDefusedExpatParser.__init__c             C   s   t |||d S )N)r   )r)   namesysidpubidZhas_internal_subsetr"   r"   r#   r7   |   s    z-DefusedExpatParser.defused_start_doctype_declc             C   s   t ||||||d S )N)r   )r)   r=   Zis_parameter_entityvaluebaser>   r?   notation_namer"   r"   r#   r8      s    z&DefusedExpatParser.defused_entity_declc             C   s   t |d ||||d S )N)r   )r)   r=   rA   r>   r?   rB   r"   r"   r#   r9      s    z/DefusedExpatParser.defused_unparsed_entity_declc             C   s   t ||||d S )N)r   )r)   contextrA   r>   r?   r"   r"   r#   r:      s    z6DefusedExpatParser.defused_external_entity_ref_handlerN)FTT)r.   r/   r0   r(   r7   r8   r9   r:   r"   r"   r"   r#   r2   m   s
   
r2   c               C   s    t t_tt_tt_trtt_d S )N)r2   xmlrpc_client
FastParserr%   r   r$   r   xmlrpc_serverr"   r"   r"   r#   monkey_patch   s
    rG   c               C   s    d t _tt _tt _trtt_d S )N)rD   rE   _OrigGzipDecodedResponser   _orig_gzip_decoder   rF   r"   r"   r"   r#   unmonkey_patch   s
    rJ   )N)!r1   
__future__r   r   r   commonr   r   r   r   
__origin__xmlrpc.clientr	   Zxmlrpcr
   rD   r   rF   r   rI   r   rH   r   r   ImportErrorr   r$   r   objectr%   r2   rG   rJ   r"   r"   r"   r#   <module>	   s4   

'