
    6jw1                         d Z ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ defd	Zd
edefdZd ZdZded
edefdZd Zd ZdS )zD
Hermes Web UI -- File upload: multipart parser and upload handler.
    N)Path)MAX_UPLOAD_BYTES)jbad)get_session)safe_resolve_wsreturnc                 B   dd l }dd lm}  |j        d|          }|st	          d          |                    d                              d                                          }|                     |          }i }i }	d|z   }
d|z   dz   }|	                    |
          }|dd          D ]o}|
                    d          }|                    d          r nAd|v rdnd	}||vr=|	                    |d          \  }}|                    d          r|d d
         }n|                    d          r
|d d         }|
                    d                              dd          }|                                                    |          }|                    dd          } |j        d|          } |j        d|          }|s"|                    d          }|r|                    d          |f|	|<   U|                    dd          ||<   q||	fS )Nr   zboundary=([^;\s]+)zNo boundary in Content-Type   "s   --s   
s   

s   

   
zutf-8replace)errorszContent-Disposition zname="([^"]*)"zfilename="([^"]*)")reemail.parserparsersearch
ValueErrorgroupstripencodereadsplitlstrip
startswithendswithdecodeHeaderParserparsestrget)rfilecontent_typecontent_length_re_epmboundaryrawfieldsfiles	delimiter
end_markerpartspartstrippedsep
header_rawbodyheader_textmsgdispname_mfile_mnames                            /root/hermes-webui/api/upload.pyparse_multipartr=      s\   ))))))))))
(,77A 86777wwqzz$$++--H
**^
$
$CFE I!E)JIIi  Eabb	 B B;;w''u%% 	E(D00kkgd??::c1--
D==!! 	9DD]]5!! 	9D ''0077	7RR  ))+66ww,b11-t441488 	||A 	B!<<??D1E$KK;;wy;AAF4LL5=    filenamec                     t          j        ddt          |           j                  d d         }|r|                    d          dk    rt          d          |S )Nz[^\w.\-]_   .r   zInvalid filename)r'   subr   r;   r   r   )r?   	safe_names     r<   _sanitize_upload_namerF   7   sZ    S$x..*=>>ttDI -	,,22+,,,r>   c           
         dd l }	 | j                            dd          }t          | j                            dd          pd          }|t          k    r#t          | ddt          dz  dz   did	
          S t          | j        ||          \  }}|                    dd          }d|vrt          | ddid
          S |d         \  }}|st          | ddid
          S 	 t          |          }	n$# t          $ r t          | ddid
          cY S w xY wt          |	j                  }
t          |          }t          |
|          }|                    |           t          j        |          d         pd}t          | |t#          |          |                                j        ||                    d          d          S # t*          $ r+}t          | dt#          |          id
          cY d }~S d }~wt,          $ r= t/          d|                                z   d           t          | ddid
          cY S w xY w)Nr   Content-Typer   Content-LengtherrorFile too large (max    MB)  status
session_idfileNo file field in request  No filename in uploadSession not found  zapplication/octet-streamzimage/)r?   pathsizemimeis_imagez[webui] upload error: TflushzUpload failed  )	tracebackheadersr#   intr   r   r=   r$   r   KeyErrorr   	workspacerF   r   write_bytes	mimetypes
guess_typestrstatst_sizer   r   	Exceptionprint
format_exc)handler_tbr%   r&   r,   r-   rQ   r?   
file_bytessrc   rE   destrZ   es                  r<   handle_uploadrs   >   s    B**>2>>W_001A1EEJKK,,,Ww(`?OQU?UW[?[(`(`(`ajmnnnn'|^TTZZb11
Ww(BCCPPPP$V}* 	NWw(?@MMMM	JJ''AA 	J 	J 	JWw(;<SIIIIII	J%%	)(33	y)44$$$#I..q1O5O!IIIIKK'11
 
   	  9 9 97CFF+C888888888 B B B&)9)99FFFF7O4SAAAAAABsW   A2G 9AG   G "C2 1G 2DG DB3G 
I G71I7AI Ii  ro   rc   c           
         ddl }ddl}ddl}ddl}ddl}t          |          j        }t          |          j        }	|                                	                    d          rd}
n<|                                	                    d          rd}
nt          d|           t          ||	          }|                                rzddl}ddl}|                                r^d                    |                    |j        d	
                    }|                    |	dz   |z             }|                                ^|                    dd           g }d}	 |
