
    [7_ib                        S SK JrJrJrJrJrJrJrJr  SSK	J
q
JrJrJrJrJrJrJrJrJr  S SKrS SKrS SKrS SKJr  \" S\5      rSr\R9                  SS	/S
9\S 5       5       r\R9                  SS/S
9\S 5       5       rS rSS jr S/r!g)    )	Blueprintrender_templatejsonifyredirecturl_forgcurrent_appflash   )
generation_statusgeneration_outputreset_log_idload_generation_resultset_current_challenge_id"update_conversation_logs_challengecurrent_challenge_idcancel_generationreset_cancel_flagis_generation_cancelledN)login_requiredgenerateFz/auto-startGET)methodsc                      SSK Jn Jn  U R                  S0 5      nU R                  SS5      nU(       a  U(       d!  SSK JnJnJn  U" SS5        U" U" S	5      5      $ U" S
5      $ )uA   自动启动页面：使用 JavaScript 自动调用 API 并跳转r   )sessionr   	form_datacategory_idweb)r
   r   r   u   请先完成题目配置warningzwizard.select_categoryz%pages/generate/wizard/auto_start.html)flaskr   r   getr
   r   r   )r   r   r   r   r
   r   r   s          8/Users/yu22x/Desktop/ge/ctf/app/routes/generator/core.py
