o
    òT·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	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©Ú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#   úT/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/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 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__)ÚselfÚ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.closer0   )Ú__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 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 |||ƒ‚r0   )r   )r+   ÚnameÚsysidÚpubidÚhas_internal_subsetr#   r#   r$   r:   |   s   z-DefusedExpatParser.defused_start_doctype_declc                 C   s   t ||||||ƒ‚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 ||||ƒ‚r0   rH   )r+   rD   rK   rE   rF   rL   r#   r#   r$   r>   „   s   z/DefusedExpatParser.defused_unparsed_entity_declc                 C   s   t ||||ƒ‚r0   )r   )r+   ÚcontextrK   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 d S r0   )r5   Úxmlrpc_clientÚ
FastParserr&   r   r%   r   Úxmlrpc_serverr#   r#   r#   r$   Úmonkey_patchŒ   ó   
ÿrQ   c                   C   s$   d t _tt _tt _trtt_d S d S r0   )rN   rO   Ú_OrigGzipDecodedResponser   Ú_orig_gzip_decoder   rP   r#   r#   r#   r$   Úunmonkey_patch”   rR   rU   r0   )!r4   Ú
__future__r   r   r   Úcommonr   r   r   r   Ú
__origin__Úxmlrpc.clientr	   Úxmlrpcr
   rN   r   rP   r   rT   r   rS   r   r   ÚImportErrorr   r%   r   Úobjectr&   r5   rQ   rU   r#   r#   r#   r$   Ú<module>   s8   ÿ
'