
    !bt:                        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e      Z G d d      Zi Zd Zd9d
Zd9dZd9dZddlmZ  ej2                         Zej                  Zd Zd Zd Z	 ddlm Z  d Z!d Z#ejH                  Z$ee$_%        ege$_&        ejN                  Z'de'_%        ege'_&        ejP                  Z(ee(_%        ege(_&        ejR                  Z)ee)_%        ege)_&        ejT                  Z+ee+_%        eege+_&        ee+_,        d Z*ejZ                  Z.ee._%        ee
e	ge._&        ee._,        d Z-ej^                  Z/ee/_%        eege/_&        ee/_,        ej^                  Z0ee0_%        eege0_&        ee0_,        d Z/ejb                  Z2ee2_%        eege2_&        ee2_,        d Z1ejf                  Z3ee3_%        eege3_&        ejh                  Z4ee4_%        eege4_&        ejj                  Z5ee5_%        eege5_&        d	Z6 e7ed      r_ e7ed      rVdZ6ejp                  Z9ee9_%        ee ee	      ge9_&        ee9_,        ejt                  Z;ee;_%        ee ee	      ge;_&        ee;_,        d Z8d Z:d	Z< e7ed      rdZ<ejz                  Z=ee=_%        g e=_&        d  Z>dZ?dZ@d!ZAd"ZBd#ZCd$ZDd%ZEd$ZFd&ZGd'ZHd(ZId)ZJd*ZKd+ZLd,ZMd-ZNd.ZOd/ZPd0ZQd1ZRd2ZSd3ZTd4ZUdZVdZWd!ZXd5ZYd"ZZd6Z[d7Z\d8 Z] e] e^              y# e"$ r d Z!Y qw xY w):ai  
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                        e Zd Z fdZ xZS )MagicExceptionc                 :    t         t        |   |       || _        y N)super	Exception__init__message)selfr   	__class__s     0/usr/lib/python3/dist-packages/magic/__init__.pyr   zMagicException.__init__!   s    i'0    )__name__
__module____qualname__r   __classcell__)r   s   @r   r
   r
       s     r   r
   c                   F    e Zd ZdZ	 	 ddZd Zd Zd Zd Zd Z	d	 Z
d
 Zy)Magicz;
    Magic is a wrapper around the libmagic C library.
    Nc                    t         | _        |r| xj                  t        z  c_        |r| xj                  t        z  c_        |r| xj                  t        z  c_        |r| xj                  t
        z  c_        |r| xj                  t        z  c_        |r| xj                  t        z  c_        t        | j                        | _	        t        j                         | _        t        | j                  |       |rt        rt               dk  rt!        d      t"        r	 | j%                  t&        d       yy# t(        $ r
}Y d}~yd}~ww xY w)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es	            r   r   zMagic.__init__+   s      
JJ/)JJJ--JJJ.(JJJ.(JJJ)#JJJ/)J ,NN$	4;;
+ lgi#o%&dee 2B7  "  s   D6 6	E	E	c                 J   | j                   5  	 t        |      t        k(  r t        t        k7  r|j	                  dd      }t        t        | j                  |            cddd       S # t        $ r$}| j                  |      cY d}~cddd       S d}~ww xY w# 1 sw Y   yxY w)z0
        Identify the contents of `buf`
        utf-8replace)errorsN)
r)   typestrbytesencodemaybe_decodemagic_bufferr&   r
   _handle509Bug)r   bufr8   s      r   from_bufferzMagic.from_buffer^   s     YY 
	-	-
 9#u**WY*?C#Lc$BC
	- 
	- " -))!,,
	- 
	--
	- 
	-s5   BAA))	B2BBBBBB"c                 (   t        |      5  	 d d d        | j                  5  	 t        t        | j                  |            cd d d        S # 1 sw Y   ?xY w# t
        $ r$}| j                  |      cY d }~cd d d        S d }~ww xY w# 1 sw Y   y xY wr   )
_real_openr)   rA   r2   r&   r
   rC   )r   filenamer8   s      r   	from_filezMagic.from_filen   s    ! 		 YY 	--#Jt{{H$EF	- 	-	 	 " -))!,,		- 	--	- 	-s?   ABAA	B!B 1B2B BBBc                     | j                   5  	 t        t        | j                  |            cd d d        S # t        $ r$}| j                  |      cY d }~cd d d        S d }~ww xY w# 1 sw Y   y xY wr   )r)   rA   magic_descriptorr&   r
   rC   )r   fdr8   s      r   from_descriptorzMagic.from_descriptory   si    YY 	--#$4T[["$EF	- 	- " -))!,,		- 	--	- 	-s2   A'7	A$ AA$A'A$$A''A0c                 F    |j                   | j                  t        z  ry|)Nzapplication/octet-stream)r   r   r   )r   r8   s     r   rC   zMagic._handle509Bug   s!     99$**">-Gr   c                 0    t        | j                  ||      S r   )magic_setparamr&   )r   paramvals      r   r/   zMagic.setparam   s    dkk5#66r   c                 .    t        | j                  |      S r   )magic_getparamr&   )r   rQ   s     r   getparamzMagic.getparam   s    dkk511r   c                 ~    t        | d      r1| j                  r$t        rt        | j                         d | _        y y y y )Nr&   )hasattrr&   magic_close)r   s    r   __del__zMagic.__del__   s4     4"t{{{$DK 8C{"r   )FNFFFFF)r   r   r   __doc__r   rE   rI   rM   rC   r/   rU   rY    r   r   r   r   &   s:     CHJO1f- 	--72r   r   c                 ^    t         j                  |       }|t        |       x}t         | <   |S )N)r1   )