dk    r|                    |                    |                     5 }|                                D ]}|                                r||j        z                                  }|                    |                                          st          d|j                   |t6          k    r!t          d|dz   dt6          dz   d          |j                            dd           |                    |          5 }t;          |d          5 }d}	 |                    |          }|snN|t?          |          z  }|t6          k    rt          dt6          dz   d          |                     |           f	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   |!                    tE          |#                    |                                                               	 ddd           n# 1 swxY w Y   n#|
dk    r|                    |                    |                     5 }|$                                D ]}|%                                s||j        z                                  }|                    |                                          st          d|j                   |t6          k    r!t          d|dz   dt6          dz   d          |j                            dd           |&                    |          }|r|5 }t;          |d          5 }d}	 |                    |          }|snN|t?          |          z  }|t6          k    rt          dt6          dz   d          |                     |           f	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   |!                    tE          |#                    |                                                               	 ddd           n# 1 swxY w Y   n8# tN          $ r+ 	 |(                    |d           n# tN          $ r Y nw xY w w xY wt?          |          |tE          |          dS )zExtract a zip or tar archive into the workspace.

    Returns a dict with ``extracted`` (int), ``files`` (list[str]).
    Raises ValueError on zip-slip or unsupported format.
    r   N)z.zipzip)z.tarz.tar.gzz.tgzz.tar.bz2z.tbz2z.tar.xzz.txztarzUnsupported archive format: r      )krA   T)parentsexist_okzZip-slip blocked: zExtraction too large (i   z MB > z MB limit). Possible zip bomb.wbi   zExtraction too large (> )fileobjzTar-slip blocked: )ignore_errors)	extractedr-   rq   ))zipfiletarfileioosshutilr   r;   stemlowerr   r   r   existsstringrandomjoinchoicesdigits	with_namemkdirZipFileBytesIOinfolistis_dirr?   resolveis_relative_to_MAX_EXTRACTED_BYTESparentopenr   lenwriteappendrg   relative_to
getmembersisfileextractfilerj   rmtree)ro   r?   rc   r   r   r   r   r   r;   r   _modedest_dirr   r   suffixextracted_filestotal_extractedzfmembermember_pathsrcdst_chunk_sizechunktfsrc_objs                             r<   extract_archiver   h   s)    ,+++++++++++++++++++>>D>>Dzz||Y'' D			b	c	c DBBBCCC y$//H ?oo 	?WWV^^FMQ^??@@F))$*v*=>>H oo 	? NN4$N///OOKE>>J!7!788 ^B kkmm ^ ^F}} ! #+fo#="F"F"H"HK&55h6F6F6H6HII Q()Ofo)O)OPPP&)===(2_5S 2 23	B2 2 2  
  &,,TD,III -Ck41H1H -C&+-$'HH[$9$9E#( & %+s5zz9O.1EEE&0%:';	'J%: %: %:'" '" !"
  IIe,,,- !&- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $**3{/F/FyGXGXGZGZ/[/[+\+\]]]]=^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^B e^^bjj&<&<==  ^ mmoo ^ ^F!==?? ! #+fk#9"B"B"D"DK&55h6F6F6H6HII M()Kfk)K)KLLL&)===(2_5S 2 23	B2 2 2  
  &,,TD,III nnV44G 1$ 1T+t-D-D 1*/K1(+(=(=', !*$) /3u:: =#25I#I#I*4)>+?I+N)> )> )>+& +& %&
 !$		% 0 0 01 %*1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 $**3{/F/FyGXGXGZGZ/[/[+\+\]]]]?^ ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^B    	MM($M7777 	 	 	D	 _--QTU]Q^Q^___s  /V! C$M00LA*K8	,L8K<<L?K< LM0LM0LAM0$V! 0M44V! 7M485V! -C(VT4&A*T	T4T!!T4$T!%T4(V4T88V;T8<AV	V! VV! VV! !
W,WW
WWWWc                    ddl }	 | j                            dd          }t          | j                            dd          pd          }|t          k    r#t          | ddt          dz  dz   d	id
          S t          | j        ||          \  }}|                    dd          }d|vrt          | ddid          S |d         \  }}|st          | ddid          S 	 t          |          }	n$# t          $ r t          | ddid          cY S w xY wt          |	j                  }
t          |||
          }t          | ddi|          S # t          $ r+}t          | dt          |          id          cY d}~S d}~wt          $ r= t!          d|                                z   d           t          | ddid          cY S w xY w)z%Handle archive upload and extraction.r   NrH   r   rI   rJ   rK   rL   rM   rN   rO   rQ   rR   rS   rT   rU   rV   rW   okTz[webui] upload extract error: r\   zArchive extraction failedr^   )r_   r`   r#   ra   r   r   r=   r$   r   rb   r   rc   r   r   rg   rj   rk   rl   )rm   rn   r%   r&   r,   r-   rQ   r?   ro   rp   rc   resultrr   s                r<   handle_upload_extractr      sI   N**>2>>W_001A1EEJKK,,,Ww(`?OQU?UW[?[(`(`(`ajmnnnn'|^TTZZb11
