
    M'QiU                         S r SSKrSSKrSSKrSSKJrJrJrJr  SSK	J
r
  SSKJrJrJrJrJr  SSKJr   " S S5      rg)	uZ   
知识库管理服务

提供知识分类、知识点、Writeup 文件的管理功能。
    N)OptionalListDictAnysecure_filename)dbCategoryConfigKnowledgeCategoryKnowledgeItemWriteupFile)KnowledgePathConfigc                       \ rS rSrSrS4S\4S jjrS\S\4S jr S5S\S	\S
\S\S\	4
S jjr
S\S\\\4   S\\	   4S jrS\S\4S jrS\S\\	   4S jr     S6S\S	\S\S\S\\   S\\   S\\   S\4S jjrS\S\\\4   S\\   4S jrS\S\4S jr  S7S\S\S\S\\   4S jjrS\S\S\\   4S jrS4S\S\S\\\4   4S jjrS\S\\\\4      4S  jrS\S!\S\4S" jr   S8S\S!\S#\S\S$\S%\S&\S\4S' jjrS(\S\\\4   S\\   4S) jrS(\S\4S* jr S\S\\   4S+ jr!S(\S\\   4S, jr"S\S-\\\4   S\\\4   4S. jr#S\S\\\4   4S/ jr$ S4S\S\S\\\4   4S0 jjr%S\S\\\4   4S1 jr&S4S\S\S\\\\4      4S2 jjr'S3r(g)9KnowledgeService   u   知识库管理服务N	base_pathc                     U=(       dA    [         R                  R                  [         R                  R                  [        5      S5      U l        g)u=   
初始化服务

Args:
    base_path: 知识库基础路径
z../../../ge10N)ospathjoindirname__file__r   )selfr   s     Q   /Users/yu22x/Desktop/ddd_副本123/ctf/app/services/category/knowledge_service.py__init__KnowledgeService.__init__   s,     #^bggll277??83Lo&^    category_idreturnc                 ,    [        XR                  5      $ )up   
获取知识库路径配置管理器

Args:
    category_id: 方向ID

