
    Zie:                     b   S r SSKJrJrJrJrJr  SSKJr  SSK	J
r
JrJrJr  SSKJr  SSKJr  SSKrSSKrSSKrSSKrSSKrSSKr\" S\5      r\R5                  S	5      \S
 5       5       r\R5                  S5      \S 5       5       r\R5                  S5      \S 5       5       r\R5                  SS/S9\S 5       5       r\R5                  SS/S9\S 5       5       r\R5                  SS/S9\S 5       5       r \R5                  SS/S9\S 5       5       r!\R5                  SS/S9\S 5       5       r"g)uV   
生成结果文件操作 API

提供文件浏览、上传、下载、编辑等功能
    )	Blueprintjsonifyrequest	send_fileafter_this_request)login_required)get_challenge_and_output_diris_binary_filesuccess_responseerror_response)Path)secure_filenameNgenerate_result_file_apiz/project-structurec                  v  ^	  SSK n U R                  [        5      nUR                  S 5        [        R
                  R                  S5      nUR                  SU 35        [        U5      u  p4nUc  U$ UR                  SU 35        [        U5      nUR                  5       (       d  [        SU 35        [        SS5      $ SU	4S	 jjm	T	" U5      nUR                  S
[        U5       35        [        US9$ ! [         a7  n[        R                   " 5         [        S[#        U5       3S5      s SnA$ SnAff = f)u   获取项目结构r   Nchallenge_idu"   接收到的 challenge_id 参数: u    从输出目录构建文件树: u   输出目录不存在: u   输出目录不存在  c           	      D  > / n [        U R                  5       5       H  nUR                  R                  S5      (       a  M%  U(       a)  [        R
                  R                  XR                  5      OUR                  nUR                  5       (       a*  T" X45      nUR                  UR                  SUUS.5        M  UR                  5       nUR                  UR                  SUUR                  UR                  S.5        M     [        US S9$ ! [         a     Nf = f)u   递归构建文件树.	directory)nametypepathchildrenfile)r   r   r   sizemodifiedc                 8    U S   S:H  U S   R                  5       4$ )Nr   r   r   )lower)xs    N   /Users/yu22x/Desktop/ddd_副本135/ctf/app/routes/generator/result/file_api.py<lambda>;get_project_structure.<locals>.build_tree.<locals>.<lambda>Q   s    &	V0CQvY__EV/W    )key)sortediterdirr   
startswithosr   joinis_dirappendstatst_sizest_mtimePermissionError)r   relative_pathitemsitemitem_rel_pathr   r,   
build_trees          r    r4   )get_project_structure.<locals>.build_tree3   s    E"4<<>2Dyy++C00 N[BGGLL		$JaeajajM{{}}#-d#B$(II$/$1(0	&   $yy{$(II$*$1$(LL(,& ! 34 %%WXX # s   DD 
DDu   构建的文件树数量: )treeu   获取项目结构时出错:   ) )logging	getLogger__name__debugr   argsgetr	   r   existsprintr   lenr   	Exception	traceback	print_excstr)
r9   loggerr   challenge_data
output_dircategory_idoutput_pathr6   er4   s
            @r    get_project_structurerL      s'   <M""8,)*||''79,HI 3O|2\/K!7
|DE:&!!##+K=9:!"93??	Y@ +&1#d)=>T** M =c!fXFLLMs+   A/C7 3AC7 5C7 7
D8,D3-D83D8z/file-contentc                  *    [         R                  R                  SS5      n [         R                  R                  S5      nU (       d  [        SS5      $ [	        U5      u  p#nUc  U$ U R                  5       R                  S5      R                  SS5      n[        U5      nXe-  n UR                  5       nUR                  5       nUR                  U5        UR                  5       (       d  [        S
S5      $ UR                  5       (       a
  [        SSS9$ [!        UR"                  5      (       a  [        SSU 3S9$  [%        USSSS9 nUR'                  5       n	SSS5        [        SSW	S9$ ! [        [        4 a    [        S	S5      s $ f = f! , (       d  f       N;= f! [(         a"  n
[        S[+        U
5       3S5      s Sn
A
$ Sn
A
ff = f! [(         a7  n
[,        R.                  " 5         [        S[+        U
5       3S5      s Sn
A
$ Sn
A
ff = f)u   获取文件内容r   r8   r      未提供文件路径  N/..   非法路径   文件不存在r   T)is_directorycontentu   [二进制文件] )	is_binaryrU   rutf-8ignore)encodingerrorsF)rV   rT   rU   u   读取文件失败: r7   u   获取文件内容失败: )r   r=   r>   r   r	   striplstripreplacer   resolverelative_to
ValueErrorOSErrorr?   r*   r   r
   r   openreadrB   rE   rC   rD   )	file_pathr   rG   rH   rI   
clean_pathrJ   target_filefrU   rK   s              r    get_file_contentri   ]   s   (JLL$$VR0	||''7!"93??2N|2\/K!__&--c2::4D
:&!.	7%--/K%--/K##K0 !!##!"3S99#rBB+**++#d>PQ[P\<]^^	Hk3Ja&&( K#e%QXYY G$ 	7!.#66	7 KJ  	H!$8Q"A3GG	H  J :3q6(CSIIJs   AG G '>G &1E/  G 8G &G ?F" FF" /FG FG 
FF" "
G,G	GG 	GG 
H,HHHz/file-downloadc                  <    [         R                  R                  SS5      n [         R                  R                  S5      nU (       d  [        SS5      $ [	        U5      u  p#nUc  U$ U R                  5       R                  S5      R                  SS5      n[        U5      nXe-  n UR                  5       nUR                  5       nUR                  U5        UR                  5       (       d  [        S
S5      $ UR                  5       (       a  [        SS5      $ [        [!        U5      SUR"                  SS9$ ! [        [        4 a    [        S	S5      s $ f = f! [$         a7  n[&        R(                  " 5         [        S[!        U5       3S5      s SnA$ SnAff = f)u   下载单个文件r   r8   r   rN   rO   NrP   rQ   rR   rS   r   u   无法下载目录Tzapplication/octet-streamas_attachmentdownload_namemimetypeu   下载文件失败: r7   )r   r=   r>   r   r	   r\   r]   r^   r   r_   r`   ra   rb   r?   r*   r   rE   r   rB   rC   rD   )	re   r   rG   rH   rI   rf   rJ   rg   rK   s	            r    download_filero      s    DLL$$VR0	||''7!"93??2N|2\/K!__&--c2::4D
:&!.	7%--/K%--/K##K0 !!##!"3S99!"6<<[)[M]M]  iC  D  	D G$ 	7!.#66	7  D 4SVH=sCCDsZ   AE E '>E &1D8  E 8 E E 8EE EE 
F$,FFFz/file-createPOST)methodsc                      [         R                  " 5       n U R                  S5      nU R                  SS5      nU R                  SS5      nU R                  S5      =(       d    [         R                  R                  S5      nU(       d  [	        SS5      $ [        U5      u  pVnUc  U$ [        U5      nU(       a4  UR                  5       R                  S
5      R                  SS5      n	X-  n
OUn
 U
R                  5       n
UR                  5       nU
R                  U5        U
R                  SSS9  X-  nUR                  5       (       a  [	        U(       a  SOS SU S3S5      $ U(       a  UR                  SSS9  SU S3nOUR!                  SSS9  SU S3n[#        US9$ ! [        [        4 a    [	        SS5      s $ f = f! [$         a4  n[&        R(                  " 5         [	        [+        U5      S5      s S	nA$ S	nAff = f)u   创建文件或文件夹r   r   r8   rT   Fr   u   缺少名称参数rO   NrP   rQ   rR   Tparentsexist_oku	   文件夹u   文件 
    已存在
   文件夹 u    创建成功rX   rZ      文件 messager7   )r   get_jsonr>   r=   r   r	   r   r\   r]   r^   r_   r`   ra   rb   mkdirr?   
write_textr   rB   rC   rD   rE   )datar   parent_pathrT   r   rG   rH   rI   rJ   rf   
parent_dirnew_pathr|   rK   s                 r    create_file_or_folderr      s   ,+!xxhhvr*xx6xx/S7<<3C3CN3S!"6<<2N|2\/K!:&$**,33C8@@rJJ$1J$J	7#++-J%--/K"";/ 	5$??!L[h$OqQUPVV`"acfggNN4$N7"4&6GW5v]3G00! G$ 	7!.#66	7"  +c!fc**+sV   BG G )AG 21F$ #AG '<G $G G GG 
H)G?9H?Hz/file-deleteDELETEc                      [         R                  " 5       n U R                  S5      nU R                  SS5      nU R                  S5      =(       d    [         R                  R                  S5      nU(       d  [	        SS5      $ [        U5      u  pEnUc  U$ [        U5      nUR                  5       R                  S5      R                  S	S
5      nXx-  n	 U	R                  5       n	UR                  5       nU	R                  U5        U	R                  5       (       d  [	        SS5      $ U(       a'  [        R                   " U	5        SU	R"                   S3n
O U	R%                  5         SU	R"                   S3n
['        U
S9$ ! [        [        4 a    [	        SS5      s $ f = f! [(         a4  n[*        R,                  " 5         [	        [/        U5      S5      s SnA$ SnAff = f)u   删除文件或文件夹r   rT   Fr      缺少路径参数rO   NrP   rQ   r8   rR   u   文件或文件夹不存在r   rx   u    删除成功rz   r{   r7   )r   r}   r>   r=   r   r	   r   r\   r]   r^   r_   r`   ra   rb   r?   shutilrmtreer   unlinkr   rB   rC   rD   rE   )r   re   rT   r   rG   rH   rI   rJ   rf   rg   r|   rK   s               r    delete_file_or_folderr      s   %+!HHV$	xx6xx/S7<<3C3CN3S!"6<<2N|2\/K!:&__&--c2::4D
!.	7%--/K%--/K##K0 !!##!"?EEMM+&";#3#3"4MBG  0 01?G00 G$ 	7!.#66	7  +c!fc**+sU   BF! F! >F! 1E?  F! (AF! ?FF! FF! !
G+)GGGz/file-writec                  :    [         R                  " 5       n U R                  S5      nU R                  SS5      nU R                  S5      =(       d    [         R                  R                  S5      nU(       d  [	        SS5      $ [        U5      u  pEnUc  U$ [        U5      nUR                  5       R                  S5      R                  S	S5      nXx-  n	 U	R                  5       n	UR                  5       nU	R                  U5        U	R                  R                  SSS9  U	R!                  USS9  [#        SS9$ ! [        [        4 a    [	        S
S5      s $ f = f! [$         a4  n
[&        R(                  " 5         [	        [+        U
5      S5      s Sn
A
$ Sn
A
ff = f)u   写入文件内容r   rU   r8   r   r   rO   NrP   rQ   rR   Trs   rX   ry   u   文件保存成功r{   r7   )r   r}   r>   r=   r   r	   r   r\   r]   r^   r_   r`   ra   rb   parentr~   r   r   rB   rC   rD   rE   )r   re   rU   r   rG   rH   rI   rJ   rf   rg   rK   s              r    write_file_contentr     sq   +!HHV$	((9b)xx/S7<<3C3CN3S!"6<<2N|2\/K!:&__&--c2::4D
!.	7%--/K%--/K##K0 	   =w9(<== G$ 	7!.#66	7  +c!fc**+sN   BE E >E 1D: 2E :EE EE 
F&)FFFz/file-uploadc                      S[         R                  ;  a  [        SS5      $ [         R                  S   n [         R                  R	                  SS5      n[         R                  R	                  SS5      R                  5       S:H  n[         R                  R	                  S	5      =(       d    [         R                  R	                  S	5      nU R                  S:X  a  [        SS5      $ [        U5      u  pEnUc  U$ [        U5      nU(       a4  UR                  5       R                  S5      R                  SS5      nXx-  n	OUn	 U	R                  5       n	UR                  5       nU	R                  U5        U	R#                  SSS9  [%        U R                  5      n
X-  nU(       a  U
R'                  S5      (       a  U	SU
 3-  nU R)                  [+        U5      5         U
R'                  S5      (       a2  [,        R.                  " US5       nUR1                  U	5        S
S
S
5        OGU
R'                  S5      (       a1  [2        R4                  " US5       nUR1                  U	5        S
S
S
5        UR7                  5         [9        SU
 S3S9$ UR=                  5       (       a  [        SU
 S3S5      $ U R)                  [+        U5      5        UR?                  5       n[9        U
[+        UR                  U5      5      UR@                  URB                  S.SU
 S3S9$ ! [        [         4 a    [        SS5      s $ f = f! , (       d  f       N= f! , (       d  f       N= f! [:         a,  nUR=                  5       (       a  UR7                  5         UeS
nAff = f! [:         a4  n[D        RF                  " 5         [        [+        U5      S5      s S
nA$ S
nAff = f)u*   上传文件，支持压缩包自动解压r   u   请选择文件rO   r   r8   extractfalsetruer   NrP   rQ   rR   Trs   ).zipz.rarz.7z.tar.gz_r   rW   )r   r   zr:*u
   压缩包 u    上传并解压成功r{   rz   rw   )r   r   r   r   u    上传成功)r   r|   r7   )$r   filesr   formr>   r   r=   filenamer	   r   r\   r]   r^   r_   r`   ra   rb   r~   r   endswithsaverE   zipfileZipFile
extractalltarfilerc   r   r   rB   r?   r,   r-   r.   rC   rD   )r   r   r   r   rG   rH   rI   rJ   rf   save_dirsafe_filenamere   	temp_pathzip_reftar_refrK   r,   s                    r    upload_filer   7  sP   B+&!"3S99}}V$ll&&vr2,,""9g6<<>&H||''7[7<<;K;KN;[==B!"3S992N|2\/K!:&$**,33C8@@rJJ"/H"H	7'')H%--/K  - 	td3'6,	}--.TUU Q}o#66IIIc)n% ))&11 C8G**84 98"++O<< i77**84 8   "'*]OKa0bcc !!%j&I3OOIIc)n%>>#D#+S9N9N{9[5\fjfrfr  AE  AN  AN  O!-> A G$ 	7!.#66	7 98 87
  ##%%$$&   +c!fc**+s   N CN 'N :AN 1L 4A(N -M 
L96M M
$$M 	$N .A(N L63N 5L66N 9
MM 

MM 
N%'NNN 
O)OOOz/download_allGETc                  :  ^  [         R                  R                  S5      n [        U 5      u  pnUc  U$ [	        U5      S-  nSnUR                  5       (       al   SSKn[        USSS9 nUR                  5       nSSS5        UR                  S	WUR                  5      n	U	(       a  U	R                  S
5      R                  5       n[        R                  " SSS9mTR!                  5         ["        R$                  " TR&                  SS SU5        [(        U4S j5       n
[+        TR&                  SU S3SS9$ ! , (       d  f       N= f! [         a     Nf = f! [         a7  n[,        R.                  " 5         [1        S[3        U5       3S5      s SnA$ SnAff = f)u   下载完整题目包r   Nz
writeup.mdu   题目r   rW   rX   ry   z
^#\s+(.+)$   r   F)suffixdeletezipc                 l   >  [         R                  " TR                  5        U $ ! [         a     U $ f = f)N)r(   remover   rB   )responsetemp_zips    r    remove_file!download_all.<locals>.remove_file  s8    		(--( O  Os    % 
33Tz_complete.zipzapplication/ziprk   u   下载失败: r7   )r   r=   r>   r	   r   r?   rerc   rd   search	MULTILINEgroupr\   rB   tempfileNamedTemporaryFilecloser   make_archiver   r   r   rC   rD   r   rE   )r   rG   rH   rI   writeup_filechallenge_namer   rh   writeup_contentmatchr   rK   r   s               @r    download_allr     sx   %>||''72N|2\/K!J',6!  ,g>!&'ffhO ?		-",,O%*[[^%9%9%;N ..fUKHMM#2.zB		 
	 d^L\\iJj  vG  H  	H+ ?>
  $  >s1vh7==>s`   1E %E E	 *D8;AE	 A1E 8
EE	 	
EE EE 
F#,FFF)#__doc__flaskr   r   r   r   r   app.services.auth.decoratorsr   app.routes.commonr	   r
   r   r   pathlibr   werkzeug.utilsr   r(   r   rC   r   r   r   r;   bp_result_file_apirouterL   ri   ro   r   r   r   r   r    r#   r    <module>r      s  
 M L 7   * 	     98D  ./>M  0>MB /**J  +*JZ *+"D  ,"DJ .6(;.+  <.+b .8*='+  >'+T -&: +  ; +F .6(;D+  <D+N /E7;'>  <'>r#   