
    TiC4                     P    S r SSKrSSKJrJrJr  SSKJr  SSKJ	r	   " S S5      r
g)ug   
知识库路径配置管理器

提供灵活的知识库路径配置，支持自定义目录结构。
    N)DictAnyOptional)Path)CategoryConfigc                   r   \ rS rSrSrSSSS.rSS/S	/S
S/S.rS)S\S\4S jjrS\	\\
4   4S jrS\	S\	4S jrS)S\S\4S jjrS)S\S\S\4S jjrS\S\\   4S jrS*S\S\S\\   4S jjrS\S\4S jrS)S\S\4S  jjrS\S\\   4S! jrS\4S" jrS\4S# jrS*S$\S\4S% jjrS& rS\	\\
4   4S' jrS(rg)+KnowledgePathConfig   u   知识库路径配置管理器datapromptsoutput)r   r   r   zdocs/writeupsrawzjson/knowledge_db.jsonztools/scripts/choice.pyz	choice.py)writeupsknowledge_dbchoice_scriptNcategory_id	base_pathc           	      x   Xl         [        R                  R                  U5      U l        U(       a  X l        O[        R                  R                  [        5      n[        R                  R                  [        R                  R                  [        R                  R                  [        R                  R                  U5      5      5      5      n[        R                  R                  US5      U l        [        R                  R                  U R
                  U5      U l        U R                  5       U l        g)u   
初始化路径配置管理器

Args:
    category_id: 方向ID
    base_path: 知识库基础路径（默认从项目根目录查找ge10）
ge10N)r   r   querygetcategoryr   ospathabspath__file__dirnamejoincategory_dir_load_paths_configpaths_config)selfr   r   current_filectf_roots        U   /Users/yu22x/Desktop/ddd_副本123/ctf/app/services/category/knowledge_path_config.py__init__KnowledgePathConfig.__init__   s     '&,,00=&N 77??84L wwrwwrwwrwwWcGd7e'fgHWW\\(F;DNGGLLE !335    returnc                 >   U R                   (       d  U R                  R                  5       $ U R                   R                  5       nU(       a8  SU;   a2  US   nU R                  R                  5       nU R	                  X25        U$ U R                  R                  5       $ )u   加载路径配置knowledge_paths)r   DEFAULT_PATHScopyget_advanced_config_deep_update)r"   advanced_configcustom_pathspathss       r%   r    &KnowledgePathConfig._load_paths_config9   s    }}%%**,, --;;=0OC*+<=L&&++-Ee2L!!&&((r(   baseupdatec                     UR                  5        HP  u  p4X1;   aB  [        X   [        5      (       a+  [        U[        5      (       a  U R                  X   U5        ML  XAU'   MR     g)u   深度更新字典N)items
isinstancedictr/   )r"   r4   r5   keyvalues        r%   r/    KnowledgePathConfig._deep_updateM   sM     ,,.JC{z$)T::z%QU?V?V!!$)U3!S		 )r(   subcategoryc                    [         R                  R                  U R                  U R                  S   5      n[         R                  R                  US5      n[         R                  R                  U5      (       a(  U(       a  [         R                  R                  X15      $ U$ U(       a  [         R                  R                  X!5      $ U$ )u   
获取 Writeup 文件路径（从data目录查找）

Args:
    subcategory: 子分类（如：sql_injection, xss等），可选

Returns:
    Writeup 文件目录路径
r   r   r   r   r   r   r!   exists)r"   r=   data_dirwriteups_dirs       r%   get_writeups_path%KnowledgePathConfig.get_writeups_pathU   s     77<< 1 143D3DV3LM ww||Hj977>>,''ww||L>> 77<<66r(   filenamec                 b    U R                  U5      n[        R                  R                  X15      $ )u   
获取单个 Writeup 文件路径

Args:
    filename: 文件名
    subcategory: 子分类，可选