_instancesgetr   )r1   is     r   _get_magic_typer`      s.    tAy$$//JtHr   Fc                 :    t        |      }|j                  |       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'
    )r`   rI   )rH   r1   ms      r   rI   rI      s     	A;;x  r   c                 :    t        |      }|j                  |       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'
    )r`   rE   )bufferr1   rb   s      r   rE   rE      s     	A==  r   c                 :    t        |      }|j                  |       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'
    )r`   rM   )rL   r1   rb   s      r   rM   rM      s     	AR  r      )loaderc                 <    | t        |d         }t        |      | S )Nr   magic_errorr
   resultfuncargserrs       r   errorcheck_nullrp      s%    ~$q'"S!!r   c                 B    | dk(  rt        |d         }t        |      | S )Nr   ri   rk   s       r   errorcheck_negative_oners      s'    |$q'"S!!r   c                 D    t         t        k(  r| S | j                  dd      S )Nr:   backslashreplace)r>   r?   decode)ss    r   rA   rA      s"    
e| xx!344r   )PathLikec                 F    t        | t              r| j                         S | S r   )
isinstancerx   
__fspath__rH   s    r   unpathr}      s     h)&&((Or   c                     | S r   r[   r|   s    r   r}   r}      s    r   c                     | y t        |       } t        j                  d   dk  xr t        | t              xs( t        j                  d   dk\  xr t        | t
              }|r| j                  dd      S | S )Nr         r:   surrogateescape)r}   sysversion_inforz   unicoder>   r@   )rH   
is_unicodes     r   coerce_filenamer      s    hH ""1%* /Hg.-""1%* ,Xs+  w(9::r   c                 ,    t        | t        |            S r   )_magic_filer   r&   rH   s     r   r2   r2   (      vx899r   c                 .    t        | |t        |            S r   )_magic_bufferlen)r&   rD   s     r   rB   rB   2  s    c#h//r   c                     t        | |      S r   )_magic_descriptor)r&   rL   s     r   rK   rK   A  s    VR((r   c                 ,    t        | t        |            S r   )_magic_loadr   r   s     r   r*   r*   K  r   r   rP   rT   Tc                 f    t         st        d      t        |      }t        | |t	        |            S )Nzmagic_setparam not implemented)r.   r-   r   _magic_setparamr   )r&   rQ   rR   vs       r   rP   rP   i  s-    !"BCCA65%(33r   c                 |    t         st        d      t               }t        | |t	        |             |j
                  S )Nzmagic_getparam not implemented)r.   r-   r   _magic_getparamr   value)r&   rQ   rR   s      r   rT   rT   p  s2    !"BCC
*CFE5:.99r   magic_versionc                  8    t         st        d      t               S )Nzmagic_version not implemented)r+   r-   r   r[   r   r   r,   r,     s    !"ABB?r   r            i   i       r         i   i   i    i @  i   i   i   i   i   i   r         c                 ^  
 dd l 
dd l}ddlm} 
fd}g d}|D ]  } ||j                  |         | |<    |j                  d      }t        dg      }|j                  j                         D ]<  \  }}	|j                  |      s|| v r||v r!| |   |	k7  rt        d|z         8|	| |<   > y )Nr   )compatc                       fd}|S )Nc                  @    j                  dt                | i |S )NzUsing compatibility mode with libmagic's python binding. See https://github.com/ahupp/python-magic/blob/master/COMPAT.md for details.)warnPendingDeprecationWarning)rn   kwargsfnwarningss     r   _z3_add_compat.<locals>.deprecation_wrapper.<locals>._  s*    MM_)+
 t&v&&r   r[   )r   r   r   s   ` r   deprecation_wrapperz(_add_compat.<locals>.deprecation_wrapper  s    	' r   )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   s             @r   _add_compatr     s    	
B  G.vu/EF	%G **[)K~.,,. 
(eT"y //T?e+#$=$DEE"'	$
(r   )F)_rZ   r   globctypesctypes.utilr'   loggingr   r   r   r   r   r   r   rG   r   r
   r   r]   r`   rI   rE   rM    rg   load_liblibmagicmagic_trp   rs   rA   osrx   r}   ImportErrorr   r%   restypeargtypesrX   rj   magic_errnor2   r   errcheckrB   r   rK   r   r*   r   magic_setflagsmagic_checkmagic_compiler.   rW   rP   r   rT   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_MAXr0   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   <module>r      s  $       F F 
Y v vr 

!
!! 6??
//5	*   

 g
 "" y "" y "" y !! * & : %%  !8X6 ( 0 ,, #  $e,  +  -- $  %u-  ,  ) !! * . : (( "E* "" * && !8, 

8%&78=M+NJ--O#O '0ABO6O--O#O '0ABO6O4 
8_%L**M!MM 
  
 	"   !    !          #(L GI y  s    	K/ /K;:K;