
    vf1                        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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 d dl
mZ d dlmZ d dlmZmZ 	 d dlZdZ	 d dlZ ej:                  e      Zdee    d	ee    d
ee    fdZ! G d de"      Z# G d de
jH                  jJ                        Z& G d de&      Z' G d de&      Z(y# e$ r dZY tw xY w# e$ r Y zw xY w)    N)AnyIOListOptional)error)	framework)	constants
exceptionsTFnew_fporiginal_fpreturnc                 $      fd}| _          S )a  Really horrible solution for ensuring files aren't left open

    Args:
        new_fp: The file pointer constructed based on the original file pointer
        original_fp: The original file pointer that should be closed when the new file pointer is closed, but isn't
    c                  Z    j                           j                  j                         S N)close	__class__)r   r   s   X/home/panchajanya/Development/work/volatility3/volatility3/framework/layers/resources.pyr   zcascadeCloseFile.<locals>.close4   s&    %%f--    )r   )r   r   r   s   `` r   cascadeCloseFiler   ,   s    . FLMr   c            	           e Zd ZdZdZ	 	 	 ddeej                     deej                     de
ddfdZd	ede
fd
Zedee   fd       Zdd	ededefdZy)ResourceAccessorzMObject for opening URLs as files (downloading locally first if
    necessary)TNprogress_callbackcontextenable_cacher   c           
         || _         || _        t        t        j                  t
        j                  j                              | _        || _	        | j                  rjt        j                  t        j                  ddj                  | j                  D cg c]  }|j                    c}              d| j"                  _
        yyc c}w )zhCreates a resource accessor.

        Note: context is an SSL context, not a volatility context
        zAvailable URL handlers: z, FN)_progress_callback_contextlistr   class_subclassesurllibrequestBaseHandler	_handlers_enable_cachelist_handlersvolloglogr	   LOGLEVEL_VVVjoin__name__r   )selfr   r   r   xs        r   __init__zResourceAccessor.__init__B   s     #4i889S9STU)JJ&&*499$..5YQajj5Y+Z*[\ ,1DNN(  6Zs   Curlc                     t         j                  j                  |      }| j                  xr |j                  | j                         vS )z3Determines whether a URLs contents should be cached)r    parseurlparser$   scheme_non_cached_schemes)r+   r.   
parsed_urls      r   
uses_cachezResourceAccessor.uses_cacheW   s?    \\**3/
 V:#4#4D<T<T<V#V	
r   c                  n    dg} t        j                  t              D ]  }| |j                         z  }  | S )z,Returns the list of schemes not to be cachedfile)r   r   VolatilityHandlernon_cached_schemes)resultclazzs     r   r3   z$ResourceAccessor._non_cached_schemes_   s>     //0AB 	1Ee..00F	1r   modec                 R   t         j                  j                  t        j                  j                  | j                          t
        j                  dk(  rt         j                  j                  |d      }|j                  dk(  r|j                  s|j                  j                  d      rt         j                  j                  |j                  dd|j                  z   |j                  z   |j                  |j                  |j                   f      }t"        j%                  t&        j(                  d| d|        |}	 t         j                  j+                  || j,                        }tO        jP                  |      5 }| jS                  |      s-t         j                  j+                  || j,                        }nvd}	tT        j                  jW                  t&        jX                  dt[        j\                  t_        |d            ja                         z   dz         }
tT        j                  jc                  |
      st"        je                  d|
        	 |jG                         jg                  dd      }tk        |
d      5 }d	}|jm                  |	      }|rm|to        |      z  }| jp                  r.| jq                  |dz  ts        |tu        |            z  d|        |jw                  |       |jm                  |	      }|rmddd       nt"        je                  d|
        tk        |
