o
    ¼Ü¸`õ8  ã                   @   sJ  d Z ddlZddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZmZ eZG dd„ deƒZG dd„ dƒZi Zdd	„ ZdDdd„ZdDdd„ZdDdd„ZddlmZ e ¡ Zej
Zdd„ Zdd„ Zdd„ Zdd„ Zej Z ee _!ege _"ej#Z#de#_!ege#_"ej$Z$ee$_!ege$_"ej%Z%ee%_!ege%_"ej&Z'ee'_!eege'_"ee'_(dd„ Z&ej)Z*ee*_!ee
e	ge*_"ee*_(dd„ Z)ej+Z+ee+_!eege+_"ee+_(ej+Z,ee,_!eege,_"ee,_(dd „ Z+ej-Z.ee._!eege._"ee._(d!d"„ Z-ej/Z/ee/_!eege/_"ej0Z0ee0_!eege0_"ej1Z1ee1_!eege1_"d
Z2e3ed#ƒ�r?e3ed$ƒ�r?d%Z2ej4Z5ee5_!eeee	ƒge5_"ee5_(ej6Z7ee7_!eeee	ƒge7_"ee7_(d&d#„ Z4d'd$„ Z6d
Z8e3ed(ƒ�rZd%Z8ej9Z9ee9_!g e9_"d)d*„ Z:dZ;dZ<d+Z=d,Z>d-Z?d.Z@d/ZAd.ZBd0ZCd1ZDd2ZEd3ZFd4ZGd5ZHd6ZId7ZJd8ZKd9ZLd:ZMd;ZNd<ZOd=ZPd>ZQdZRdZSd+ZTd?ZUd,ZVd@ZWdAZXdBdC„ ZYeYeZƒ ƒ dS )Eai  
magic is a wrapper around the libmagic file identification library.

See README for more information.

Usage:

>>> import magic
>>> magic.from_file("testdata/test.pdf")
'PDF document, version 1.2'
>>> magic.from_file("testdata/test.pdf", mime=True)
'application/pdf'
>>> magic.from_buffer(open("testdata/test.pdf").read(1024))
'PDF document, version 1.2'
>>>

é    N)Úc_char_pÚc_intÚc_size_tÚc_void_pÚbyrefÚPOINTERc                       s   e Zd Z‡ fdd„Z‡  ZS )ÚMagicExceptionc                    s   t t| ƒ |¡ || _d S ©N)ÚsuperÚ	ExceptionÚ__init__Úmessage)Úselfr   ©Ú	__class__© ú0/usr/lib/python3/dist-packages/magic/__init__.pyr   !   s   
zMagicException.__init__)Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__r   r   r   r   r       s    r   c                   @   sV   e Zd ZdZ		ddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚMagicz;
    Magic is a wrapper around the libmagic C library.
    FNc           	   
   C   sð   t | _|r|  jtO  _|r|  jtO  _|r|  jtO  _|r'|  jtO  _|r0|  jtO  _|r9|  jtO  _t| jƒ| _	t
 ¡ | _t| j	|ƒ |rWtrStƒ dk rWtdƒ‚trvz	|  td¡ W dS  tyu } zW Y d}~dS d}~ww dS )a  
        Create a new libmagic wrapper.

        mime - if True, mimetypes are returned instead of textual descriptions
        mime_encoding - if True, codec is returned
        magic_file - use a mime database other than the system default
        keep_going - don't stop at the first match, keep going
        uncompress - Try to look inside compressed files.
        raw - Do not try to decode "non-printable" chars.
        extension - Print a slash-separated list of valid extensions for the file type found.
        i  z<MAGIC_EXTENSION is not supported in this version of libmagicé@   N)Ú
MAGIC_NONEÚflagsÚMAGIC_MIME_TYPEÚMAGIC_MIME_ENCODINGÚMAGIC_CONTINUEÚMAGIC_COMPRESSÚ	MAGIC_RAWÚMAGIC_EXTENSIONÚ
magic_openÚcookieÚ	threadingÚLockÚlockÚ
magic_loadÚ_has_versionÚversionÚNotImplementedErrorÚ
_has_paramÚsetparamÚMAGIC_PARAM_NAME_MAXr   )	r   ÚmimeÚ
magic_fileÚmime_encodingÚ
keep_goingÚ
uncompressÚrawÚ	extensionÚer   r   r   r   +   s4   
€ýýzMagic.__init__c                 C   sœ   | j �A z!t|ƒtkrttkr|jddd�}tt| j|ƒƒW W  d  ƒ S  tyC } z|  	|¡W  Y d}~W  d  ƒ S d}~ww 1 sGw   Y  dS )z0
        Identify the contents of `buf`
        úutf-8Úreplace)ÚerrorsN)
r%   ÚtypeÚstrÚbytesÚencodeÚmaybe_decodeÚmagic_bufferr"   r   Ú_handle509Bug)r   Úbufr4   r   r   r   Úfrom_buffer^   s   ù÷€øzMagic.from_bufferc                 C   s¢   t |ƒ� W d   ƒ n1 sw   Y  | j�0 ztt| j|ƒƒW W  d   ƒ S  tyF } z|  |¡W  Y d }~W  d   ƒ S d }~ww 1 sJw   Y  d S r	   )Ú
_real_openr%   r<   r.   r"   r   r>   )r   Úfilenamer4   r   r   r   Ú	from_filem   s   
ÿþü€ýzMagic.from_filec                 C   sz   | j �0 ztt| j|ƒƒW W  d   ƒ S  ty2 } z|  |¡W  Y d }~W  d   ƒ S d }~ww 1 s6w   Y  d S r	   )r%   r<   Úmagic_descriptorr"   r   r>   )r   Úfdr4   r   r   r   Úfrom_descriptorx   s   þü€ýzMagic.from_descriptorc                 C   s   |j d u r| jt@ rdS |‚)Nzapplication/octet-stream)r   r   r   )r   r4   r   r   r   r>      s   zMagic._handle509Bugc                 C   s   t | j||ƒS r	   )Úmagic_setparamr"   )r   ÚparamÚvalr   r   r   r+   ˆ   ó   zMagic.setparamc                 C   s   t | j|ƒS r	   )Úmagic_getparamr"   )r   rH   r   r   r   Úgetparam‹   s   zMagic.getparamc                 C   s4   t | dƒr| jrtrt| jƒ d | _d S d S d S d S )Nr"   )Úhasattrr"   Úmagic_close)r   r   r   r   Ú__del__Ž   s   

þzMagic.__del__)FNFFFFF)r   r   r   Ú__doc__r   r@   rC   rF   r>   r+   rL   rO   r   r   r   r   r   &   s    
ÿ3	r   c                 C   s(   t  | ¡}|d u rt| d� }t | < |S )N)r-   )Ú
_instancesÚgetr   )r-   Úir   r   r   Ú_get_magic_type¡   s   
rT   Fc                 C   ó   t |ƒ}| | ¡S )zä"
    Accepts a filename and returns the detected filetype.  Return
    value is the mimetype if mime=True, otherwise a human readable
    name.

    >>> magic.from_file("testdata/test.pdf", mime=True)
    'application/pdf'
    )rT   rC   )rB   r-   Úmr   r   r   rC   ¨   ó   	
rC   c                 C   rU   )zú
    Accepts a binary string and returns the detected filetype.  Return
    value is the mimetype if mime=True, otherwise a human readable
    name.

    >>> magic.from_buffer(open("testdata/test.pdf").read(1024))
    'PDF document, version 1.2'
    )rT   r@   )Úbufferr-   rV   r   r   r   r@   µ   rW   r@   c                 C   rU   )a  
    Accepts a file descriptor and returns the detected filetype.  Return
    value is the mimetype if mime=True, otherwise a human readable
    name.

    >>> f = open("testdata/test.pdf")
    >>> magic.from_descriptor(f.fileno())
    'PDF document, version 1.2'
    )rT   rF   )rE   r-   rV   r   r   r   rF   Â   s   

rF   é   )Úloaderc                 C   s    | d u rt |d ƒ}t|ƒ‚| S )Nr   ©Úmagic_errorr   ©ÚresultÚfuncÚargsÚerrr   r   r   Úerrorcheck_nullÕ   ó   rb   c                 C   s    | dkrt |d ƒ}t|ƒ‚| S )Néÿÿÿÿr   r[   r]   r   r   r   Úerrorcheck_negative_oneÝ   rc   re   c                 C   s   t tkr| S |  dd¡S )Nr5   Úbackslashreplace)r9   r:   Údecode)Úsr   r   r   r<   ç   s   r<   c                 C   sP   | d u rd S t jd dkrt| tƒpt jd dkot| tƒ}|r&|  dd¡S | S )Nr   é   é   r5   Úsurrogateescape)ÚsysÚversion_infoÚ
isinstanceÚunicoder9   r;   )rB   Ú
is_unicoder   r   r   Úcoerce_filenameð   s   ÿýrq   c                 C   ó   t | t|ƒƒS r	   )Ú_magic_filerq   ©r"   rB   r   r   r   r.     rJ   r.   c                 C   s   t | |t|ƒƒS r	   )Ú_magic_bufferÚlen)r"   r?   r   r   r   r=   !  s   r=   c                 C   s
   t | |ƒS r	   )Ú_magic_descriptor)r"   rE   r   r   r   rD   0  s   
rD   c                 C   rr   r	   )Ú_magic_loadrq   rt   r   r   r   r&   :  rJ   r&   rG   rK   Tc                 C   s$   t stdƒ‚t|ƒ}t| |t|ƒƒS )Nzmagic_setparam not implemented)r*   r)   r   Ú_magic_setparamr   )r"   rH   rI   Úvr   r   r   rG   X  s   c                 C   s(   t stdƒ‚tƒ }t| |t|ƒƒ |jS )Nzmagic_getparam not implemented)r*   r)   r   Ú_magic_getparamr   Úvalue)r"   rH   rI   r   r   r   rK   _  s
   Úmagic_versionc                   C   s   t stdƒ‚tƒ S )Nzmagic_version not implemented)r'   r)   r}   r   r   r   r   r(   o  s   r(   ri   é   é   é   i   i   é    r   é€   é   i   i   i    i @  i €  i   i   i   i   i   rj   é   é   c           
         s¶   dd l ‰ dd l}ddlm} ‡ fdd„}g d¢}|D ]}||j| ƒ| |< q| d¡}tdgƒ}|j ¡ D ]#\}}	| |¡rX|| v rT||v rGq5| | |	krSt	d| ƒ‚q5|	| |< q5d S )	Nr   )Úcompatc                    s   ‡ ‡fdd„}|S )Nc                     s   ˆ  dt¡ ˆ | i |¤ŽS )Nz…Using compatibility mode with libmagic's python binding. See https://github.com/ahupp/python-magic/blob/master/COMPAT.md for details.)ÚwarnÚPendingDeprecationWarning)r`   Úkwargs)ÚfnÚwarningsr   r   Ú_£  s
   ýz3_add_compat.<locals>.deprecation_wrapper.<locals>._r   )rŠ   rŒ   ©r‹   )rŠ   r   Údeprecation_wrapper¢  s   z(_add_compat.<locals>.deprecation_wrapper)Údetect_from_filenameÚdetect_from_contentÚdetect_from_fobjÚopenz	^[A-Z_]+$Ú
