
    HYi                     n   S SK JrJrJrJrJrJrJrJrJ	r	J
r
Jr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Jr   S SKJrJrJrJr  Sr\" S
\"5      r#S r$S r%S)S jr&S r'\#RQ                  SS/S9\S 5       5       r)\#RQ                  S5      \S 5       5       r*\#RQ                  S5      \S 5       5       r+\#RQ                  S5      \S 5       5       r,\#RQ                  SS/S9\S 5       5       r-\#RQ                  SS/S9\S 5       5       r.\#RQ                  SS/S9\S  5       5       r/\#RQ                  S!S/S9\S" 5       5       r0\#RQ                  S#S/S9\S$ 5       5       r1\#RQ                  S%S/S9\S& 5       5       r2\#RQ                  S'S/S9\S( 5       5       r3g! \  a    Sr\!" S	5         GN_f = f)*    )	Blueprintrender_templateredirecturl_forsession	send_fileafter_this_requestResponsejsonifyrequestaborthas_request_contextcurrent_appflashg)SessionData)login_requiredN)Path)get_latest_challengeget_challenge_by_nameupdate_challengeget_challenge_recordTFuE   数据库操作模块导入失败，将使用文件方式读取数据generate_resultc                 r    1 Skn[         R                  R                  U 5      S   R                  5       nX!;   $ )u$   检查文件是否为二进制文件>   .gz.so.bmp.dll.exe.gif.ico.jpg.pdf.png.tar.zip.jpeg.dylib   )ospathsplitextlower)filenamebinary_extensionsexts      E   /Users/yu22x/Desktop/ddd_副本131/ctf/app/routes/generator/result.py_is_binary_filer2      s6    P
''

8
$Q
'
-
-
/C##    c                    U (       d  gSSK JnJn  U   UR                  5        HB  u  p4UR	                  S5      U :X  d  M  UR	                  SS5      nU(       d  M7  Us  sSSS5        $    SSS5         [        [        U 5      5      nU(       a  UR	                  S5      nU(       a  U$ g! , (       d  f       NE= f! [         a!  n[        S[        U5       35         SnAgSnAff = f)	u   
通过 challenge_id 从任务记录或数据库获取 category_id

Args:
    challenge_id: 题目ID
    
Returns:
    str: category_id，如果找不到则返回 'web'（默认）
webr)   tasks_status_tasks_lockchallenge_idcategory_idNchallenge_typeu&   从数据库读取题目记录失败: )
tasksr7   r8   itemsgetr   int	Exceptionprintstr)	r9   r7   r8   task_idtaskr:   challenge_datar;   es	            r1   _get_category_id_from_challengerG      s      1	)//1MGxx'<7"hh}e<;&& 
1 
A-c,.?@+//0@AN%%
 ' 
  A6s1vh?@@ 	As5   )B) B)B)(B)34B: )
