o
    8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	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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    3/usr/lib/python3/dist-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__)selfZ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.closer,   )__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 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 |||r,   )r   )r(   namesysidpubidZhas_internal_subsetr    r    r!   r5   |   s   z-DefusedExpatParser.defused_start_doctype_declc                 C   s   t ||||||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 ||||r,   r>   )r(   r;   r@   r<   r=   rA   r    r    r!   r7      s   z/DefusedExpatParser.defused_unparsed_entity_declc                 C   s   t ||||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 d S r,   )r1   xmlrpc_client
FastParserr#   r   r"   r   xmlrpc_serverr    r    r    r!   monkey_patch      
rF   c                   C   s$   d t _tt _tt _trtt_d S d S r,   )rC   rD   _OrigGzipDecodedResponser   _orig_gzip_decoder   rE   r    r    r    r!   unmonkey_patch   rG   rJ   r,   )!r0   Z
__future__r   r   r   commonr   r   r   r   
__origin__Zxmlrpc.clientr	   Zxmlrpcr
   rC   r   rE   r   rI   r   rH   r   r   ImportErrorr   r"   r   objectr#   r1   rF   rJ   r    r    r    r!   <module>   s8   
'