auto_startr#      s^     / K,I++mU3KK22()4 89:: BCC    z/start_generatePOSTc                     SSK n U R                  [        5      nUR                  S 5         SSKJn  [        [        S5      (       a/  [        R                  (       a  [        R                  R                  OSnU(       d  [        SSS.5      $ UR                  U5      u  pEU(       d  [        SUS.5      $ SSKJn  SS	KJn  UR!                  S
S5      nUR!                  S0 5      n	SSKJn
Jn  UR(                  nSnSnU	R!                  S5      nUR                  SU S[+        U5       S35        UR                  S[-        U	R/                  5       5       35        U(       Ga=   [1        U5      nUR                  SU 35        U
R2                  R!                  U5      nU(       a  UR                  SUR4                   SUR6                   SUR8                   35        UR8                  U:X  d  UR8                  ci  UR6                  U;   a+  UR6                  nUR                  SUR6                   35        O|SnUR                  SUR6                   SUR:                   35        ONUR=                  SU SUR8                   SU S35        SnO&UR=                  SU 35        OUR                  S"5        U(       d   U
RC                  U5      nU(       ah  UR6                  U;   a+  UR6                  nUR                  S#UR6                   35        O-SnUR                  S$UR6                   SUR:                   35        URI                  X5      u  pEnU(       d  [        SUS.5      S&4$ URK                  X5      nUR!                  S'5      nUR!                  S(5      nUR!                  S)5      nUR!                  S*5      nUR!                  S+S,5      nUR                  S-U S.U S/U S0U 35        URM                  UUUUUU	5      u  pEU(       d  [        SU=(       d    S1S.5      $ UR                  S2U S35        [O        U[P        5      (       a*  S3U;   a$  URS                  5       nUS3	 UR=                  S45        UR                  S5U 35        UR                  S6U 35        UR                  S7U 35        UR                  S8U 35        UR                  S9U 35        UR                  [U        U5      S::  a	  S;USS:  S<3OS;U 35        UR                  S=U S>35        SS?K+J,n  UR2                  R!                  U5      nU(       a  UR4                  OUR[                  5       n[\        R^                  " 5       n[a        5         S@SAK1J2nJ3n  U" 5       nSSK4n[k        URm                  5       5      SSB R[                  5       n S@SCK1J7n!J8n"  U"   UUU USDS[r        Rr                  Ru                  5       [r        Rr                  Ru                  5       U	SSSE.U!U'   SSS5        UR                  SFU SGU  SHU 35        S@SIK;J<n#J=n$  SSK>n%U$   SJSK0 SSLSSSSU%R}                  5       UUSM.U#U'   SSS5         U(       a  UR                  5       n&U&(       a  [U        U&5      OSn'0 n(U&(       aR  [        U&5       HC  u  n)n*[O        U*[P        5      (       a  U*R!                  SNSOU) 35      U(U)'   M5  [k        U*5      U(U)'   ME     U$   U'U#U   SP'   U(U#U   SQ'   U'S:  a$  [        U'5       V)s0 s H  n)U)SR_M     sn)U#U   SS'   O0 U#U   SS'   SSS5        UR                  STU' SU[-        U(R                  5       5       35        OU$   SU#U   SP'   0 U#U   SS'   SSS5        [        R                  " [        UUUUUUUUUUU	4SW9n+SJU+lF        U+R                  5         [        SXSYUSZU 3S[.5      $ ! [>        [@        4 a"  nUR=                  S U S!U 35         SnAGNLSnAff = f! [D         a  nURG                  S%U 35         SnAGNSnAff = f! , (       d  f       GN-= f! , (       d  f       GN= fs  sn)f ! , (       d  f       GN1= f! , (       d  f       N= f! [D         aQ  nUR=                  SVU 35        U$   SU#U   SP'   0 U#U   SS'   SSS5         SnAGM;  ! , (       d  f        SnAGNN= fSnAff = f! [D         ah  nUR                  S\[k        U5       35        [        R                  " 5         [k        U5      [        S'   [        SS][k        U5       3S.5      s SnA$ SnAff = f)^u   开始生成题目r   N)GenerationValidatorusererroru   用户未登录)statusmessage)r   )FormDataExtractorr   r   r   )AIProviderConfigAIProviderTypeaugmentai_config_idu&   从 form_data 获取的 ai_config_id: u
    (类型: )u   form_data 中的键: u   尝试加载 AI 配置 ID: u   找到 AI 配置: z, provider_type: z, user_id: u"   使用用户选择的 CLI 模式: apiu"   使用用户选择的 API 模式: z - u0   用户选择的 AI 配置不属于当前用户: u    (配置用户ID: u   , 当前用户ID: u   未找到 AI 配置 ID: u   无效的 AI 配置 ID: u
   , 错误: u;   form_data 中未找到 ai_config_id，将使用默认配置u   使用默认 CLI 模式: u   使用默认 API 模式: u3   获取 AI 配置失败，回退到 Augment 模式: i  languagevulnerabilitiesscene
difficultyextra_requirements u   提取的参数 - language: z, difficulty: z, vulnerabilities: z	, scene: u   参数验证失败u"   所有参数验证通过 (方向: 
sub_scenesuB   检测到场景数据中包含 sub_scenes 字段，已自动移除u   方向: u   语言: u   漏洞/知识点: u   场景: u   难度: 2   u   额外要求: z...u   当前用户ID: u   ，将传递给生成线程)CategoryConfigr   )create_task_idupdate_task   )tasks_status_tasks_lockrunning)user_idr   namer6   r*   progress
created_at
updated_atr   log_filechallenge_idu   创建新任务: z (u   )，用户: generation_statusesgeneration_lockTu$   任务已开始，正在生成中...F)generation_startedr+   step_statusescurrent_step	completedkey_infor)   rG   log_positionrE   task_idai_moderC   u   阶段 total_stagesstage_nameswaitingrM   u
   初始化 u    个阶段: u   初始化阶段总数失败: )targetargssuccessu   生成进程已启动z/generate/tasks/)r*   r+   rR   redirect_urlu   启动生成进程时出错: u   启动生成进程失败: )Llogging	getLogger__name__info app.services.generator.validatorr'   hasattrr   r(   idr   validate_ai_configr    r    app.services.generator.extractorr,   r!   app.models.databaser-   r.   CLI_PROVIDERStypelistkeysintqueryrC   provider_typerB   modelr   
