U
    jÕÕjô  ã                   @   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röe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ršt
|ƒ|kršt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-xc2j09cz/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   

'