Ww(BCCPPPP$V}* 	NWw(?@MMMM	JJ''AA 	J 	J 	JWw(;<SIIIIII	J%%	 XyAA400111 9 9 97CFF+C888888888 N N N.1A1AANNNN7$?@MMMMMMNsV   A2E 9AE   E "C2 1E 2DE D;E 
G	 E?9G	?AG	G	c                 V	   dd l }d }	 | j                            dd          }t          | j                            dd          pd          }|t          k    rZt          | ddt          dz  dz   did	
          |r5	 t          |                              d           S # t          $ r Y S w xY wS t          | j
        ||          \  }}d|vrKt          | ddid
          |r5	 t          |                              d           S # t          $ r Y S w xY wS |d         \  }}|sKt          | ddid
          |r5	 t          |                              d           S # t          $ r Y S w xY wS t          |          }	t          |	          j        pd}
t          j        d|
d          5 }|j        }|                    |           d d d            n# 1 swxY w Y   	 ddlm} n[# t&          $ rN t          | ddid
          cY |r5	 t          |                              d           S # t          $ r Y S w xY wS w xY w ||          }|                    d          st)          |                    d          pd          }d|                                v sd|                                v rdnd}t          | d|i|
          |r5	 t          |                              d           S # t          $ r Y S w xY wS t)          |                    d          pd                                          }t          | d|d          |r5	 t          |                              d           S # t          $ r Y S w xY wS # t.          $ rb}t          | dt)          |          id
          cY d }~|r5	 t          |                              d           S # t          $ r Y S w xY wS d }~wt          $ rt t1          d|                                z   d           t          | ddid 
          cY |r5	 t          |                              d           S # t          $ r Y S w xY wS w xY w# |r5	 t          |                              d           w # t          $ r Y w w xY ww xY w)!Nr   rH   r   rI   rJ   rK   rL   rM   rN   rO   T)
missing_okrR   rS   rT   rU   z.webmz
webui-stt-F)prefixr   delete)transcribe_audioz,Speech-to-text is unavailable on this serveri  successzTranscription failedunavailableznot configured
transcript)r   r   z[webui] transcribe error: r\   r^   )r_   r`   r#   ra   r   r   r   unlinkrj   r=   r$   rF   r   tempfileNamedTemporaryFiler;   r   tools.transcription_toolsr   ImportErrorrg   r   r   r   rk   rl   )rm   rn   	temp_pathr%   r&   r,   r-   r?   ro   rE   r   tmpr   r   r7   rP   r   rr   s                     r<   handle_transcriber      sh   I%**>2>>W_001A1EEJKK,,,Ww(`?OQU?UW[?[(`(`(`ajmnnn:  	Y&&$&7777   	9 (|^TTWw(BCCPPP4  	Y&&$&7777   	3  %V}* 	NWw(?@MMM.  	Y&&$&7777   	- *(33	i'27(VTYZZZ 	"^aIIIj!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"	eBBBBBBB 	e 	e 	eWw(VW`cddddd  	Y&&$&7777   		e!!),,zz)$$ 	=fjj))C-CDDC)SYY[[88<LPSPYPYP[P[<[<[SSadFWwnV<<<  	Y&&$&7777   	 L117R88>>@@
Z@@AA  	Y&&$&7777   	  9 9 97CFF+C88888888
  	Y&&$&7777   		  I I I*S^^-=-==TJJJJ7$:;CHHHHH 	Y&&$&7777   		I  	Y&&$&7777   	sS  A2N =#B!!
B.-B.20N %#D		
DD N =#E!!
E.-E.2<N .GN GN GN #G* )N *IN #H00
H=<H=IB
N #K33
L ?L AN #M33
N ?N 
Q, O+.Q,/Q/ 6#O
O'&O'+AQ,2Q/ 6#Q
Q'&Q'+Q,,Q/ /R(3#RR(
R$!R(#R$$R()__doc__re   r   r'   r   emailr   pathlibr   
api.configr   api.helpersr   r   
api.modelsr   api.workspacer   tupler=   rg   rF   rs   r   bytesr   r   r    r>   r<   <module>r      sZ                       ' ' ' ' ' '         " " " " " " ) ) ) ) ) )$E $ $ $ $NC C    "B "B "BN - l` l` l` l` l` l` l`^N N N:( ( ( ( (r>   