Returns:
    KnowledgePathConfig 实例
)r   r   r   r   s     r   get_path_config KnowledgeService.get_path_config   s     #;??r   nameicondescriptionc                 |   [         R                  R                  [         R                  R	                  [
        R                  5      5      R                  US9R                  5       =(       d    Sn[        UUUUUS-   S9n[         R                  R                  U5        [         R                  R                  5         U$ )u   创建知识分类r   r      )r   r$   r%   r&   
sort_order)r	   sessionqueryfuncmaxr   r*   	filter_byscalaraddcommit)r   r   r$   r%   r&   	max_orderkcs          r   create_knowledge_category*KnowledgeService.create_knowledge_category,   s     JJ$$RWW[[1B1M1M%NOYY# Z 

&( 	 ## 1}
 	

r


	r   kc_idupdatesc                    [         R                  R                  U5      nU(       d  gSU;   a
  US   Ul        SU;   a
  US   Ul        SU;   a
  US   Ul        SU;   a
  US   Ul        [        R                  R                  5         U$ )u   更新知识分类Nr$   r%   r&   r*   )
r   r,   getr$   r%   r&   r*   r	   r+   r2   )r   r7   r8   r4   s       r   update_knowledge_category*KnowledgeService.update_knowledge_category?   s    $$((/WfoBGWfoBGG#$]3BN7"#L1BM


	r   c                     [         R                  R                  U5      nU(       d  g[        R                  R                  U5        [        R                  R                  5         g)u   删除知识分类FT)r   r,   r:   r	   r+   deleter2   )r   r7   r4   s      r   delete_knowledge_category*KnowledgeService.delete_knowledge_categoryQ   sC    $$((/


"


r   c                     [         R                  R                  US9R                  [         R                  5      R                  5       $ )u$   获取方向下的所有知识分类r(   )r   r,   r/   order_byr*   allr!   s     r   get_knowledge_categories)KnowledgeService.get_knowledge_categories[   s9     &&00[0IRR((

#%	r   knowledge_category_idtagsdifficulty_range	languagesc                 *   [        UUUUSS9nU(       a  UR                  U5        U(       a  UR                  U5        U(       a  UR                  U5        [        R
                  R                  U5        [        R
                  R                  5         U$ )u   创建知识点T)r   rF   r$   r&   enabled)r   set_tagsset_difficulty_rangeset_languagesr	   r+   r1   r2   )	r   r   r$   rF   r&   rG   rH   rI   items	            r   create_knowledge_item&KnowledgeService.create_knowledge_itemc   sv     #"7#
 MM$%%&67y)


t


r   item_idc                    [         R                  R                  U5      nU(       d  gSU;   a
  US   Ul        SU;   a
  US   Ul        SU;   a
  US   Ul        SU;   a  UR                  US   5        SU;   a  UR                  US   5        SU;   a  UR                  US   5        SU;   a
  US   Ul	        S	U;   a
  US	   Ul
        [        R                  R                  5         U$ )
u   更新知识点Nr$   rF   r&   rG   rH   rI   rK   r*   )r   r,   r:   r$   rF   r&   rL   rM   rN   rK   r*   r	   r+   r2   )r   rR   r8   rO   s       r   update_knowledge_item&KnowledgeService.update_knowledge_item}   s    ""&&w/WDI"g-)01H)ID&G#&}5DWMM'&/*(%%g.@&AB'!w{34"9-DL7"%l3DO


r   c                     [         R                  R                  U5      nU(       d  g[        R                  R                  U5        [        R                  R                  5         g)u   删除知识点FT)r   r,   r:   r	   r+   r>   r2   )r   rR   rO   s      r   delete_knowledge_item&KnowledgeService.delete_knowledge_item   sC    ""&&w/


$


r   enabled_onlyc                     [         R                  R                  US9nU(       a  UR                  US9nU(       a  UR                  SS9nUR                  [         R                  5      R                  5       $ )u   获取知识点列表r(   )rF   T)rK   )r   r,   r/   rB   r*   rC   )r   r   rF   rY   r,   s        r   get_knowledge_items$KnowledgeService.get_knowledge_items   sb     ##--+-F OO:OOPEOODO1E~~m667;;==r   languagec                     U R                  U5      n/ nU H[  nUR                  (       a   [        R                  " UR                  5      O/ nU(       a  X&;   d  SU;   d  MJ  UR	                  U5        M]     U$ )u/   根据语言获取知识点（仅 Web 方向）   通用)r[   rI   jsonloadsappend)r   r   r]   itemsresultrO   rI   s          r   get_knowledge_items_by_language0KnowledgeService.get_knowledge_items_by_language   s]    ((5D6:nn

4>>2"I 5Y9Nd# 
 r   knowledge_item_idc                    SSK Jn  [        R                  R	                  U5      nU(       d  [        SU S35      eU R                  U5      nUR                  5         UR                  5       n[        R                  " USS9  U" UR                  5      nU(       d  Sn[        R                  R                  Xx5      n	UR                  5       R                  S5      n
[!        U	S	SS
9 nUR#                  U
5        SSS5        SnU(       a  U R%                  UUU	U
S9nUU	['        U
5      U(       a  UR(                  S.$ SS.$ ! , (       d  f       NN= f)u   导入单个 Writeup 文件r   r   u   方向 u
    不存在Texist_okz
writeup.mdutf-8wencodingNrg   filename	file_pathcontent)rp   rq   size
writeup_id)werkzeug.utilsr   r
   r,   r:   
ValueErrorr"   ensure_directoriesget_writeups_pathr   makedirsrp   r   r   readdecodeopenwritecreate_writeuplenid)r   r   filerg   r   categorypath_configwriteups_dirsafe_filenamerq   rr   fwriteup_records                r   import_single_writeup&KnowledgeService.import_single_writeup   s8   2!''++K8w{m:>?? **;7&&("446
L40 (6(MGGLL=	 ))+$$W- )S73qGGG 4 !00"3&#	 1 N &"L/=.++	
 	
 DH	
 	
 43s   &E  
Ec                 v   / nU R                  U5      nUR                  SS9nU GH  nUS   nUS   n[        R                  R	                  U5      (       d  M4  [        R
                  " U5      n[        R                  R                  US9R                  5       n	UR                  UUUR                  SU5      UR                  S5      UR                  UR                  U	SLU	(       a  U	R                  OSU	(       a'  U	R                  (       a  U	R                  R                   OSS	.	5        GM	     [#        US
 S9$ )uH   列出方向下所有 Writeup 文件（包括文件系统和数据库）T)	recursiverp   	full_pathrp   relative_pathsubcategoryN)	rp   rq   r   r   rs   modifiedin_databasert   knowledge_itemc                     U S   $ )Nrp    )xs    r   <lambda>4KnowledgeService.list_all_writeups.<locals>.<lambda>  s    AjMr   )key)r"   list_all_writeupsr   r   existsstatr   r,   r/   firstrb   r:   st_sizest_mtimer   r   r$   sorted)
r   r   rd   r   writeup_fileswp_inforp   rq   r   	db_records
             r   r   "KnowledgeService.list_all_writeups   s    **;7#555E$Gz*H,Iww~~i((wwy) (--777JPPR	 (!*%,[[(%K#*;;}#= LL $#,D#82;),,GPU^UmUmi&>&>&C&Csw
 
 %, f"9::r   rp   c                    U R                  U5      nUR                  U5      nU(       a:  [        R                  R	                  U5      (       a  [        R
                  " U5        [        R                  R                  US9R                  5       nU(       a=  [        R                  R                  U5        [        R                  R                  5         g)u?   删除 Writeup 文件（同时删除文件和数据库记录）r   T)r"   find_writeup_filer   r   r   remover   r,   r/   r   r	   r+   r>   r2   )r   r   rp   r   rq   writeups         r   delete_writeup_file$KnowledgeService.delete_writeup_file	  s     **;711(;		22IIi  ##--x-@FFHJJg&JJr   quality
is_primaryrr   rq   c                     [        UUUUUUUU(       a  [        UR                  S5      5      OSS9n[        R                  R                  U5        [        R                  R                  5         U$ )u   创建 Writeup 记录rk   r   )rg   rp   r   r]   r   rr   rq   	file_size)r   r   encoder	   r+   r1   r2   )	r   rg   rp   r   r]   r   rr   rq   r   s	            r   r~   KnowledgeService.create_writeup  s_    
 /!6=c'..121	
 	

w


r   rt   c                 t   [         R                  R                  U5      nU(       d  gSU;   a
  US   Ul        SU;   a
  US   Ul        SU;   a
  US   Ul        SU;   a
  US   Ul        SU;   a,  US   Ul        [        US   R                  S5      5      Ul
        [        R                  R                  5         U$ )u   更新 WriteupNrp   r   r]   r   rr   rk   )r   r,   r:   rp   r   r]   r   rr   r   r   r   r	   r+   r2   )r   rt   r8   r   s       r   update_writeupKnowledgeService.update_writeup-  s    ##''
3 &z2G%i0GO &z2G7"!(!6G%i0GO #GI$6$=$=g$F GG


r   c                    [         R                  R                  U5      nU(       d  gUR                  (       aO  [        R
                  R                  UR                  5      (       a!   [        R                  " UR                  5        [        R                  R                  U5        [        R                  R                  5         g!    NB= f)u   删除 WriteupFT)r   r,   r:   rq   r   r   r   r   r	   r+   r>   r2   )r   rt   r   s      r   delete_writeupKnowledgeService.delete_writeupB  s    ##''
3 0A0A!B!B		'++, 	

'"


s   ( C C
c                 X    [         R                  R                  US9R                  5       $ )u!   获取知识点的 Writeup 列表)rg   )r   r,   r/   rC   )r   rg   s     r   get_writeupsKnowledgeService.get_writeupsS  s&      **=N*OSSUUr   c                    [         R                  R                  U5      nU(       d  gUR                  (       a  UR                  $ UR                  (       a]  [
        R                  R                  UR                  5      (       a/  [        UR                  SSS9 nUR                  5       sSSS5        $ g! , (       d  f       g= f)u   获取 Writeup 内容Nrrk   rm   )
r   r,   r:   rr   rq   r   r   r   r|   rz   )r   rt   r   r   s       r   get_writeup_content$KnowledgeService.get_writeup_contentW  s    ##''
3 ????" 0A0A!B!Bg''w?1vvx @?  @? s   B44
C	json_datac                    SSSS.nUR                  S/ 5       GH@  nU R                  UUS   UR                  S5      UR                  S5      S9nUS==   S-  ss'   UR                  S	/ 5       H  nU R                  UUR                  US   UR                  S5      UR                  S
/ 5      UR                  S/ 5      UR                  S/ 5      S9nUS	==   S-  ss'   UR                  S/ 5       H_  nU R	                  UR                  US   UR                  SS5      UR                  S5      UR                  SS5      S9  US==   S-  ss'   Ma     M     GMC     U$ )u   从 JSON 导入知识库r   )
categoriesrc   writeupsr   r$   r%   r&   )r   r$   r%   r&   r)   rc   rG   rH   rI   )r   rF   r$   r&   rG   rH   rI   r   rp   r   Br]   r   F)rg   rp   r   r]   r   )r:   r5   rP   r   r~   )	r   r   r   statscat_datar4   	item_datarO   wp_datas	            r   import_from_json!KnowledgeService.import_from_jsonj  so    1!< "lB7H//'f%\\&)$LL7	 0 B ,1$ &\\'26	11 +*,%%"6* )m <"vr2%.]]3Er%J'mmK< 2  g!#  )}}Z<G''*.''!(!4 'Is ;!(Z!8#*;;|U#C (  *%*%  = 7 8B r   c                    U/ S.nU R                  U5      nU H  nUR                  UR                  UR                  / S.nU R	                  XR
                  SS9nU Hb  nUR                  5       nUR                  R                  5        V	s/ s H  oR                  5       PM     sn	US'   US   R                  U5        Md     US   R                  U5        M     U$ s  sn	f )u   导出知识库为 JSON)r   r   )r$   r%   r&   rc   F)rY   r   rc   r   )
rD   r$   r%   r&   r[   r   to_dictr   rC   rb   )
r   r   rd   r   r4   r   rc   rO   r   wps
             r   export_to_jsonKnowledgeService.export_to_json  s     '

 22;?
B!~~	H ,,[%%e,TE LLN	@D@Q@Q@S(T@S"@S(T	*%!((3 
 < ''1    )Us   Cc           	         SSSS.n[         R                  R                  U5      nU(       d  U$ U R                  U5      nUR	                  5         UR                  5       n[        R                  " USS9  [        R                  " US5       nUR                  5        H  n	U	R                  S5      (       d  US==   S-  ss'   M(   UR                  U	5      R                  S	5      n
[        [        R                  R!                  U	5      5      n[        R                  R#                  X{5      n[%        US
S	S9 nUR'                  U
5        SSS5        U(       a  U R)                  UUUU
S9  US==   S-  ss'   M     SSS5        U$ ! , (       d  f       NB= f! [*         a  nUS==   S-  ss'    SnAGM  SnAff = f! , (       d  f       U$ = f)u"   从 ZIP 文件批量导入 Writeupr   )successfailedskippedTri   r   z.mdr   r)   rk   rl   rm   Nro   r   r   )r
   r,   r:   r"   rw   rx   r   ry   zipfileZipFilenamelistendswithrz   r{   r   r   basenamer   r|   r}   r~   	Exception)r   r   zip_filerg   r   r   r   r   zfrp   rr   r   rq   r   es                  r   import_writeups_from_zip)KnowledgeService.import_writeups_from_zip  s    q9 "''++K8L **;7&&("446
L40__Xs+rKKM((//)$)$) ggh/66w?G$3BGG4D4DX4N$OM "\ II iw?1( @ )++.?%2&/$+	 ,  )$)$3 * ,< ! @? ! )(Oq(OO)7 ,+< sO   9F=A2F8F
.F8F=
FF
F:!F5.F=5F::F==
Gc                 j   SSS.n[         R                  R                  U5      nU(       d  U$ U R                  U5      n/ SQnSnU HL  nUR	                  UR                  SS5      5      n[        R                  R                  U5      (       d  MJ  Un  O   U(       d  [        R                  R                  U R                  USS5      [        R                  R                  U R                  USS	5      [        R                  R                  U R                  SS5      /n	U	 H+  n[        R                  R                  U5      (       d  M)  Un  O   U(       a$  [        R                  R                  U5      (       d  U$ [        US
SS9 n
[        R                  " U
5      nSSS5        WR                  S0 5      nUR                  5        GH  u  pUR                  SS5      n[        R                  R!                  UUS9R#                  5       nU(       d  U R%                  X5      n[&        R                  R!                  UUS9R#                  5       nU(       d9  U R)                  UUR*                  UUR                  S/ 5      S9nUS==   S-  ss'   UR                  S/ 5       H  nUR                  S5      nU(       d  M  [,        R                  R!                  UR*                  US9R#                  5       nU(       a  M\  UR/                  U5      nU R1                  UR*                  UUR                  SS5      UR                  S5      UR                  SS5      U(       a&  [        R                  R                  U5      (       a  UOSS9  US==   S-  ss'   M     GM     U$ ! , (       d  f       GN
= f)u3   从文件系统同步知识库（用于初始化）r   )rc   r   )knowledge_db.jsonvulnerability_db.jsonzalgorithm_db.jsonztechnique_db.jsonNz.json r`   r   r   r   rk   rm   vulnerabilitiesr   u	   未分类)r   r$   rI   )r   rF   r$   rI   rc   r)   
challengesrp   )rg   rp   r   r   r]   r   F)rg   rp   r   r]   r   rq   r   )r
   r,   r:   r"   get_data_file_pathreplacer   r   r   r   r   r|   r`   loadrc   r   r/   r   r5   r   rP   r   r   r   r~   )r   r   r   r   r   possible_filesdb_pathrp   	test_pathlegacy_pathsr   db_datar   	vuln_name	vuln_datacat_namer4   rO   	challengeexistingrq   s                        r   sync_from_filesystem%KnowledgeService.sync_from_filesystem  s0   +!''++K8L **;7
 &H#66x7G7GQS7TUIww~~i((#	 ' T^^[&BYZT^^[&BUVT^^V5LML
 *	77>>),,'G *
 bggnnW55L'31QiilG 2 "++&7<$3$9$9$; I }}Z=H"((22' 3  eg 
 33KJ !&&00' 1  eg 
 11 +*,%%"'mmK<	 2  g!# ']]<<	$==4&,,66&*gg% 7  %' 
  x + = =h GI''*.''!) )i =!*z!:#,==u#E/8RWW^^I=V=V)\` (  *%*%+ =7 %<d o 21s   	N##
N2c                    / nU R                  U5      nU H  nU R                  XR                  5      nU(       ae  / nU H[  nUR                  (       a   [        R
                  " UR                  5      O/ n	U	(       a  X);   d  SU	;   d  MJ  UR                  U5        M]     UnU(       d  M  UR                  UR                  UR                  UR                  U Vs/ s H  oR                  UR                  S.PM     snS.5        M     U$ s  snf )u6   获取分类组织的知识点（用于前端展示）r_   )r$   r   )r   r$   r%   r   )	rD   r[   r   rI   r`   ra   rb   r$   r%   )
r   r   r]   rd   r   r4   rc   filtered_itemsrO   rI   s
             r   get_categorized_knowledge*KnowledgeService.get_categorized_knowledge>  s    22;?
B,,[%%@E !#!D>Bnn

4>> :RTI$(=YAV&--d3 " 'u%%GGGGW\']W\t$''(JW\']	  (  (^s   "D
)r   )N)NN)NNNNN)NT)r   NFNN))__name__
__module____qualname____firstlineno____doc__strr   r   r"   r   r5   intr   r   r   r;   boolr?   r   rD   r   rP   rT   rW   r[   re   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   __static_attributes__r   r   r   r   r      s   _# _
@3 
@3F 
@ IMS  ),BEQb&s T#s(^ PXYjPk $s t C DAR<S  =A2615=A6: C 69,/ &*#Y 26c	
 +/s)
 @M4S 4S> hWdNe 4S T  :>15>s >36>*.>:>}:M>
3 
# 
RVWdRe 
*
 *
s *
^bcfhkck^l *
X;S ;T$sCx.5I ;@s c d " <@@D(, s  #58#':= #& 2=( tCH~ (S^J_ *  "Vc Vd;6G Vc hsm &&C &DcN &tTWY\T\~ &P# $sCx. 6 <@.C .58.DHcN.`` `S#X `DS C SWX\]`be]eXfSg  r   r   )r   r   r`   r   typingr   r   r   r   ru   r   app.models.database.modelsr	   r
   r   r   r   +app.services.category.knowledge_path_configr   r   r   r   r   <module>r     s:   
 
   , , *  LE	 E	r   