
    '\i/                     R    S SK r S SKJrJrJr  S SKJr  S SKrSSKJ	r	  S SK
Jr  S rg)    N)Flaskgjsonify)Session   register_all_blueprints)Configc                    ^' [         R                  S:H  n [        [        U S9nUR                  R                  [         5        UR                  R                  SSS9  U (       aW   [        R                  " UR                  SS9  SS K
nUR                  [        5      m'T'R                  SUR                   35         SS
KJn  U" U5      n SS K
nUR                  [        5      m'[         R                  S:X  aV  T'R                  S[         R&                   35        T'R                  S[         R(                   S[         R*                   35        O[        R,                  R/                  UR                  [         R0                  5      n[        R,                  R3                  U5      (       d&  T'R5                  SU 35        T'R5                  S5        OT'R                  SU 35         [=        U5         SSKJ n	  UR                  RC                  S5      n
UR                  RC                  SS5      nU
(       av  U	" U
USS9nURE                  5         URG                  5          URI                  5       nUS:  a.  SS K
nUR                  [        5      m'T'R                  SU S35        S S S 5        O URK                  S5      S7S j5       nURK                  S5      S  5       nURK                  S!5      S7S" j5       nURK                  S#5      S7S$ j5       nURK                  S%5      S& 5       nURK                  S'5      S( 5       nURK                  S)5      S8S* j5       nURL                  S+ 5       nURN                  S, 5       nSS-K(J)n  U" U5        SS.K*J+n  URY                  U5        SS/K-J.nJ/nJ0nJ1nJ2nJ3nJ4nJ5n J6n!J7n"  SS K
nUR                  [        5      m'URq                  U5      S0U4U'4S1 jj5       n#URq                  S25      S3 5       n$URq                  S45      U'4S5 j5       n%URq                  [         5      U'4S6 j5       n&U$ ! [         aA  nSS K
nUR                  [        5      m'T'R                  S	[        U5       35         S nAGNS nAf[          aA  nSS K
nUR                  [        5      m'T'R                  S	[        U5       35         S nAGNS nAff = f! [          aA  nSS K
nUR                  [        5      m'T'R                  S[        U5       35         S nAGN6S nAff = f! [          aA  n[7        S[        U5       35        [7        S5        SS KnUR;                  5          S nAGNS nAff = f! , (       d  f       GN= f! [          a8  nSS K
nUR                  [        5      m'T'R5                  SU 35         S nAGNS nAff = f)9Nsqlite)instance_relative_configdevT)
SECRET_KEYTEMPLATES_AUTO_RELOAD)exist_okr   u   已创建实例目录: u    创建应用实例目录出错: )init_db
postgresqlu   使用 PostgreSQL 数据库: u   连接地址: :u!   SQLite 数据库文件不存在: u7   请运行 python3 scripts/init_db.py 初始化数据库u   使用 SQLite 数据库: u   检查数据库连接出错: u   初始化数据库出错: u   将使用JSON加载器)SessionCleanerSESSION_FILE_DIRPERMANENT_SESSION_LIFETIMEi  )session_dirsession_lifetimecleanup_intervalu   启动时清理了 u    个过期Session文件u!   初始化Session清理器失败: datetimec                 @    U (       d  gSSK Jn  UR                  X5      $ )u$   格式化日期时间为北京时间   未知时间r   	TimeUtils)app.utils.time_utilsr   format_datetime)dt
format_strr   s      +/Users/yu22x/Desktop/ge/ctf/app/__init__.pydatetime_filter#create_app.<locals>.datetime_filtera   s     !2((88    relative_timec                 @    U (       d  gSSK Jn  UR                  U 5      $ )u   格式化相对时间r   r   r   )r    r   format_relative_time)r"   r   s     r$   relative_time_filter(create_app.<locals>.relative_time_filterj   s     !2--b11r'   beijing_timec                 b    U (       d  gSSK Jn  UR                  U 5      nUR                  X15      $ )u-   将UTC时间转换为北京时间并格式化r   r   r   )r    r   utc_to_beijingr!   )r"   r#   r   r-   s       r$   beijing_time_filter'create_app.<locals>.beijing_time_filters   s.     !2 //3((BBr'   strftimec                 b    U (       d  g U R                  U5      $ ! [        [        4 a     gf = f)u#   格式化datetime对象为字符串r   u   时间格式错误)r2   AttributeError
ValueError)r"   r#   s     r$   strftime_filter#create_app.<locals>.strftime_filter}   s5     !	(;;z**
+ 	('	(s    ..markdownc           	         U (       d  g SS K nSU ;   a  UR                  SXR                  5      nU(       a  SR                  U5      n OU R	                  5       R                  S5      nSnSn[        U5       H@  u  pgUR	                  5       S:X  a  US-   nM   UR	                  5       S	:X  d  M6  US:w  d  M>  Un  O   US:w  a  US:w  a  SR                  X4U 5      n UR                  S
SU 5      n UR                  SSU 5      n [        R                  " U / SQSSSSS.0S9nU$ ! [         a3  n	[        S[        U	5       35        SSKJn
  SU
" U 5       S3s S n	A	$ S n	A	ff = f)N r   z```markdownz```markdown\s*\n(.*?)\n```z


r   z```z^```markdown\s*z\s*```$)fenced_code
codehilitetablesnl2br
sane_lists	attr_listr>   	highlightT)	css_classuse_pygments	noclasses)
extensionsextension_configsu   Markdown渲染错误: )escapez<pre>z</pre>)refindallDOTALLjoinstripsplit	enumeratesubr8   	ExceptionprintstrhtmlrI   )textrJ   markdown_blockslines	start_idxend_idxilineresulterI   s              r$   render_markdown#create_app.<locals>.render_markdown   sd   7	0 $"$**-JDR[R["\"!;;7D !JJL..t4E "I G#,U#3::<=8()AI!ZZ\U2yB&'G! $4 !B7b=#yy)AB 66,b$7D66*b$/D && !%0(,%)##F& M 	0*3q6(34#6$<.//		0s+   BD  -D  5A*D   
E*(EEEbasenamec                 P    U (       d  gSSK nUR                  R                  U 5      $ )u!   提取文件路径的基本名称r:   r   N)ospathra   )rd   rc   s     r$   basename_filter#create_app.<locals>.basename_filter   s"     ww%%r'   
icon_classc                    U (       d  U S3$ [        U 5      R                  5       n SU ;   d  U R                  S5      (       dn  U R                  S5      (       dX  U R                  S5      (       dB  U R                  S5      (       d,  U R                  S5      (       d  U R                  S5      (       a  U $ 1 S	knX;   a  S
U  3$ U SU  3$ )u   
根据图标名称返回完整的 Font Awesome 图标类名
如果输入已经是完整的类名（如 'fab fa-python'），直接返回
如果只是图标名称（如 'python'），根据图标数据自动判断前缀
z
 fa-folder zfa-zfab zfas zfar zfal zfad >   jsqqawsnpmphpjavaapplehtml5linuxreactslackvuejsweiboalipaydockergithubgitlabgooglepythonweixinandroidangulardiscordwindowstelegram	bootstrap	microsoftgit-altnode-jscss3-altzfab fa-z fa-)rT   rN   
startswith)	icon_namedefaultbrand_iconss      r$   icon_class_filter%create_app.<locals>.icon_class_filter   s     Yj))	N((*	 )y33E::i>R>RSY>Z>Z''9+?+?+G+G''9+?+?+G+G
 #YK(( Yd9+..r'   c                  B    SSK Jn   U R                  5       [        l        g)u$   在每个请求前加载当前用户r   AuthServiceN)app.services.authr   get_current_userr   userr   s    r$   load_logged_in_user'create_app.<locals>.load_logged_in_user   s     	2--/r'   c                      0 $ )u!   向所有模板注入系统配置 r   r'   r$   inject_system_config(create_app.<locals>.inject_system_config   s	     	r'   r   )bp)
CTFErrorValidationErrorNotFoundErrorPermissionDeniedErrorAuthenticationErrorAIServiceErrorGenerationErrorDeploymentErrorDatabaseErrorConfigurationErrorerrorc                    > TR                  SU R                   SU R                   3U R                  S9  [	        U R                  5       5      U R                  4$ )u    处理 CTF 系统自定义异常zCTF Error [z]: )extra)warningcodemessagedetailsr   to_dictr   loggers    r$   handle_ctf_error$create_app.<locals>.handle_ctf_error  sH     	UZZLEMM?C5==Yu}}'33r'     c                 $    [        SSSS.5      S4$ )u   处理 404 错误r   u   资源不存在r   statusr   r   )r   )r   s    r$   handle_not_found$create_app.<locals>.handle_not_found  s)     (
  	 	r'     c                 ^   > TR                  S[        U 5       3SS9  [        SSSS.5      S4$ )u   处理 500 错误zInternal Server Error: Texc_infor      服务器内部错误r   r   r   rT   r   r   s    r$   handle_internal_error)create_app.<locals>.handle_internal_error   sF     	.s5zl;dK.
  	 	r'   c                 ^   > TR                  S[        U 5       3SS9  [        SSSS.5      S4$ )u   处理未捕获的异常zUnhandled Exception: Tr   r   r   r   r   r   r   s    r$   handle_generic_exception,create_app.<locals>.handle_generic_exception*  sF     	,SZL9DI.
  	 	r'   )z%Y-%m-%d %H:%M:%S)fas)9r
   DATABASE_TYPEr   __name__configfrom_objectfrom_mappingrc   makedirsinstance_pathlogging	getLoggerinfoOSErrorr   rT   rR   app.models.databaser   POSTGRES_DBPOSTGRES_HOSTPOSTGRES_PORTrd   rM   SQLITE_DB_NAMEexistsr   rS   	traceback	print_excr   app.services.storager   getstartapp_contextcleanup_nowtemplate_filterbefore_requestcontext_processor
app.routesr	   app.routes.authr   register_blueprintapp.core.exceptionsr   r   r   r   r   r   r   r   r   r   errorhandler)(use_instanceappr   oser^   r   dbdb_pathr   r   r   r   session_cleanerdeleted_countr%   r+   r0   r6   r_   re   r   r   r   r	   auth_bpr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s(                                          @r$   
create_appr   	   sV   ''83L
<
@C JJ6"JJ"   	FKK))D9&&x0FKK1#2C2C1DEF/S\	C&&x0F##|3;F<N<N;OPQnV-A-A,B!FDXDXCYZ['',,s'8'8&:O:OPww~~g..NN%Fwi#PQNN#\]KK";G9 EF CL@7jjnn%78::>>*FM,'!1!%O
 !!# " / ; ; = 1$"$..x8FKK"5m_D[ \] #" * 	$9 %9 	)2 *2 	(C )C 	$( %( 	$;0 %;0| 	$& %& 	&/ '/B 	0 0 	 
 3C  .7#  
 x(Fh4 4  4
 	c  	c  	i  !* JI	  	H&&x0FLL;CH:FGG 	F&&x0FLL;CF8DEE	F2  	C&&x0FLL8QABB	C  *3q6(34&'	0 #"  @""8,:1#>??@s   $AP= ;T" 
BS BS S 0A,V AU0!V =
S6RS6SS
T6TT" TT" "
U-,6U((U-0
U?:V ?V 
W-V??W)rc   flaskr   r   r   flask_sessionr   r8   routesr	   r   r
   r   r   r'   r$   <module>r      s     	 # # !  + wr'   