d      }ddd       d}tx        rd}|sd}tO        jz                  th        t|              5  t        j                        }d}ddd       |r|j                  d k(  r!t        t        j                  |      |      }n`|j                  d!k(  r!t        t        j                  |      |      }n0|j                  d"k(  r!t        t        j                  |#      |      }|j                  d$v r#jm                  d%       |j                  d	       nd}nd}|s|st         j                  j                  |      }|j                  }d}|s|j                  d&      }|dd |d   }}d&jW                  |      }|d'k(  r!t        t        j                  |      |      }nO|d(k(  r!t        t        j                  |      |      }n)|d)k(  r"t        t        j                  |#      |      }nd}|stE        d*      |S # t.        j0                  $ r}|j2                  rt5        |j2                  d	   t6        j8                        rgt"        j;                  d
       t7        j<                         }d|_        t6        j@                  |_!        t         j                  j+                  ||      }n||Y d}~d}~wtD        $ rA}t"        jG                  d| d| d       dt&        _$        tK        jL                  |      d}~wtJ        jL                  $ r t"        jG                  d| d        w xY w# th        $ r d}Y w xY w# 1 sw Y   bxY w# 1 sw Y   ZxY w# 1 sw Y   xY w)+zReturns a file-like object for a particular URL opened in mode.

        If the file is remote, it will be downloaded and locally cached
        win32r7   )r2   z///z"UNC path detected, converted path z to )r   r   zDSSL certificate verification failed: attempting UNVERIFIED retrievalFNzCannot access z due to z - Setting OFFLINETzNot accessing z in offline modei    data_raw_unicode_escapez.cachezCaching file at: zContent-Lengthwbd   zReading file zUsing already cached file at: rb)r<   application/x-xzapplication/x-bzip2application/x-gzip)fileobjr<   )rF   rG   rH      .xzbz2gzz'URL does not reference an openable file)Kr    r!   install_openerbuild_openerr#   sysplatformr0   r1   r2   netlocpath
startswith
urlunparseparamsqueryfragmentr&   r'   r	   LOGLEVEL_VVVVurlopenr   r   URLErrorargs
isinstancesslSSLCertVerificationErrorwarning
SSLContextcheck_hostname	CERT_NONEverify_mode
ValueErrorinfoOFFLINEr
   OfflineException
contextlibclosingr5   osr)   
CACHE_PATHhashlibsha512bytes	hexdigestexistsdebuggetAttributeErroropenreadlenr   maxintwrite	HAS_MAGICsuppressIOErrormagicdetect_from_fobj	mime_typer   lzmaLZMAFilerM   BZ2FilegzipGzipFileseeksplit)r+   r.   r<   r4   new_urlfpexcpnon_verifying_ctxcurfile
block_sizetemp_filenamecontent_length
cache_filecountblockIMPORTED_MAGICstopdetectedurl_pathurl_path_spliturl_path_list	extensions                         r   rv   zResourceAccessor.openh   s   
 	%%fnn&A&A4>>&RS <<7"..s6.BJ   F*!!Z__%?%?%E !,,11"))j///*//A"))"(("++	 

++8T'K 	''T]]'CB2 # )	9r ??3' ..00dmm0L &
 "((nnU30D%EFPPRS! ww~~m4LL#4]O!DE,)+7G)L mT2 8j ! "
 3#!SZ/E#66 $ 7 7$)CK#eS=P2Q$Q&3C5$9!" ',,U3$&GGJ$7E $8 8 LL#A-!QR }48S)	9X D((A *$55g>H%)N* ))-??"2 MM'48'# "++/DD"23;;w3Mw"W!++/CC"2 MM'Ew#  )) .   QQ#D? B ..s3J!HD!)!4+9#2+>r@Ry88M2$.t}}Wd/KWUG%'.s{{7D/I7SG$&.gDA7G  D   ?FGG ~~ 	yydiilC,H,HINN^ ),(8%7<%447MM%1//=N/OBJ
	 
  	3 KK.XdV;MNO $I--c22** 	KK.-=>?	2 * ,)+,8 81)	9 )	9b* *s{   +T= CZ Y0:ZBZ	.Z-Z=Y-BW44Y- <X<<1Y-0Y?;Z>Y??ZZ	ZZZ&)NNT)rE   )r*   
__module____qualname____doc__r%   r   r	   ProgressCallbackr_   rb   boolr-   strr5   staticmethodr   r3   r   rv    r   r   r   r   <   s     M CG,0!	1#I$>$>?1 #..)1 	1
 
1*
c 
d 
 c  c c3 c# cr   r   c                   (    e Zd Zedee   fd       Zy)r8   r   c                     g S r   r   clss    r   r9   z$VolatilityHandler.non_cached_schemes  s    	r   N)r*   r   r   classmethodr   r   r9   r   r   r   r8   r8     s    49  r   r8   c                   t    e Zd ZdZedee   fd       Zede	j                  j                  dee   fd       Zy)
JarHandleraO  Handles the jar scheme for URIs.

    Reference used for the schema syntax:
    http://docs.netkernel.org/book/view/book:mod:reference/doc:layer1:schemes:jar

    Actual reference (found from https://www.w3.org/wiki/UriSchemes/jar) seemed not to return:
    http://developer.java.sun.com/developer/onlineTraining/protocolhandlers/
    r   c                     dgS )Njarr   r   s    r   r9   zJarHandler.non_cached_schemes  s	    wr   reqc                    | j                   dk(  r| j                  j                  d      d   dj                  | j                  j                  d      dd       }}|dk7  r(t        j                  t        j                  d|        y|j                  d      }t        |      dk7  r(t        j                  t        j                  d	|        y|\  }}t        j                  |      j                  |      S y)
z+Handles the request if it's the jar scheme.r   :rJ      Nr7   zUnsupported jar subscheme !z5Path did not contain exactly one fragment indicator: )typefull_urlr   r)   r&   r'   r	   r(   rx   zipfileZipFilerv   )r   	subscheme	remainderzipsplitzippathfilepaths         r   default_openzJarHandler.default_open"  s     88u#&<<#5#5c#:1#=sxx""3'+@yI F"

**.H,T  s+H8}!

**KI;W  (GX??7+00::r   N)r*   r   r   r   r   r   r   r9   r   r    r!   Requestr   r   r   r   r   r   r   r     sV     49   &..00 Xc]  r   r   c                   T    e Zd Zedej
                  j                  dee   fd       Z	y)OfflineHandlerr   r   c                 ~    t         j                  r-| j                  dv rt        j                  | j
                        y )N)httphttps)r	   rh   r   r
   ri   r   )r   s    r   r   zOfflineHandler.default_open=  s/    ->!>--cll;;r   N)
r*   r   r   r   r    r!   r   r   r   r   r   r   r   r   r   <  s0    &..00 Xc]  r   r   ))rM   rj   r   rn   loggingr   rl   r_   rQ   urllib.parser    urllib.requestr   typingr   r   r   r   r   volatility3r   volatility3.frameworkr	   r
   r   r|   ImportErrorsmb.SMBHandlersmb	getLoggerr*   r&   rp   r   objectr   r!   r"   r8   r   r   r   r   r   <module>r      s   
       	 
 
    * *  ! 7I	
 
		8	$RY RY 2e9  Ov Od22 %" %P& C	  I  		s$   C C CCCC