app.py 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968
  1. from flask import Flask, request, session, render_template
  2. app = Flask(__name__)
  3. from urllib import parse
  4. import json
  5. import pymysql
  6. import time
  7. import re
  8. import bcrypt
  9. json_data=open('set.json').read()
  10. data = json.loads(json_data)
  11. conn = pymysql.connect(host = data['host'], user = data['user'], password = data['pw'], db = data['db'], charset = 'utf8')
  12. curs = conn.cursor(pymysql.cursors.DictCursor)
  13. app.secret_key = data['key']
  14. def namumark(data):
  15. data = '\n' + data + '\n'
  16. data = re.sub('<', '&lt;', data)
  17. data = re.sub('>', '&gt;', data)
  18. data = re.sub("======\s?(?P<in>[^=]*)\s?======(?:\s+)?\n", '<h6>\g<in></h6>', data)
  19. data = re.sub("=====\s?(?P<in>[^=]*)\s?=====(?:\s+)?\n", '<h5>\g<in></h5>', data)
  20. data = re.sub("====\s?(?P<in>[^=]*)\s?====(?:\s+)?\n", '<h4>\g<in></h4>', data)
  21. data = re.sub("===\s?(?P<in>[^=]*)\s?===(?:\s+)?\n", '<h3>\g<in></h3>', data)
  22. data = re.sub("==\s?(?P<in>[^=]*)\s?==(?:\s+)?\n", '<h2>\g<in></h2>', data)
  23. data = re.sub("=\s?(?P<in>[^=]*)\s?=(?:\s+)?\n", '<h1>\g<in></h1>', data)
  24. data = re.sub("'''(?P<in>.+?)'''(?!')", '<strong>\g<in></strong>', data)
  25. data = re.sub("''(?P<in>.+?)''(?!')", '<i>\g<in></i>', data)
  26. data = re.sub('~~(?P<in>.+?)~~(?!~)', '<s>\g<in></s>', data)
  27. data = re.sub('--(?P<in>.+?)--(?!-)', '<s>\g<in></s>', data)
  28. data = re.sub('__(?P<in>.+?)__(?!_)', '<u>\g<in></u>', data)
  29. data = re.sub('\^\^(?P<in>.+?)\^\^(?!\^)', '<sup>\g<in></sup>', data)
  30. data = re.sub(',,(?P<in>.+?),,(?!,)', '<sub>\g<in></sub>', data)
  31. while True:
  32. m = re.search("\[\[(((?!\]\]).)*)\]\]", data)
  33. if(m):
  34. result = m.groups()
  35. a = re.search("(((?!\|).)*)\|(.*)", result[0])
  36. if(a):
  37. results = a.groups()
  38. curs.execute("select * from data where title = '" + pymysql.escape_string(results[0]) + "'")
  39. rows = curs.fetchall()
  40. if(rows):
  41. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a href="' + results[0] + '">' + results[2] + '</a>', data, 1)
  42. else:
  43. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="not_thing" href="' + results[0] + '">' + results[2] + '</a>', data, 1)
  44. else:
  45. curs.execute("select * from data where title = '" + pymysql.escape_string(result[0]) + "'")
  46. rows = curs.fetchall()
  47. if(rows):
  48. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a href="' + result[0] + '">' + result[0] + '</a>', data, 1)
  49. else:
  50. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="not_thing" href="' + result[0] + '">' + result[0] + '</a>', data, 1)
  51. else:
  52. break
  53. data = re.sub('\n', '<br>', data)
  54. return data
  55. def getip(request):
  56. if(session.get('Now') == True):
  57. ip = format(session['DREAMER'])
  58. else:
  59. if(request.headers.getlist("X-Forwarded-For")):
  60. ip = request.headers.getlist("X-Forwarded-For")[0]
  61. else:
  62. ip = request.remote_addr
  63. return ip
  64. def getcan(ip, name):
  65. curs.execute("select * from ban where block = '" + pymysql.escape_string(ip) + "'")
  66. rows = curs.fetchall()
  67. if(rows):
  68. return 1
  69. else:
  70. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  71. row = curs.fetchall()
  72. if(row):
  73. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  74. rows = curs.fetchall()
  75. if(row[0]['acl'] == 'user'):
  76. if(rows):
  77. return 0
  78. else:
  79. return 1
  80. elif(row[0]['acl'] == 'admin'):
  81. if(rows):
  82. if(rows[0]['acl'] == 'admin' or rows[0]['acl'] == 'owner'):
  83. return 0
  84. else:
  85. return 1
  86. else:
  87. return 1
  88. else:
  89. return 0
  90. else:
  91. return 0
  92. def getban(ip):
  93. curs.execute("select * from ban where block = '" + pymysql.escape_string(ip) + "'")
  94. rows = curs.fetchall()
  95. if(rows):
  96. return 1
  97. else:
  98. return 0
  99. def getdiscuss(ip, name, sub):
  100. curs.execute("select * from ban where block = '" + pymysql.escape_string(ip) + "'")
  101. rows = curs.fetchall()
  102. if(rows):
  103. return 1
  104. else:
  105. curs.execute("select * from stop where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "'")
  106. rows = curs.fetchall()
  107. if(rows):
  108. return 1
  109. else:
  110. return 0
  111. def getnow():
  112. now = time.localtime()
  113. s = "%04d-%02d-%02d %02d:%02d:%02d" % (now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec)
  114. return s
  115. def recent(title, ip, today, send, leng):
  116. curs.execute("insert into rc (title, date, ip, send, leng, back) value ('" + pymysql.escape_string(title) + "', '" + today + "', '" + ip + "', '" + pymysql.escape_string(send) + "', '" + leng + "', '')")
  117. conn.commit()
  118. def discuss(title, sub, date):
  119. curs.execute("select * from rd where title = '" + pymysql.escape_string(title) + "' and sub = '" + pymysql.escape_string(sub) + "'")
  120. rows = curs.fetchall()
  121. if(rows):
  122. curs.execute("update rd set date = '" + pymysql.escape_string(date) + "' where title = '" + pymysql.escape_string(title) + "' and sub = '" + pymysql.escape_string(sub) + "'")
  123. else:
  124. curs.execute("insert into rd (title, sub, date) value ('" + pymysql.escape_string(title) + "', '" + pymysql.escape_string(sub) + "', '" + pymysql.escape_string(date) + "')")
  125. conn.commit()
  126. def history(title, data, date, ip, send, leng):
  127. curs.execute("select * from history where title = '" + pymysql.escape_string(title) + "' order by id+0 desc limit 1")
  128. rows = curs.fetchall()
  129. if(rows):
  130. number = int(rows[0]['id']) + 1
  131. curs.execute("insert into history (id, title, data, date, ip, send, leng) value ('" + str(number) + "', '" + pymysql.escape_string(title) + "', '" + pymysql.escape_string(data) + "', '" + date + "', '" + ip + "', '" + pymysql.escape_string(send) + "', '" + leng + "')")
  132. conn.commit()
  133. else:
  134. curs.execute("insert into history (id, title, data, date, ip, send, leng) value ('1', '" + pymysql.escape_string(title) + "', '" + pymysql.escape_string(data) + "', '" + date + "', '" + ip + "', '" + pymysql.escape_string(send) + "', '" + leng + "')")
  135. conn.commit()
  136. def getleng(existing, change):
  137. if(existing < change):
  138. leng = change - existing
  139. leng = '+' + str(leng)
  140. elif(change < existing):
  141. leng = existing - change
  142. leng = '-' + str(leng)
  143. else:
  144. leng = '0'
  145. return leng;
  146. @app.route('/')
  147. @app.route('/w/')
  148. def redirect():
  149. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  150. @app.route('/recentchanges')
  151. def recentchanges():
  152. i = 0
  153. div = '<div>'
  154. curs.execute("select * from rc order by date desc limit 50")
  155. rows = curs.fetchall()
  156. if(rows):
  157. while True:
  158. try:
  159. a = rows[i]
  160. except:
  161. div = div + '</div>'
  162. break
  163. if(rows[i]['send']):
  164. send = rows[i]['send']
  165. send = re.sub('<', '&lt;', send)
  166. send = re.sub('>', '&gt;', send)
  167. send = re.sub('&lt;a href="\/w\/(?P<in>[^"]*)"&gt;(?P<out>[^&]*)&lt;\/a&gt;', '<a href="/w/\g<in>">\g<out></a>', send)
  168. else:
  169. send = '<br>'
  170. title = rows[i]['title']
  171. title = re.sub('<', '&lt;', title)
  172. title = re.sub('>', '&gt;', title)
  173. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;"><a href="/w/' + parse.quote(rows[i]['title']) + '">' + title + '</a> <a href="/history/' + parse.quote(rows[i]['title']) + '">(์—ญ์‚ฌ)</a> (' + rows[i]['leng'] + ')</td><td style="text-align: center;width:33.33%;">' + rows[i]['ip'] + '</td><td style="text-align: center;width:33.33%;">' + rows[i]['date'] + '</td></tr><tr><td colspan="3" style="text-align: center;width:100%;">' + send + '</td></tr></tbody></table>'
  174. i = i + 1
  175. return render_template('index.html', logo = data['name'], rows = div, tn = 3, title = '์ตœ๊ทผ ๋ณ€๊ฒฝ๋‚ด์—ญ')
  176. else:
  177. return render_template('index.html', logo = data['name'], rows = '', tn = 3, title = '์ตœ๊ทผ ๋ณ€๊ฒฝ๋‚ด์—ญ')
  178. @app.route('/recentdiscuss')
  179. def recentdiscuss():
  180. i = 0
  181. div = '<div>'
  182. curs.execute("select * from rd order by date desc limit 50")
  183. rows = curs.fetchall()
  184. if(rows):
  185. while True:
  186. try:
  187. a = rows[i]
  188. except:
  189. div = div + '</div>'
  190. break
  191. title = rows[i]['title']
  192. title = re.sub('<', '&lt;', title)
  193. title = re.sub('>', '&gt;', title)
  194. sub = rows[i]['sub']
  195. sub = re.sub('<', '&lt;', sub)
  196. sub = re.sub('>', '&gt;', sub)
  197. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:50%;"><a href="/topic/' + parse.quote(rows[i]['title']) + '/sub/' + parse.quote(rows[i]['sub']) + '">' + title + '</a> (' + sub + ')</td><td style="text-align: center;width:50%;">' + rows[i]['date'] + '</td></tr></tbody></table>'
  198. i = i + 1
  199. return render_template('index.html', logo = data['name'], rows = div, tn = 12, title = '์ตœ๊ทผ ํ† ๋ก ๋‚ด์—ญ')
  200. else:
  201. return render_template('index.html', logo = data['name'], rows = '', tn = 12, title = '์ตœ๊ทผ ํ† ๋ก ๋‚ด์—ญ')
  202. @app.route('/history/<name>')
  203. def gethistory(name = None):
  204. i = 0
  205. div = '<div>'
  206. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' order by date desc")
  207. rows = curs.fetchall()
  208. if(rows):
  209. while True:
  210. try:
  211. a = rows[i]
  212. except:
  213. div = div + '</div>'
  214. break
  215. if(rows[i]['send']):
  216. send = rows[i]['send']
  217. send = re.sub('<', '&lt;', send)
  218. send = re.sub('>', '&gt;', send)
  219. send = re.sub('&lt;a href="\/w\/(?P<in>[^"]*)"&gt;(?P<out>[^&]*)&lt;\/a&gt;', '<a href="/w/\g<in>">\g<out></a>', send)
  220. else:
  221. send = '<br>'
  222. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;">r' + rows[i]['id'] + '</a> <a href="/w/' + parse.quote(rows[i]['title']) + '/r/' + rows[i]['id'] + '">(w)</a> <a href="/w/' + parse.quote(rows[i]['title']) + '/raw/' + rows[i]['id'] + '">(Raw)</a> <a href="/revert/' + parse.quote(rows[i]['title']) + '/r/' + rows[i]['id'] + '">(๋˜๋Œ๋ฆฌ๊ธฐ)</a> (' + rows[i]['leng'] + ')</td><td style="text-align: center;width:33.33%;">' + rows[i]['ip'] + '</td><td style="text-align: center;width:33.33%;">' + rows[i]['date'] + '</td></tr><tr><td colspan="3" style="text-align: center;width:100%;">' + send + '</td></tr></tbody></table>'
  223. i = i + 1
  224. return render_template('index.html', logo = data['name'], rows = div, tn = 5, title = name, page = parse.quote(name))
  225. else:
  226. return render_template('index.html', logo = data['name'], rows = '', tn = 5, title = name, page = parse.quote(name))
  227. @app.route('/search', methods=['POST', 'GET'])
  228. def search():
  229. if(request.method == 'POST'):
  230. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(request.form["search"]) + '" />'
  231. else:
  232. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  233. @app.route('/w/<name>')
  234. def w(name = None):
  235. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  236. rows = curs.fetchall()
  237. if(rows):
  238. if(rows[0]['acl'] == 'admin'):
  239. acl = '(๊ด€๋ฆฌ์ž)'
  240. elif(rows[0]['acl'] == 'user'):
  241. acl = '(์œ ์ €)'
  242. else:
  243. acl = ''
  244. enddata = namumark(rows[0]['data'])
  245. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = enddata, license = data['license'], tn = 1, acl = acl)
  246. else:
  247. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '<br>๋ฌธ์„œ ์—†์Œ', license = data['license'], tn = 1)
  248. @app.route('/w/<name>/redirect/<redirect>')
  249. def redirectw(name = None, redirect = None):
  250. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  251. rows = curs.fetchall()
  252. if(rows):
  253. enddata = namumark(rows[0]['data'])
  254. test = redirect
  255. redirect = re.sub('<', '&lt;', redirect)
  256. redirect = re.sub('>', '&gt;', redirect)
  257. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = enddata, license = data['license'], tn = 1, redirect = '<a href="/w/' + parse.quote(test) + '">' + redirect + '</a>์—์„œ ๋„˜์–ด ์™”์Šต๋‹ˆ๋‹ค.')
  258. else:
  259. test = redirect
  260. redirect = re.sub('<', '&lt;', redirect)
  261. redirect = re.sub('>', '&gt;', redirect)
  262. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '<br>๋ฌธ์„œ ์—†์Œ', license = data['license'], tn = 1, redirect = '<a href="/w/' + parse.quote(test) + '">' + redirect + '</a>์—์„œ ๋„˜์–ด ์™”์Šต๋‹ˆ๋‹ค.')
  263. @app.route('/w/<name>/r/<number>')
  264. def rew(name = None, number = None):
  265. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' and id = '" + number + "'")
  266. rows = curs.fetchall()
  267. if(rows):
  268. enddata = namumark(rows[0]['data'])
  269. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = enddata, license = data['license'], tn = 6)
  270. else:
  271. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '<br>๋ฌธ์„œ ์—†์Œ', license = data['license'], tn = 6)
  272. @app.route('/w/<name>/raw/<number>')
  273. def reraw(name = None, number = None):
  274. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' and id = '" + number + "'")
  275. rows = curs.fetchall()
  276. if(rows):
  277. enddata = re.sub("\n", '<br>', rows[0]['data'])
  278. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = enddata, license = data['license'])
  279. else:
  280. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '<br>๋ฌธ์„œ ์—†์Œ', license = data['license'])
  281. @app.route('/raw/<name>')
  282. def raw(name = None):
  283. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  284. rows = curs.fetchall()
  285. if(rows):
  286. enddata = re.sub("\n", '<br>', rows[0]['data'])
  287. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = enddata, license = data['license'], tn = 7)
  288. else:
  289. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '๋ฌธ์„œ ์—†์Œ', license = data['license'], tn = 7)
  290. @app.route('/revert/<name>/r/<number>', methods=['POST', 'GET'])
  291. def revert(name = None, number = None):
  292. if(request.method == 'POST'):
  293. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' and id = '" + number + "'")
  294. rows = curs.fetchall()
  295. if(rows):
  296. ip = getip(request)
  297. can = getcan(ip, name)
  298. if(can == 1):
  299. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  300. else:
  301. today = getnow()
  302. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  303. row = curs.fetchall()
  304. if(row):
  305. leng = getleng(len(row[0]['data']), len(rows[0]['data']))
  306. curs.execute("update data set data = '" + pymysql.escape_string(rows[0]['data']) + "' where title = '" + pymysql.escape_string(name) + "'")
  307. conn.commit()
  308. else:
  309. leng = '+' + str(len(rows[0]['data']))
  310. curs.execute("insert into data (title, data, acl) value ('" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(rows[0]['data']) + "', '')")
  311. conn.commit()
  312. recent(name, ip, today, '๋ฌธ์„œ๋ฅผ ' + number + 'ํŒ์œผ๋กœ ๋˜๋Œ๋ ธ์Šต๋‹ˆ๋‹ค.', leng)
  313. history(name, rows[0]['data'], today, ip, '๋ฌธ์„œ๋ฅผ ' + number + 'ํŒ์œผ๋กœ ๋˜๋Œ๋ ธ์Šต๋‹ˆ๋‹ค.', leng)
  314. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  315. else:
  316. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  317. else:
  318. ip = getip(request)
  319. can = getcan(ip, name)
  320. if(can == 1):
  321. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  322. else:
  323. curs.execute("select * from history where title = '" + pymysql.escape_string(name) + "' and id = '" + number + "'")
  324. rows = curs.fetchall()
  325. if(rows):
  326. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), r = parse.quote(number), tn = 13, plus = '์ •๋ง ๋˜๋Œ๋ฆฌ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?')
  327. else:
  328. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  329. @app.route('/edit/<name>', methods=['POST', 'GET'])
  330. def edit(name = None):
  331. if(request.method == 'POST'):
  332. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  333. rows = curs.fetchall()
  334. if(rows):
  335. ip = getip(request)
  336. can = getcan(ip, name)
  337. if(can == 1):
  338. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  339. else:
  340. today = getnow()
  341. leng = getleng(len(rows[0]['data']), len(request.form["content"]))
  342. recent(name, ip, today, request.form["send"], leng)
  343. history(name, request.form["content"], today, ip, request.form["send"], leng)
  344. curs.execute("update data set data = '" + pymysql.escape_string(request.form["content"]) + "' where title = '" + pymysql.escape_string(name) + "'")
  345. conn.commit()
  346. else:
  347. ip = getip(request)
  348. can = getcan(ip, name)
  349. if(can == 1):
  350. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  351. else:
  352. today = getnow()
  353. leng = '+' + str(len(request.form["content"]))
  354. recent(name, ip, today, request.form["send"], leng)
  355. history(name, request.form["content"], today, ip, request.form["send"], leng)
  356. curs.execute("insert into data (title, data, acl) value ('" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(request.form["content"]) + "', '')")
  357. conn.commit()
  358. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  359. else:
  360. ip = getip(request)
  361. can = getcan(ip, name)
  362. if(can == 1):
  363. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  364. else:
  365. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  366. rows = curs.fetchall()
  367. if(rows):
  368. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = rows[0]['data'], tn = 2)
  369. else:
  370. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), data = '', tn = 2)
  371. @app.route('/delete/<name>', methods=['POST', 'GET'])
  372. def delete(name = None):
  373. if(request.method == 'POST'):
  374. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  375. rows = curs.fetchall()
  376. if(rows):
  377. ip = getip(request)
  378. can = getcan(ip, name)
  379. if(can == 1):
  380. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  381. else:
  382. today = getnow()
  383. leng = '-' + str(len(rows[0]['data']))
  384. recent(name, ip, today, '๋ฌธ์„œ๋ฅผ ์‚ญ์ œ ํ–ˆ์Šต๋‹ˆ๋‹ค.', leng)
  385. history(name, '', today, ip, '๋ฌธ์„œ๋ฅผ ์‚ญ์ œ ํ–ˆ์Šต๋‹ˆ๋‹ค.', leng)
  386. curs.execute("delete from data where title = '" + pymysql.escape_string(name) + "'")
  387. conn.commit()
  388. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  389. else:
  390. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  391. else:
  392. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  393. rows = curs.fetchall()
  394. if(rows):
  395. ip = getip(request)
  396. can = getcan(ip, name)
  397. if(can == 1):
  398. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  399. else:
  400. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), tn = 8, plus = '์ •๋ง ์‚ญ์ œ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?')
  401. else:
  402. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  403. @app.route('/move/<name>', methods=['POST', 'GET'])
  404. def move(name = None):
  405. if(request.method == 'POST'):
  406. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  407. rows = curs.fetchall()
  408. if(rows):
  409. ip = getip(request)
  410. can = getcan(ip, name)
  411. if(can == 1):
  412. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  413. else:
  414. today = getnow()
  415. leng = '0'
  416. curs.execute("select * from history where title = '" + pymysql.escape_string(request.form["title"]) + "'")
  417. row = curs.fetchall()
  418. if(row):
  419. return render_template('index.html', title = '์ด๋™ ์˜ค๋ฅ˜', logo = data['name'], data = '์ด๋™ ํ•˜๋ ค๋Š” ๊ณณ์— ๋ฌธ์„œ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.')
  420. else:
  421. recent(name, ip, today, '๋ฌธ์„œ๋ฅผ <a href="/w/' + pymysql.escape_string(parse.quote(request.form["title"])) + '">' + pymysql.escape_string(request.form["title"]) + '</a> ๋ฌธ์„œ๋กœ ์ด๋™ ํ–ˆ์Šต๋‹ˆ๋‹ค.', leng)
  422. history(name, rows[0]['data'], today, ip, '<a href="/w/' + pymysql.escape_string(parse.quote(name)) + '">' + pymysql.escape_string(name) + '</a> ๋ฌธ์„œ๋ฅผ <a href="/w/' + pymysql.escape_string(parse.quote(request.form["title"])) + '">' + pymysql.escape_string(request.form["title"]) + '</a> ๋ฌธ์„œ๋กœ ์ด๋™ ํ–ˆ์Šต๋‹ˆ๋‹ค.', leng)
  423. curs.execute("update data set title = '" + pymysql.escape_string(request.form["title"]) + "' where title = '" + pymysql.escape_string(name) + "'")
  424. curs.execute("update history set title = '" + pymysql.escape_string(request.form["title"]) + "' where title = '" + pymysql.escape_string(name) + "'")
  425. conn.commit()
  426. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(request.form["title"]) + '" />'
  427. else:
  428. ip = getip(request)
  429. can = getcan(ip, name)
  430. if(can == 1):
  431. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  432. else:
  433. today = getnow()
  434. leng = '0'
  435. curs.execute("select * from history where title = '" + pymysql.escape_string(request.form["title"]) + "'")
  436. row = curs.fetchall()
  437. if(row):
  438. return render_template('index.html', title = '์ด๋™ ์˜ค๋ฅ˜', logo = data['name'], data = '์ด๋™ ํ•˜๋ ค๋Š” ๊ณณ์— ๋ฌธ์„œ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.')
  439. else:
  440. recent(name, ip, today, '๋ฌธ์„œ๋ฅผ <a href="/w/' + pymysql.escape_string(parse.quote(request.form["title"])) + '">' + pymysql.escape_string(request.form["title"]) + '</a> ๋ฌธ์„œ๋กœ ์ด๋™ ํ–ˆ์Šต๋‹ˆ๋‹ค.', leng)
  441. history(name, rows[0]['data'], today, ip, '<a href="/w/' + pymysql.escape_string(parse.quote(name)) + '">' + pymysql.escape_string(name) + '</a> ๋ฌธ์„œ๋ฅผ <a href="/w/' + pymysql.escape_string(parse.quote(request.form["title"])) + '">' + pymysql.escape_string(request.form["title"]) + '</a> ๋ฌธ์„œ๋กœ ์ด๋™ ํ–ˆ์Šต๋‹ˆ๋‹ค.', leng)
  442. curs.execute("update history set title = '" + pymysql.escape_string(request.form["title"]) + "' where title = '" + pymysql.escape_string(name) + "'")
  443. conn.commit()
  444. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(request.form["title"]) + '" />'
  445. else:
  446. ip = getip(request)
  447. can = getcan(ip, name)
  448. if(can == 1):
  449. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  450. else:
  451. return render_template('index.html', title = name, logo = data['name'], page = parse.quote(name), tn = 9, plus = '์ •๋ง ์ด๋™ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?')
  452. @app.route('/setup')
  453. def setup():
  454. curs.execute("create table if not exists data(title text not null, data longtext not null, acl text not null)")
  455. curs.execute("create table if not exists history(id text not null, title text not null, data longtext not null, date text not null, ip text not null, send text not null, leng text not null)")
  456. curs.execute("create table if not exists rc(title text not null, date text not null, ip text not null, send text not null, leng text not null, back text not null)")
  457. curs.execute("create table if not exists rd(title text not null, sub text not null, date text not null)")
  458. curs.execute("create table if not exists user(id text not null, pw text not null, acl text not null)")
  459. curs.execute("create table if not exists ban(block text not null, end text not null, why text not null, band text not null)")
  460. curs.execute("create table if not exists topic(id text not null, title text not null, sub text not null, data longtext not null, date text not null, ip text not null, block text not null)")
  461. curs.execute("create table if not exists stop(title text not null, sub text not null, close text not null)")
  462. return render_template('index.html', title = '์„ค์น˜ ์™„๋ฃŒ', logo = data['name'], data = '๋ฌธ์ œ ์—†์—ˆ์Œ')
  463. @app.route('/other')
  464. def other():
  465. return render_template('index.html', title = '๊ธฐํƒ€ ๋ฉ”๋‰ด', logo = data['name'], data = '<li><a href="/titleindex">๋ชจ๋“  ๋ฌธ์„œ</a><li><a href="/grammar">๋ฌธ๋ฒ• ์„ค๋ช…</a></li><li><a href="/version">๋ฒ„์ „</a></li>')
  466. @app.route('/titleindex')
  467. def titleindex():
  468. i = 0
  469. div = '<div>'
  470. curs.execute("select * from data")
  471. rows = curs.fetchall()
  472. if(rows):
  473. while True:
  474. try:
  475. a = rows[i]
  476. except:
  477. div = div + '</div>'
  478. break
  479. div = div + '<li><a href="/w/' + parse.quote(rows[i]['title']) + '">' + rows[i]['title'] + '</a></li>'
  480. i = i + 1
  481. return render_template('index.html', logo = data['name'], rows = div, tn = 4, title = '๋ชจ๋“  ๋ฌธ์„œ')
  482. else:
  483. return render_template('index.html', logo = data['name'], rows = '', tn = 4, title = '๋ชจ๋“  ๋ฌธ์„œ')
  484. @app.route('/topic/<name>', methods=['POST', 'GET'])
  485. def topic(name = None):
  486. if(request.method == 'POST'):
  487. return '<meta http-equiv="refresh" content="0;url=/topic/' + parse.quote(name) + '/sub/' + parse.quote(request.form["topic"]) + '" />'
  488. else:
  489. div = '<div>'
  490. i = 0
  491. curs.execute("select * from topic where title = '" + pymysql.escape_string(name) + "' order by sub asc")
  492. rows = curs.fetchall()
  493. while True:
  494. try:
  495. a = rows[i]
  496. except:
  497. div = div + '</div>'
  498. break
  499. if(i == 0):
  500. sub = rows[i]['sub']
  501. curs.execute("select * from stop where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' and close = 'O'")
  502. row = curs.fetchall()
  503. if(not row):
  504. div = div + '<li><a href="/topic/' + parse.quote(name) + '/sub/' + parse.quote(rows[i]['sub']) + '">' + rows[i]['sub'] + '</a></li>'
  505. else:
  506. if(not sub == rows[i]['sub']):
  507. sub = rows[i]['sub']
  508. curs.execute("select * from stop where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' and close = 'O'")
  509. row = curs.fetchall()
  510. if(not row):
  511. div = div + '<li><a href="/topic/' + parse.quote(name) + '/sub/' + parse.quote(rows[i]['sub']) + '">' + rows[i]['sub'] + '</a></li>'
  512. i = i + 1
  513. return render_template('index.html', title = name, page = parse.quote(name), logo = data['name'], plus = div, tn = 10, list = 1)
  514. @app.route('/topic/<name>/close')
  515. def topicstoplist(name = None):
  516. if(request.method == 'POST'):
  517. return '<meta http-equiv="refresh" content="0;url=/topic/' + parse.quote(name) + '/sub/' + parse.quote(request.form["topic"]) + '" />'
  518. else:
  519. div = '<div>'
  520. i = 0
  521. curs.execute("select * from stop where title = '" + pymysql.escape_string(name) + "' and close = 'O' order by sub asc")
  522. rows = curs.fetchall()
  523. while True:
  524. try:
  525. a = rows[i]
  526. except:
  527. div = div + '</div>'
  528. break
  529. if(i == 0):
  530. sub = rows[i]['sub']
  531. div = div + '<li><a href="/topic/' + parse.quote(name) + '/sub/' + parse.quote(rows[i]['sub']) + '">' + rows[i]['sub'] + '</a></li>'
  532. else:
  533. if(not sub == rows[i]['sub']):
  534. sub = rows[i]['sub']
  535. div = div + '<li><a href="/topic/' + parse.quote(name) + '/sub/' + parse.quote(rows[i]['sub']) + '">' + rows[i]['sub'] + '</a></li>'
  536. i = i + 1
  537. return render_template('index.html', title = name, page = parse.quote(name), logo = data['name'], plus = div, tn = 10)
  538. @app.route('/topic/<name>/sub/<sub>', methods=['POST', 'GET'])
  539. def sub(name = None, sub = None):
  540. if(request.method == 'POST'):
  541. curs.execute("select * from topic where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' order by id+0 desc limit 1")
  542. rows = curs.fetchall()
  543. if(rows):
  544. number = int(rows[0]['id']) + 1
  545. else:
  546. number = 1
  547. ip = getip(request)
  548. ban = getdiscuss(ip, name, sub)
  549. if(ban == 1):
  550. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  551. else:
  552. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  553. rows = curs.fetchall()
  554. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  555. ip = ip + ' - Admin'
  556. today = getnow()
  557. discuss(name, sub, today)
  558. curs.execute("insert into topic (id, title, sub, data, date, ip, block) value ('" + str(number) + "', '" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(sub) + "', '" + pymysql.escape_string(request.form["content"]) + "', '" + today + "', '" + ip + "', '')")
  559. conn.commit()
  560. return '<meta http-equiv="refresh" content="0;url=/topic/' + parse.quote(name) + '/sub/' + parse.quote(sub) + '" />'
  561. else:
  562. ip = getip(request)
  563. ban = getdiscuss(ip, name, sub)
  564. div = '<div>'
  565. i = 0
  566. curs.execute("select * from topic where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' order by id+0 asc")
  567. rows = curs.fetchall()
  568. while True:
  569. try:
  570. a = rows[i]
  571. except:
  572. div = div + '</div>'
  573. break
  574. if(i == 0):
  575. start = rows[i]['ip']
  576. indata = rows[i]['data']
  577. indata = re.sub('<', '&lt;', indata)
  578. indata = re.sub('>', '&gt;', indata)
  579. if(rows[i]['block'] == 'O'):
  580. indata = '๋ธ”๋ผ์ธ๋“œ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'
  581. block = 'style="background: gainsboro;"'
  582. else:
  583. block = ''
  584. if(rows[i]['ip'] == start):
  585. j = i + 1
  586. div = div + '<table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="' + str(j) + '">#' + str(j) + '</a> ' + rows[i]['ip'] + ' <span style="float:right;">' + rows[i]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  587. else:
  588. j = i + 1
  589. div = div + '<table id="toron"><tbody><tr><td id="toroncolor"><a href="javascript:void(0);" id="' + str(j) + '">#' + str(j) + '</a> ' + rows[i]['ip'] + ' <span style="float:right;">' + rows[i]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  590. i = i + 1
  591. return render_template('index.html', title = name, page = parse.quote(name), suburl = parse.quote(sub), sub = sub, logo = data['name'], rows = div, tn = 11, ban = ban)
  592. @app.route('/topic/<name>/sub/<sub>/b/<number>')
  593. def blind(name = None, sub = None, number = None):
  594. if(session.get('Now') == True):
  595. ip = getip(request)
  596. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  597. rows = curs.fetchall()
  598. if(rows):
  599. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  600. curs.execute("select * from topic where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' and id = '" + number + "'")
  601. row = curs.fetchall()
  602. if(row):
  603. if(row[0]['block'] == 'O'):
  604. curs.execute("update topic set block = '' where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' and id = '" + number + "'")
  605. else:
  606. curs.execute("update topic set block = 'O' where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' and id = '" + number + "'")
  607. conn.commit()
  608. return '<meta http-equiv="refresh" content="0;url=/topic/' + name + '/sub/' + sub + '" />'
  609. else:
  610. return '<meta http-equiv="refresh" content="0;url=/topic/' + name + '/sub/' + sub + '" />'
  611. else:
  612. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ถŒํ•œ์ด ๋ชจ์ž๋ž๋‹ˆ๋‹ค.')
  613. else:
  614. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  615. else:
  616. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค.')
  617. @app.route('/topic/<name>/sub/<sub>/stop')
  618. def topicstop(name = None, sub = None):
  619. if(session.get('Now') == True):
  620. ip = getip(request)
  621. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  622. rows = curs.fetchall()
  623. if(rows):
  624. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  625. curs.execute("select * from topic where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' order by id+0 desc limit 1")
  626. row = curs.fetchall()
  627. if(row):
  628. today = getnow()
  629. curs.execute("select * from stop where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' and close = ''")
  630. rows = curs.fetchall()
  631. if(rows):
  632. curs.execute("insert into topic (id, title, sub, data, date, ip, block) value ('" + pymysql.escape_string(str(int(row[0]['id']) + 1)) + "', '" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(sub) + "', 'Restart', '" + pymysql.escape_string(today) + "', '" + pymysql.escape_string(ip) + " - Restart', '')")
  633. curs.execute("delete from stop where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' and close = ''")
  634. else:
  635. curs.execute("insert into topic (id, title, sub, data, date, ip, block) value ('" + pymysql.escape_string(str(int(row[0]['id']) + 1)) + "', '" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(sub) + "', 'Stop', '" + pymysql.escape_string(today) + "', '" + pymysql.escape_string(ip) + " - Stop', '')")
  636. curs.execute("insert into stop (title, sub, close) value ('" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(sub) + "', '')")
  637. conn.commit()
  638. return '<meta http-equiv="refresh" content="0;url=/topic/' + name + '/sub/' + sub + '" />'
  639. else:
  640. return '<meta http-equiv="refresh" content="0;url=/topic/' + name + '/sub/' + sub + '" />'
  641. else:
  642. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ถŒํ•œ์ด ๋ชจ์ž๋ž๋‹ˆ๋‹ค.')
  643. else:
  644. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  645. else:
  646. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค.')
  647. @app.route('/topic/<name>/sub/<sub>/close')
  648. def topicclose(name = None, sub = None):
  649. if(session.get('Now') == True):
  650. ip = getip(request)
  651. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  652. rows = curs.fetchall()
  653. if(rows):
  654. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  655. curs.execute("select * from topic where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' order by id+0 desc limit 1")
  656. row = curs.fetchall()
  657. if(row):
  658. today = getnow()
  659. curs.execute("select * from stop where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' and close = 'O'")
  660. rows = curs.fetchall()
  661. if(rows):
  662. curs.execute("insert into topic (id, title, sub, data, date, ip, block) value ('" + pymysql.escape_string(str(int(row[0]['id']) + 1)) + "', '" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(sub) + "', 'Reopen', '" + pymysql.escape_string(today) + "', '" + pymysql.escape_string(ip) + " - Reopen', '')")
  663. curs.execute("delete from stop where title = '" + pymysql.escape_string(name) + "' and sub = '" + pymysql.escape_string(sub) + "' and close = 'O'")
  664. else:
  665. curs.execute("insert into topic (id, title, sub, data, date, ip, block) value ('" + pymysql.escape_string(str(int(row[0]['id']) + 1)) + "', '" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(sub) + "', 'Close', '" + pymysql.escape_string(today) + "', '" + pymysql.escape_string(ip) + " - Close', '')")
  666. curs.execute("insert into stop (title, sub, close) value ('" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(sub) + "', 'O')")
  667. conn.commit()
  668. return '<meta http-equiv="refresh" content="0;url=/topic/' + name + '/sub/' + sub + '" />'
  669. else:
  670. return '<meta http-equiv="refresh" content="0;url=/topic/' + name + '/sub/' + sub + '" />'
  671. else:
  672. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ถŒํ•œ์ด ๋ชจ์ž๋ž๋‹ˆ๋‹ค.')
  673. else:
  674. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  675. else:
  676. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค.')
  677. @app.route('/login', methods=['POST', 'GET'])
  678. def login():
  679. if(request.method == 'POST'):
  680. ip = getip(request)
  681. ban = getban(ip)
  682. if(ban == 1):
  683. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  684. else:
  685. curs.execute("select * from user where id = '" + pymysql.escape_string(request.form["id"]) + "'")
  686. rows = curs.fetchall()
  687. if(rows):
  688. if(session.get('Now') == True):
  689. return render_template('index.html', title = '๋กœ๊ทธ์ธ ์˜ค๋ฅ˜', logo = data['name'], data = '์ด๋ฏธ ๋กœ๊ทธ์ธ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.')
  690. elif(bcrypt.checkpw(bytes(request.form["pw"], 'utf-8'), bytes(rows[0]['pw'], 'utf-8'))):
  691. session['Now'] = True
  692. session['DREAMER'] = request.form["id"]
  693. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  694. else:
  695. return render_template('index.html', title = '๋กœ๊ทธ์ธ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.')
  696. else:
  697. return render_template('index.html', title = '๋กœ๊ทธ์ธ ์˜ค๋ฅ˜', logo = data['name'], data = '์—†๋Š” ๊ณ„์ • ์ž…๋‹ˆ๋‹ค.')
  698. else:
  699. ip = getip(request)
  700. ban = getban(ip)
  701. if(ban == 1):
  702. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  703. else:
  704. if(session.get('Now') == True):
  705. return render_template('index.html', title = '๋กœ๊ทธ์ธ ์˜ค๋ฅ˜', logo = data['name'], data = '์ด๋ฏธ ๋กœ๊ทธ์ธ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.')
  706. else:
  707. return render_template('index.html', title = '๋กœ๊ทธ์ธ', enter = '๋กœ๊ทธ์ธ', logo = data['name'], tn = 15)
  708. @app.route('/register', methods=['POST', 'GET'])
  709. def register():
  710. if(request.method == 'POST'):
  711. ip = getip(request)
  712. ban = getban(ip)
  713. if(ban == 1):
  714. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  715. else:
  716. p = re.compile('(?:[^A-Za-zใ„ฑ-ํžฃ0-9 ])')
  717. m = p.search(request.form["id"])
  718. if(m):
  719. return render_template('index.html', title = 'ํšŒ์›๊ฐ€์ž… ์˜ค๋ฅ˜', logo = data['name'], data = '์•„์ด๋””์—๋Š” ํ•œ๊ธ€๊ณผ ์•ŒํŒŒ๋ฒณ ๊ณต๋ฐฑ๋งŒ ํ—ˆ์šฉ ๋ฉ๋‹ˆ๋‹ค.')
  720. else:
  721. curs.execute("select * from user where id = '" + pymysql.escape_string(request.form["id"]) + "'")
  722. rows = curs.fetchall()
  723. if(rows):
  724. return render_template('index.html', title = 'ํšŒ์›๊ฐ€์ž… ์˜ค๋ฅ˜', logo = data['name'], data = '๋™์ผํ•œ ์•„์ด๋””์˜ ์œ ์ €๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.')
  725. else:
  726. hashed = bcrypt.hashpw(bytes(request.form["pw"], 'utf-8'), bcrypt.gensalt())
  727. if(request.form["id"] == data['owner']):
  728. curs.execute("insert into user (id, pw, acl) value ('" + pymysql.escape_string(request.form["id"]) + "', '" + pymysql.escape_string(hashed.decode()) + "', 'owner')")
  729. else:
  730. curs.execute("insert into user (id, pw, acl) value ('" + pymysql.escape_string(request.form["id"]) + "', '" + pymysql.escape_string(hashed.decode()) + "', 'user')")
  731. conn.commit()
  732. return '<meta http-equiv="refresh" content="0;url=/login" />'
  733. else:
  734. ip = getip(request)
  735. ban = getban(ip)
  736. if(ban == 1):
  737. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  738. else:
  739. return render_template('index.html', title = 'ํšŒ์›๊ฐ€์ž…', enter = 'ํšŒ์›๊ฐ€์ž…', logo = data['name'], tn = 15)
  740. @app.route('/logout')
  741. def logout():
  742. session['Now'] = False
  743. session.pop('DREAMER', None)
  744. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  745. @app.route('/ban/<name>', methods=['POST', 'GET'])
  746. def ban(name = None):
  747. if(request.method == 'POST'):
  748. if(session.get('Now') == True):
  749. ip = getip(request)
  750. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  751. rows = curs.fetchall()
  752. if(rows):
  753. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  754. curs.execute("select * from ban where block = '" + pymysql.escape_string(name) + "'")
  755. row = curs.fetchall()
  756. if(row):
  757. curs.execute("delete from ban where block = '" + pymysql.escape_string(name) + "'")
  758. else:
  759. curs.execute("insert into ban (block, end, why, band) value ('" + pymysql.escape_string(name) + "', '" + pymysql.escape_string(request.form["end"]) + "', '" + pymysql.escape_string(request.form["why"]) + "', '')")
  760. conn.commit()
  761. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  762. else:
  763. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ถŒํ•œ์ด ๋ชจ์ž๋ž๋‹ˆ๋‹ค.')
  764. else:
  765. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  766. else:
  767. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค.')
  768. else:
  769. if(session.get('Now') == True):
  770. ip = getip(request)
  771. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  772. rows = curs.fetchall()
  773. if(rows):
  774. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  775. curs.execute("select * from ban where block = '" + pymysql.escape_string(name) + "'")
  776. row = curs.fetchall()
  777. if(row):
  778. now = '์ฐจ๋‹จ ํ•ด์ œ'
  779. else:
  780. now = '์ฐจ๋‹จ'
  781. return render_template('index.html', title = name, page = parse.quote(name), logo = data['name'], tn = 16, now = now)
  782. else:
  783. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ถŒํ•œ์ด ๋ชจ์ž๋ž๋‹ˆ๋‹ค.')
  784. else:
  785. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  786. else:
  787. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค.')
  788. @app.route('/acl/<name>', methods=['POST', 'GET'])
  789. def acl(name = None):
  790. if(request.method == 'POST'):
  791. if(session.get('Now') == True):
  792. ip = getip(request)
  793. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  794. rows = curs.fetchall()
  795. if(rows):
  796. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  797. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  798. row = curs.fetchall()
  799. if(row):
  800. if(request.form["select"] == 'admin'):
  801. curs.execute("update data set acl = 'admin' where title = '" + pymysql.escape_string(name) + "'")
  802. elif(request.form["select"] == 'user'):
  803. curs.execute("update data set acl = 'user' where title = '" + pymysql.escape_string(name) + "'")
  804. else:
  805. curs.execute("update data set acl = '' where title = '" + pymysql.escape_string(name) + "'")
  806. conn.commit()
  807. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  808. else:
  809. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ถŒํ•œ์ด ๋ชจ์ž๋ž๋‹ˆ๋‹ค.')
  810. else:
  811. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  812. else:
  813. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค.')
  814. else:
  815. if(session.get('Now') == True):
  816. ip = getip(request)
  817. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  818. rows = curs.fetchall()
  819. if(rows):
  820. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  821. curs.execute("select * from data where title = '" + pymysql.escape_string(name) + "'")
  822. row = curs.fetchall()
  823. if(row):
  824. if(row[0]['acl'] == 'admin'):
  825. now = '๊ด€๋ฆฌ์ž๋งŒ'
  826. elif(row[0]['acl'] == 'user'):
  827. now = '์œ ์ € ์ด์ƒ'
  828. else:
  829. now = '์ผ๋ฐ˜'
  830. return render_template('index.html', title = name, page = parse.quote(name), logo = data['name'], tn = 19, now = 'ํ˜„์žฌ ACL ์ƒํƒœ๋Š” ' + now)
  831. else:
  832. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(name) + '" />'
  833. else:
  834. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ถŒํ•œ์ด ๋ชจ์ž๋ž๋‹ˆ๋‹ค.')
  835. else:
  836. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  837. else:
  838. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค.')
  839. @app.route('/admin/<name>', methods=['POST', 'GET'])
  840. def admin(name = None):
  841. if(request.method == 'POST'):
  842. if(session.get('Now') == True):
  843. ip = getip(request)
  844. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  845. rows = curs.fetchall()
  846. if(rows):
  847. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  848. curs.execute("select * from user where id = '" + pymysql.escape_string(name) + "'")
  849. row = curs.fetchall()
  850. if(row):
  851. if(row[0]['acl'] == 'admin' or row[0]['acl'] == 'owner'):
  852. curs.execute("update user set acl = 'user' where id = '" + pymysql.escape_string(name) + "'")
  853. else:
  854. curs.execute("update user set acl = '" + pymysql.escape_string(request.form["select"]) + "' where id = '" + pymysql.escape_string(name) + "'")
  855. conn.commit()
  856. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  857. else:
  858. return render_template('index.html', title = '์‚ฌ์šฉ์ž ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  859. else:
  860. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ถŒํ•œ์ด ๋ชจ์ž๋ž๋‹ˆ๋‹ค.')
  861. else:
  862. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  863. else:
  864. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค.')
  865. else:
  866. if(session.get('Now') == True):
  867. ip = getip(request)
  868. curs.execute("select * from user where id = '" + pymysql.escape_string(ip) + "'")
  869. rows = curs.fetchall()
  870. if(rows):
  871. if(rows[0]['acl'] == 'owner'):
  872. curs.execute("select * from user where id = '" + pymysql.escape_string(name) + "'")
  873. row = curs.fetchall()
  874. if(row):
  875. if(row[0]['acl'] == 'admin' or row[0]['acl'] == 'owner'):
  876. now = '๊ถŒํ•œ ํ•ด์ œ'
  877. else:
  878. now = '๊ถŒํ•œ ๋ถ€์—ฌ'
  879. return render_template('index.html', title = name, page = parse.quote(name), logo = data['name'], tn = 18, now = now)
  880. else:
  881. return render_template('index.html', title = '์‚ฌ์šฉ์ž ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  882. else:
  883. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ถŒํ•œ์ด ๋ชจ์ž๋ž๋‹ˆ๋‹ค.')
  884. else:
  885. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.')
  886. else:
  887. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = '๋น„ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค.')
  888. @app.route('/grammar')
  889. def grammar():
  890. return render_template('index.html', title = '๋ฌธ๋ฒ• ์„ค๋ช…', logo = data['name'], tn = 17)
  891. @app.route('/ban')
  892. def aban():
  893. return render_template('index.html', title = '๊ถŒํ•œ ์˜ค๋ฅ˜', logo = data['name'], data = 'ํ˜„์žฌ ์ฐจ๋‹จ ์ƒํƒœ๊ฑฐ๋‚˜ ACL์ด ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.')
  894. @app.route('/version')
  895. def version():
  896. return render_template('index.html', title = '๋ฒ„์ „', logo = data['name'], tn = 14)
  897. @app.route('/user')
  898. def user():
  899. ip = getip(request)
  900. return render_template('index.html', title = '์œ ์ € ๋ฉ”๋‰ด', logo = data['name'], data = ip + '<br><br><li><a href="/login">๋กœ๊ทธ์ธ</a></li><li><a href="/logout">๋กœ๊ทธ์•„์›ƒ</a></li><li><a href="/register">ํšŒ์›๊ฐ€์ž…</a></li>')
  901. @app.route('/random')
  902. def random():
  903. curs.execute("select * from data order by rand() limit 1")
  904. rows = curs.fetchall()
  905. if(rows):
  906. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(rows[0]['title']) + '" />'
  907. else:
  908. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  909. @app.errorhandler(404)
  910. def uncaughtError(error):
  911. return '<meta http-equiv="refresh" content="0;url=/w/' + parse.quote(data['frontpage']) + '" />'
  912. if __name__ == '__main__':
  913. app.run(host = '0.0.0.0', port = 3000)