MAGIC_MIMEzinconsistent value for )
r‹   ÚreÚmagicr†   Ú__dict__ÚcompileÚsetÚitemsÚmatchr   )
Ú	to_moduler”   r†   rŽ   rŠ   ÚfnameÚis_const_reÚallowed_inconsistentÚnamer|   r   r�   r   Ú_add_compatž  s&   


€ör    )F)[rP   rl   ÚglobÚctypesÚctypes.utilr#   Úloggingr   r   r   r   r   r   r’   rA   r   r   r   rQ   rT   rC   r@   rF   Ú rZ   Úload_libÚlibmagicÚmagic_trb   re   r<   rq   r!   ÚrestypeÚargtypesrN   r\   Úmagic_errnor.   rs   Úerrcheckr=   ru   rD   rw   r&   rx   Úmagic_setflagsÚmagic_checkÚmagic_compiler*   rM   rG   ry   rK   r{   r'   r}   r(   r   ÚMAGIC_DEBUGÚMAGIC_SYMLINKr   ÚMAGIC_DEVICESr   r   r“   r    r   ÚMAGIC_CHECKÚMAGIC_PRESERVE_ATIMEr   ÚMAGIC_ERRORÚMAGIC_NO_CHECK_COMPRESSÚMAGIC_NO_CHECK_TARÚMAGIC_NO_CHECK_SOFTÚMAGIC_NO_CHECK_APPTYPEÚMAGIC_NO_CHECK_ELFÚMAGIC_NO_CHECK_ASCIIÚMAGIC_NO_CHECK_TROFFÚMAGIC_NO_CHECK_FORTRANÚMAGIC_NO_CHECK_TOKENSÚMAGIC_PARAM_INDIR_MAXr,   ÚMAGIC_PARAM_ELF_PHNUM_MAXÚMAGIC_PARAM_ELF_SHNUM_MAXÚMAGIC_PARAM_ELF_NOTES_MAXÚMAGIC_PARAM_REGEX_MAXÚMAGIC_PARAM_BYTES_MAXr    Úglobalsr   r   r   r   Ú<module>   sð     x



	






&