B7:
C%C  C%c           	         [         (       d  S[        SSS.5      S44$ U (       a  [        [        U 5      5      nO
[	        5       nU(       d  S[        SSS.5      S44$ [        [        S5      (       as  [        R                  (       a^  UR                  S	5      [        R                  R                  :w  a0  [        R                  R                  S
:w  a  S[        SSS.5      S44$ OS[        SSS.5      S44$ UR                  S5      nU(       a  [        U5      OSnX1S'   UR                  S5      n[        [        5      R                  R                  R                  R                  nU(       d  S[        SSS.5      S44$ UnUR                  S5      (       d2  [         R"                  R%                  U5      (       d  ['        XT-  5      nO [         R"                  R)                  U5      (       d  [        U5      nUR*                  nUS-  U-  S-  U-  n	U	R)                  5       (       aL  ['        U	R-                  U5      5      n
['        U	5      n SSKJn  U" USU
05        [3        SU SU SU
 35        OS[        SSU SU	 S3S.5      S44$ X4$ [        U5      nS['        UR6                  5      ;   a   UR6                  nSn[9        U5       H  u  nnUS:X  d  M  Un  O   Ub  US -   [;        U5      :  a  XS!-      S:X  av  US"   nUS-  U-  S-  U-  n	U	R)                  5       (       aN  ['        U	R-                  U5      5      n
['        U	5      n SSKJn  U" USU
05        [3        S#U SU SU
 35        X4$ X4$ X4$ ! [4         a"  n[3        S['        U5       35         SnAGNSnAff = f! [4         a#  n[3        S['        U5       35         SnAX4$ SnAff = f! [4         a#  n[3        S$['        U5       35         SnAX4$ SnAff = f)%u   
获取题目数据和输出目录的公共函数

Args:
    challenge_id: 题目ID，如果为None则获取最新题目

Returns:
    tuple: (challenge_data, output_dir, category_id) 或 (None, error_response)
Nerroru   数据库操作不可用statusmessage     未找到题目数据  useruser_idadminu   您没有权限查看此题目i  u   请先登录i  idr5   r:   
output_diru   输出目录未设置/ge10outputr   )r   u   已更新题目 u    的 output_dir: z -> u#   更新数据库 output_dir 失败:    输出目录不存在: u   （已尝试新路径: u   ）   r)   u   已迁移题目 u   检查路径格式时出错: )HAS_DB_OPERATIONSr   r   r?   r   hasattrr   rP   r>   rS   rolerG   r   __file__parent
startswithr*   r+   isabsrB   existsnamerelative_toapp.models.database.operationsr   rA   r@   parts	enumeratelen)r9   rE   challenge_id_intr:   rT   project_rootoriginal_output_dirold_output_pathchallenge_dir_namenew_output_dirnew_output_dir_strr   rF   output_pathrf   
ge10_indexiparts                     r1   _get_challenge_and_output_dirrt   ?   sz    g=WXY[^___-c,.?@-/g=TUVX[\\\ q&affi(AFFII5!&&++:P'WAa"bcehiii g^LMsSSS &))$/GW12BC]bK %0=!  ##L1J>((//66==Lg=TUVX[\\\ %  %%bggmmJ.G.G23
 	 77>>*%%23,11 &.<xGJ\\  ""!$^%?%?%M!N^,JFK !1LBT3UV()9(::KL_K``dewdxyz 'WCZ[eZff}  M  ~N  NQ  BR  #S  T  VY  Z  Z  ZH %%C :&S**++@#))!
(/GAtv~%&
  0
 )j1ns5z.I!^,8-22Y*)5)>)Lx)WZl)l)002214^5O5OP\5]1^.),^)<JV [ 01ALRdCe f %(89I8JJ[\o[ppt  vH  uI  'J  !K %%>%%>%%S  F;CF8DEEFF $- V %(KCPQF8&T U U
 %%V @5c!fX>?? %%	@s[   %N  7#O A3O %N/  
N,
N''N,/
O9OO OO 
P)PPc                    SSSSSS.nU (       d  U$ SSK nU R                  S5      nU Ha  nUR                  S	5      (       d  M  US
S R                  5       nUR	                  SSU5      nUR	                  SSU5      nU(       d  M]  XQS'     O   [        U5       GHX  u  pdSU;   d  M  SU;   d  M  SU;   d  M  US
-   [        U5      :  Ga(  X6S
-      nUR                  S5       Vs/ s H  oR                  5       PM     n	nU	 Vs/ s H  o(       d  M  UPM     n	n[        U	5      S:  a  U	S   (       a!  U	S   R                  S5      (       d  U	S   US'   U	S   (       a!  U	S   R                  S5      (       d  U	S   US'   [        U	5      S:  a+  U	S   (       a!  U	S   R                  S5      (       d  U	S   US'   [        U	5      S:  a+  U	S   (       a!  U	S   R                  S5      (       d  U	S   US'     O   US   S:X  a  Sn
SnU H  nUR                  5       R                  S5      (       a  SnM+  U(       a&  UR                  5       R                  S5      (       a  SnU(       d  Ma  UR                  5       R                  S5      (       d  M  U
S-  n
M     U
S
::  a  SUS'   OU
S::  a  SUS'   OSUS'   U H9  nSUR                  5       ;   d  S U;   d  M  S!U;   a  S"US#'   M,  S$U;   d  M4  S%US#'   M;     U$ s  snf s  snf )&u!   从 writeup 中提取基本信息   未命名题目 u   中等u	   1-2小时)rc   description
difficultyflag_formatestimated_timer   N
z# rY   z\s*-\s*[Ww]riteup\s*$u   \s*的?解题思路\s*$rc   u	   题目名u   题目描述|   :r)   rx      r{   ry   Fu   ## 知识点Tz##)	z1.z2.z3.z4.z5.z6.z7.z8.z9.u   简单u   困难flagFLAGu   动态zDASCTF{dynamic_flag}rz   u   静态zDASCTF{static_flag})resplitr`   stripsubrg   rh   r-   )writeupinfor   lineslinetitlerr   	data_lineprf   knowledge_countin_knowledge_sections               r1   _extract_info_from_writeupr      s    "%D MM$E ??4  HNN$EFF3R?EFF5r5AEu$V  U#$>T#9cTk1us5z!!a%L	,5OOC,@A,@q,@A$)/EqQE/u:?Qxa(;(;C(@(@',QxVQxa(;(;C(@(@.3Ah]+5zA~%(58;N;Ns;S;S16q-.5zA~%(58;N;Ns;S;S-21X\*' $, LX%$Dzz|&&~66'+$#

(?(?(E(E',$##

(?(?@v(w(w1$  a!)D!!)D!)D TZZ\!Vt^4&<]#T!&;]#  Kc B/s   $K3
K8K8rU   GET)methodsc                  0	    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  p4Uc!  SSK	J
nJnJn  U" SS5        U" U" S5      5      $ UnUR                  S	S
5      n	Sn
 SSKJn  UR                  R                  U	5      nU(       a-  UR                   UR"                  UR$                  =(       d    SS.n
Sn[+        U5      S-  nUR-                  5       (       a%   [/        USSS9 nUR1                  5       nSSS5        SnSSKn[+        U5      nUR"                  nUR5                  SU5      nU(       a  UR7                  S5      nOUnSnUR                  S5      nU(       ag  SSKJnJn  U   UR?                  5        H@  u  nnUR                  S5      U:X  d  M  UR                  SS5      nU(       d  M8  US:w  d  M@    O   SSS5        US:X  a  [A        U5      nUR                  SS5      nUR                  S5      nU(       d  UR                  S5      (       a  [C        UR                  S5      [D        5      (       a  UR                  S5      nOY[G        UR                  S5      S5      (       a  UR                  S5      RI                  5       O[E        UR                  S5      5      nU(       d  SnSnUR                  S 5      nU(       aB   SS!KJ%n   U R                  R                  U5      n!U!(       a  U!R                   U!RL                  S".nUUUR                  S$S5      UR                  S%S5      S&.n[O        S'UR                  S5      UUUU	U
/ 0 S(9	$ ! [&         a  n[)        SU 35         SnAGNSnAff = f! , (       d  f       GN= f! [&         a  n[)        SU 35         SnAGNSnAff = f! , (       d  f       GN= f! [&         a  n[)        S#U 35         SnANSnAff = f! [&         aY  nS)[E        U5       3n"[)        U"5        [P        RR                  " 5         SSK	J
nJnJn  U" U"S5        U" U" S5      5      s SnA$ SnAff = f)*u   显示生成结果r   Nr9   "   接收到的 challenge_id 参数: )r   r   r   rN   rI   zgenerate_tasks.tasksr:   r5   )CategoryConfigfolder)rS   rc   iconu   获取方向配置失败: rw   
writeup.mdrutf-8encodingu   读取writeup失败: rv   z^\d{8}_\d{6}_(.+)$r)   u	   未设置rS   r6   ry   	timestamp
created_at	isoformatu   未知时间rQ   )User)rS   usernameu   获取出题人信息失败: rx   r{   )rc   ry   rx   r{   z pages/generate/result/index.html)r9   challenge_infogeneration_timeauthor_infor:   category_configcore_functions
code_filesu#   显示结果页面时发生错误: )*logging	getLogger__name__r   r   argsr>   debugrt   flaskr   r   r   app.models.database.modelsr   queryrS   rc   r   r@   rA   r   rb   openreadr   matchgroupr<   r7   r8   r=   r   
isinstancerB   r\   r   r   r   r   	traceback	print_exc)#r   loggerr9   rE   resultr   r   r   rT   r:   r   r   categoryrF   r   writeup_filefchallenge_namer   rp   folder_name
name_matchry   ri   r7   r8   rC   rD   r   r   r   rQ   r   author	error_msgs#                                      r1   indexr   
  sY   ~9""8,() ||''79,HI "?|!L!66)73G$:;<<
$((> 
	4A%++//<H"++$MM$MM5X# J',6  3,g>!ffhG ? +:&!&&XX3[A
'--a0N )N !
)--d38%1%7%7%9MGTxx/3CC%)XXlK%H
%:**C!	 &:  $7@N'++L+FJ ),,[9>#5#5l#C#C.,,\:C@@"0"4"4\"BRYZhZlZlmyZz  }H  SI  SI."4"4\"B"L"L"N  OR  Sa  Se  Se  fr  Ss  Ot,O  $$Y/	;;0$ii$*OO#K #$)--mR@,001A2F	
 .'++D1)+##+

 
	
[  	4.qc233	4 ?> 3-aS1223, D  ;5aS9::;.  99#a&B	i22i! 67889s   BP2 P2 'AN <%P2 "O -O>O A.P2 4*O;"O;=O;O;	DP2 AP AP2 
O 'N;5P2 ;O  P2 
OO P2 O 
O8O3-P2 3O88P2 ;
P
P2 
P/P*%P2 *P//P2 2
R<AR
RRz/project-structurec                    ^	  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  p4Uc  U$ UnUR                  SU 35        [        U5      nUR                  5       (       d  [        SU 35        [        SSS	.5      S
4$ SU	4S jjm	T	" U5      nUR                  S[        U5       35        [        SUS.5      $ ! [         aX  nWR                  S[        U5       35        [         R"                  " 5         [        SS[        U5       3S	.5      S4s SnA$ SnAff = f)u   获取项目结构r   Nr9   r   u    从输出目录构建文件树: rX   rI   u   输出目录不存在rJ   rO   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)u3   递归构建文件树（与知识库格式相同）.	directory)rc   typer+   childrenfile)rc   r   r+   sizemodifiedc                 8    U S   S:H  U S   R                  5       4$ )Nr   r   rc   )r-   )xs    r1   <lambda>;get_project_structure.<locals>.build_tree.<locals>.<lambda>  s    &	V0CQvY__EV/Wr3   )key)sortediterdirrc   r`   r*   r+   joinis_dirappendstatst_sizest_mtimePermissionError)r+   relative_pathr=   itemitem_rel_pathr   r   
build_trees          r1   r   )get_project_structure.<locals>.build_tree  s    E"4<<>2Dyy++C00 N[BGGLL		$JaeajajM{{}}#-d#B$(II$/$1(0	&   $yy{$(II$*$1$(LL(,& # 36 %%WXX # s   DD 
DDu   构建的文件树数量: T)successtreeu   获取项目结构时出错: rM   )rw   )r   r   r   r   r   r   r>   rt   r   rb   rA   r   rh   r@   rI   rB   r   r   )
r   r   r9   rE   r   rT   rp   r   rF   r   s
            @r1   get_project_structurer     sw   K""8,)* ||''79,HI "?|!L!M
7
|DE:&!!##+K=9:!2   	YB +&1#d)=>
  	
  4SVH=>6s1vh?
   	s,   A.D 2AD :D 
E#AEE#E#z/file-contentc                      [         R                  R                  SS5      n [         R                  R                  S5      nU (       d  [        SSS.5      S4$ [	        U5      u  p#Uc  U$ Un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S.5      S4$ UR                  5       (       a  [        SSSS.5      $ [        UR                   5      nU(       a  [        SSSU 3S.5      $  [#        USSSS9 n	U	R%                  5       n
SSS5        [        SSSW
S.5      $ ! [        [        4 a    [        SSS.5      S4s $ f = f! , (       d  f       ND= f! [&         a&  n[        SS[)        U5       3S.5      S4s SnA$ SnAff = f! [&         aR  n[+        S[)        U5       35        [,        R.                  " 5         [        SS[)        U5       3S.5      S4s SnA$ SnAff = f)u   获取文件内容r+   rw   r9   rI      未提供文件路径rJ     NrU   ..   非法路径   文件不存在rO   r   T)rK   is_directorycontentu   [二进制文件] )rK   	is_binaryr   r   r   ignore)r   errorsF)rK   r   r   r   u   读取文件失败: rM   u   获取文件内容失败: )r   r   r>   r   rt   r   lstripreplacer   resolverd   
ValueErrorOSErrorrb   r   r2   rc   r   r   r@   rB   rA   r   r   )	file_pathr9   rE   r   rT   
clean_pathrp   target_filer   r   r   rF   s               r1   get_file_contentr     s   ULL$$VR0	||''7!2    "?|!L!M
 __&--c2::4D
 :&!.	%--/K%--/K##K0 !!##!,    # $   $K$4$45	#!/
|<  	k3Ja&&( K #" %"	  I G$ 	!)   	B KJ  	!1#a&:   	  *3q6(343CF8<
   	s   AG3 G3 *A G3 +1F	 $G3 #G3 %-G3 G   F/1G  	 F,)G3 +F,,G3 /
F=9G   
G0
G+%G0&G3 +G00G3 3
I=AI
I
Iz/file-downloadc                      [         R                  R                  SS5      n [         R                  R                  S5      nU (       d  [        SSS.5      S4$ [	        U5      u  p#Uc  U$ Un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S.5      S4$ UR                  5       (       a  [        SSS.5      S4$ [        [!        U5      SUR"                  SS9$ ! [        [        4 a    [        SSS.5      S4s $ f = f! [$         aR  n['        S[!        U5       35        [(        R*                  " 5         [        SS[!        U5       3S.5      S4s SnA$ SnAff = f)u   下载单个文件r+   rw   r9   rI   r   rJ   r   NrU   r   r   r   rO   u   无法下载目录Tzapplication/octet-streamas_attachmentdownload_namemimetypeu   下载文件失败: rM   )r   r   r>   r   rt   r   r   r   r   r   rd   r   r   rb   r   r   rB   rc   r@   rA   r   r   )	r   r9   rE   r   rT   r   rp   r   rF   s	            r1   download_filer   ;  s   ALL$$VR0	||''7!2    "?|!L!M
 __&--c2::4D
 :&!.	%--/K%--/K##K0 !!##!,    !/    %**/	
 	
+ G$ 	!)   	8  $SVH-.-c!fX6
   	s\   AE+ E+ *A E+ +1E $E+ $E+ &E+  E(%E+ 'E((E+ +
G5AG<GGz/file-createPOSTc                  v    [         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SSS	.5      S
4$ [        U5      u  pVUc  U$ Un[        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n[	        SSUUS	.5      S
4$ 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[	        SSUS.5      $ ! [        [        4 a    [	        SSS.5      S
4s $ f = f! ["         aO  n[%        S['        U5       35        [(        R*                  " 5         [	        S['        U5      S.5      S4s SnA$ SnAff = f)u   创建文件或文件夹rc   r+   rw   r   Fr9   rI   u   缺少名称参数)r   rK   rI   rL   r   NrU   r   r   r   rI   Tparentsexist_oku	   文件夹u   文件 
    已存在
   文件夹 u    创建成功r   r      文件 r   )r   rK   rL   u   创建失败: rM   )r   get_jsonr>   r   r   rt   r   r   r   r   r   rd   r   r   mkdirrb   
write_textr@   rA   rB   r   r   )datarc   parent_pathr   r9   rE   r   rT   rp   r   
parent_dirnew_pathr   rL   rF   s                  r1   create_file_or_folderr    sc   @A!xxhhvr*xx6xx/S7<<3C3CN3S !-/	 
   "?|!L!M
:& $**,33C8@@rJJ$1J$J	M#++-J%--/K"";/ 	5$??*6;HEQtfJWI !"$	 
   NN4$N7"4&6GW5v]3G
  	- G$ 	Mu~FGLL	M6  As1vh'(53q6:;S@@AsX   BG G .A
G 91F9 *AG 6AG 9 GG GG 
H8)AH3-H83H8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S.5      S4$ [        U5      u  pEUc  U$ Un[        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S.5      S4$ SSKn
U(       a"  U
R!                  U	5        SU	R"                   S3nO U	R%                  5         SU	R"                   S3n[	        SUS.5      $ ! [        [        4 a    [	        SSS.5      S4s $ f = f! [&         aO  n[)        S[+        U5       35        [,        R.                  " 5         [	        S[+        U5      S.5      S4s SnA$ SnAff = f)u   删除文件或文件夹r+   r   Fr9      缺少路径参数r   r   NrU   r   rw   r   u   文件或文件夹不存在rO   r   r  u    删除成功r  Tr   rL   u   删除失败: rM   )r   r  r>   r   r   rt   r   r   r   r   r   rd   r   r   rb   shutilrmtreerc   unlinkr@   rA   rB   r   r   )r  r   r   r9   rE   r   rT   rp   r   r   r  rL   rF   s                r1   delete_file_or_folderr    s   ,A!HHV$	xx6xx/S7<<3C3CN3Su7KLMsRR "?|!L!M
:& __&--c2::4D
!.	M%--/K%--/K##K0 !!##u7TUVX[[[ 	MM+&";#3#3"4MBG  0 01?G4G<== G$ 	Mu~FGLL	M   As1vh'(53q6:;S@@AsW   BF2 F2 A F2 1F $F2 1AF2  F/,F2 .F//F2 2
H<AH HH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S.5      S4$ [        U5      u  pEUc  U$ Un[        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S.5      $ ! [        [        4 a    [	        SSS.5      S4s $ f = f! ["         aO  n
[%        S['        U
5       35        [(        R*                  " 5         [	        S['        U
5      S.5      S4s S	n
A
$ S	n
A
ff = f)u   写入文件内容r+   r   rw   r9   Fr  r   r   NrU   r   r   Tr   r   r   u   文件保存成功r  u   写入文件失败: rM   )r   r  r>   r   r   rt   r   r   r   r   r   rd   r   r   r_   r  r  r@   rA   rB   r   r   )r  r   r   r9   rE   r   rT   rp   r   r   rF   s              r1   write_file_contentr    s   &A!HHV$	((9b)xx/S7<<3C3CN3Su7KLMsRR "?|!L!M
:& __&--c2::4D
!.	M%--/K%--/K##K0
 	   = 	w944HIJJ G$ 	Mu~FGLL	M  A$SVH-.53q6:;S@@AsP   BE* E* A E* 1E 7E*  E'$E* &E''E* *
G4AF>8G>Gz/file-uploadc            	          SSK Jn   SSKnSSKnSSKn S[
        R                  ;  a  [        SSS.5      S4$ [
        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S.5      S4$ [        U5      u  pUc  U	$ U	n
[        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  U " UR                  5      nX-  nU(       a  UR/                  S5      (       a  USU 3-  nUR1                  [3        U5      5         UR/                  S5      (       a-  UR5                  US5       nUR7                  U5        SSS5        OBUR/                  S5      (       a,  UR9                  US5       nUR7                  U5        SSS5        UR;                  5         [        SSU S3S.5      $ UR?                  5       (       a  [        SSU S3S.5      S4$ UR1                  [3        U5      5        URA                  5       n[        SU[3        UR'                  U5      5      URB                  URD                  S.SU S 3S!.5      $ ! [(        [*        4 a    [        SSS.5      S4s $ f = f! , (       d  f       N= f! , (       d  f       N= f! [<         a,  nUR?                  5       (       a  UR;                  5         UeSnAff = f! [<         aO  n[G        S"[3        U5       35        [H        RJ                  " 5         [        S[3        U5      S.5      S#4s SnA$ SnAff = f)$u*   上传文件，支持压缩包自动解压r   )secure_filenameNr   Fu   请选择文件r   r   r+   rw   extractfalsetruer9   rU   r   r   Tr   )r&   z.rarz.7zr%   r   _r&   r   )r%   r   zr:*u
   压缩包 u    上传并解压成功r  r  r  )rc   r+   r   r   u    上传成功)r   r   rL   u   上传文件失败: rM   )&werkzeug.utilsr  zipfiletarfiler  r   filesr   formr>   r-   r   r.   rt   r   r   r   r   r   rd   r   r   r  endswithsaverB   ZipFile
extractallr   r  r@   rb   r   r   r   rA   r   r   )r  r  r  r  r   r	  r  r9   rE   r   rT   rp   r   save_dirsafe_filenamer   	temp_pathzip_reftar_refrF   r   s                        r1   upload_filer+  &  s    /UA&u7HIJCOO}}V$ll&&vr2,,""9g6<<>&H||''7[7<<;K;KN;[==Bu7HIJCOO "?|!L!M
:& $**,33C8@@rJJ"/H"H	M'')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   "#!+M?:PQ    !!5W]OS];^_`beeeIIc)n%>>#D)	 5 5k BC LL $	 %]O=A	 	 	Q G$ 	Mu~FGLL	M 98 87  ##%%$$&.  A$SVH-.53q6:;S@@As   #N4 CN4 N4 A
N4 1L3 A%N4 5(M; M/1M;  M*2)M; (N4 A-N4 3 MN4 MN4 
M'#M; *
M84M; ;
N1'N,,N11N4 4
P>APPPz/download_allc                    ^  [        S5        [        R                  R                  S5      n [	        U 5      u  pUc  U$ Un[        U5      S-  nSnUR                  5       (       aA  [        USSS9 nUR                  5       nSSS5        [        W5      nUR                  S	S5      nS
SK
n	[        R                  " SSS9mTR                  5         U	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! [$         aQ  n[        S['        U5       35        [(        R*                  " 5         [-        SS['        U5       305      S4s SnA$ SnAff = f)u:   下载完整题目包（包含writeup、exp、源代码）u   
=== 下载完整题目包 ===r9   Nr   u   题目r   r   r   rc   r   r&   F)suffixdeletezipc                    >  [         R                  " TR                  5        U $ ! [         a"  n[	        S[        U5       35         S nAU $ S nAff = f)Nu   删除临时文件失败: )r*   removerc   r@   rA   rB   )responserF   temp_zips     r1   remove_file!download_all.<locals>.remove_file  sM    =		(--( O  =23q6(;<<O=s    % 
AAATz_complete.zipzapplication/zipr   u   下载完整题目包失败: rI   u   下载失败: rM   )rA   r   r   r>   rt   r   rb   r   r   r   r  tempfileNamedTemporaryFileclosemake_archiverc   r	   r   r@   rB   r   r   r   )r9   rE   r   rT   r   r   r   writeup_contentr   r  r5  rF   r4  s               @r1   download_allr<    s}   2B/0 ||''7 "?|!L!M
 J',6!  lC':a"#&&( ;7HN+//AN 	..fUK 	HMM#2.zB 
	 
	 MM+,M:&	
 	
- ;::  B-c!fX67>#a&!:;<cAABs<   ;D) 2D) 1DBD) 
D&"D) )
F3AE?9F?Fz/resultc                      [         R                  R                  S5      n U (       a  [        [	        SU S95      $ [        [	        S5      5      $ )u#   结果页面（重定向到index）r9   zgenerate_result.indexr9   )r   r   r>   r   r   r>  s    r1   r   r     s?    
 <<##N3L 7lSTT 7899r3   z	/view-logc            
      F    [        S5        [        R                  R                  S5      n U (       d   [	        SS5        [        [        S5      5      $ SSKnUR                  [        5      nUR                  SU  35        [        U 5      u  p4Uc   [	        S	S5        [        [        S5      5      $ UR                  S
5      nU(       d   [	        SS5        [        [        S5      5      $ [        SU 35        [        U5      nUR                  5       (       d#  [	        SU 3S5        [        [        S5      5      $  [        USSS9 nUR                  5       nSSS5        UR                  SS5      n
UR%                  5       R&                  nUS:  a  U S3nOUS:  a
  US-  S S3nO	US-  S S3nWR)                  S5      S-   n[+        SU U
UUUUS9$ ! , (       d  f       N= f! [          aD  n	[        SU	 35        [	        S[#        U	5       3S5        [        [        S5      5      s Sn	A	$ Sn	A	ff = f! [          ab  n	[        S[#        U	5       35        [,        R.                  " 5         [	        S[#        U	5       3S5        [        [        S5      5      s Sn	A	$ Sn	A	ff = f) u*   查看题目生成日志（原始文本）u!   
=== 查看题目生成日志 ===r9   u   缺少题目ID参数rI   zauth.profiler   Nr   rN   log_fileu   该题目没有生成日志warningu   日志文件路径: u   日志文件不存在: r   r   r   u   读取日志文件失败: rc   rv   i   z Bi   z.2fz KBz MBr|   r)   zpages/generate/log/view.html)r9   r   log_contentr@  	file_size
line_countu   查看日志时出错: )rA   r   r   r>   r   r   r   r   r   r   r   rt   r   rb   r   r   r@   rB   r   r   countr   r   r   )r9   r   r   rE   r   r@  log_pathr   rB  rF   r   rC  file_size_strrD  s                 r1   view_logrH    s   F123 ||''7('2GN344""8,9,HI "?|!L!)73GN344 "%%j1/;GN344$XJ/0 >  +H:6@GN344	5hg6!ffh 7 (++F4EFMMO++	 t(k,M$(4/4C8M(K8=SAM !&&t,q0
 =*6,:)4&.'4(24 	4/ 76 	5.qc23.s1vh7AGN344	5:  1'Ax01'Ax0':/00	1s   AH4 AH4 07H4 (AH4 :G# GG# A3H4 
G G# H4  G# #
H1-9H,&H1'H4 ,H11H4 4
J >AJJ J )N)4r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   app.models.sessionr   app.services.auth.decoratorsr   r*   r7  r   jsonpathlibr   re   r   r   r   r   r[   ImportErrorrA   r   	bp_resultr2   rG   rt   r   router   r   r   r   r  r  r  r+  r<  r   rH   r3   r1   <module>rQ     s   w  w  w  w  w * 7 	    S C  C
 '2	$"Hq&fUp ug&@9  '@9D %&M  'M` !W  "Wr !"C  #CJ &2BA  3BAH (4.A  5.A` 1(A  2(AT &2\A  3\A| 5'24B  34Bl UG,:  -: ug.H1  /H1{  S	
QRSs   F   F43F4