app.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. import os
  2. import re
  3. for i_data in os.listdir("route"):
  4. f_src = re.search("(.+)\.py$", i_data)
  5. if f_src:
  6. f_src = f_src.groups()[0]
  7. exec("from route." + f_src + " import *")
  8. version_list = json.loads(open('version.json', encoding='utf-8').read())
  9. r_ver = version_list['master']['r_ver']
  10. c_ver = version_list['master']['c_ver']
  11. s_ver = version_list['master']['s_ver']
  12. print('Version : ' + r_ver)
  13. app_var = json.loads(open('data/app_variables.json', encoding='utf-8').read())
  14. # DB
  15. all_src = []
  16. for i_data in os.listdir("."):
  17. f_src = re.search("(.+)\.db$", i_data)
  18. if f_src:
  19. all_src += [f_src.groups()[0]]
  20. if len(all_src) == 0:
  21. print('DB\'s name (data) : ', end = '')
  22. db_name = input()
  23. if db_name == '':
  24. db_name = 'data'
  25. elif len(all_src) > 1:
  26. db_num = 1
  27. for i_data in all_src:
  28. print(str(db_num) + ' : ' + i_data)
  29. db_num += 1
  30. print('Number : ', end = '')
  31. db_name = all_src[int(number_check(input())) - 1]
  32. else:
  33. db_name = all_src[0]
  34. if len(all_src) == 1:
  35. print('DB\'s name : ' + db_name)
  36. if os.path.exists(db_name + '.db'):
  37. setup_tool = 0
  38. else:
  39. setup_tool = 1
  40. conn = sqlite3.connect(db_name + '.db', check_same_thread = False)
  41. curs = conn.cursor()
  42. load_conn(conn)
  43. logging.basicConfig(level = logging.ERROR)
  44. app = flask.Flask(__name__, template_folder = './')
  45. app.config['JSON_AS_ASCII'] = False
  46. flask_reggie.Reggie(app)
  47. compress = flask_compress.Compress()
  48. compress.init_app(app)
  49. class EverythingConverter(werkzeug.routing.PathConverter):
  50. regex = '.*?'
  51. app.jinja_env.filters['md5_replace'] = md5_replace
  52. app.jinja_env.filters['load_lang'] = load_lang
  53. app.jinja_env.filters['cut_100'] = cut_100
  54. app.url_map.converters['everything'] = EverythingConverter
  55. curs.execute('create table if not exists data(test text)')
  56. curs.execute('create table if not exists cache_data(test text)')
  57. curs.execute('create table if not exists history(test text)')
  58. curs.execute('create table if not exists rd(test text)')
  59. curs.execute('create table if not exists user(test text)')
  60. curs.execute('create table if not exists user_set(test text)')
  61. curs.execute('create table if not exists ban(test text)')
  62. curs.execute('create table if not exists topic(test text)')
  63. curs.execute('create table if not exists rb(test text)')
  64. curs.execute('create table if not exists back(test text)')
  65. curs.execute('create table if not exists custom(test text)')
  66. curs.execute('create table if not exists other(test text)')
  67. curs.execute('create table if not exists alist(test text)')
  68. curs.execute('create table if not exists re_admin(test text)')
  69. curs.execute('create table if not exists alarm(test text)')
  70. curs.execute('create table if not exists ua_d(test text)')
  71. curs.execute('create table if not exists filter(test text)')
  72. curs.execute('create table if not exists scan(test text)')
  73. curs.execute('create table if not exists acl(test text)')
  74. curs.execute('create table if not exists inter(test text)')
  75. curs.execute('create table if not exists html_filter(test text)')
  76. curs.execute('create table if not exists oauth_conn(test text)')
  77. if setup_tool == 0:
  78. try:
  79. curs.execute('select data from other where name = "ver"')
  80. ver_set_data = curs.fetchall()
  81. if not ver_set_data:
  82. setup_tool = 1
  83. else:
  84. if c_ver > ver_set_data[0][0]:
  85. setup_tool = 1
  86. except:
  87. setup_tool = 1
  88. if setup_tool != 0:
  89. create_data = {}
  90. create_data['all_data'] = [
  91. 'data',
  92. 'cache_data',
  93. 'history',
  94. 'rd',
  95. 'user',
  96. 'user_set',
  97. 'ban',
  98. 'topic',
  99. 'rb',
  100. 'back',
  101. 'custom',
  102. 'other',
  103. 'alist',
  104. 're_admin',
  105. 'alarm',
  106. 'ua_d',
  107. 'filter',
  108. 'scan',
  109. 'acl',
  110. 'inter',
  111. 'html_filter',
  112. 'oauth_conn'
  113. ]
  114. create_data['data'] = ['title', 'data']
  115. create_data['cache_data'] = ['title', 'data']
  116. create_data['history'] = ['id', 'title', 'data', 'date', 'ip', 'send', 'leng', 'hide', 'type']
  117. create_data['rd'] = ['title', 'sub', 'date', 'band', 'stop', 'agree']
  118. create_data['user'] = ['id', 'pw', 'acl', 'date', 'encode']
  119. create_data['user_set'] = ['name', 'id', 'data']
  120. create_data['ban'] = ['block', 'end', 'why', 'band', 'login']
  121. create_data['topic'] = ['id', 'title', 'sub', 'data', 'date', 'ip', 'block', 'top']
  122. create_data['rb'] = ['block', 'end', 'today', 'blocker', 'why', 'band']
  123. create_data['back'] = ['title', 'link', 'type']
  124. create_data['custom'] = ['user', 'css']
  125. create_data['other'] = ['name', 'data', 'coverage']
  126. create_data['alist'] = ['name', 'acl']
  127. create_data['re_admin'] = ['who', 'what', 'time']
  128. create_data['alarm'] = ['name', 'data', 'date']
  129. create_data['ua_d'] = ['name', 'ip', 'ua', 'today', 'sub']
  130. create_data['filter'] = ['name', 'regex', 'sub']
  131. create_data['scan'] = ['user', 'title']
  132. create_data['acl'] = ['title', 'dec', 'dis', 'view', 'why']
  133. create_data['inter'] = ['title', 'link']
  134. create_data['html_filter'] = ['html', 'kind']
  135. create_data['oauth_conn'] = ['provider', 'wiki_id', 'sns_id', 'name', 'picture']
  136. for create_table in create_data['all_data']:
  137. for create in create_data[create_table]:
  138. try:
  139. curs.execute('select ' + create + ' from ' + create_table + ' limit 1')
  140. except:
  141. curs.execute("alter table " + create_table + " add " + create + " text default ''")
  142. update()
  143. # Init
  144. curs.execute('select name from alist where acl = "owner"')
  145. if not curs.fetchall():
  146. curs.execute('delete from alist where name = "owner"')
  147. curs.execute('insert into alist (name, acl) values ("owner", "owner")')
  148. if not os.path.exists(app_var['path_data_image']):
  149. os.makedirs(app_var['path_data_image'])
  150. if not os.path.exists('views'):
  151. os.makedirs('views')
  152. import route.tool.init as server_init
  153. dislay_set_key = ['Host', 'Port', 'Language', 'Markup', 'Encryption method']
  154. server_set_key = ['host', 'port', 'language', 'markup', 'encode']
  155. server_set = {}
  156. for i in range(len(server_set_key)):
  157. curs.execute('select data from other where name = ?', [server_set_key[i]])
  158. server_set_val = curs.fetchall()
  159. if not server_set_val:
  160. server_set_val = server_init.init(server_set_key[i])
  161. curs.execute('insert into other (name, data) values (?, ?)', [server_set_key[i], server_set_val])
  162. conn.commit()
  163. else:
  164. server_set_val = server_set_val[0][0]
  165. print(dislay_set_key[i] + ' : ' + server_set_val)
  166. server_set[server_set_key[i]] = server_set_val
  167. try:
  168. if not os.path.exists('robots.txt'):
  169. curs.execute('select data from other where name = "robot"')
  170. robot_test = curs.fetchall()
  171. if robot_test:
  172. fw_test = open('./robots.txt', 'w')
  173. fw_test.write(re.sub('\r\n', '\n', robot_test[0][0]))
  174. fw_test.close()
  175. else:
  176. fw_test = open('./robots.txt', 'w')
  177. fw_test.write('User-agent: *\nDisallow: /\nAllow: /$\nAllow: /w/')
  178. fw_test.close()
  179. curs.execute('insert into other (name, data) values ("robot", "User-agent: *\nDisallow: /\nAllow: /$\nAllow: /w/")')
  180. print('----')
  181. print('Engine made robots.txt')
  182. except:
  183. pass
  184. curs.execute('select data from other where name = "key"')
  185. rep_data = curs.fetchall()
  186. if not rep_data:
  187. rep_key = ''.join(random.choice("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") for i in range(16))
  188. if rep_key:
  189. curs.execute('insert into other (name, data) values ("key", ?)', [rep_key])
  190. else:
  191. rep_key = rep_data[0][0]
  192. curs.execute('select data from other where name = "adsense"')
  193. adsense_result = curs.fetchall()
  194. if not adsense_result:
  195. curs.execute('insert into other (name, data) values ("adsense", "False")')
  196. curs.execute('insert into other (name, data) values ("adsense_code", "")')
  197. curs.execute('delete from other where name = "ver"')
  198. curs.execute('insert into other (name, data) values ("ver", ?)', [c_ver])
  199. def back_up():
  200. print('----')
  201. try:
  202. shutil.copyfile(db_name + '.db', 'back_' + db_name + '.db')
  203. print('Back up : OK')
  204. except:
  205. print('Back up : Error')
  206. threading.Timer(60 * 60 * back_time, back_up).start()
  207. try:
  208. curs.execute('select data from other where name = "back_up"')
  209. back_up_time = curs.fetchall()
  210. back_time = int(back_up_time[0][0])
  211. except:
  212. back_time = 0
  213. print('----')
  214. if back_time != 0:
  215. print('Back up state : ' + str(back_time) + ' hours')
  216. if __name__ == '__main__':
  217. back_up()
  218. else:
  219. print('Back up state : Turn off')
  220. curs.execute('select data from other where name = "s_ver"')
  221. ver_set_data = curs.fetchall()
  222. if not ver_set_data:
  223. curs.execute('insert into other (name, data) values ("s_ver", ?)', [s_ver])
  224. if setup_tool == 0:
  225. print('----')
  226. print('Skin update required')
  227. else:
  228. if int(ver_set_data[0][0]) < int(s_ver):
  229. curs.execute('delete from other where name = "s_ver"')
  230. curs.execute('insert into other (name, data) values ("s_ver", ?)', [s_ver])
  231. print('----')
  232. print('Skin update required')
  233. conn.commit()
  234. ## Func
  235. @app.route('/del_alarm')
  236. def alarm_del():
  237. return alarm_del_2(conn)
  238. @app.route('/alarm')
  239. def alarm():
  240. return alarm_2(conn)
  241. @app.route('/<regex("inter_wiki|(?:edit|email|file|name)_filter"):tools>')
  242. def inter_wiki(tools = None):
  243. return inter_wiki_2(conn, tools)
  244. @app.route('/<regex("del_(?:inter_wiki|(?:edit|email|file|name)_filter)"):tools>/<name>')
  245. def inter_wiki_del(tools = None, name = None):
  246. return inter_wiki_del_2(conn, tools, name)
  247. @app.route('/<regex("plus_(?:inter_wiki|(?:edit|email|file|name)_filter)"):tools>', methods=['POST', 'GET'])
  248. @app.route('/<regex("plus_edit_filter"):tools>/<name>', methods=['POST', 'GET'])
  249. def inter_wiki_plus(tools = None, name = None):
  250. return inter_wiki_plus_2(conn, tools, name)
  251. @app.route('/setting')
  252. @app.route('/setting/<int:num>', methods=['POST', 'GET'])
  253. def setting(num = 0):
  254. return setting_2(conn, num)
  255. @app.route('/not_close_topic')
  256. def list_not_close_topic():
  257. return list_not_close_topic_2(conn)
  258. @app.route('/acl_list')
  259. def list_acl():
  260. return list_acl_2(conn)
  261. @app.route('/admin_plus/<name>', methods=['POST', 'GET'])
  262. def give_admin_groups(name = None):
  263. return give_admin_groups_2(conn, name)
  264. @app.route('/admin_list')
  265. def list_admin():
  266. return list_admin_2(conn)
  267. @app.route('/hidden/<everything:name>')
  268. def give_history_hidden(name = None):
  269. return give_history_hidden_2(conn, name)
  270. @app.route('/user_log')
  271. def list_user():
  272. return list_user_2(conn)
  273. @app.route('/admin_log')
  274. def list_admin_use():
  275. return list_admin_use_2(conn)
  276. @app.route('/give_log')
  277. def list_give():
  278. return list_give_2(conn)
  279. @app.route('/indexing', methods=['POST', 'GET'])
  280. def server_indexing():
  281. return server_indexing_2(conn)
  282. @app.route('/restart', methods=['POST', 'GET'])
  283. def server_restart():
  284. return server_restart_2(conn)
  285. @app.route('/update', methods=['GET', 'POST'])
  286. def server_now_update():
  287. return server_now_update_2(conn)
  288. @app.route('/oauth_setting', methods=['GET', 'POST'])
  289. def setting_oauth():
  290. return setting_oauth_2(conn)
  291. @app.route('/adsense_setting', methods=['GET', 'POST'])
  292. def setting_adsense():
  293. return setting_adsense_2(conn)
  294. @app.route('/xref/<everything:name>')
  295. def view_xref(name = None):
  296. return view_xref_2(conn, name)
  297. @app.route('/please')
  298. def list_please():
  299. return list_please_2(conn)
  300. @app.route('/recent_discuss')
  301. def recent_discuss():
  302. return recent_discuss_2(conn)
  303. @app.route('/block_log')
  304. @app.route('/<regex("block_user|block_admin"):tool>/<name>')
  305. def list_block(name = None, tool = None):
  306. return list_block_2(conn, name, tool)
  307. @app.route('/search', methods=['POST'])
  308. def search():
  309. return search_2(conn)
  310. @app.route('/goto', methods=['POST'])
  311. def search_goto():
  312. return search_goto_2(conn)
  313. @app.route('/search/<everything:name>')
  314. def search_deep(name = ''):
  315. return search_deep_2(conn, name)
  316. @app.route('/raw/<everything:name>')
  317. @app.route('/topic/<everything:name>/sub/<sub_title>/raw/<int:num>')
  318. def view_raw(name = None, sub_title = None, num = None):
  319. return view_raw_2(conn, name, sub_title, num)
  320. @app.route('/revert/<everything:name>', methods=['POST', 'GET'])
  321. def edit_revert(name = None):
  322. return edit_revert_2(conn, name)
  323. @app.route('/edit/<everything:name>', methods=['POST', 'GET'])
  324. def edit(name = None):
  325. return edit_2(conn, name)
  326. @app.route('/delete/<everything:name>', methods=['POST', 'GET'])
  327. def edit_delete(name = None):
  328. return edit_delete_2(conn, name, app_var)
  329. @app.route('/move/<everything:name>', methods=['POST', 'GET'])
  330. def edit_move(name = None):
  331. return edit_move_2(conn, name)
  332. @app.route('/other')
  333. def main_other():
  334. return main_other_2(conn)
  335. @app.route('/manager', methods=['POST', 'GET'])
  336. @app.route('/manager/<int:num>', methods=['POST', 'GET'])
  337. def main_manager(num = 1):
  338. return main_manager_2(conn, num, r_ver)
  339. @app.route('/title_index')
  340. def list_title_index():
  341. return list_title_index_2(conn)
  342. @app.route('/topic/<everything:name>/sub/<sub>/b/<int:num>')
  343. def topic_block(name = None, sub = None, num = 1):
  344. return topic_block_2(conn, name, sub, num)
  345. @app.route('/topic/<everything:name>/sub/<sub>/notice/<int:num>')
  346. def topic_top(name = None, sub = None, num = 1):
  347. return topic_top_2(conn, name, sub, num)
  348. @app.route('/topic/<everything:name>/sub/<sub>/tool/<regex("close|stop|agree"):tool>', methods=['POST', 'GET'])
  349. def topic_stop(name = None, sub = None, tool = None):
  350. return topic_stop_2(conn, name, sub, tool)
  351. @app.route('/topic/<everything:name>/sub/<sub>/tool')
  352. def topic_tool(name = None, sub = None):
  353. return topic_tool_2(conn, name, sub)
  354. @app.route('/topic/<everything:name>/sub/<sub>/admin/<int:num>')
  355. def topic_admin(name = None, sub = None, num = 1):
  356. return topic_admin_2(conn, name, sub, num)
  357. @app.route('/topic/<everything:name>/sub/<sub>', methods=['POST', 'GET'])
  358. def topic(name = None, sub = None):
  359. return topic_2(conn, name, sub)
  360. @app.route('/topic/<everything:name>', methods=['POST', 'GET'])
  361. @app.route('/topic/<everything:name>/<regex("close|agree"):tool>', methods=['GET'])
  362. def topic_close_list(name = None, tool = None):
  363. return topic_close_list_2(conn, name, tool)
  364. @app.route('/tool/<name>')
  365. def user_tool(name = None):
  366. return user_tool_2(conn, name)
  367. @app.route('/login', methods=['POST', 'GET'])
  368. def login():
  369. return login_2(conn)
  370. @app.route('/oauth/<regex("discord|naver|facebook|kakao"):platform>/<regex("init|callback"):func>', methods=['GET', 'POST'])
  371. def login_oauth(platform = None, func = None):
  372. return login_oauth_2(conn, platform, func)
  373. @app.route('/change', methods=['POST', 'GET'])
  374. def user_setting():
  375. return user_setting_2(conn, server_init)
  376. @app.route('/pw_change', methods=['POST', 'GET'])
  377. def login_pw_change():
  378. return login_pw_change_2(conn)
  379. @app.route('/check/<name>')
  380. def give_user_check(name = None):
  381. return give_user_check_2(conn, name)
  382. @app.route('/register', methods=['POST', 'GET'])
  383. def login_register():
  384. return login_register_2(conn)
  385. @app.route('/<regex("need_email|pass_find|email_change"):tool>', methods=['POST', 'GET'])
  386. def login_need_email(tool = 'pass_find'):
  387. return login_need_email_2(conn, tool)
  388. @app.route('/<regex("check_key|check_pass_key|email_replace"):tool>', methods=['POST', 'GET'])
  389. def login_check_key(tool = 'check_pass_key'):
  390. return login_check_key_2(conn, tool)
  391. @app.route('/logout')
  392. def login_logout():
  393. return login_logout_2(conn)
  394. @app.route('/ban', methods=['POST', 'GET'])
  395. @app.route('/ban/<name>', methods=['POST', 'GET'])
  396. def give_user_ban(name = None):
  397. return give_user_ban_2(conn, name)
  398. @app.route('/acl/<everything:name>', methods=['POST', 'GET'])
  399. def give_acl(name = None):
  400. return give_acl_2(conn, name)
  401. @app.route('/admin/<name>', methods=['POST', 'GET'])
  402. def give_admin(name = None):
  403. return give_admin_2(conn, name)
  404. @app.route('/diff/<everything:name>')
  405. def view_diff_data(name = None):
  406. return view_diff_data_2(conn, name)
  407. @app.route('/down/<everything:name>')
  408. def view_down(name = None):
  409. return view_down_2(conn, name)
  410. @app.route('/w/<everything:name>')
  411. def view_read(name = None):
  412. return view_read_2(conn, name)
  413. @app.route('/topic_record/<name>')
  414. def list_user_topic(name = None):
  415. return list_user_topic_2(conn, name)
  416. @app.route('/recent_changes')
  417. @app.route('/<regex("record"):tool>/<name>')
  418. @app.route('/<regex("history"):tool>/<everything:name>', methods=['POST', 'GET'])
  419. def recent_changes(name = None, tool = 'record'):
  420. return recent_changes_2(conn, name, tool)
  421. @app.route('/upload', methods=['GET', 'POST'])
  422. def func_upload():
  423. return func_upload_2(conn)
  424. @app.route('/user')
  425. def user_info():
  426. return user_info_2(conn)
  427. @app.route('/watch_list')
  428. def watch_list():
  429. return watch_list_2(conn)
  430. @app.route('/watch_list/<everything:name>')
  431. def watch_list_name(name = None):
  432. return watch_list_name_2(conn, name)
  433. @app.route('/custom_head', methods=['GET', 'POST'])
  434. def user_custom_head_view():
  435. return user_custom_head_view_2(conn)
  436. @app.route('/count')
  437. @app.route('/count/<name>')
  438. def user_count_edit(name = None):
  439. return user_count_edit_2(conn, name)
  440. @app.route('/random')
  441. def func_title_random():
  442. return func_title_random_2(conn)
  443. @app.route('/image/<name>')
  444. def main_image_view(name = None):
  445. return main_image_view_2(conn, name, app_var)
  446. @app.route('/skin_set')
  447. def main_skin_set():
  448. return main_skin_set_2(conn)
  449. # API
  450. @app.route('/api/w/<everything:name>', methods=['POST', 'GET'])
  451. def api_w(name = ''):
  452. return api_w_2(conn, name)
  453. @app.route('/api/raw/<everything:name>')
  454. def api_raw(name = ''):
  455. return api_raw_2(conn, name)
  456. @app.route('/api/version')
  457. def api_version():
  458. return api_version_2(conn, r_ver, c_ver)
  459. @app.route('/api/skin_info')
  460. def api_skin_info():
  461. return api_skin_info_2(conn)
  462. @app.route('/api/topic/<everything:name>/sub/<sub>')
  463. def api_topic_sub(name = '', sub = '', time = ''):
  464. return api_topic_sub_2(conn, name, sub, time)
  465. ## File
  466. @app.route('/views/easter_egg.html')
  467. def main_easter_egg():
  468. return main_easter_egg_2(conn)
  469. @app.route('/views/<everything:name>')
  470. def main_views(name = None):
  471. return main_views_2(conn, name)
  472. @app.route('/<data>')
  473. def main_file(data = None):
  474. return main_file_2(conn, data)
  475. ## End
  476. @app.errorhandler(404)
  477. def main_error_404(e):
  478. return main_error_404_2(conn)
  479. if __name__=="__main__":
  480. app.secret_key = rep_key
  481. http_server = tornado.httpserver.HTTPServer(tornado.wsgi.WSGIContainer(app))
  482. http_server.listen(server_set['port'], address=server_set['host'])
  483. tornado.ioloop.IOLoop.instance().start()