Returns:
    文件完整路径
)rC   r   r   r   )r"   rE   r=   rB   s       r%   get_writeup_file_path)KnowledgePathConfig.get_writeup_file_pathn   s'     --k:ww||L33r(   c                    [         R                  R                  U R                  U R                  S   5      n[         R                  R                  U5      (       d  g[         R                  " U5       H,  u  p4nX;   d  M  [         R                  R                  X15      s  $    UR                  5       n[         R                  " U5       H  u  p4nU Hu  nUR                  S5      (       d  M  UR                  5       R                  U5      (       d  XgR                  5       ;   d  MT  [         R                  R                  X75      s  s  $    M     g)u   
查找 Writeup 文件（从data目录递归搜索）

Args:
    filename: 文件名（支持完整文件名或部分匹配）

Returns:
    文件路径，如果不存在返回None
r   N.md)
r   r   r   r   r!   r@   walklowerendswith
startswith)r"   rE   rA   rootdirsfilesfilename_lowerfiles           r%   find_writeup_file%KnowledgePathConfig.find_writeup_file|   s     77<< 1 143D3DV3LMww~~h'' "$!2D ww||D33 "3
 ")!#!2D==''TZZ\-D-D^-T-TXfjtjtjvXv77<<33  "3
 r(   	data_typeauto_detectc                    [         R                  R                  U R                  U R                  S   5      nU(       a  [         R                  R                  U5      (       aa  U R                  U5      nU HJ  n[         R                  R                  X55      n[         R                  R                  U5      (       d  MH  Us  $    [         R                  R                  X1 S35      $ )u/  
获取数据文件路径（从data目录查找）

Args:
    data_type: 数据类型（knowledge_db, categories, items, taxonomy, metadata）
    auto_detect: 是否自动检测多种可能的文件名（默认True）

Returns:
    数据文件路径，如果不存在且auto_detect=False则返回None
r   .json)r   r   r   r   r!   r@   _get_possible_data_filenames)r"   rV   rW   rA   possible_namesrE   	test_paths          r%   get_data_file_path&KnowledgePathConfig.get_data_file_path   s     77<< 1 143D3DV3LM 277>>(33!>>yIN*GGLL<	77>>),,$$ + ww||H5&9::r(   c                     U R                   R                  5       nU S3U S3SSSSS/U S3S	S
S/U S3S/U S3SS/U S3S/S.nUR                  X S3/5      $ )u   
获取数据类型可能的文件名列表（支持多种命名约定）

Args:
    data_type: 数据类型

Returns:
    可能的文件名列表
z_knowledge_db.jsonz_db.jsonzknowledge_db.jsonzvulnerability_db.jsonzalgorithm_db.jsonztechnique_db.jsonzskill_db.jsonz_categories.jsonzcategories.jsonzvulnerability_taxonomy.jsonztaxonomy.jsonz_items.jsonz
items.jsonz_taxonomy.jsonzvulnerability_taxonomy_v3.jsonz_metadata.jsonzmetadata.json)r   
categoriesr7   taxonomymetadatarY   )r   rL   r   )r"   rV   r   name_mappings       r%   rZ   0KnowledgePathConfig._get_possible_data_filenames   s     &&,,.
 -12-x(#'## -/0!-	 -{+
 -~.0 -~.3
> 	k,?+@AAr(   script_namec                 L   [         R                  R                  U R                  U R                  S   5      n[         R                  R                  US5      n[         R                  R                  U5      (       d  UnU(       a  [         R                  R                  X15      $ U$ )u   
获取工具脚本路径（从data目录查找）

Args:
    script_name: 脚本名称（如：choice.py），如果为None返回脚本目录

Returns:
    脚本路径
r   scriptsr?   )r"   re   rA   scripts_dirs       r%   get_tool_script_path(KnowledgePathConfig.get_tool_script_path   ss     77<< 1 143D3DV3LM ggll8Y7ww~~k**"K77<<99r(   c                 H   [         R                  R                  U R                  U R                  S   5      n[         R                  R                  U5      (       d  g[         R                  " U5       H,  u  p4nX;   d  M  [         R                  R                  X15      s  $    g)u   
查找工具脚本（从data目录递归搜索）

Args:
    script_name: 脚本名称

Returns:
    脚本路径，如果不存在返回None
r   N)r   r   r   r   r!   r@   rK   )r"   re   rA   rO   rP   rQ   s         r%   find_tool_script$KnowledgePathConfig.find_tool_script   sw     77<< 1 143D3DV3LMww~~h'' "$!2D#ww||D66 "3 r(   c                     U R                   (       a1  U R                   R                  (       a  U R                   R                  $ [        R                  R	                  U R
                  U R                  S   5      $ )u   
获取 Prompt 模板路径

注意：CLAUDE.md 文件会在运行时由 guideline_manager 根据难度自动生成，
不需要手动创建或编辑。此方法仅保留用于向后兼容。
prompt_template)r   prompt_template_pathr   r   r   r   r!   r"   s    r%   get_prompt_template_path,KnowledgePathConfig.get_prompt_template_path  sN     ==T]]??==555ww||D--t/@/@AR/STTr(   c                 p    [         R                  R                  U R                  U R                  S   5      $ )u   
获取配置文件路径（已废弃）

注意：config.json 文件已被废弃，所有配置都存储在数据库中。
此方法仅保留用于向后兼容，实际不会创建或使用该文件。
config)r   r   r   r   r!   rq   s    r%   get_config_file_path(KnowledgePathConfig.get_config_file_path  s*     ww||D--t/@/@/JKKr(   	recursivec                    / n[         R                  R                  U R                  U R                  S   5      n[         R                  R                  U5      (       d  U$ U(       a  [         R                  " U5       H  u  pEnU H  nUR                  S5      (       d  M  [         R                  R                  [         R                  R                  XG5      U5      nUR                  UU[         R                  R                  XG5      XC:w  a  [         R                  R                  XC5      OSS.5        M     M     O[         R                  " U5       Hv  n[         R                  R                  X75      n	UR                  S5      (       d  M:  [         R                  R                  U	5      (       d  M`  UR                  UUU	SS.5        Mx     [        US S9$ )u   
列出所有 Writeup 文件（从data目录查找）

Args:
    recursive: 是否递归搜索子目录

Returns:
    Writeup 文件列表
r   rJ   N)rE   relative_path	full_pathr=   c                     U S   $ )NrE    )xs    r%   <lambda>7KnowledgePathConfig.list_all_writeups.<locals>.<lambda>H  s    a
mr(   )r:   )r   r   r   r   r!   r@   rK   rM   relpathappendlistdirisfilesorted)
r"   rx   r   rA   rO   rP   rQ   rE   rel_path	file_paths
             r%   list_all_writeups%KnowledgePathConfig.list_all_writeups"  sT    77<< 1 143D3DV3LMww~~h''O%'WWX%6!E %H((//#%77??277<<3OQY#Z (0-5)+d)ENRN^277??4+Jdh	)  !& &7 JJx0GGLL<	$$U++y0I0IOO$,)1%.'+	%  1 h$;<<r(   c                    [         R                  R                  U R                  U R                  S   5      [         R                  R                  U R                  S5      [         R                  R                  U R                  SS5      [         R                  R                  U R                  S5      /nU H  n[         R
                  " USS9  M     g)u!   确保所有必要的目录存在r   r   historyr   T)exist_okN)r   r   r   r   r!   makedirs)r"   directories	directorys      r%   ensure_directories&KnowledgePathConfig.ensure_directoriesJ  s     GGLL**D,=,=f,EFGGLL**I6GGLL**IyAGGLL**H5	
 %IKK	D1 %r(   c                 D   U R                   U R                  [        R                  R	                  U R                  U R
                  S   5      [        R                  R	                  U R                  S5      [        R                  R	                  U R                  S5      S.$ )u0   获取路径配置摘要（用于前端显示）r   r   r   )r   r   r   r   r   )r   r   r   r   r   r!   rq   s    r%   get_paths_summary%KnowledgePathConfig.get_paths_summaryV  sq      --GGLL!2!2D4E4Ef4MNww||D$5$5yAggll4#4#4h?
 	
r(   )r   r   r   r   r!   )N)T)__name__
__module____qualname____firstlineno____doc__r,   LEGACY_PATHSstrr&   r   r   r    r/   rC   rG   r   rT   boolr]   listrZ   ri   rl   rr   rv   r   r   r   __static_attributes__r}   r(   r%   r	   r	      s]   ( M %e,123[AL6C 6C 66)DcN )(" "t "S C 24c 4 4s 4# (3- <;C ;d ;hWZm ;2-Bc -Bd -B^ s *C HSM ,
U# 
ULc L&=4 &=4 &=P
2
4S> 
r(   r	   )r   r   typingr   r   r   pathlibr   app.models.database.modelsr   r	   r}   r(   r%   <module>r      s'   
 
 & &  5Q
 Q
r(   