U
    [e8                     @   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dEddZdFd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(rd%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 )Gai  
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__ P/var/www/html/services/stratfitenv/lib/python3.8/site-packages/magic/__init__.pyr   !   s    zMagicException.__init__)__name__
__module____qualname__r   __classcell__r   r   r   r   r       s   r   c                   @   sR   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  _|rN|  jtO  _|r`|  jtO  _|rr|  jtO  _t| j| _	t
 | _t| j	| |rtrt dk rtdtrz| td W n" tk
r } zW 5 d}~X Y nX 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_fileZmime_encodingZ
keep_going
uncompressraw	extensioner   r   r   r   +   s.    
zMagic.__init__c                 C   s   | j  z@t|tkr,ttkr,|jddd}tt| j|W W  5 Q R  S  tk
r } z| 	| W Y W  5 Q R  S d}~X Y nX W 5 Q R X dS )z0
        Identify the contents of `buf`
        utf-8replace)errorsN)
r%   typestrbytesencodemaybe_decodemagic_bufferr"   r   _handle509Bug)r   bufr2   r   r   r   from_buffer^   s    zMagic.from_bufferc                 C   s   t | W 5 Q R X | jb ztt| j|W W  5 Q R  S  tk
rv } z| | W Y W  5 Q R  S d }~X Y nX W 5 Q R X d S r	   )
_real_openr%   r:   r.   r"   r   r<   )r   filenamer2   r   r   r   	from_filem   s    

zMagic.from_filec                 C   sr   | j b ztt| j|W W  5 Q R  S  tk
rb } z| | W Y W  5 Q R  S d }~X Y nX W 5 Q R X d S r	   )r%   r:   magic_descriptorr"   r   r<   )r   fdr2   r   r   r   from_descriptorx   s
    zMagic.from_descriptorc                 C   s    |j d kr| jt@ rdS |d S )Nzapplication/octet-stream)r   r   r   )r   r2   r   r   r   r<      s    zMagic._handle509Bugc                 C   s   t | j||S r	   )magic_setparamr"   )r   paramvalr   r   r   r+      s    zMagic.setparamc                 C   s   t | j|S r	   )magic_getparamr"   )r   rF   r   r   r   getparam   s    zMagic.getparamc                 C   s(   t | dr$| jr$tr$t| j d | _d S )Nr"   )hasattrr"   magic_close)r   r   r   r   __del__   s    
zMagic.__del__)FNFFFFF)r   r   r   __doc__r   r>   rA   rD   r<   r+   rI   rL   r   r   r   r   r   &   s           
3	r   c                 C   s(   t | }|d kr$t| d }t | < |S )N)r-   )
_instancesgetr   )r-   ir   r   r   _get_magic_type   s    
rQ   Fc                 C   s   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'
    )rQ   rA   )r@   r-   mr   r   r   rA      s    	rA   c                 C   s   t |}|| S )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'
    )rQ   r>   )bufferr-   rR   r   r   r   r>      s    	r>   c                 C   s   t |}|| S )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'
    )rQ   rD   )rC   r-   rR   r   r   r   rD      s    
rD      )loaderc                 C   s&   | d krt |d }t|n| S d S )Nr   magic_errorr   resultfuncargserrr   r   r   errorcheck_null   s    
r]   c                 C   s&   | dkrt |d }t|n| S d S )Nr   rV   rX   r   r   r   errorcheck_negative_one   s    
r_   c                 C   s   t tkr| S | ddS d S )Nr3   backslashreplace)r7   r8   decode)sr   r   r   r:      s    r:   c                 C   sT   | d krd S t jd dkr$t| tp:t jd dko:t| t}|rL| ddS | S d S )Nr         r3   surrogateescape)sysversion_info
isinstanceunicoder7   r9   )r@   Z
is_unicoder   r   r   coerce_filename   s    rj   c                 C   s   t | t|S r	   )_magic_filerj   r"   r@   r   r   r   r.     s    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"   rC   r   r   r   rB   0  s    rB   c                 C   s   t | t|S r	   )_magic_loadrj   rl   r   r   r   r&   :  s    r&   rE   rH   Tc                 C   s$   t stdt|}t| |t|S )Nzmagic_setparam not implemented)r*   r)   r   _magic_setparamr   )r"   rF   rG   vr   r   r   rE   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"   rF   rG   r   r   r   rH   _  s
    magic_versionc                   C   s   t stdt S )Nzmagic_version not implemented)r'   r)   ru   r   r   r   r   r(   o  s    r(   rc            i   i       r         i   i   i    i @  i   i   i   i   i   i   rd         c           
         s   dd l  dd l}ddlm}  fdd}ddddg}|D ]}||j| | |< q8|d	}td
g}|j D ]J\}}	||rn|| kr||krqn| | |	krnt	d| qqnqn|	| |< qnd S )Nr   )compatc                    s    fdd}|S )Nc                     s    dt  | |S )NzUsing 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_wrapperZdetect_from_filenameZdetect_from_contentZdetect_from_fobjopenz	^[A-Z_]+$
MAGIC_MIMEzinconsistent value for )
r   remagicr~   __dict__compilesetitemsmatchr   )
Z	to_moduler   r~   r   r   fnameZis_const_reZallowed_inconsistentnamert   r   r   r   _add_compat  s*    


r   )F)F)F)[rM   rf   globctypesctypes.utilr#   loggingr   r   r   r   r   r   r   r?   r   r   r   rN   rQ   rA   r>   rD    rU   Zload_libZlibmagicZmagic_tr]   r_   r:   rj   r!   restypeZargtypesrK   rW   Zmagic_errnor.   rk   Zerrcheckr;   rm   rB   ro   r&   rp   Zmagic_setflagsmagic_checkZmagic_compiler*   rJ   rE   rq   rH   rs   r'   ru   r(   r   ZMAGIC_DEBUGZMAGIC_SYMLINKr   ZMAGIC_DEVICESr   r   r   r    r   ZMAGIC_CHECKZMAGIC_PRESERVE_ATIMEr   ZMAGIC_ERRORZMAGIC_NO_CHECK_COMPRESSZMAGIC_NO_CHECK_TARZMAGIC_NO_CHECK_SOFTZMAGIC_NO_CHECK_APPTYPEZMAGIC_NO_CHECK_ELFZMAGIC_NO_CHECK_ASCIIZMAGIC_NO_CHECK_TROFFZMAGIC_NO_CHECK_FORTRANZMAGIC_NO_CHECK_TOKENSZMAGIC_PARAM_INDIR_MAXr,   ZMAGIC_PARAM_ELF_PHNUM_MAXZMAGIC_PARAM_ELF_SHNUM_MAXZMAGIC_PARAM_ELF_NOTES_MAXZMAGIC_PARAM_REGEX_MAXZMAGIC_PARAM_BYTES_MAXr   globalsr   r   r   r   <module>   s    x



	






&