ValueError	TypeErrorget_effective_config	Exceptiondebugvalidate_form_dataextract_generation_paramsvalidate_parameters
isinstancedictcopylenapp.models.database.modelsr;   upperr	   _get_current_objectr   tasksr<   r=   uuidstruuid4r?   r@   datetimenowutilsrJ   rK   time
get_stages	enumeraterangevalues	threadingThreadgenerate_challengedaemonstartr)   	traceback	print_excr   ),r[   loggerr'   rB   is_valid	error_msgr   r,   r   r   r-   r.   cli_providersrS   selected_ai_configr0   emissing_fieldsparamsr3   r4   r5   r6   r7   r;   categorycategory_nameappr<   r=   rR   r}   	task_namer?   r@   rJ   rK   r   stagesrT   rU   istagethreads,                                               r"   start_generater   "   s	    x(F
KK$%
mH&q&11aff!&&))$!,  
 2DDWM!$   	"Fkk-7KKR0	 	I&44! !}}^4<\N*UYZfUgThhijk+D1A,B+CDEW"<09,HI%5%;%;%?%?%M"%KK"45G5L5L4MM^_q__  _A  AL  M_  Mg  Mg  Lh  !i  j)11W<@R@Z@Z@b-;;}L&8&F&FG"KK*LM_MmMmLn(op&+G"KK*LM_MmMmLnnq  sE  sK  sK  rL  )M  N)YZfYggy  {M  {U  {U  zV  Vh  ip  hq  qr  (s  t-1*NN%=l^#LM KKUV "
X%5%J%J7%S"%)77=H"4"B"B&?@R@`@`?a$bc"'&?@R@`@`?aadewe}e}d~$  A
 /B.T.TU`.l+^!$    #<<[T::j) **%67

7#ZZ-
#ZZ(<bA 	28*N:,Vijyiz  {D  EJ  DK  L  	M 2EE?E:y
 !$<(<  
 	8QGH eT""|u'<JJLEl#NN_`h{m,-hxj)*((9:;hug&'hzl+,SI[E\_aEan%7%<$=SAiw  yK  xL  hM  	N 	&wi/JKL 	>!''++K8)1{7H7H7J --/ 	 	7 " 	

%bq)//1	 	5"*!(#&//335&//335&  $%L!  	'y9+\'ST 	@&*A!# !"   !"iik"",( "	C!,,..4s6{! !$-f$55%eT22-2YYv}-MKN-0ZKN	 %6 %CO'0@BM'0?#a'_deq_rHs_rZ[I_rHs+G4_EHJ+G4_E % jl4HZHZH\C]B^_`$CD'0@DF'0A % !!);8_^ceoqxz}  @G  I[  ]h  jq  s|  C}  ~..wi8	
  	K 	* W!9,zRSQTUVVW   XRSTRUVWWXT [( _H It %_ %_  	CNN:1#>? ?@#G,^<@B#G,_= !	C$  	4SVH=>%(V'"3CF8<
  		s  A c 'c 5B-c #C_ 3c 4-_ !c "'_ 	c 
_ c 8A` 
c -` 8*c #B9c F#c  A
`0
0c :!ac $Ba< ,$aaa/6a< %c &a< (a+9a< Ac `_<6c <`c 
`-`("c (`--c 0
`?:c 
ac a
a(#a< +
a95a< 8c 9a< <
ccb<-c5c <
c	c	c ccc 
e$Aeeec                    SSK nSSSSSS.nUR                  S	U UR                  5      nU(       GaI  UR                  S
5      R	                  5       US'   UR                  S5      R	                  5       US'   UR                  S5      R	                  5       US'   UR                  S5      R	                  5       US'   UR                  S5      R	                  5       US'   SSKnUR                  [        5      nUR                  S5        UR                  SUS    35        UR                  SUS    35        UR                  SUS    35        UR                  SUS    35        UR                  SUS    35        U$ UR                  SU UR                  5      nU(       Ga  UR                  S
5      R	                  5       US'   UR                  S5      R	                  5       US'   UR                  S5      R	                  5       US'   UR                  S5      R	                  5       US'   SSKnUR                  [        5      nUR                  S5        UR                  SUS    35        UR                  SUS    35        UR                  SUS    35        UR                  SUS    35        OGSSKnUR                  [        5      nUR                  S5        UR                  SU UR                  5      nW(       a  UR                  S
5      R	                  5       US'   UR                  S5      R	                  5       US'   UR                  S5      R	                  5       US'   UR                  S5        UR                  SUS    35        UR                  SUS    35        UR                  SUS    35        U$ UR                  SXR                  5      n	U	(       a;  U	R                  S
5      R	                  5       US'   UR                  S US    35        U$ UR                  S!5        UR                  S"U5      n
U
(       a+  U
R                  S
5      US'   UR                  S#US    35        U$ )$u   从 writeup 中提取题目信息

Args:
    writeup: writeup 内容
    dir_name: 输出目录名称

Returns:
    题目信息字典
r   Nu   未命名题目r8   u	   未设置WEBu	   1-2小时)rC   descriptionr6   r   estimated_timeu   \|\s*题目名\s*\|\s*题目描述\s*\|\s*类型\s*\|\s*预计解题时间\s*\|\s*难度\s*\|\s*是否提供源码\s*\|.*?\n\|[:\-\s\|]+\|.*?\n\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*[^|]+\s*\|r   rC      r      r      r      r6   u&   成功从6列表格提取题目信息:u      - 题目名: u      - 题目描述: u      - 类型: u      - 预计时间: u      - 难度: u   \|\s*题目名\s*\|\s*题目描述\s*\|\s*类型\s*\|\s*预计解题时间\s*\|.*?\n\|[:\-\s]+\|[:\-\s]+\|[:\-\s]+\|[:\-\s]+\|.*?\n\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|u&   成功从4列表格提取题目信息:u?   未能从新格式表格提取题目信息，尝试旧格式...u   \|\s*题目名\s*\|\s*类型\s*\|\s*难度\s*\|.*?\n\|[:\-\s]+\|[:\-\s]+\|[:\-\s]+\|.*?\n\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|u%   从旧格式表格提取题目信息:z)^#\s+([^#\n]+?)(?:\s*-\s*[Ww]riteup)?\s*$u   从标题提取题目名: u6   表格提取失败，从目录名提取题目名称...z\d{8}_\d{6}_(.+)u"      - 从目录名提取题目名: )researchDOTALLgroupstripr[   r\   r]   r^   r   	MULTILINE)writeupdir_namer   challenge_infotable_match_6r[   r   table_matchold_table_matchtitle_matchmatchs              r"   $_extract_challenge_info_from_writeupr     sc     "!%N II	f 	
		M !.!4!4Q!7!=!=!?v(5(;(;A(>(D(D(F}%%2%8%8%;%A%A%Cz"+8+>+>q+A+G+G+I'('4':':1'='C'C'E|$""8,<>&~f'=&>?@).*G)HIJmN:$>#?@A).9I*J)KLMmN<$@#ABCr m iiN II
 %0%6%6q%9%?%?%AN6",7,=,=a,@,F,F,HN=))4):):1)=)C)C)EN:&/:/@/@/C/I/I/KN+,&&x0FKK@BKK*>&+A*BCDKK-n].K-LMNKK-z(B'CDEKK-n=M.N-OPQ&&x0FNN\] iiC 		O %4%:%:1%=%C%C%EN6")8)>)>q)A)G)G)IN:&+:+@+@+C+I+I+KN<(KK?AKK*>&+A*BCDKK-z(B'CDEKK-|(D'EFG  ))$PRY[g[ghK)4):):1)=)C)C)Ev&89O8PQR  WX		"5x@-2[[^N6*KK"D^TZE[D\ ]^r$   c                 
  ^	^^ T	(       aK  SSK JmJm  T" T	5      nU(       a4  T" T	SS9  UU	U4S jn[        R                  " USS9nUR                  5         Uc  S	S
KJn  UR                  " 5       nUR                  5          S	SK
nUR                  [        5      n S	SKJn  U" UUT	S9nSnU
(       a)  SU
;   a#   [        U
S   5      nUR!                  SU 35        UR+                  U UUUUUUU
US9	nUS   S:X  ax  UR)                  S5      nU(       a_  SSKJn  U" U5        T	(       aJ  SSKJnJn  U   T	U;   a#  SUT	   S'   SUT	   S'   SU 3UT	   S'   UUT	   S'   SSS5        SSK Jm  T" T	SUS9  OGUR)                  SS5      nT	(       a-  SSKJnJn  U   T	U;   a  UUT	   S'   SU 3UT	   S'   SSS5        O UR!                  S%5         SSS5        g! ["        [$        4 a'    UR'                  SU
R)                  S5       35         GN0f = f! , (       d  f       N= f! , (       d  f       Nt= f! [4         a  nUR7                  S [9        U5       3SS!9  T	(       ar  SSK Jm  T" T	S"[9        U5      S#9  SSKJnJn  U   T	U;   a%  [9        U5      UT	   S'   S$[9        U5       3UT	   S'   SSS5         SnAGM   ! , (       d  f        SnAGN= f SnAGNSnAff = f! UR!                  S%5        f = f! , (       d  f       g= f)&u  生成题目的主函数，在单独的线程中运行（已重构为使用服务层）

Args:
    language: 编程语言
    vulnerabilities: 漏洞列表
    scene: 场景
    difficulty: 难度
    user_id: 用户ID，从主线程中传递过来的
    app: Flask应用对象，从主线程中传递过来的
    ai_mode: AI 模式，'augment' 或 'api'
    extra_requirements: 用户额外要求
    category_id: 方向ID
    task_id: 任务ID
    form_data: 完整的表单数据
r   )r=   get_taskrA   )r*   c                    > SS K n SSKJn  SnSnX2:  a   T	" T
5      nU(       aa  U" T
5      nU(       aR  UR                  S5      T
:X  a=  UR                  S5      (       a
  T" T
US   S9  SU;   a  T" T
UR                  SS5      S	9  T	" T
5      nU(       a  UR                  S
5      S;   a  g U R	                  S5        US-  nX2:  a  M  g g ! [
         a7  nSS KnUR                  [        5      nUR                  SU 35         S nAg S nAff = f)Nr   r   )get_generation_statusi  rR   rG   )rG   rD   )rD   r*   )rO   failed	cancelledu    同步日志文件路径失败: )
r   r   r   r!   sleeprp   r[   r\   r]   r   )r   r   max_iterations	iterationtasktask_statusr   r[   r   r   rR   r=   s            r"   sync_log_file)generate_challenge.<locals>.sync_log_file  s    8!%	0'0*?*HK*{y/IW/T#.??:#>#>$/+jBY$Z#-#<$/+//R\^_B`$a'0DHHX$6:^$^!

1!Q	  0 % &!(!2!28!<)I!'MN	s   BC
 +C
 

D-DDT)rW   r   Nr   )r	   )ChallengeGeneratorService)rB   r   rR   r0   u%   传递 AI 配置 ID 到生成服务: u   无效的 ai_config_id: )	r3   r4   r5   r6   r7   rS   r   r   r0   r*   rY   rH   )r   rI   u   生成成功!r+   rO   z/generate/result?challenge_id=rZ   )r=   )r*   rH   u   生成失败r)   u   生成失败: u   生成进程中发生错误: )exc_infor   )r*   r)   u   生成出错: u$   === 生成题目主进程结束 ===
)r|   r=   r   r   r   r   r    r	   r{   app_contextr[   r\   r]   app.services.generator.servicer   ri   r^   rm   rn   r   r!   r   r   r   rJ   rK   rp   r)   r~   )r3   r4   r5   r6   rB   r   rS   r7   r   rR   r   existing_taskr   sync_threadr	   r[   r   r   servicer0   resultrH   r   rJ   rK   r   r   r   r=   s            `                 @@r"   r   r     s   & 0 )	24 $**-MK {%--/		""8,R	AP/'G  L^y8_#&y'@#ALKK"G~ VW %%! /%#5#) & 
F h9,%zz.9?,\: O,&*==JY 3G <Y GLP 3G <[ IQop|o}O~ 3G <^ LO[ 3G <^ L - 7#G*50<>
 #JJy.A	K("&99DM/8AHVW`VaFb/8C ) . KK?@m 
	( #I. _NN%=immN>[=\#]^_8 -_" )
  	\LL8QADLQ .GHCFC H$"55@CA+G4W=DRSVWXSYRZB[+G4Y? %____ 		\  KK?@m 
	s    K4H19"GAH12*HH12K3#H1H 0H18K:K43HH1HH1
H	H1 
H.	*H1-K.H11
K;AK?,J:+K3K:
KKKKKKKK11K44
Lbp)NNr/   r8   r   NN)"r    r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   app.services.auth.decoratorsr   r]   r   generate_challenge_runningrouter#   r   r   r   __all__ r$   r"   <module>r      s    _ _ _ q  q  q    7 z8$ # -%)D  *D" 
fX.v  /vphTRAl &r$   