
    xh,                     2    S SK r S SKrS SKrS rS rSS jrg)    Nc                     [         R                  R                  U 5      (       a  gU R                  [         R                  R                  5       H#  nU[         R                  R
                  :X  d  M#    g   g)NTF)ospathisabssplitseppardir)r   segments     /code/sentry/utils/zip.pyis_unsafe_pathr      sK    	ww}}T::bggkk*bggnn$ +     c                     / nU  HG  nUR                  S5      nU(       a  US   R                  S5      (       a  M6  UR                  U5        MI     [        R                  R                  U5      nU(       a  US   S-   $ g)N/r   . )r   
startswithappendr   r   commonprefix)membersqualifying_membersmemberpiecesrvs        r   find_common_prefixr      ss    c"fQi**3//!!&)	  
		0	1B	!us{r   c                    Sn[        U [        R                  5      (       d(  [        U [        5      n[        R                  " U S5      nOU n UR	                  5       nU(       a  [        U5      nOSnU H  nUR                  S5      (       a  M  UR                  U5      (       a  [        U5      (       a  MC  [        R                  R                  X[        U5      S 5      n [        R                  " [        R                  R                  U5      5        [!        US5       n	UR!                  U5       n
["        R$                  " X5        SSS5        SSS5        M     U(       a  UR'                  5         gg! [         a     Nnf = f! , (       d  f       NC= f! , (       d  f       GM5  = f! U(       a  UR'                  5         f f = f)a
  Safely extract a given zip file to a path.  The zipfile can either
be an open file or a filename.  If the zip is unsafe an exception is
raised.  Optionally the toplevel folder is stripped off.  If there are
hidden files on toplevel then, these are silently ignored.
Frr   r   Nwb)
isinstancezipfileZipFilestrnamelistr   endswithr   r   r   r   joinlenmakedirsdirnameOSErroropenshutilcopyfileobjclose)fr   strip_toplevelr,   zfr   prefixr   dst_pathdfsfs              r   safe_extract_zipr4      sT    Ea))1c"__Q$++-'0FFFs##$$V,,v0F0Fww||DV*?@HBGGOOH56 h%WWV_&&r. % &%   HHJ    %_ &% HHJ sa   BF, #3E8F, "F4FFF, 8
FF, FF, 
FF
F)	#	F, ,G)T)r   r*   r   r   r   r4    r   r   <module>r6      s    	  #r   