app.py 72 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880
  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. r_ver = 'v3.0.9-master-005'
  9. c_ver = '309002'
  10. print('Version : ' + r_ver)
  11. app_var = json.loads(open('data/app_variables.json', encoding='utf-8').read())
  12. all_src = []
  13. for i_data in os.listdir("."):
  14. f_src = re.search("(.+)\.db$", i_data)
  15. if f_src:
  16. all_src += [f_src.groups()[0]]
  17. if len(all_src) == 0:
  18. print('DB\'s name (data) : ', end = '')
  19. db_name = input()
  20. if db_name == '':
  21. db_name = 'data'
  22. elif len(all_src) > 1:
  23. db_num = 1
  24. for i_data in all_src:
  25. print(str(db_num) + ' : ' + i_data)
  26. db_num += 1
  27. print('Number : ', end = '')
  28. db_name = all_src[int(number_check(input())) - 1]
  29. else:
  30. db_name = all_src[0]
  31. if len(all_src) == 1:
  32. print('DB\'s name : ' + db_name)
  33. if os.path.exists(db_name + '.db'):
  34. setup_tool = 0
  35. else:
  36. setup_tool = 1
  37. conn = sqlite3.connect(db_name + '.db', check_same_thread = False)
  38. curs = conn.cursor()
  39. load_conn(conn)
  40. logging.basicConfig(level = logging.ERROR)
  41. app = flask.Flask(__name__, template_folder = './')
  42. app.config['JSON_AS_ASCII'] = False
  43. flask_reggie.Reggie(app)
  44. compress = flask_compress.Compress()
  45. compress.init_app(app)
  46. class EverythingConverter(werkzeug.routing.PathConverter):
  47. regex = '.*?'
  48. app.jinja_env.filters['md5_replace'] = md5_replace
  49. app.jinja_env.filters['load_lang'] = load_lang
  50. app.url_map.converters['everything'] = EverythingConverter
  51. curs.execute('create table if not exists data(test text)')
  52. curs.execute('create table if not exists cache_data(test text)')
  53. curs.execute('create table if not exists history(test text)')
  54. curs.execute('create table if not exists rd(test text)')
  55. curs.execute('create table if not exists user(test text)')
  56. curs.execute('create table if not exists user_set(test text)')
  57. curs.execute('create table if not exists ban(test text)')
  58. curs.execute('create table if not exists topic(test text)')
  59. curs.execute('create table if not exists rb(test text)')
  60. curs.execute('create table if not exists back(test text)')
  61. curs.execute('create table if not exists custom(test text)')
  62. curs.execute('create table if not exists other(test text)')
  63. curs.execute('create table if not exists alist(test text)')
  64. curs.execute('create table if not exists re_admin(test text)')
  65. curs.execute('create table if not exists alarm(test text)')
  66. curs.execute('create table if not exists ua_d(test text)')
  67. curs.execute('create table if not exists filter(test text)')
  68. curs.execute('create table if not exists scan(test text)')
  69. curs.execute('create table if not exists acl(test text)')
  70. curs.execute('create table if not exists inter(test text)')
  71. curs.execute('create table if not exists html_filter(test text)')
  72. curs.execute('create table if not exists oauth_conn(test text)')
  73. if setup_tool == 0:
  74. try:
  75. curs.execute('select data from other where name = "ver"')
  76. ver_set_data = curs.fetchall()
  77. if not ver_set_data:
  78. setup_tool = 1
  79. else:
  80. if c_ver > ver_set_data[0][0]:
  81. setup_tool = 1
  82. except:
  83. setup_tool = 1
  84. if setup_tool != 0:
  85. create_data = {}
  86. create_data['all_data'] = [
  87. 'data',
  88. 'cache_data',
  89. 'history',
  90. 'rd',
  91. 'user',
  92. 'user_set',
  93. 'ban',
  94. 'topic',
  95. 'rb',
  96. 'back',
  97. 'custom',
  98. 'other',
  99. 'alist',
  100. 're_admin',
  101. 'alarm',
  102. 'ua_d',
  103. 'filter',
  104. 'scan',
  105. 'acl',
  106. 'inter',
  107. 'html_filter',
  108. 'oauth_conn'
  109. ]
  110. create_data['data'] = ['title', 'data']
  111. create_data['cache_data'] = ['title', 'data']
  112. create_data['history'] = ['id', 'title', 'data', 'date', 'ip', 'send', 'leng', 'hide', 'type']
  113. create_data['rd'] = ['title', 'sub', 'date', 'band', 'stop', 'agree']
  114. create_data['user'] = ['id', 'pw', 'acl', 'date', 'encode']
  115. create_data['user_set'] = ['name', 'id', 'data']
  116. create_data['ban'] = ['block', 'end', 'why', 'band', 'login']
  117. create_data['topic'] = ['id', 'title', 'sub', 'data', 'date', 'ip', 'block', 'top']
  118. create_data['rb'] = ['block', 'end', 'today', 'blocker', 'why', 'band']
  119. create_data['back'] = ['title', 'link', 'type']
  120. create_data['custom'] = ['user', 'css']
  121. create_data['other'] = ['name', 'data']
  122. create_data['alist'] = ['name', 'acl']
  123. create_data['re_admin'] = ['who', 'what', 'time']
  124. create_data['alarm'] = ['name', 'data', 'date']
  125. create_data['ua_d'] = ['name', 'ip', 'ua', 'today', 'sub']
  126. create_data['filter'] = ['name', 'regex', 'sub']
  127. create_data['scan'] = ['user', 'title']
  128. create_data['acl'] = ['title', 'dec', 'dis', 'view', 'why']
  129. create_data['inter'] = ['title', 'link']
  130. create_data['html_filter'] = ['html', 'kind']
  131. create_data['oauth_conn'] = ['provider', 'wiki_id', 'sns_id', 'name', 'picture']
  132. for create_table in create_data['all_data']:
  133. for create in create_data[create_table]:
  134. try:
  135. curs.execute('select ' + create + ' from ' + create_table + ' limit 1')
  136. except:
  137. curs.execute("alter table " + create_table + " add " + create + " text default ''")
  138. update()
  139. curs.execute('select name from alist where acl = "owner"')
  140. if not curs.fetchall():
  141. curs.execute('delete from alist where name = "owner"')
  142. curs.execute('insert into alist (name, acl) values ("owner", "owner")')
  143. if not os.path.exists(app_var['path_data_image']):
  144. os.makedirs(app_var['path_data_image'])
  145. if not os.path.exists('views'):
  146. os.makedirs('views')
  147. import route.tool.init as server_init
  148. dislay_set_key = ['Host', 'Port', 'Language', 'Markup', 'Encrypt Method']
  149. server_set_key = ['host', 'port', 'language', 'markup', 'encode']
  150. server_set = {}
  151. for i in range(len(server_set_key)):
  152. curs.execute('select data from other where name = ?', [server_set_key[i]])
  153. server_set_val = curs.fetchall()
  154. if not server_set_val:
  155. server_set_val = server_init.init(server_set_key[i])
  156. curs.execute('insert into other (name, data) values (?, ?)', [server_set_key[i], server_set_val])
  157. conn.commit()
  158. else:
  159. server_set_val = server_set_val[0][0]
  160. print(dislay_set_key[i] + ' : ' + server_set_val)
  161. server_set[server_set_key[i]] = server_set_val
  162. try:
  163. if not os.path.exists('robots.txt'):
  164. curs.execute('select data from other where name = "robot"')
  165. robot_test = curs.fetchall()
  166. if robot_test:
  167. fw_test = open('./robots.txt', 'w')
  168. fw_test.write(re.sub('\r\n', '\n', robot_test[0][0]))
  169. fw_test.close()
  170. else:
  171. fw_test = open('./robots.txt', 'w')
  172. fw_test.write('User-agent: *\nDisallow: /\nAllow: /$\nAllow: /w/')
  173. fw_test.close()
  174. curs.execute('insert into other (name, data) values ("robot", "User-agent: *\nDisallow: /\nAllow: /$\nAllow: /w/")')
  175. print('Engine made robots.txt')
  176. except:
  177. pass
  178. curs.execute('select data from other where name = "key"')
  179. rep_data = curs.fetchall()
  180. if not rep_data:
  181. rep_key = ''.join(random.choice("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") for i in range(16))
  182. if rep_key:
  183. curs.execute('insert into other (name, data) values ("key", ?)', [rep_key])
  184. else:
  185. rep_key = rep_data[0][0]
  186. curs.execute('select data from other where name = "adsense"')
  187. adsense_result = curs.fetchall()
  188. if not adsense_result:
  189. curs.execute('insert into other (name, data) values ("adsense", "False")')
  190. curs.execute('insert into other (name, data) values ("adsense_code", "")')
  191. curs.execute('delete from other where name = "ver"')
  192. curs.execute('insert into other (name, data) values ("ver", ?)', [c_ver])
  193. def back_up():
  194. try:
  195. shutil.copyfile(db_name + '.db', 'back_' + db_name + '.db')
  196. print('Back up : OK')
  197. except:
  198. print('Back up : Error')
  199. threading.Timer(60 * 60 * back_time, back_up).start()
  200. try:
  201. curs.execute('select data from other where name = "back_up"')
  202. back_up_time = curs.fetchall()
  203. back_time = int(back_up_time[0][0])
  204. except:
  205. back_time = 0
  206. if back_time != 0:
  207. print('Back up state : ' + str(back_time) + ' hours')
  208. if __name__ == '__main__':
  209. back_up()
  210. else:
  211. print('Back up state : Turn off')
  212. conn.commit()
  213. @app.route('/del_alarm')
  214. def del_alarm():
  215. return del_alarm_2(conn)
  216. @app.route('/alarm')
  217. def alarm():
  218. return alarm_2(conn)
  219. @app.route('/<regex("inter_wiki|(?:edit|email|name)_filter"):tools>')
  220. def inter_wiki(tools = None):
  221. return inter_wiki_2(conn, tools)
  222. @app.route('/<regex("del_(?:inter_wiki|(?:edit|email|name)_filter)"):tools>/<name>')
  223. def del_inter(tools = None, name = None):
  224. return del_inter_2(conn, tools, name)
  225. @app.route('/<regex("plus_(?:inter_wiki|(?:edit|email|name)_filter)"):tools>', methods=['POST', 'GET'])
  226. @app.route('/<regex("plus_edit_filter"):tools>/<name>', methods=['POST', 'GET'])
  227. def plus_inter(tools = None, name = None):
  228. return plus_inter_2(conn, tools, name)
  229. @app.route('/setting')
  230. @app.route('/setting/<int:num>', methods=['POST', 'GET'])
  231. def setting(num = 0):
  232. return setting_2(conn, num)
  233. @app.route('/not_close_topic')
  234. def not_close_topic():
  235. return not_close_topic_2(conn)
  236. @app.route('/image/<name>')
  237. def image_view(name = None):
  238. return image_view_2(conn, name)
  239. @app.route('/acl_list')
  240. def acl_list():
  241. return acl_list_2(conn)
  242. @app.route('/admin_plus/<name>', methods=['POST', 'GET'])
  243. def admin_plus(name = None):
  244. return admin_plus_2(conn)
  245. @app.route('/admin_list')
  246. def admin_list():
  247. return admin_list_2(conn)
  248. @app.route('/hidden/<everything:name>')
  249. def history_hidden(name = None):
  250. return history_hidden_2(name)
  251. @app.route('/user_log')
  252. def user_log():
  253. return user_log_2(conn)
  254. @app.route('/admin_log')
  255. def admin_log():
  256. return admin_log_2(conn)
  257. @app.route('/give_log')
  258. def give_log():
  259. return give_log_2(conn)
  260. @app.route('/indexing', methods=['POST', 'GET'])
  261. def indexing():
  262. return indexing_2(conn)
  263. @app.route('/restart', methods=['POST', 'GET'])
  264. def restart():
  265. return restart_2(conn)
  266. @app.route('/update')
  267. def now_update():
  268. return now_update_2(conn)
  269. @app.route('/oauth_setting', methods=['GET', 'POST'])
  270. def oauth_setting():
  271. return oauth_setting_2(conn)
  272. @app.route('/adsense_setting', methods=['GET', 'POST'])
  273. def adsense_setting():
  274. return adsense_setting_2(conn)
  275. @app.route('/xref/<everything:name>')
  276. def xref(name = None):
  277. return xref_2(conn, name)
  278. @app.route('/please')
  279. def please():
  280. return please_2(conn)
  281. @app.route('/recent_discuss')
  282. def recent_discuss():
  283. return recent_discuss_2(conn)
  284. @app.route('/block_log')
  285. @app.route('/<regex("block_user|block_admin"):tool>/<name>')
  286. def block_log(name = None, tool = None):
  287. return block_log_2(conn, name, tool)
  288. @app.route('/search', methods=['POST'])
  289. def search():
  290. return redirect('/search/' + url_pas(flask.request.form.get('search', 'test')))
  291. @app.route('/goto', methods=['POST'])
  292. def goto():
  293. curs.execute("select title from data where title = ?", [flask.request.form.get('search', 'test')])
  294. data = curs.fetchall()
  295. if data:
  296. return redirect('/w/' + url_pas(flask.request.form.get('search', 'test')))
  297. else:
  298. return redirect('/search/' + url_pas(flask.request.form.get('search', 'test')))
  299. @app.route('/search/<everything:name>')
  300. def deep_search(name = ''):
  301. return deep_search_2(conn, name)
  302. @app.route('/raw/<everything:name>')
  303. @app.route('/topic/<everything:name>/sub/<sub_title>/raw/<int:num>')
  304. def raw_view(name = None, sub_title = None, num = None):
  305. return raw_view_2(conn, name, sub_title, num)
  306. @app.route('/revert/<everything:name>', methods=['POST', 'GET'])
  307. def revert(name = None):
  308. return revert_2(conn, name)
  309. @app.route('/edit/<everything:name>', methods=['POST', 'GET'])
  310. def edit(name = None):
  311. return edit_2(conn, name)
  312. @app.route('/preview/<everything:name>', methods=['POST'])
  313. def preview(name = None):
  314. return preview_2(conn, name)
  315. @app.route('/delete/<everything:name>', methods=['POST', 'GET'])
  316. def delete(name = None):
  317. return delete_2(conn, name)
  318. @app.route('/move/<everything:name>', methods=['POST', 'GET'])
  319. def move(name = None):
  320. return move_2(conn, name)
  321. @app.route('/other')
  322. def other():
  323. return other_2(conn)
  324. @app.route('/manager', methods=['POST', 'GET'])
  325. @app.route('/manager/<int:num>', methods=['POST', 'GET'])
  326. def manager(num = 1):
  327. return manager_2(conn, num)
  328. @app.route('/title_index')
  329. def title_index():
  330. return title_index_2(conn)
  331. @app.route('/topic/<everything:name>/sub/<sub>/b/<int:num>')
  332. def topic_block(name = None, sub = None, num = 1):
  333. return topic_block_2(conn, name, sub, num)
  334. @app.route('/topic/<everything:name>/sub/<sub>/notice/<int:num>')
  335. def topic_top(name = None, sub = None, num = 1):
  336. return topic_top_2(conn, name, sub, num)
  337. @app.route('/topic/<everything:name>/sub/<sub>/tool/<regex("close|stop|agree"):tool>')
  338. def topic_stop(name = None, sub = None, tool = None):
  339. return topic_stop_2(conn, name, sub, tool)
  340. @app.route('/topic/<everything:name>/sub/<sub>/admin/<int:num>')
  341. def topic_admin(name = None, sub = None, num = 1):
  342. return topic_admin_2(conn, name, sub, num)
  343. @app.route('/topic/<everything:name>/sub/<sub>', methods=['POST', 'GET'])
  344. def topic(name = None, sub = None):
  345. return topic_2(conn, name, sub)
  346. @app.route('/tool/<name>')
  347. def user_tool(name = None):
  348. return user_tool_2(conn, name)
  349. @app.route('/topic/<everything:name>', methods=['POST', 'GET'])
  350. @app.route('/topic/<everything:name>/<regex("close|agree"):tool>', methods=['GET'])
  351. def close_topic_list(name = None, tool = None):
  352. return close_topic_list_2(conn, name, tool)
  353. @app.route('/login', methods=['POST', 'GET'])
  354. def login():
  355. return login_2(conn)
  356. @app.route('/oauth/<regex("discord|naver|facebook"):platform>/<regex("init|callback"):func>', methods=['GET', 'POST'])
  357. def login_oauth(platform = None, func = None):
  358. return login_oauth_2(conn, platform, func)
  359. @app.route('/change', methods=['POST', 'GET'])
  360. def change_password():
  361. support_language = server_init.server_set_var['language']['list']
  362. if ban_check() == 1:
  363. return re_error('/ban')
  364. if custom()[2] == 0:
  365. return redirect('/login')
  366. ip = ip_check()
  367. user_state = flask.request.args.get('user', 'ip')
  368. if user_state == 'ip':
  369. if flask.request.method == 'POST':
  370. if flask.request.form.get('pw4', None) and flask.request.form.get('pw2', None):
  371. if flask.request.form.get('pw2', None) != flask.request.form.get('pw3', None):
  372. return re_error('/error/20')
  373. curs.execute("select pw, encode from user where id = ?", [flask.session['id']])
  374. user = curs.fetchall()
  375. if not user:
  376. return re_error('/error/2')
  377. pw_check_d = pw_check(
  378. flask.request.form.get('pw4', ''),
  379. user[0][0],
  380. user[0][1],
  381. flask.request.form.get('id', None)
  382. )
  383. if pw_check_d != 1:
  384. return re_error('/error/10')
  385. hashed = pw_encode(flask.request.form.get('pw2', None))
  386. curs.execute("update user set pw = ? where id = ?", [hashed, flask.session['id']])
  387. auto_list = ['email', 'skin', 'lang']
  388. for auto_data in auto_list:
  389. curs.execute('select data from user_set where name = ? and id = ?', [auto_data, ip])
  390. if curs.fetchall():
  391. curs.execute("update user_set set data = ? where name = ? and id = ?", [flask.request.form.get(auto_data, ''), auto_data, ip])
  392. else:
  393. curs.execute("insert into user_set (name, id, data) values (?, ?, ?)", [auto_data, ip, flask.request.form.get(auto_data, '')])
  394. conn.commit()
  395. return redirect('/change')
  396. else:
  397. curs.execute('select data from user_set where name = "email" and id = ?', [ip])
  398. data = curs.fetchall()
  399. if data:
  400. email = data[0][0]
  401. else:
  402. email = ''
  403. div2 = load_skin()
  404. div3 = ''
  405. var_div3 = ''
  406. curs.execute('select data from user_set where name = "lang" and id = ?', [flask.session['id']])
  407. data = curs.fetchall()
  408. for lang_data in support_language:
  409. if data and data[0][0] == lang_data:
  410. div3 = '<option value="' + lang_data + '">' + lang_data + '</option>'
  411. else:
  412. var_div3 += '<option value="' + lang_data + '">' + lang_data + '</option>'
  413. div3 += var_div3
  414. oauth_provider = load_oauth('_README')['support']
  415. oauth_content = '<ul>'
  416. for i in range(len(oauth_provider)):
  417. curs.execute('select name, picture from oauth_conn where wiki_id = ? and provider = ?', [flask.session['id'], oauth_provider[i]])
  418. oauth_data = curs.fetchall()
  419. if len(oauth_data) == 1:
  420. oauth_content += '<li>{} - {}</li>'.format(oauth_provider[i], load_lang('connection') + ' : <img src="{}" width="17px" height="17px">{}'.format(oauth_data[0][1], oauth_data[0][0]))
  421. else:
  422. oauth_content += '<li>{} - {}</li>'.format(oauth_provider[i], load_lang('connection') + ' : <a href="/oauth/{}/init">{}</a>'.format(oauth_provider[i], load_lang('connect')))
  423. oauth_content += '</ul>'
  424. return easy_minify(flask.render_template(skin_check(),
  425. imp = [load_lang('user_setting'), wiki_set(), custom(), other2([0, 0])],
  426. data = '''
  427. <form method="post">
  428. <span>id : ''' + ip + '''</span>
  429. <hr class=\"main_hr\">
  430. <input placeholder="''' + load_lang('now_password') + '''" name="pw4" type="password">
  431. <hr class=\"main_hr\">
  432. <input placeholder="''' + load_lang('new_password') + '''" name="pw2" type="password">
  433. <hr class=\"main_hr\">
  434. <input placeholder="''' + load_lang('password_confirm') + '''" name="pw3" type="password">
  435. <hr class=\"main_hr\">
  436. <span>''' + load_lang('skin') + '''</span>
  437. <hr class=\"main_hr\">
  438. <select name="skin">''' + div2 + '''</select>
  439. <hr class=\"main_hr\">
  440. <span>''' + load_lang('language') + '''</span>
  441. <hr class=\"main_hr\">
  442. <select name="lang">''' + div3 + '''</select>
  443. <hr class=\"main_hr\">
  444. <span>''' + load_lang('oauth_connection') + '''</span>
  445. ''' + oauth_content + '''
  446. <hr class=\"main_hr\">
  447. <button type="submit">''' + load_lang('save') + '''</button>
  448. <hr class=\"main_hr\">
  449. <span>''' + load_lang('http_warring') + '''</span>
  450. </form>
  451. ''',
  452. menu = [['user', load_lang('return')]]
  453. ))
  454. else:
  455. pass
  456. @app.route('/check/<name>')
  457. def user_check(name = None):
  458. curs.execute("select acl from user where id = ? or id = ?", [name, flask.request.args.get('plus', '-')])
  459. user = curs.fetchall()
  460. if user and user[0][0] != 'user':
  461. if admin_check() != 1:
  462. return re_error('/error/4')
  463. if admin_check(4, 'check (' + name + ')') != 1:
  464. return re_error('/error/3')
  465. num = int(number_check(flask.request.args.get('num', '1')))
  466. if num * 50 > 0:
  467. sql_num = num * 50 - 50
  468. else:
  469. sql_num = 0
  470. if flask.request.args.get('plus', None):
  471. end_check = 1
  472. if ip_or_user(name) == 1:
  473. if ip_or_user(flask.request.args.get('plus', None)) == 1:
  474. curs.execute("select name, ip, ua, today from ua_d where ip = ? or ip = ? order by today desc limit ?, '50'", [name, flask.request.args.get('plus', None), sql_num])
  475. else:
  476. curs.execute("select name, ip, ua, today from ua_d where ip = ? or name = ? order by today desc limit ?, '50'", [name, flask.request.args.get('plus', None), sql_num])
  477. else:
  478. if ip_or_user(flask.request.args.get('plus', None)) == 1:
  479. curs.execute("select name, ip, ua, today from ua_d where name = ? or ip = ? order by today desc limit ?, '50'", [name, flask.request.args.get('plus', None), sql_num])
  480. else:
  481. curs.execute("select name, ip, ua, today from ua_d where name = ? or name = ? order by today desc limit ?, '50'", [name, flask.request.args.get('plus', None), sql_num])
  482. else:
  483. end_check = 0
  484. if ip_or_user(name) == 1:
  485. curs.execute("select name, ip, ua, today from ua_d where ip = ? order by today desc limit ?, '50'", [name, sql_num])
  486. else:
  487. curs.execute("select name, ip, ua, today from ua_d where name = ? order by today desc limit ?, '50'", [name, sql_num])
  488. record = curs.fetchall()
  489. if record:
  490. if not flask.request.args.get('plus', None):
  491. div = '<a href="/manager/14?plus=' + url_pas(name) + '">(' + load_lang('compare') + ')</a><hr class=\"main_hr\">'
  492. else:
  493. div = '<a href="/check/' + url_pas(name) + '">(' + name + ')</a> <a href="/check/' + url_pas(flask.request.args.get('plus', None)) + '">(' + flask.request.args.get('plus', None) + ')</a><hr class=\"main_hr\">'
  494. div += '''
  495. <table id="main_table_set">
  496. <tbody>
  497. <tr>
  498. <td id="main_table_width">''' + load_lang('name') + '''</td>
  499. <td id="main_table_width">ip</td>
  500. <td id="main_table_width">''' + load_lang('time') + '''</td>
  501. </tr>
  502. '''
  503. for data in record:
  504. if data[2]:
  505. ua = data[2]
  506. else:
  507. ua = '<br>'
  508. div += '''
  509. <tr>
  510. <td>''' + ip_pas(data[0]) + '''</td>
  511. <td>''' + ip_pas(data[1]) + '''</td>
  512. <td>''' + data[3] + '''</td>
  513. </tr>
  514. <tr>
  515. <td colspan="3">''' + ua + '''</td>
  516. </tr>
  517. '''
  518. div += '''
  519. </tbody>
  520. </table>
  521. '''
  522. else:
  523. return re_error('/error/2')
  524. if end_check == 1:
  525. div += next_fix('/check/' + url_pas(name) + '?plus=' + flask.request.args.get('plus', None) + '&num=', num, record)
  526. else:
  527. div += next_fix('/check/' + url_pas(name) + '?num=', num, record)
  528. return easy_minify(flask.render_template(skin_check(),
  529. imp = [load_lang('check'), wiki_set(), custom(), other2([0, 0])],
  530. data = div,
  531. menu = [['manager', load_lang('return')]]
  532. ))
  533. @app.route('/register', methods=['POST', 'GET'])
  534. def register():
  535. if ban_check() == 1:
  536. return re_error('/ban')
  537. if custom()[2] != 0:
  538. return redirect('/user')
  539. if not admin_check() == 1:
  540. curs.execute('select data from other where name = "reg"')
  541. set_d = curs.fetchall()
  542. if set_d and set_d[0][0] == 'on':
  543. return re_error('/ban')
  544. if flask.request.method == 'POST':
  545. if captcha_post(flask.request.form.get('g-recaptcha-response', '')) == 1:
  546. return re_error('/error/13')
  547. else:
  548. captcha_post('', 0)
  549. if flask.request.form.get('pw', None) != flask.request.form.get('pw2', None):
  550. return re_error('/error/20')
  551. if re.search('(?:[^A-Za-zㄱ-힣0-9 ])', flask.request.form.get('id', None)):
  552. return re_error('/error/8')
  553. curs.execute('select html from html_filter where kind = "name"')
  554. set_d = curs.fetchall()
  555. for i in set_d:
  556. check_r = re.compile(i[0], re.I)
  557. if check_r.search(flask.request.form.get('id', None)):
  558. return re_error('/error/8')
  559. if len(flask.request.form.get('id', None)) > 32:
  560. return re_error('/error/7')
  561. curs.execute("select id from user where id = ?", [flask.request.form.get('id', None)])
  562. if curs.fetchall():
  563. return re_error('/error/6')
  564. hashed = pw_encode(flask.request.form.get('pw', None))
  565. curs.execute('select data from other where name = "email_have"')
  566. sql_data = curs.fetchall()
  567. if sql_data and sql_data[0][0] != '':
  568. flask.session['c_id'] = flask.request.form.get('id', None)
  569. flask.session['c_pw'] = hashed
  570. flask.session['c_key'] = ''.join(random.choice("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") for i in range(16))
  571. return redirect('/need_email')
  572. else:
  573. curs.execute('select data from other where name = "encode"')
  574. db_data = curs.fetchall()
  575. curs.execute("select id from user limit 1")
  576. if not curs.fetchall():
  577. curs.execute("insert into user (id, pw, acl, date, encode) values (?, ?, 'owner', ?, ?)", [flask.request.form.get('id', None), hashed, get_time(), db_data[0][0]])
  578. first = 1
  579. else:
  580. curs.execute("insert into user (id, pw, acl, date, encode) values (?, ?, 'user', ?, ?)", [flask.request.form.get('id', None), hashed, get_time(), db_data[0][0]])
  581. first = 0
  582. ip = ip_check()
  583. agent = flask.request.headers.get('User-Agent')
  584. curs.execute("insert into ua_d (name, ip, ua, today, sub) values (?, ?, ?, ?, '')", [flask.request.form.get('id', None), ip, agent, get_time()])
  585. flask.session['state'] = 1
  586. flask.session['id'] = flask.request.form.get('id', None)
  587. flask.session['head'] = ''
  588. conn.commit()
  589. if first == 0:
  590. return redirect('/change')
  591. else:
  592. return redirect('/setting')
  593. else:
  594. contract = ''
  595. curs.execute('select data from other where name = "contract"')
  596. data = curs.fetchall()
  597. if data and data[0][0] != '':
  598. contract = data[0][0] + '<hr class=\"main_hr\">'
  599. return easy_minify(flask.render_template(skin_check(),
  600. imp = [load_lang('register'), wiki_set(), custom(), other2([0, 0])],
  601. data = '''
  602. <form method="post">
  603. ''' + contract + '''
  604. <input placeholder="''' + load_lang('id') + '''" name="id" type="text">
  605. <hr class=\"main_hr\">
  606. <input placeholder="''' + load_lang('password') + '''" name="pw" type="password">
  607. <hr class=\"main_hr\">
  608. <input placeholder="''' + load_lang('password_confirm') + '''" name="pw2" type="password">
  609. <hr class=\"main_hr\">
  610. ''' + captcha_get() + '''
  611. <button type="submit">''' + load_lang('save') + '''</button>
  612. <hr class=\"main_hr\">
  613. <span>''' + load_lang('http_warring') + '''</span>
  614. </form>
  615. ''',
  616. menu = [['user', load_lang('return')]]
  617. ))
  618. @app.route('/<regex("need_email|pass_find"):tool>', methods=['POST', 'GET'])
  619. def need_email(tool = 'pass_find'):
  620. if flask.request.method == 'POST':
  621. if tool == 'need_email':
  622. if 'c_id' in flask.session:
  623. main_email = ['naver.com', 'gmail.com', 'daum.net', 'hanmail.net', 'hanmail2.net']
  624. data = re.search('@([^@]+)$', flask.request.form.get('email', ''))
  625. if data:
  626. data = data.groups()[0]
  627. curs.execute("select html from html_filter where html = ? and kind = 'email'", [data])
  628. if curs.fetchall() or (data in main_email):
  629. curs.execute('select id from user_set where name = "email" and data = ?', [flask.request.form.get('email', '')])
  630. if curs.fetchall():
  631. flask.session.pop('c_id', None)
  632. flask.session.pop('c_pw', None)
  633. flask.session.pop('c_key', None)
  634. return redirect('/register')
  635. else:
  636. send_email(flask.request.form.get('email', ''), wiki_set()[0] + ' key', 'key : ' + flask.session['c_key'])
  637. flask.session['c_email'] = flask.request.form.get('email', '')
  638. return redirect('/check_key')
  639. return redirect('/register')
  640. else:
  641. curs.execute("select id from user where id = ? and email = ?", [flask.request.form.get('id', ''), flask.request.form.get('email', '')])
  642. if curs.fetchall():
  643. flask.session['c_key'] = ''.join(random.choice("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") for i in range(16))
  644. flask.session['c_id'] = flask.request.form.get('id', '')
  645. send_email(flask.request.form.get('email', ''), wiki_set()[0] + ' ' + load_lang('password_search') + ' key', 'key : ' + flask.session['c_key'])
  646. return redirect('/check_pass_key')
  647. else:
  648. if tool == 'need_email':
  649. return easy_minify(flask.render_template(skin_check(),
  650. imp = [load_lang('email'), wiki_set(), custom(), other2([0, 0])],
  651. data = '''
  652. <a href="/email_filter">(''' + load_lang('email_filter_list') + ''')</a>
  653. <hr class=\"main_hr\">
  654. <form method="post">
  655. <input placeholder="''' + load_lang('email') + '''" name="email" type="text">
  656. <hr class=\"main_hr\">
  657. <button type="submit">''' + load_lang('save') + '''</button>
  658. </form>
  659. ''',
  660. menu = [['user', load_lang('return')]]
  661. ))
  662. else:
  663. return easy_minify(flask.render_template(skin_check(),
  664. imp = [load_lang('password_search'), wiki_set(), custom(), other2([0, 0])],
  665. data = '''
  666. <form method="post">
  667. <input placeholder="''' + load_lang('id') + '''" name="id" type="text">
  668. <hr class=\"main_hr\">
  669. <input placeholder="email" name="email" type="text">
  670. <hr class=\"main_hr\">
  671. <button type="submit">''' + load_lang('save') + '''</button>
  672. </form>
  673. ''',
  674. menu = [['user', load_lang('return')]]
  675. ))
  676. @app.route('/<regex("check_key|check_pass_key"):tool>', methods=['POST', 'GET'])
  677. def check_key(tool = 'check_pass_key'):
  678. if flask.request.method == 'POST':
  679. if tool == 'check_key':
  680. if 'c_id' in flask.session and flask.session['c_key'] == flask.request.form.get('key', None):
  681. curs.execute('select data from other where name = "encode"')
  682. db_data = curs.fetchall()
  683. curs.execute("select id from user limit 1")
  684. if not curs.fetchall():
  685. curs.execute("insert into user (id, pw, acl, date, encode) values (?, ?, 'owner', ?)", [flask.session['c_id'], flask.session['c_pw'], get_time(), db_data[0][0]])
  686. first = 1
  687. else:
  688. curs.execute("insert into user (id, pw, acl, date, encode) values (?, ?, 'user', ?)", [flask.session['c_id'], flask.session['c_pw'], get_time(), db_data[0][0]])
  689. first = 0
  690. ip = ip_check()
  691. agent = flask.request.headers.get('User-Agent')
  692. curs.execute("insert into user_set (name, id, data) values ('email', ?, ?)", [flask.session['c_id'], flask.session['c_email']])
  693. curs.execute("insert into ua_d (name, ip, ua, today, sub) values (?, ?, ?, ?, '')", [flask.session['c_id'], ip, agent, get_time()])
  694. flask.session['state'] = 1
  695. flask.session['id'] = flask.session['c_id']
  696. flask.session['head'] = ''
  697. conn.commit()
  698. flask.session.pop('c_id', None)
  699. flask.session.pop('c_pw', None)
  700. flask.session.pop('c_key', None)
  701. flask.session.pop('c_email', None)
  702. if first == 0:
  703. return redirect('/change')
  704. else:
  705. return redirect('/setting')
  706. else:
  707. flask.session.pop('c_id', None)
  708. flask.session.pop('c_pw', None)
  709. flask.session.pop('c_key', None)
  710. flask.session.pop('c_email', None)
  711. return redirect('/register')
  712. else:
  713. if 'c_id' in flask.session and flask.session['c_key'] == flask.request.form.get('key', None):
  714. hashed = pw_encode(flask.session['c_key'])
  715. curs.execute("update user set pw = ? where id = ?", [hashed, flask.session['c_id']])
  716. d_id = flask.session['c_id']
  717. pw = flask.session['c_key']
  718. flask.session.pop('c_id', None)
  719. flask.session.pop('c_key', None)
  720. return easy_minify(flask.render_template(skin_check(),
  721. imp = ['check', wiki_set(), custom(), other2([0, 0])],
  722. data = '''
  723. ''' + load_lang('id') + ' : ' + d_id + '''
  724. <br>
  725. ''' + load_lang('password') + ' : ' + pw + '''
  726. ''',
  727. menu = [['user', load_lang('return')]]
  728. ))
  729. else:
  730. return redirect('/pass_find')
  731. else:
  732. return easy_minify(flask.render_template(skin_check(),
  733. imp = ['check', wiki_set(), custom(), other2([0, 0])],
  734. data = '''
  735. <form method="post">
  736. <input placeholder="''' + load_lang('key') + '''" name="key" type="text">
  737. <hr class=\"main_hr\">
  738. <button type="submit">''' + load_lang('save') + '''</button>
  739. </form>
  740. ''',
  741. menu = [['user', load_lang('return')]]
  742. ))
  743. @app.route('/logout')
  744. def logout():
  745. flask.session['state'] = 0
  746. flask.session.pop('id', None)
  747. return redirect('/user')
  748. @app.route('/ban/<name>', methods=['POST', 'GET'])
  749. def user_ban(name = None):
  750. if ip_or_user(name) == 0:
  751. curs.execute("select acl from user where id = ?", [name])
  752. user = curs.fetchall()
  753. if not user:
  754. return re_error('/error/2')
  755. if user and user[0][0] != 'user':
  756. if admin_check() != 1:
  757. return re_error('/error/4')
  758. if ban_check(ip = ip_check(), tool = 'login') == 1:
  759. return re_error('/ban')
  760. if flask.request.method == 'POST':
  761. if admin_check(1, 'ban (' + name + ')') != 1:
  762. return re_error('/error/3')
  763. if flask.request.form.get('limitless', '') == '':
  764. end = flask.request.form.get('second', '0')
  765. else:
  766. end = '0'
  767. ban_insert(name, end, flask.request.form.get('why', ''), flask.request.form.get('login', ''), ip_check())
  768. return redirect('/ban/' + url_pas(name))
  769. else:
  770. if admin_check(1) != 1:
  771. return re_error('/error/3')
  772. curs.execute("select end, why from ban where block = ?", [name])
  773. end = curs.fetchall()
  774. if end:
  775. now = load_lang('release')
  776. if end[0][0] == '':
  777. data = '<ul><li>' + load_lang('limitless') + '</li>'
  778. else:
  779. data = '<ul><li>' + load_lang('period') + ' : ' + end[0][0] + '</li>'
  780. curs.execute("select block from ban where block = ? and login = 'O'", [name])
  781. if curs.fetchall():
  782. data += '<li>' + load_lang('login_able') + '</li>'
  783. if end[0][1] != '':
  784. data += '<li>' + load_lang('why') + ' : ' + end[0][1] + '</li></ul><hr class=\"main_hr\">'
  785. else:
  786. data += '</ul><hr class=\"main_hr\">'
  787. else:
  788. if re.search("^([0-9]{1,3}\.[0-9]{1,3})$", name):
  789. now = load_lang('band_ban')
  790. else:
  791. now = load_lang('ban')
  792. if ip_or_user(name) == 1:
  793. plus = '<input type="checkbox" name="login"> ' + load_lang('login_able') + '<hr class=\"main_hr\">'
  794. else:
  795. plus = ''
  796. data = '''
  797. <input placeholder="''' + load_lang('second') + '''" name="second" type="text">
  798. <hr class=\"main_hr\">
  799. <input type="checkbox" name="limitless"> ''' + load_lang('limitless') + '''
  800. <hr class=\"main_hr\">
  801. <input placeholder="''' + load_lang('why') + '''" name="why" type="text">
  802. <hr class=\"main_hr\">
  803. ''' + plus
  804. return easy_minify(flask.render_template(skin_check(),
  805. imp = [name, wiki_set(), custom(), other2([' (' + now + ')', 0])],
  806. data = '''
  807. <form method="post">
  808. ''' + data + '''
  809. <button type="submit">''' + now + '''</button>
  810. </form>
  811. ''',
  812. menu = [['manager', load_lang('return')]]
  813. ))
  814. @app.route('/acl/<everything:name>', methods=['POST', 'GET'])
  815. def acl(name = None):
  816. check_ok = ''
  817. if flask.request.method == 'POST':
  818. check_data = 'acl (' + name + ')'
  819. else:
  820. check_data = None
  821. user_data = re.search('^user:(.+)$', name)
  822. if user_data:
  823. if check_data and custom()[2] == 0:
  824. return redirect('/login')
  825. if user_data.groups()[0] != ip_check():
  826. if admin_check(5, check_data) != 1:
  827. if check_data:
  828. return re_error('/error/3')
  829. else:
  830. check_ok = 'disabled'
  831. else:
  832. if admin_check(5, check_data) != 1:
  833. if check_data:
  834. return re_error('/error/3')
  835. else:
  836. check_ok = 'disabled'
  837. if flask.request.method == 'POST':
  838. if flask.request.form.get('dec', '') != flask.request.form.get('view', ''):
  839. dec = flask.request.form.get('view', '')
  840. view = flask.request.form.get('view', '')
  841. else:
  842. dec = flask.request.form.get('dec', '')
  843. view = flask.request.form.get('view', '')
  844. curs.execute("select title from acl where title = ?", [name])
  845. if curs.fetchall():
  846. curs.execute("update acl set dec = ? where title = ?", [dec, name])
  847. curs.execute("update acl set dis = ? where title = ?", [flask.request.form.get('dis', ''), name])
  848. curs.execute("update acl set why = ? where title = ?", [flask.request.form.get('why', ''), name])
  849. curs.execute("update acl set view = ? where title = ?", [view, name])
  850. else:
  851. curs.execute("insert into acl (title, dec, dis, why, view) values (?, ?, ?, ?, ?)", [name, dec, flask.request.form.get('dis', ''), flask.request.form.get('why', ''), view])
  852. curs.execute("select title from acl where title = ? and dec = '' and dis = ''", [name])
  853. if curs.fetchall():
  854. curs.execute("delete from acl where title = ?", [name])
  855. conn.commit()
  856. return redirect('/acl/' + url_pas(name))
  857. else:
  858. data = '' + load_lang('document_acl') + '<br><br><select name="dec" ' + check_ok + '>'
  859. if re.search('^user:', name):
  860. acl_list = [['', load_lang('normal')], ['user', load_lang('member')], ['all', load_lang('all')]]
  861. else:
  862. acl_list = [['', load_lang('normal')], ['user', load_lang('member')], ['admin', load_lang('admin')]]
  863. curs.execute("select dec from acl where title = ?", [name])
  864. acl_data = curs.fetchall()
  865. for data_list in acl_list:
  866. if acl_data and acl_data[0][0] == data_list[0]:
  867. check = 'selected="selected"'
  868. else:
  869. check = ''
  870. data += '<option value="' + data_list[0] + '" ' + check + '>' + data_list[1] + '</option>'
  871. data += '</select>'
  872. if not re.search('^user:', name):
  873. data += '<hr class=\"main_hr\">' + load_lang('discussion_acl') + '<br><br><select name="dis" ' + check_ok + '>'
  874. curs.execute("select dis, why, view from acl where title = ?", [name])
  875. acl_data = curs.fetchall()
  876. for data_list in acl_list:
  877. if acl_data and acl_data[0][0] == data_list[0]:
  878. check = 'selected="selected"'
  879. else:
  880. check = ''
  881. data += '<option value="' + data_list[0] + '" ' + check + '>' + data_list[1] + '</option>'
  882. data += '</select>'
  883. data += '<hr class=\"main_hr\">' + load_lang('view_acl') + '<br><br><select name="view" ' + check_ok + '>'
  884. for data_list in acl_list:
  885. if acl_data and acl_data[0][2] == data_list[0]:
  886. check = 'selected="selected"'
  887. else:
  888. check = ''
  889. data += '<option value="' + data_list[0] + '" ' + check + '>' + data_list[1] + '</option>'
  890. data += '</select>'
  891. if check_ok == '':
  892. if acl_data:
  893. data += '<hr class=\"main_hr\"><input value="' + html.escape(acl_data[0][1]) + '" placeholder="' + load_lang('why') + '" name="why" type="text" ' + check_ok + '>'
  894. else:
  895. data += '<hr class=\"main_hr\"><input placeholder="' + load_lang('why') + '" name="why" type="text" ' + check_ok + '>'
  896. return easy_minify(flask.render_template(skin_check(),
  897. imp = [name, wiki_set(), custom(), other2([' (' + load_lang('acl') + ')', 0])],
  898. data = '''
  899. <form method="post">
  900. ''' + data + '''
  901. <hr class=\"main_hr\">
  902. <button type="submit" ''' + check_ok + '''>''' + load_lang('save') + '''</button>
  903. </form>
  904. ''',
  905. menu = [['w/' + url_pas(name), load_lang('document')], ['manager', load_lang('admin')]]
  906. ))
  907. @app.route('/admin/<name>', methods=['POST', 'GET'])
  908. def user_admin(name = None):
  909. owner = admin_check()
  910. curs.execute("select acl from user where id = ?", [name])
  911. user = curs.fetchall()
  912. if not user:
  913. return re_error('/error/2')
  914. else:
  915. if owner != 1:
  916. curs.execute('select name from alist where name = ? and acl = "owner"', [user[0][0]])
  917. if curs.fetchall():
  918. return re_error('/error/3')
  919. if ip_check() == name:
  920. return re_error('/error/3')
  921. if flask.request.method == 'POST':
  922. if admin_check(7, 'admin (' + name + ')') != 1:
  923. return re_error('/error/3')
  924. if owner != 1:
  925. curs.execute('select name from alist where name = ? and acl = "owner"', [flask.request.form.get('select', None)])
  926. if curs.fetchall():
  927. return re_error('/error/3')
  928. if flask.request.form.get('select', None) == 'X':
  929. curs.execute("update user set acl = 'user' where id = ?", [name])
  930. else:
  931. curs.execute("update user set acl = ? where id = ?", [flask.request.form.get('select', None), name])
  932. conn.commit()
  933. return redirect('/admin/' + url_pas(name))
  934. else:
  935. if admin_check(7) != 1:
  936. return re_error('/error/3')
  937. div = '<option value="X">X</option>'
  938. curs.execute('select distinct name from alist order by name asc')
  939. for data in curs.fetchall():
  940. if user[0][0] == data[0]:
  941. div += '<option value="' + data[0] + '" selected="selected">' + data[0] + '</option>'
  942. else:
  943. if owner != 1:
  944. curs.execute('select name from alist where name = ? and acl = "owner"', [data[0]])
  945. if not curs.fetchall():
  946. div += '<option value="' + data[0] + '">' + data[0] + '</option>'
  947. else:
  948. div += '<option value="' + data[0] + '">' + data[0] + '</option>'
  949. return easy_minify(flask.render_template(skin_check(),
  950. imp = [name, wiki_set(), custom(), other2([' (' + load_lang('authorize') + ')', 0])],
  951. data = '''
  952. <form method="post">
  953. <select name="select">''' + div + '''</select>
  954. <hr class=\"main_hr\">
  955. <button type="submit">''' + load_lang('save') + '''</button>
  956. </form>
  957. ''',
  958. menu = [['manager', load_lang('return')]]
  959. ))
  960. @app.route('/diff/<everything:name>')
  961. def diff_data(name = None):
  962. first = flask.request.args.get('first', '1')
  963. second = flask.request.args.get('second', '1')
  964. curs.execute("select data from history where id = ? and title = ?", [first, name])
  965. first_raw_data = curs.fetchall()
  966. if first_raw_data:
  967. curs.execute("select data from history where id = ? and title = ?", [second, name])
  968. second_raw_data = curs.fetchall()
  969. if second_raw_data:
  970. first_data = html.escape(first_raw_data[0][0])
  971. second_data = html.escape(second_raw_data[0][0])
  972. if first == second:
  973. result = '-'
  974. else:
  975. diff_data = difflib.SequenceMatcher(None, first_data, second_data)
  976. result = re.sub('\r', '', diff(diff_data))
  977. return easy_minify(flask.render_template(skin_check(),
  978. imp = [name, wiki_set(), custom(), other2([' (' + load_lang('compare') + ')', 0])],
  979. data = '<pre>' + result + '</pre>',
  980. menu = [['history/' + url_pas(name), load_lang('return')]]
  981. ))
  982. return redirect('/history/' + url_pas(name))
  983. @app.route('/down/<everything:name>')
  984. def down(name = None):
  985. div = '<ul>'
  986. curs.execute("select title from data where title like ?", ['%' + name + '/%'])
  987. for data in curs.fetchall():
  988. div += '<li><a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a></li>'
  989. div += '</ul>'
  990. return easy_minify(flask.render_template(skin_check(),
  991. imp = [name, wiki_set(), custom(), other2([' (' + load_lang('sub') + ')', 0])],
  992. data = div,
  993. menu = [['w/' + url_pas(name), load_lang('return')]]
  994. ))
  995. @app.route('/w/<everything:name>')
  996. def read_view(name = None):
  997. return read_view_2(conn, name)
  998. @app.route('/topic_record/<name>')
  999. def user_topic_list(name = None):
  1000. num = int(number_check(flask.request.args.get('num', '1')))
  1001. if num * 50 > 0:
  1002. sql_num = num * 50 - 50
  1003. else:
  1004. sql_num = 0
  1005. one_admin = admin_check(1)
  1006. div = '''
  1007. <table id="main_table_set">
  1008. <tbody>
  1009. <tr>
  1010. <td id="main_table_width">''' + load_lang('discussion_name') + '''</td>
  1011. <td id="main_table_width">''' + load_lang('writer') + '''</td>
  1012. <td id="main_table_width">''' + load_lang('time') + '''</td>
  1013. </tr>
  1014. '''
  1015. curs.execute("select title, id, sub, ip, date from topic where ip = ? order by date desc limit ?, '50'", [name, str(sql_num)])
  1016. data_list = curs.fetchall()
  1017. for data in data_list:
  1018. title = html.escape(data[0])
  1019. sub = html.escape(data[2])
  1020. if one_admin == 1:
  1021. curs.execute("select * from ban where block = ?", [data[3]])
  1022. if curs.fetchall():
  1023. ban = ' <a href="/ban/' + url_pas(data[3]) + '">(' + load_lang('release') + ')</a>'
  1024. else:
  1025. ban = ' <a href="/ban/' + url_pas(data[3]) + '">(' + load_lang('ban') + ')</a>'
  1026. else:
  1027. ban = ''
  1028. div += '<tr><td><a href="/topic/' + url_pas(data[0]) + '/sub/' + url_pas(data[2]) + '#' + data[1] + '">' + title + '#' + data[1] + '</a> (' + sub + ')</td>'
  1029. div += '<td>' + ip_pas(data[3]) + ban + '</td><td>' + data[4] + '</td></tr>'
  1030. div += '</tbody></table>'
  1031. div += next_fix('/topic_record/' + url_pas(name) + '?num=', num, data_list)
  1032. curs.execute("select end from ban where block = ?", [name])
  1033. if curs.fetchall():
  1034. sub = ' (' + load_lang('blocked') + ')'
  1035. else:
  1036. sub = 0
  1037. return easy_minify(flask.render_template(skin_check(),
  1038. imp = [load_lang('discussion_record'), wiki_set(), custom(), other2([sub, 0])],
  1039. data = div,
  1040. menu = [['other', load_lang('other')], ['user', load_lang('user')], ['count/' + url_pas(name), load_lang('count')], ['record/' + url_pas(name), load_lang('record')]]
  1041. ))
  1042. @app.route('/recent_changes')
  1043. @app.route('/<regex("record"):tool>/<name>')
  1044. @app.route('/<regex("history"):tool>/<everything:name>', methods=['POST', 'GET'])
  1045. def recent_changes(name = None, tool = 'record'):
  1046. if flask.request.method == 'POST':
  1047. return redirect('/diff/' + url_pas(name) + '?first=' + flask.request.form.get('b', None) + '&second=' + flask.request.form.get('a', None))
  1048. else:
  1049. one_admin = admin_check(1)
  1050. six_admin = admin_check(6)
  1051. ban = ''
  1052. select = ''
  1053. div = '''
  1054. <table id="main_table_set">
  1055. <tbody>
  1056. <tr>
  1057. '''
  1058. if name:
  1059. num = int(number_check(flask.request.args.get('num', '1')))
  1060. if num * 50 > 0:
  1061. sql_num = num * 50 - 50
  1062. else:
  1063. sql_num = 0
  1064. if tool == 'history':
  1065. div += '''
  1066. <td id="main_table_width">''' + load_lang('version') + '''</td>
  1067. <td id="main_table_width">''' + load_lang('editor') + '''</td>
  1068. <td id="main_table_width">''' + load_lang('time') + '''</td></tr>
  1069. '''
  1070. curs.execute("select id, title, date, ip, send, leng from history where title = ? order by id + 0 desc limit ?, '50'", [name, str(sql_num)])
  1071. else:
  1072. div += '''
  1073. <td id="main_table_width">''' + load_lang('document_name') + '''</td>
  1074. <td id="main_table_width">''' + load_lang('editor') + '''</td>
  1075. <td id="main_table_width">''' + load_lang('time') + '''</td>
  1076. </tr>
  1077. '''
  1078. div = '<a href="/topic_record/' + url_pas(name) + '">(' + load_lang('discussion') + ')</a><hr class=\"main_hr\">' + div
  1079. curs.execute("select id, title, date, ip, send, leng from history where ip = ? order by date desc limit ?, '50'", [name, str(sql_num)])
  1080. else:
  1081. num = int(number_check(flask.request.args.get('num', '1')))
  1082. if num * 50 > 0:
  1083. sql_num = num * 50 - 50
  1084. else:
  1085. sql_num = 0
  1086. div += '''
  1087. <td id="main_table_width">''' + load_lang('document_name') + '''</td>
  1088. <td id="main_table_width">''' + load_lang('editor') + '''</td>
  1089. <td id="main_table_width">''' + load_lang('time') + '''</td>
  1090. </tr>
  1091. '''
  1092. curs.execute("select id, title, date, ip, send, leng from history where not title like 'user:%' order by date desc limit ?, 50", [str(sql_num)])
  1093. data_list = curs.fetchall()
  1094. for data in data_list:
  1095. select += '<option value="' + data[0] + '">' + data[0] + '</option>'
  1096. send = '<br>'
  1097. if data[4]:
  1098. if not re.search("^(?: *)$", data[4]):
  1099. send = data[4]
  1100. if re.search("\+", data[5]):
  1101. leng = '<span style="color:green;">(' + data[5] + ')</span>'
  1102. elif re.search("\-", data[5]):
  1103. leng = '<span style="color:red;">(' + data[5] + ')</span>'
  1104. else:
  1105. leng = '<span style="color:gray;">(' + data[5] + ')</span>'
  1106. ip = ip_pas(data[3])
  1107. if int(data[0]) - 1 == 0:
  1108. revert = ''
  1109. else:
  1110. revert = '<a href="/diff/' + url_pas(data[1]) + '?first=' + str(int(data[0]) - 1) + '&second=' + data[0] + '">(' + load_lang('compare') + ')</a> <a href="/revert/' + url_pas(data[1]) + '?num=' + str(int(data[0]) - 1) + '">(' + load_lang('revert') + ')</a>'
  1111. style = ['', '']
  1112. date = data[2]
  1113. curs.execute("select title from history where title = ? and id = ? and hide = 'O'", [data[1], data[0]])
  1114. hide = curs.fetchall()
  1115. if six_admin == 1:
  1116. if hide:
  1117. hidden = ' <a href="/hidden/' + url_pas(data[1]) + '?num=' + data[0] + '">(' + load_lang('hide_release') + ')'
  1118. style[0] = 'id="toron_color_grey"'
  1119. style[1] = 'id="toron_color_grey"'
  1120. if send == '<br>':
  1121. send = '(' + load_lang('hide') + ')'
  1122. else:
  1123. send += ' (' + load_lang('hide') + ')'
  1124. else:
  1125. hidden = ' <a href="/hidden/' + url_pas(data[1]) + '?num=' + data[0] + '">(' + load_lang('hide') + ')'
  1126. elif not hide:
  1127. hidden = ''
  1128. else:
  1129. ip = ''
  1130. hidden = ''
  1131. ban = ''
  1132. date = ''
  1133. send = '(' + load_lang('hide') + ')'
  1134. style[0] = 'style="display: none;"'
  1135. style[1] = 'id="toron_color_grey"'
  1136. if tool == 'history':
  1137. title = '<a href="/w/' + url_pas(name) + '?num=' + data[0] + '">r' + data[0] + '</a> <a href="/raw/' + url_pas(name) + '?num=' + data[0] + '">(' + load_lang('raw') + ')</a> '
  1138. else:
  1139. title = '<a href="/w/' + url_pas(data[1]) + '">' + html.escape(data[1]) + '</a> <a href="/history/' + url_pas(data[1]) + '">(r' + data[0] + ')</a> '
  1140. div += '''
  1141. <tr ''' + style[0] + '''>
  1142. <td>''' + title + revert + ' ' + leng + '''</td>
  1143. <td>''' + ip + ban + hidden + '''</td>
  1144. <td>''' + date + '''</td>
  1145. </tr>
  1146. <tr ''' + style[1] + '''>
  1147. <td colspan="3">''' + send_parser(send) + '''</td>
  1148. </tr>
  1149. '''
  1150. div += '''
  1151. </tbody>
  1152. </table>
  1153. '''
  1154. sub = ''
  1155. if name:
  1156. if tool == 'history':
  1157. div = '''
  1158. <form method="post">
  1159. <select name="a">''' + select + '''</select> <select name="b">''' + select + '''</select>
  1160. <button type="submit">''' + load_lang('compare') + '''</button>
  1161. </form>
  1162. <hr class=\"main_hr\">
  1163. ''' + div
  1164. title = name
  1165. sub += ' (' + load_lang('history') + ')'
  1166. menu = [['w/' + url_pas(name), load_lang('document')], ['raw/' + url_pas(name), 'raw']]
  1167. div += next_fix('/history/' + url_pas(name) + '?num=', num, data_list)
  1168. else:
  1169. curs.execute("select end from ban where block = ?", [name])
  1170. if curs.fetchall():
  1171. sub += ' (' + load_lang('blocked') + ')'
  1172. title = load_lang('edit_record')
  1173. menu = [['other', load_lang('other')], ['user', load_lang('user')], ['count/' + url_pas(name), load_lang('count')]]
  1174. div += next_fix('/record/' + url_pas(name) + '?num=', num, data_list)
  1175. else:
  1176. menu = 0
  1177. title = load_lang('recent_change')
  1178. div += next_fix('/recent_changes?num=', num, data_list)
  1179. if sub == '':
  1180. sub = 0
  1181. return easy_minify(flask.render_template(skin_check(),
  1182. imp = [title, wiki_set(), custom(), other2([sub, 0])],
  1183. data = div,
  1184. menu = menu
  1185. ))
  1186. @app.route('/upload', methods=['GET', 'POST'])
  1187. def upload():
  1188. if ban_check() == 1:
  1189. return re_error('/ban')
  1190. if flask.request.method == 'POST':
  1191. if captcha_post(flask.request.form.get('g-recaptcha-response', '')) == 1:
  1192. return re_error('/error/13')
  1193. else:
  1194. captcha_post('', 0)
  1195. data = flask.request.files.get('f_data', None)
  1196. if not data:
  1197. return re_error('/error/9')
  1198. if int(wiki_set(3)) * 1024 * 1024 < flask.request.content_length:
  1199. return re_error('/error/17')
  1200. value = os.path.splitext(data.filename)[1]
  1201. if not value in ['.jpeg', '.jpg', '.gif', '.png', '.webp', '.JPEG', '.JPG', '.GIF', '.PNG', '.WEBP']:
  1202. return re_error('/error/14')
  1203. if flask.request.form.get('f_name', None):
  1204. name = flask.request.form.get('f_name', None) + value
  1205. else:
  1206. name = data.filename
  1207. piece = os.path.splitext(name)
  1208. if re.search('[^ㄱ-힣0-9a-zA-Z_\- ]', piece[0]):
  1209. return re_error('/error/22')
  1210. e_data = sha224(piece[0]) + piece[1]
  1211. curs.execute("select title from data where title = ?", ['file:' + name])
  1212. if curs.fetchall():
  1213. return re_error('/error/16')
  1214. ip = ip_check()
  1215. if flask.request.form.get('f_lice', None):
  1216. lice = flask.request.form.get('f_lice', None)
  1217. else:
  1218. if custom()[2] == 0:
  1219. lice = ip
  1220. else:
  1221. lice = '[[user:' + ip + ']]'
  1222. if os.path.exists(os.path.join(app_var['path_data_image'], e_data)):
  1223. os.remove(os.path.join(app_var['path_data_image'], e_data))
  1224. data.save(os.path.join(app_var['path_data_image'], e_data))
  1225. else:
  1226. data.save(os.path.join(app_var['path_data_image'], e_data))
  1227. curs.execute("select title from data where title = ?", ['file:' + name])
  1228. if curs.fetchall():
  1229. curs.execute("delete from data where title = ?", ['file:' + name])
  1230. curs.execute("insert into data (title, data) values (?, ?)", ['file:' + name, '[[file:' + name + ']][br][br]{{{[[file:' + name + ']]}}}[br][br]' + lice])
  1231. curs.execute("insert into acl (title, dec, dis, why, view) values (?, 'admin', '', '', '')", ['file:' + name])
  1232. history_plus(
  1233. 'file:' + name, '[[file:' + name + ']][br][br]{{{[[file:' + name + ']]}}}[br][br]' + lice,
  1234. get_time(),
  1235. ip,
  1236. '(upload)',
  1237. '0'
  1238. )
  1239. conn.commit()
  1240. return redirect('/w/file:' + name)
  1241. else:
  1242. return easy_minify(flask.render_template(skin_check(),
  1243. imp = [load_lang('upload'), wiki_set(), custom(), other2([0, 0])],
  1244. data = '''
  1245. <form method="post" enctype="multipart/form-data" accept-charset="utf8">
  1246. <input type="file" name="f_data">
  1247. <hr class=\"main_hr\">
  1248. <input placeholder="''' + load_lang('name') + '''" name="f_name" type="text">
  1249. <hr class=\"main_hr\">
  1250. <input placeholder="''' + load_lang('license') + '''" name="f_lice" type="text">
  1251. <hr class=\"main_hr\">
  1252. ''' + captcha_get() + '''
  1253. <button id="save" type="submit">''' + load_lang('save') + '''</button>
  1254. </form>
  1255. ''',
  1256. menu = [['other', load_lang('return')]]
  1257. ))
  1258. @app.route('/user')
  1259. def user_info():
  1260. ip = ip_check()
  1261. curs.execute("select acl from user where id = ?", [ip])
  1262. data = curs.fetchall()
  1263. if ban_check() == 0:
  1264. if data:
  1265. if data[0][0] != 'user':
  1266. acl = data[0][0]
  1267. else:
  1268. acl = load_lang('member')
  1269. else:
  1270. acl = load_lang('normal')
  1271. else:
  1272. acl = load_lang('blocked')
  1273. match = re.search("^([0-9]{1,3}\.[0-9]{1,3})", ip)
  1274. if match:
  1275. match = match.groups()[0]
  1276. else:
  1277. match = '-'
  1278. curs.execute("select end, login, band from ban where block = ? or block = ?", [ip, match])
  1279. block_data = curs.fetchall()
  1280. if block_data:
  1281. if block_data[0][0] != '':
  1282. acl += ' (' + load_lang('period') + ' : ' + block_data[0][0] + ')'
  1283. else:
  1284. acl += ' (' + load_lang('limitless') + ')'
  1285. if block_data[0][1] != '':
  1286. acl += ' (' + load_lang('login_able') + ')'
  1287. if block_data[0][2] == 'O':
  1288. acl += ' (' + load_lang('band_blocked') + ')'
  1289. if custom()[2] != 0:
  1290. ip_user = '<a href="/w/user:' + ip + '">' + ip + '</a>'
  1291. plus = '''
  1292. <li><a href="/logout">''' + load_lang('logout') + '''</a></li>
  1293. <li><a href="/change">''' + load_lang('user_setting') + '''</a></li>
  1294. '''
  1295. curs.execute('select name from alarm where name = ? limit 1', [ip_check()])
  1296. if curs.fetchall():
  1297. plus2 = '<li><a href="/alarm">' + load_lang('alarm') + ' (O)</a></li>'
  1298. else:
  1299. plus2 = '<li><a href="/alarm">' + load_lang('alarm') + '</a></li>'
  1300. plus2 += '<li><a href="/watch_list">' + load_lang('watchlist') + '</a></li>'
  1301. plus3 = '<li><a href="/acl/user:' + url_pas(ip) + '">' + load_lang('user_document_acl') + '</a></li>'
  1302. else:
  1303. ip_user = ip
  1304. plus = '''
  1305. <li><a href="/login">''' + load_lang('login') + '''</a></li>
  1306. <li><a href="/register">''' + load_lang('register') + '''</a></li>
  1307. '''
  1308. plus2 = ''
  1309. plus3 = ''
  1310. curs.execute("select data from other where name = 'email_have'")
  1311. test = curs.fetchall()
  1312. if test and test[0][0] != '':
  1313. plus += '<li><a href="/pass_find">' + load_lang('password_search') + '</a></li>'
  1314. return easy_minify(flask.render_template(skin_check(),
  1315. imp = [load_lang('user') + ' ' + load_lang('tool'), wiki_set(), custom(), other2([0, 0])],
  1316. data = '''
  1317. <h2>''' + load_lang('state') + '''</h2>
  1318. <ul>
  1319. <li>''' + ip_user + ''' <a href="/record/''' + url_pas(ip) + '''">(''' + load_lang('record') + ''')</a></li>
  1320. <li>''' + load_lang('state') + ''' : ''' + acl + '''</li>
  1321. </ul>
  1322. <br>
  1323. <h2>''' + load_lang('login') + '''</h2>
  1324. <ul>
  1325. ''' + plus + '''
  1326. </ul>
  1327. <br>
  1328. <h2>''' + load_lang('tool') + '''</h2>
  1329. <ul>
  1330. ''' + plus3 + '''
  1331. <li><a href="/custom_head">''' + load_lang('user_head') + '''</a></li>
  1332. </ul>
  1333. <br>
  1334. <h2>''' + load_lang('other') + '''</h2>
  1335. <ul>
  1336. ''' + plus2 + '''
  1337. <li>
  1338. <a href="/count">''' + load_lang('count') + '''</a>
  1339. </li>
  1340. </ul>
  1341. ''',
  1342. menu = 0
  1343. ))
  1344. @app.route('/watch_list')
  1345. def watch_list():
  1346. div = 'limit : 10<hr class=\"main_hr\">'
  1347. if custom()[2] == 0:
  1348. return redirect('/login')
  1349. curs.execute("select title from scan where user = ?", [ip_check()])
  1350. data = curs.fetchall()
  1351. for data_list in data:
  1352. div += '<li><a href="/w/' + url_pas(data_list[0]) + '">' + data_list[0] + '</a> <a href="/watch_list/' + url_pas(data_list[0]) + '">(' + load_lang('delete') + ')</a></li>'
  1353. if data:
  1354. div = '<ul>' + div + '</ul><hr class=\"main_hr\">'
  1355. div += '<a href="/manager/13">(' + load_lang('add') + ')</a>'
  1356. return easy_minify(flask.render_template(skin_check(),
  1357. imp = [load_lang('watchlist'), wiki_set(), custom(), other2([0, 0])],
  1358. data = div,
  1359. menu = [['manager', load_lang('return')]]
  1360. ))
  1361. @app.route('/watch_list/<everything:name>')
  1362. def watch_list_name(name = None):
  1363. if custom()[2] == 0:
  1364. return redirect('/login')
  1365. ip = ip_check()
  1366. curs.execute("select count(title) from scan where user = ?", [ip])
  1367. count = curs.fetchall()
  1368. if count and count[0][0] > 9:
  1369. return redirect('/watch_list')
  1370. curs.execute("select title from scan where user = ? and title = ?", [ip, name])
  1371. if curs.fetchall():
  1372. curs.execute("delete from scan where user = ? and title = ?", [ip, name])
  1373. else:
  1374. curs.execute("insert into scan (user, title) values (?, ?)", [ip, name])
  1375. conn.commit()
  1376. return redirect('/watch_list')
  1377. @app.route('/custom_head', methods=['GET', 'POST'])
  1378. def custom_head_view():
  1379. ip = ip_check()
  1380. if flask.request.method == 'POST':
  1381. if custom()[2] != 0:
  1382. curs.execute("select user from custom where user = ?", [ip + ' (head)'])
  1383. if curs.fetchall():
  1384. curs.execute("update custom set css = ? where user = ?", [flask.request.form.get('content', None), ip + ' (head)'])
  1385. else:
  1386. curs.execute("insert into custom (user, css) values (?, ?)", [ip + ' (head)', flask.request.form.get('content', None)])
  1387. conn.commit()
  1388. flask.session['head'] = flask.request.form.get('content', None)
  1389. return redirect('/user')
  1390. else:
  1391. if custom()[2] != 0:
  1392. start = ''
  1393. curs.execute("select css from custom where user = ?", [ip + ' (head)'])
  1394. head_data = curs.fetchall()
  1395. if head_data:
  1396. data = head_data[0][0]
  1397. else:
  1398. data = ''
  1399. else:
  1400. start = '<span>' + load_lang('user_head_warring') + '</span><hr class=\"main_hr\">'
  1401. if 'head' in flask.session:
  1402. data = flask.session['head']
  1403. else:
  1404. data = ''
  1405. start += '<span>&lt;style&gt;css&lt;/style&gt;<br>&lt;script&gt;js&lt;/script&gt;</span><hr class=\"main_hr\">'
  1406. return easy_minify(flask.render_template(skin_check(),
  1407. imp = [load_lang(data = 'user_head', safe = 1), wiki_set(), custom(), other2([0, 0])],
  1408. data = start + '''
  1409. <form method="post">
  1410. <textarea rows="25" cols="100" name="content">''' + data + '''</textarea>
  1411. <hr class=\"main_hr\">
  1412. <button id="save" type="submit">''' + load_lang('save') + '''</button>
  1413. </form>
  1414. ''',
  1415. menu = [['user', load_lang('return')]]
  1416. ))
  1417. @app.route('/count')
  1418. @app.route('/count/<name>')
  1419. def count_edit(name = None):
  1420. if name == None:
  1421. that = ip_check()
  1422. else:
  1423. that = name
  1424. curs.execute("select count(title) from history where ip = ?", [that])
  1425. count = curs.fetchall()
  1426. if count:
  1427. data = count[0][0]
  1428. else:
  1429. data = 0
  1430. curs.execute("select count(title) from topic where ip = ?", [that])
  1431. count = curs.fetchall()
  1432. if count:
  1433. t_data = count[0][0]
  1434. else:
  1435. t_data = 0
  1436. return easy_minify(flask.render_template(skin_check(),
  1437. imp = [load_lang('count'), wiki_set(), custom(), other2([0, 0])],
  1438. data = '''
  1439. <ul>
  1440. <li><a href="/record/''' + url_pas(that) + '''">''' + load_lang('edit_record') + '''</a> : ''' + str(data) + '''</li>
  1441. <li><a href="/topic_record/''' + url_pas(that) + '''">''' + load_lang('discussion_record') + '''</a> : ''' + str(t_data) + '''</a></li>
  1442. </ul>
  1443. ''',
  1444. menu = [['user', load_lang('return')]]
  1445. ))
  1446. @app.route('/random')
  1447. def title_random():
  1448. curs.execute("select title from data order by random() limit 1")
  1449. data = curs.fetchall()
  1450. if data:
  1451. return redirect('/w/' + url_pas(data[0][0]))
  1452. else:
  1453. return redirect()
  1454. @app.route('/skin_set')
  1455. def skin_set():
  1456. return re_error('/error/5')
  1457. @app.route('/api/w/<everything:name>')
  1458. def api_w(name = ''):
  1459. curs.execute("select data from data where title = ?", [name])
  1460. data = curs.fetchall()
  1461. if data:
  1462. json_data = { "title" : name, "data" : render_set(title = name, data = data[0][0]) }
  1463. return flask.jsonify(json_data)
  1464. else:
  1465. return flask.jsonify({})
  1466. @app.route('/api/raw/<everything:name>')
  1467. def api_raw(name = ''):
  1468. curs.execute("select data from data where title = ?", [name])
  1469. data = curs.fetchall()
  1470. if data:
  1471. json_data = { "title" : name, "data" : render_set(title = name, data = data[0][0], s_data = 1) }
  1472. return flask.jsonify(json_data)
  1473. else:
  1474. return flask.jsonify({})
  1475. @app.route('/api/topic/<everything:name>/sub/<sub>')
  1476. def api_topic_sub(name = '', sub = '', time = ''):
  1477. if flask.request.args.get('time', None):
  1478. curs.execute("select id, data, ip from topic where title = ? and sub = ? and date >= ? order by id + 0 asc", [name, sub, flask.request.args.get('time', None)])
  1479. else:
  1480. curs.execute("select id, data, ip from topic where title = ? and sub = ? order by id + 0 asc", [name, sub])
  1481. data = curs.fetchall()
  1482. if data:
  1483. json_data = {}
  1484. for i in data:
  1485. json_data[i[0]] = {
  1486. "data" : i[1],
  1487. "id" : i[2]
  1488. }
  1489. return flask.jsonify(json_data)
  1490. else:
  1491. return flask.jsonify({})
  1492. @app.route('/views/<everything:name>')
  1493. def views(name = None):
  1494. if re.search('\/', name):
  1495. m = re.search('^(.*)\/(.*)$', name)
  1496. if m:
  1497. n = m.groups()
  1498. plus = '/' + n[0]
  1499. rename = n[1]
  1500. else:
  1501. plus = ''
  1502. rename = name
  1503. else:
  1504. plus = ''
  1505. rename = name
  1506. m = re.search('\.(.+)$', name)
  1507. if m:
  1508. g = m.groups()
  1509. else:
  1510. g = ['']
  1511. if g == 'css':
  1512. return easy_minify(flask.send_from_directory('./views' + plus, rename), 'css')
  1513. elif g == 'js':
  1514. return easy_minify(flask.send_from_directory('./views' + plus, rename), 'js')
  1515. elif g == 'html':
  1516. return easy_minify(flask.send_from_directory('./views' + plus, rename))
  1517. else:
  1518. return flask.send_from_directory('./views' + plus, rename)
  1519. @app.route('/<data>')
  1520. def main_file(data = None):
  1521. if re.search('\.txt$', data):
  1522. return flask.send_from_directory('./', data)
  1523. else:
  1524. return redirect('/w/' + url_pas(wiki_set(2)))
  1525. @app.errorhandler(404)
  1526. def error_404(e):
  1527. return redirect('/w/' + url_pas(wiki_set(2)))
  1528. if __name__=="__main__":
  1529. app.secret_key = rep_key
  1530. http_server = tornado.httpserver.HTTPServer(tornado.wsgi.WSGIContainer(app))
  1531. http_server.listen(server_set['port'], address=server_set['host'])
  1532. tornado.ioloop.IOLoop.instance().start()