
    %YiF                        S r SSKrSSKJrJrJrJrJr  SSKJ	r	  SSK
Jr  \" S\SS	9rS
 rS rS rS r\R!                  SS/S9\S 5       5       r\R!                  SS/S9\S 5       5       r\R!                  SS/S9\S 5       5       r\R!                  SS/S9\S 5       5       r\R!                  SS/S9\S 5       5       r\R!                  SS/S9\S 5       5       r\R!                  SS/S9\S 5       5       rg) uf   
CTF 方向知识库文件管理 API

提供知识库文件的增删改查、上传下载等功能。
    N)	Blueprintrequestjsonify	send_filecurrent_app)CategoryConfig   )category_admin_requiredcategory_knowledge_apiz/api/admin/categories)
url_prefixc           	         [         R                  R                  [        5      n[         R                  R	                  [         R                  R	                  [         R                  R	                  [         R                  R	                  U5      5      5      5      n[         R                  R                  US5      n[         R                  R                  X0S5      $ u   获取data文件夹路径ge10dataospathabspath__file__dirnamejoincategory_idcurrent_filectf_dir	base_paths       Q   /Users/yu22x/Desktop/ddd_副本131/ctf/app/routes/admin/category/knowledge_api.pyget_data_dirr      v    77??8,Lggoobggoobggoobggool>[.\]^GWf-I77<<	77    c                     U (       d  g[         R                  R                  U 5      nSU;   d  UR                  S5      (       a  gU$ u*   规范化路径，防止路径遍历攻击 ../Nr   r   normpath
startswithr   
normalizeds     r   normalize_pathr+      =    !!$'JzZ22377r    c           	         [         R                  R                  [        5      n[         R                  R	                  [         R                  R	                  [         R                  R	                  [         R                  R	                  U5      5      5      5      n[         R                  R                  US5      n[         R                  R                  X0S5      $ r   r   r   s       r   r   r   $   r   r    c                     U (       d  g[         R                  R                  U 5      nSU;   d  UR                  S5      (       a  gU$ r"   r&   r)   s     r   r+   r+   +   r,   r    z#/<category_id>/knowledge/files/treeGET)methodsc                   ^  [        U 5      n[        R                  R                  U5      (       d#  [        R                  " USS9  [        S/ S.5      $ SU4S jjmT" U5      n[        SUS.5      $ ! [         ac  nSSKn[        R                  R                  S[        U5       SUR                  5        35        [        S	[        U5      S
.5      S4s SnA$ SnAff = f)u   获取文件树结构Texist_ok)successtreec           	      $  > / n [        [        R                  " U 5      5       H  n[        R                  R	                  X5      nU(       a  [        R                  R	                  X5      OUn[        R                  R                  U5      (       a   T" XE5      nUR                  USUUS.5        M  [        R                  " U5      nUR                  USUUR                  UR                  S.5        M     [        US S9$ ! [         a     Nf = f)u   递归构建文件树	directory)nametyper   childrenfile)r8   r9   r   sizemodifiedc                 8    U S   S:H  U S   R                  5       4$ )Nr9   r;   r8   )lower)xs    r   <lambda>3get_file_tree.<locals>.build_tree.<locals>.<lambda>`   s    &	V0CQvY__EV/Wr    )key)sortedr   listdirr   r   isdirappendstatst_sizest_mtimePermissionError)	r   relative_pathitemsitem	item_pathitem_rel_pathr:   rH   
build_trees	           r   rQ   !get_file_tree.<locals>.build_treeD   s    E"2::d#34D "T 8IIVBGGLL$E\`Mww}}Y//#-i#G$($/$1(0	&   "wwy1$($*$1$(LL(,&  50 %%WXX # s   C2D 
DDr   Nu   获取文件树失败: 
Fr4   error  )r#   )r   r   r   existsmakedirsr   	Exception	tracebackr   loggerrU   str
format_exc)r   data_dirr5   erZ   rQ   s        @r   get_file_treer`   6   s    1A,ww~~h''KK40  
	Y< (#
  	  A  #:3q6("YEYEYE[D\!]^53q6:;S@@As%   AA3 A3 3
C =ACC C z%/<category_id>/knowledge/files/uploadPOSTc           	         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UR                  S
:X  a  [        SSS.5      S4$  [        U 5      nU(       aB  [        U5      n	U	(       d  [        SSS.5      S4$ [        R                  R!                  X5      n
OUn
[        R"                  " U
SS9  U" UR                  5      n[        R                  R!                  X5      nU(       Gay  US-   nUR%                  U5        Sn/ n UR                  5       R'                  S5      (       Ga9  UR)                  US5       nUR+                  5       nU GH  nSU;   d  UR-                  S5      (       a  UR/                  U5        M3  [        R                  R!                  U
U5      nUR'                  S5      (       a  [        R"                  " USS9  M  [        R"                  " [        R                  R1                  U5      SS9  UR3                  U5       n[3        US5       nUR5                  UR7                  5       5        SSS5        SSS5        US-  nGM     SSS5        GOUR                  5       R'                  S5      (       Gap  UR                  5       R'                  S5      (       a  SOSnUR3                  UU5       nUR9                  5        GH  nSUR:                  ;   d   UR:                  R-                  S5      (       a  UR/                  UR:                  5        MQ  [        R                  R!                  U
UR:                  5      n[        R                  R=                  U5      R-                  [        R                  R=                  U5      5      (       d  UR/                  UR:                  5        M  UR?                  UU
5        URA                  5       (       d  GM  US-  nGM     SSS5        O&[        RB                  " U5        [        SSS.5      S4$ [        RB                  " U5        SU S3nU(       a  US[E        U5       S3-  n[        SUUUS .5      $ [        R                  RI                  U5      (       a  [        SS!U S"3S.5      S4$ UR%                  U5        [        RJ                  " U5      n[        R                  RM                  X5      n[        SUUURN                  URP                  S#.S!U S$3S%.5      $ ! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN"= f! , (       d  f       GN4= f! [F         aA  n[        R                  RI                  U5      (       a  [        RB                  " U5        UeSnAff = f! [F         ac  nSSK)n[T        RV                  RY                  S&[[        U5       S'UR]                  5        35        [        S[[        U5      S.5      S(4s SnA$ SnAff = f))u:   上传文件到data文件夹，支持压缩包自动解压r   )secure_filenameNr;   Fu   请选择文件rT     r   r#   extractfalsetrue   非法路径Tr2   z.tmpz.ziprr$   r%   wbr	   )z.tar.tar.gz.tgz)rk   rl   zr:gzu;   不支持的压缩包格式，仅支持 .zip, .tar, .tar.gzu"   压缩包解压成功，共解压 u
    个文件u   ，u    个文件因安全原因跳过)r4   extracted_counterror_filesmessage   文件 
    已存在)r8   r   r<   r=   u    上传成功)r4   r;   ro   u   上传文件失败: rS   rV   )/werkzeug.utilsrc   zipfiletarfileshutilr   filesr   formgetr?   filenamer   r+   r   r   r   rX   saveendswithZipFilenamelistr(   rG   r   openwriteread
getmembersr8   r   re   isfileremovelenrY   rW   rH   relpathrI   rJ   rZ   r   r[   rU   r\   r]   )r   rc   rs   rt   ru   r;   rL   re   r^   r*   save_dirsafe_filename	file_path	temp_pathrm   rn   zip_ref	file_listmembertarget_pathsourcetargetmodetar_refro   r_   rH   file_rel_pathrZ   s                                r   upload_knowledge_filer   n   sC    /W]]"53DEFKK== DLL$$VR0Mlly'288:fDG}}53DEFKKyA, '6J5>JKSPPww||H9HH
Ht,'6GGLL9	 !F*IIIi OKD &&(11&99 C8G$+$4$4$6	&/F#v~1B1B31G1G + 2 26 : ( +-'',,x*HK  &s33 "K$ G "BGGOOK,HSW X%,\\&%9VT+W[E\`f$*LL$? F]%9 /1 4! '0	 98, #((*334OPP%2%8%8%:%C%CDW%X%X6^aD i6'&-&8&8&:F#v{{2fkk6L6LS6Q6Q + 2 26;; ? (*,'',,x*MK $&77??;#?#J#J277??[cKd#e#e + 2 26;; ? (#OOFH=%}} /1 4 '; 76( IIi("u?|#}~  AD  D  D 		)$>>OzZS%5$66UVVG#'6#.&	     ww~~i((5W]OS];^_`beeeIIi 779%DGGOOI@M)) LL $	 %]O=A	 	 	y F]E\%9%9% 980 76J  77>>),,IIi(	8  A  #7Axr)BVBVBXAY!Z[53q6:;S@@As   <3X 0B
X ;7W 2CV'V V	5V=V'A)W 8DV9
V9%.W AW 7X A1X 
VV
V$V''
V61W 9
WW 
X<XXX 
Z#AZ;ZZz'/<category_id>/knowledge/files/downloadc                    SSK Jn  [        R                  R	                  S5      nU(       d  [        SSS.5      S4$  [        U 5      n[        U5      nU(       d  [        SSS.5      S4$ [        R                  R                  X45      n[        R                  R                  U5      R                  [        R                  R                  U5      5      (       d  [        SSS.5      S	4$ [        R                  R                  U5      (       d  [        SS
S.5      S4$ [        R                  R                  U5      (       d  [        SSS.5      S4$ [        R                  R                  U5      nU" USUS9$ ! [          ac  nSSKn[$        R&                  R)                  S[+        U5       SUR-                  5        35        [        S[+        U5      S.5      S4s SnA$ SnAff = f)u   下载文件r   )r   r   F   缺少路径参数rT   rd   rh        文件不存在     不是文件T)as_attachmentdownload_nameNu   下载文件失败: rS   rV   )flaskr   r   argsrx   r   r   r+   r   r   r   r   r(   rW   r   basenamerY   rZ   r   r[   rU   r\   r]   )	r   r   r   r^   r*   	full_pathry   r_   rZ   s	            r   download_knowledge_filer      s       (I53GHI3NNA, $I.
u~FGLLGGLL6	 wwy)44RWW__X5NOOu~FGLLww~~i((u7HIJCOOww~~i((u~FGLL77##I.$hOO A  #7Axr)BVBVBXAY!Z[53q6:;S@@As7   ,E9 +A>E9 *3E9 3E9 &E9 9
G&AG!G&!G&z%/<category_id>/knowledge/files/deleteDELETEc                 P   [         R                  " 5       nUR                  S5      nUR                  SS5      nU(       d  [        SSS.5      S4$  [	        U 5      n[        U5      nU(       d  [        SSS.5      S4$ [        R                  R                  XE5      n[        R                  R                  U5      R                  [        R                  R                  U5      5      (       d  [        SSS.5      S4$ [        R                  R                  U5      (       d  [        SS	S.5      S
4$ U(       a9  SSKnUR                  U5        S[        R                  R                  U5       S3nO9[        R                  " U5        S[        R                  R                  U5       S3n[        SUS.5      $ ! [          ac  n	SSKn
[$        R&                  R)                  S[+        U	5       SU
R-                  5        35        [        S[+        U	5      S.5      S4s Sn	A	$ Sn	A	ff = f)u   删除文件或文件夹r   is_directoryFr   rT   rd   rh   r   u   文件或文件夹不存在r   r   N
   文件夹 u    删除成功rp   Tr4   ro   u   删除失败: rS   rV   )r   get_jsonrx   r   r   r+   r   r   r   r   r(   rW   ru   rmtreer   r   rY   rZ   r   r[   rU   r\   r]   )r   r   r   r   r^   r*   r   ru   ro   r_   rZ   s              r   delete_knowledge_filer   $  s    D I88NE2L53GHI3NN!A, $I.
u~FGLLGGLL6	 wwy)44RWW__X5NOOu~FGLLww~~i((u7TUVX[[[ MM)$"277#3#3I#>"?}MGIIi  0 0 ;<MJG
  	  A  >#a&I<P<P<R;S!TU53q6:;S@@As3   ,F8 >A>F8 =3F8 1BF8 8
H%AH H% H%z%/<category_id>/knowledge/files/createc                    [         R                  " 5       nUR                  S5      nUR                  SS5      nUR                  SS5      nU(       d  [        SSS.5      S4$  [	        U 5      nU(       aB  [        U5      nU(       d  [        SS	S.5      S4$ [        R                  R                  XV5      nOUn[        R                  R                  U5      R                  [        R                  R                  U5      5      (       d  [        SS	S.5      S
4$ [        R                  " USS9  [        R                  R                  Xr5      n[        R                  R                  U5      (       a  [        SU(       a  SOS SU S3S.5      S4$ U(       a  [        R                  " USS9  SU S3n	O+[        USSS9 n
U
R                  S5        SSS5        SU S3n	[        SU	S.5      $ ! , (       d  f       N"= f! [         ac  nSSKn["        R$                  R'                  S[)        U5       SUR+                  5        35        [        S[)        U5      S.5      S4s SnA$ SnAff = f)u   创建文件或文件夹r8   r   r#   r   Fu   缺少名称参数rT   rd   rh   r   Tr2   u	   文件夹u   文件 rq   r   u    创建成功wutf-8encodingNrp   r   r   u   创建失败: rS   rV   )r   r   rx   r   r   r+   r   r   r   r   r(   rX   rW   r~   r   rY   rZ   r   r[   rU   r\   r]   )r   r   r8   r   r   r^   r*   
parent_dirnew_pathro   fr_   rZ   s                r   create_file_or_folderr   S  s    D88FD88FBD88NE2L53GHI3NN(A, '-J5>JKSPPh;J!J wwz*55bggooh6OPPu~FGLL
J. 77<<
177>>(##u+[c9ddefjekku7vwxz}}}KK40"4&6G hg6! 7v]3G
  		 76  A  >#a&I<P<P<R;S!TU53q6:;S@@AsK   #3G= BG= A6G= .G= >G,G= ,
G:6G= =
I*AI%I*%I*z#/<category_id>/knowledge/files/readc                    [         R                  R                  S5      nU(       d  [        SSS.5      S4$  [	        U 5      n[        U5      nU(       d  [        SSS.5      S4$ [        R                  R                  X#5      n[        R                  R                  U5      R                  [        R                  R                  U5      5      (       d  [        SSS.5      S4$ [        R                  R                  U5      (       d  [        SSS.5      S	4$ [        R                  R                  U5      (       d  [        SS
S.5      S4$ [        USSS9 nUR                  5       nSSS5        [        SWS.5      $ ! , (       d  f       N= f! [         ac  nSSKn["        R$                  R'                  S[)        U5       SUR+                  5        35        [        S[)        U5      S.5      S4s SnA$ SnAff = f)u   读取文件内容r   Fr   rT   rd   rh   r   r   r   r   ri   r   r   NT)r4   contentr   u   读取文件失败: rS   rV   )r   r   rx   r   r   r+   r   r   r   r   r(   rW   r   r~   r   rY   rZ   r   r[   rU   r\   r]   )	r   r   r^   r*   r   r   r   r_   rZ   s	            r   read_file_contentr     s      (I53GHI3NNA,#I.
u~FGLLGGLL6	wwy)44RWW__X5NOOu~FGLLww~~i((u7HIJCOOww~~i((u~FGLL)S73qffhG 4 
  	 43  A  #7Axr)BVBVBXAY!Z[53q6:;S@@AsO   ,F %A>F $3F 3F F E>(F >
FF 
G<AG71G<7G<z$/<category_id>/knowledge/files/writec                    [         R                  " 5       nUR                  S5      nUR                  SS5      nU(       d  [        SSS.5      S4$  [	        U 5      n[        U5      nU(       d  [        SSS.5      S4$ [        R                  R                  XE5      n[        R                  R                  U5      R                  [        R                  R                  U5      5      (       d  [        SSS.5      S	4$ [        R                  " [        R                  R                  U5      S
S9  [        USSS9 nUR                  U5        SSS5        [        S
SS.5      $ ! , (       d  f       N= f! [         ac  nSSKn	["        R$                  R'                  S[)        U5       SU	R+                  5        35        [        S[)        U5      S.5      S4s SnA$ SnAff = f)u   写入文件内容r   r   r#   Fr   rT   rd   rh   r   Tr2   r   r   r   Nu   文件保存成功r   r   u   写入文件失败: rS   rV   )r   r   rx   r   r   r+   r   r   r   r   r(   rX   r   r~   r   rY   rZ   r   r[   rU   r\   r]   )
r   r   r   r   r^   r*   r   r   r_   rZ   s
             r   write_file_contentr     s    D Ihhy"%G53GHI3NNA,#I.
u~FGLLGGLL6	wwy)44RWW__X5NOOu~FGLL 	BGGOOI.>)S73qGGG 4 +
  	 43  A  #7Axr)BVBVBXAY!Z[53q6:;S@@AsD   ,E3 >A>E3 ==E3 :E"E3 "
E0,E3 3
G =AGG G )__doc__r   r   r   r   r   r   r   app.models.database.modelsr   
decoratorsr
   __name__category_knowledge_bpr   r+   router`   r   r   r   r   r   r    r    r   <module>r      s  
 
 E E 5 /!":HQhi 8	8	 BUGT3A  U3Al DvhWJA  XJAZ FQVPWX"A  Y"AJ DxjY*A  Z*AZ DvhW2A  X2Aj BUGT#A  U#AL CfXV"A  W"Ar    