main.py 107 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338
  1. from flask import Flask, request, session, render_template, send_file
  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. import os
  10. import difflib
  11. import hashlib
  12. json_data = open('set.json').read()
  13. set_data = json.loads(json_data)
  14. print('port : ' + set_data['port'])
  15. if(not set_data['log'] == "O"):
  16. import logging
  17. log = logging.getLogger('werkzeug')
  18. log.setLevel(logging.ERROR)
  19. def start():
  20. try:
  21. db_ex("select * from data limit 1")
  22. except:
  23. db_ex("create table data(title text, data longtext, acl text)")
  24. try:
  25. db_ex("select * from history limit 1")
  26. except:
  27. db_ex("create table history(id text, title text, data longtext, date text, ip text, send text, leng text)")
  28. try:
  29. db_ex("select * from rd limit 1")
  30. except:
  31. db_ex("create table rd(title text, sub text, date text)")
  32. try:
  33. db_ex("select * from user limit 1")
  34. except:
  35. db_ex("create table user(id text, pw text, acl text)")
  36. try:
  37. db_ex("select * from ban limit 1")
  38. except:
  39. db_ex("create table ban(block text, end text, why text, band text)")
  40. try:
  41. db_ex("select * from topic limit 1")
  42. except:
  43. db_ex("create table topic(id text, title text, sub text, data longtext, date text, ip text, block text)")
  44. try:
  45. db_ex("select * from stop limit 1")
  46. except:
  47. db_ex("create table stop(title text, sub text, close text)")
  48. try:
  49. db_ex("select * from rb limit 1")
  50. except:
  51. db_ex("create table rb(block text, end text, today text, blocker text, why text)")
  52. try:
  53. db_ex("select * from login limit 1")
  54. except:
  55. db_ex("create table login(user text, ip text, today text)")
  56. try:
  57. db_ex("select * from back limit 1")
  58. except:
  59. db_ex("create table back(title text, link text, type text)")
  60. try:
  61. db_ex("select * from cat limit 1")
  62. except:
  63. db_ex("create table cat(title text, cat text)")
  64. try:
  65. db_ex("select * from hidhi limit 1")
  66. except:
  67. db_ex("create table hidhi(title text, re text)")
  68. try:
  69. db_ex("select * from distop limit 1")
  70. except:
  71. db_ex("create table distop(id text, title text, sub text)")
  72. try:
  73. db_ex("select * from agreedis limit 1")
  74. except:
  75. db_ex("create table agreedis(title text, sub text)")
  76. conn = pymysql.connect(host = set_data['host'], user = set_data['user'], password = set_data['pw'], charset = 'utf8mb4')
  77. curs = conn.cursor(pymysql.cursors.DictCursor)
  78. def redirect(data):
  79. return '<meta http-equiv="refresh" content="0;url=' + data + '" />'
  80. def db_com():
  81. conn.commit()
  82. def url_pas(data):
  83. return parse.quote(data).replace('/','%2F')
  84. def db_get():
  85. return curs.fetchall()
  86. web_render = render_template
  87. db_ex = curs.execute
  88. db_pas = pymysql.escape_string
  89. try:
  90. db_ex("use " + set_data['db'])
  91. except:
  92. db_ex("create database " + set_data['db'])
  93. db_ex("use " + set_data['db'])
  94. db_ex("alter database " + set_data['db'] + " character set = utf8mb4 collate = utf8mb4_unicode_ci")
  95. start()
  96. from func import *
  97. from mark import *
  98. app.secret_key = hashlib.sha512(bytes(set_data['key'], 'ascii')).hexdigest()
  99. @app.route('/upload', methods=['GET', 'POST'])
  100. def upload():
  101. app.config['MAX_CONTENT_LENGTH'] = int(set_data['upload']) * 1024 * 1024
  102. ip = ip_check()
  103. ban = ban_check(ip)
  104. if(request.method == 'POST'):
  105. if(ban == 1):
  106. return redirect('/ban')
  107. else:
  108. file = request.files['file']
  109. if(file):
  110. if(re.search('^([^./\\*<>|:?"]+)\.([Jj][Pp][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg]|[Pp][Nn][Gg])$', file.filename)):
  111. filename = file.filename
  112. if(os.path.exists(os.path.join('image', filename))):
  113. return redirect('/error/16')
  114. else:
  115. file.save(os.path.join('image', filename))
  116. db_ex("insert into data (title, data, acl) value ('" + db_pas('파일:' + filename) + "', '" + db_pas('[[파일:' + filename + ']][br][br]{{{[[파일:' + filename + ']]}}}') + "', '')")
  117. db_com()
  118. history_plus('파일:' + filename, '[[파일:' + filename + ']][br][br]{{{[[파일:' + filename + ']]}}}', get_time(), ip, '파일:' + filename + ' 업로드', '0')
  119. return redirect('/w/' + url_pas('파일:' + filename))
  120. else:
  121. return redirect('/error/15')
  122. else:
  123. return redirect('/error/14')
  124. else:
  125. if(ban == 1):
  126. return redirect('/ban')
  127. else:
  128. return web_render('index.html', login = login_check(), logo = set_data['name'], title = '업로드', tn = 21, number = set_data['upload'])
  129. @app.route('/image/<path:name>')
  130. def image_get(name = None):
  131. if(os.path.exists(os.path.join('image', name))):
  132. return send_file(os.path.join('image', name), mimetype='image')
  133. else:
  134. return web_render('index.html', login = login_check(), logo = set_data['name'], data = '이미지 없음.', title = '이미지 보기'), 404
  135. @app.route('/acllist')
  136. def acl_list():
  137. data = ''
  138. i = 1
  139. db_ex("select title, acl from data where acl = 'admin' or acl = 'user' order by acl desc")
  140. list_data = db_get()
  141. if(list_data):
  142. while(True):
  143. try:
  144. a = list_data[i]
  145. except:
  146. break
  147. if(list_data[i]['acl'] == 'admin'):
  148. acl = '관리자'
  149. else:
  150. acl = '로그인'
  151. data = data + '<li>' + str(i) + '. <a href="/w/' + url_pas(list_data[i]['title']) + '">' + list_data[i]['title'] + '</a> (' + acl + ')</li>'
  152. i += 1
  153. data = data + '</div>'
  154. else:
  155. data = ''
  156. return web_render('index.html', login = login_check(), logo = set_data['name'], data = data, title = 'ACL 문서 목록')
  157. @app.route('/adminlist')
  158. def admin_list():
  159. i = 0
  160. div = '<div>'
  161. db_ex("select * from user where acl = 'admin' or acl = 'owner'")
  162. user_data = db_get()
  163. if(user_data):
  164. while(True):
  165. try:
  166. a = user_data[i]
  167. except:
  168. div = div + '</div>'
  169. break
  170. if(user_data[i]['acl'] == 'owner'):
  171. acl = '소유자'
  172. else:
  173. acl = '관리자'
  174. db_ex("select title from data where title = '사용자:" + user_data[i]['id'] + "'")
  175. user = db_get()
  176. if(user):
  177. name = '<a href="/w/' + url_pas('사용자:' + user_data[i]['id']) + '">' + user_data[i]['id'] + '</a> (' + acl + ')'
  178. else:
  179. name = '<a class="not_thing" href="/w/' + url_pas('사용자:' + user_data[i]['id']) + '">' + user_data[i]['id'] + '</a> (' + acl + ')'
  180. div = div + '<li>' + str(i + 1) + '. ' + name + '</li>'
  181. i += 1
  182. return web_render('index.html', login = login_check(), logo = set_data['name'], data = div, title = '관리자 목록')
  183. else:
  184. return web_render('index.html', login = login_check(), logo = set_data['name'], title = '관리자 목록')
  185. @app.route('/recentchanges')
  186. def recent_changes():
  187. i = 0
  188. div = '<div>'
  189. db_ex("select * from history order by date desc limit 50")
  190. rows = db_get()
  191. if(rows):
  192. while(True):
  193. try:
  194. a = rows[i]
  195. except:
  196. div = div + '</div>'
  197. break
  198. if(rows[i]['send']):
  199. send = rows[i]['send']
  200. send = re.sub('<a href="\/w\/(?P<in>[^"]*)">(?P<out>[^&]*)<\/a>', '<a href="/w/\g<in>">\g<out></a>', send)
  201. else:
  202. send = '<br>'
  203. title = rows[i]['title']
  204. title = re.sub('<', '&lt;', title)
  205. title = re.sub('>', '&gt;', title)
  206. m = re.search("\+", rows[i]['leng'])
  207. n = re.search("\-", rows[i]['leng'])
  208. if(m):
  209. leng = '<span style="color:green;">' + rows[i]['leng'] + '</span>'
  210. elif(n):
  211. leng = '<span style="color:red;">' + rows[i]['leng'] + '</span>'
  212. else:
  213. leng = '<span style="color:gray;">' + rows[i]['leng'] + '</span>'
  214. if(admin_check() == 1):
  215. db_ex("select * from ban where block = '" + db_pas(rows[i]['ip']) + "'")
  216. row = db_get()
  217. if(row):
  218. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(해제)</a>'
  219. else:
  220. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(차단)</a>'
  221. else:
  222. ban = ''
  223. if(re.search('\.', rows[i]['ip'])):
  224. ip = rows[i]['ip'] + ' <a href="/record/' + url_pas(rows[i]['ip']) + '/n/1">(기록)</a>'
  225. else:
  226. db_ex("select title from data where title = '사용자:" + db_pas(rows[i]['ip']) + "'")
  227. row = db_get()
  228. if(row):
  229. ip = '<a href="/w/' + url_pas('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a> <a href="/record/' + url_pas(rows[i]['ip']) + '/n/1">(기록)</a>'
  230. else:
  231. ip = '<a class="not_thing" href="/w/' + url_pas('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a> <a href="/record/' + url_pas(rows[i]['ip']) + '/n/1">(기록)</a>'
  232. if((int(rows[i]['id']) - 1) == 0):
  233. revert = ''
  234. else:
  235. revert = '<a href="/revert/' + url_pas(rows[i]['title']) + '/r/' + str(int(rows[i]['id']) - 1) + '">(되돌리기)</a>'
  236. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;"><a href="/w/' + url_pas(rows[i]['title']) + '">' + title + '</a> <a href="/history/' + url_pas(rows[i]['title']) + '/n/1">(역사)</a> ' + revert + ' (' + leng + ')</td><td style="text-align: center;width:33.33%;">' + ip + ban + '</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>'
  237. i += 1
  238. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = div, tn = 3, title = '최근 변경내역')
  239. else:
  240. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = '', tn = 3, title = '최근 변경내역')
  241. @app.route('/history/<path:name>/r/<int:num>/hidden')
  242. def history_hidden(name = None, num = None):
  243. if(owner_check() == 1):
  244. db_ex("select * from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(str(num)) + "'")
  245. exist = db_get()
  246. if(exist):
  247. db_ex("delete from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(str(num)) + "'")
  248. else:
  249. db_ex("insert into hidhi (title, re) value ('" + db_pas(name) + "', '" + db_pas(str(num)) + "')")
  250. db_com()
  251. return redirct('/history/' + url_pas(name) + '/n/1')
  252. else:
  253. return redirct('/history/' + url_pas(name) + '/n/1')
  254. @app.route('/record/<path:name>/n/<int:num>')
  255. def user_record(name = None, num = None):
  256. v = num * 50
  257. i = v - 50
  258. div = '<div>'
  259. db_ex("select * from history where ip = '" + db_pas(name) + "' order by date desc")
  260. rows = db_get()
  261. if(rows):
  262. while(True):
  263. try:
  264. a = rows[i]
  265. except:
  266. div = div + '</div>'
  267. if(num != 1):
  268. div = div + '<br><a href="/record/' + url_pas(name) + '/n/' + str(num - 1) + '">(이전)'
  269. break
  270. if(rows[i]['send']):
  271. send = rows[i]['send']
  272. send = re.sub('<a href="\/w\/(?P<in>[^"]*)">(?P<out>[^&]*)<\/a>', '<a href="/w/\g<in>">\g<out></a>', send)
  273. else:
  274. send = '<br>'
  275. title = rows[i]['title']
  276. title = re.sub('<', '&lt;', title)
  277. title = re.sub('>', '&gt;', title)
  278. m = re.search("\+", rows[i]['leng'])
  279. n = re.search("\-", rows[i]['leng'])
  280. if(m):
  281. leng = '<span style="color:green;">' + rows[i]['leng'] + '</span>'
  282. elif(n):
  283. leng = '<span style="color:red;">' + rows[i]['leng'] + '</span>'
  284. else:
  285. leng = '<span style="color:gray;">' + rows[i]['leng'] + '</span>'
  286. if(admin_check() == 1):
  287. db_ex("select * from ban where block = '" + db_pas(rows[i]['ip']) + "'")
  288. row = db_get()
  289. if(row):
  290. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(해제)</a>'
  291. else:
  292. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(차단)</a>'
  293. else:
  294. ban = ''
  295. if(re.search('\.', rows[i]['ip'])):
  296. ip = rows[i]['ip']
  297. else:
  298. db_ex("select title from data where title = '사용자:" + db_pas(rows[i]['ip']) + "'")
  299. row = db_get()
  300. if(row):
  301. ip = '<a href="/w/' + url_pas('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a>'
  302. else:
  303. ip = '<a class="not_thing" href="/w/' + url_pas('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a>'
  304. if((int(rows[i]['id']) - 1) == 0):
  305. revert = ''
  306. else:
  307. revert = '<a href="/revert/' + url_pas(rows[i]['title']) + '/r/' + str(int(rows[i]['id']) - 1) + '">(되돌리기)</a>'
  308. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;"><a href="/w/' + url_pas(rows[i]['title']) + '">' + title + '</a> (' + rows[i]['id'] + '판) <a href="/history/' + url_pas(rows[i]['title']) + '/n/1">(역사)</a> ' + revert + ' (' + leng + ')</td><td style="text-align: center;width:33.33%;">' + ip + ban + '</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>'
  309. if(i == v):
  310. div = div + '</div>'
  311. if(num == 1):
  312. div = div + '<br><a href="/record/' + url_pas(name) + '/n/' + str(num + 1) + '">(다음)'
  313. else:
  314. div = div + '<br><a href="/record/' + url_pas(name) + '/n/' + str(num - 1) + '">(이전) <a href="/record/' + url_pas(name) + '/n/' + str(num + 1) + '">(다음)'
  315. break
  316. i += 1
  317. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = div, tn = 3, title = '사용자 기록')
  318. else:
  319. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = '', tn = 3, title = '사용자 기록')
  320. @app.route('/userlog/n/<int:number>')
  321. def user_log(number = None):
  322. i = number * 50
  323. j = i - 50
  324. list = ''
  325. db_ex("select * from user")
  326. user_list = db_get()
  327. if(user_list):
  328. while(True):
  329. try:
  330. a = user_list[j]
  331. except:
  332. if(number != 1):
  333. list = list + '<br><a href="/userlog/n/' + str(number - 1) + '">(이전)'
  334. break
  335. if(admin_check() == 1):
  336. db_ex("select * from ban where block = '" + db_pas(user_list[j]['id']) + "'")
  337. ban_exist = db_get()
  338. if(ban_exist):
  339. ban_button = ' <a href="/ban/' + url_pas(user_list[j]['id']) + '">(해제)</a>'
  340. else:
  341. ban_button = ' <a href="/ban/' + url_pas(user_list[j]['id']) + '">(차단)</a>'
  342. else:
  343. ban_button = ''
  344. db_ex("select title from data where title = '사용자:" + db_pas(user_list[j]['id']) + "'")
  345. data = db_get()
  346. if(data):
  347. ip = '<a href="/w/' + url_pas('사용자:' + user_list[j]['id']) + '">' + user_list[j]['id'] + '</a> <a href="/record/' + url_pas(user_list[j]['id']) + '/n/1">(기록)</a>'
  348. else:
  349. ip = '<a class="not_thing" href="/w/' + url_pas('사용자:' + user_list[j]['id']) + '">' + user_list[j]['id'] + '</a> <a href="/record/' + url_pas(user_list[j]['id']) + '/n/1">(기록)</a>'
  350. list = list + '<li>' + str(j + 1) + '. ' + ip + ban_button + '</li>'
  351. if(j == i):
  352. if(number == 1):
  353. list = list + '<br><a href="/userlog/n/' + str(number + 1) + '">(다음)'
  354. else:
  355. list = list + '<br><a href="/userlog/n/' + str(number - 1) + '">(이전) <a href="/userlog/n/' + str(number + 1) + '">(다음)'
  356. break
  357. else:
  358. j += 1
  359. return web_render('index.html', login = login_check(), logo = set_data['name'], data = list, title = '사용자 가입 기록')
  360. else:
  361. return web_render('index.html', login = login_check(), logo = set_data['name'], data = '', title = '사용자 가입 기록')
  362. @app.route('/backreset')
  363. def backlink_reset():
  364. if(owner_check() == 1):
  365. i = 0
  366. db_ex("delete from back")
  367. db_com()
  368. db_ex("select * from data")
  369. all = db_get()
  370. if(all):
  371. while(True):
  372. try:
  373. a = all[i]
  374. except:
  375. break
  376. namumark(all[i]['title'], all[i]['data'])
  377. i += 1
  378. return web_render('index.html', login = login_check(), logo = set_data['name'], data = '에러 없음', title = '완료')
  379. else:
  380. return redirct('/error/3')
  381. @app.route('/backlink/<path:name>/n/<int:num>')
  382. def backlink(name = None, num = None):
  383. v = num * 50
  384. i = v - 50
  385. div = ''
  386. restart = 0
  387. db_ex("delete from back where title = '" + db_pas(name) + "' and link = ''")
  388. db_com()
  389. db_ex("select * from back where title = '" + db_pas(name) + "' order by link asc")
  390. rows = db_get()
  391. if(rows):
  392. while(True):
  393. try:
  394. a = rows[i]
  395. except:
  396. if(num != 1):
  397. div = div + '<br><a href="/backlink/n/' + str(num - 1) + '">(이전)'
  398. break
  399. if(rows[i]['type'] == 'include' or rows[i]['type'] == 'file'):
  400. db_ex("select * from back where title = '" + db_pas(name) + "' and link = '" + db_pas(rows[i]['link']) + "' and type = ''")
  401. test = db_get()
  402. if(test):
  403. restart = 1
  404. db_ex("delete from back where title = '" + db_pas(name) + "' and link = '" + db_pas(rows[i]['link']) + "' and type = ''")
  405. db_com()
  406. if(not re.search('^사용자:', rows[i]['link'])):
  407. db_ex("select * from data where title = '" + db_pas(rows[i]['link']) + "'")
  408. row = db_get()
  409. if(row):
  410. data = row[0]['data']
  411. data = re.sub("(?P<in>\[include\((?P<out>(?:(?!\)\]|,).)*)((?:,\s?(?:[^)]*))+)?\)\])", "\g<in>\n\n[[\g<out>]]\n\n", data)
  412. data = re.sub("\[\[파일:(?P<in>(?:(?!\]\]|\|).)*)(?:\|((?:(?!\]\]).)*))?\]\]", "\n\n[[:파일:\g<in>]]\n\n", data)
  413. data = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', '[[\g<in>]]', data)
  414. data = namumark('', data)
  415. if(re.search("<a(?:(?:(?!href=).)*)?href=\"\/w\/" + url_pas(name) + "(?:\#[^\"]*)?\"(?:(?:(?!>).)*)?>([^<]*)<\/a>", data)):
  416. div = div + '<li><a href="/w/' + url_pas(rows[i]['link']) + '">' + rows[i]['link'] + '</a>'
  417. if(rows[i]['type']):
  418. div = div + ' (' + rows[i]['type'] + ')</li>'
  419. else:
  420. div = div + '</li>'
  421. if(i == v):
  422. if(num == 1):
  423. div = div + '<br><a href="/backlink/' + url_pas(name) + '/n/' + str(num + 1) + '">(다음)'
  424. else:
  425. div = div + '<br><a href="/backlink/' + url_pas(name) + '/n/' + str(num - 1) + '">(이전) <a href="/backlink/' + url_pas(name) + '/n/' + str(num + 1) + '">(다음)'
  426. break
  427. else:
  428. i += 1
  429. else:
  430. db_ex("delete from back where title = '" + db_pas(name) + "' and link = '" + db_pas(rows[i]['link']) + "'")
  431. db_com()
  432. i += 1
  433. v += 1
  434. else:
  435. db_ex("delete from back where title = '" + db_pas(name) + "' and link = '" + db_pas(rows[i]['link']) + "'")
  436. db_com()
  437. i += 1
  438. v += 1
  439. else:
  440. db_ex("delete from back where title = '" + db_pas(name) + "' and link = '" + db_pas(rows[i]['link']) + "'")
  441. db_com()
  442. i += 1
  443. v += 1
  444. if(restart == 1):
  445. return redirct('/backlink/' + url_pas(name) + '/n/' + str(num))
  446. else:
  447. return web_render('index.html', login = login_check(), logo = set_data['name'], data = div, title = name, page = url_pas(name), sub = '역링크')
  448. else:
  449. return web_render('index.html', login = login_check(), logo = set_data['name'], data = '', title = name, page = url_pas(name), sub = '역링크')
  450. @app.route('/recentdiscuss')
  451. def recent_discuss():
  452. i = 0
  453. div = '<div>'
  454. db_ex("select * from rd order by date desc limit 50")
  455. rows = db_get()
  456. if(rows):
  457. while(True):
  458. try:
  459. a = rows[i]
  460. except:
  461. div = div + '</div>'
  462. break
  463. title = rows[i]['title']
  464. title = re.sub('<', '&lt;', title)
  465. title = re.sub('>', '&gt;', title)
  466. sub = rows[i]['sub']
  467. sub = re.sub('<', '&lt;', sub)
  468. sub = re.sub('>', '&gt;', sub)
  469. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:50%;"><a href="/topic/' + url_pas(rows[i]['title']) + '/sub/' + url_pas(rows[i]['sub']) + '">' + title + '</a> (' + sub + ')</td><td style="text-align: center;width:50%;">' + rows[i]['date'] + '</td></tr></tbody></table>'
  470. i += 1
  471. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = div, tn = 12, title = '최근 토론내역')
  472. else:
  473. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = '', tn = 12, title = '최근 토론내역')
  474. @app.route('/blocklog/n/<int:number>')
  475. def blocklog(number = None):
  476. v = number * 50
  477. i = v - 50
  478. div = '<div>'
  479. db_ex("select * from rb order by today desc")
  480. rows = db_get()
  481. if(rows):
  482. while(True):
  483. try:
  484. a = rows[i]
  485. except:
  486. div = div + '</div>'
  487. if(number != 1):
  488. div = div + '<br><a href="/blocklog/n/' + str(number - 1) + '">(이전)'
  489. break
  490. why = rows[i]['why']
  491. why = re.sub('<', '&lt;', why)
  492. why = re.sub('>', '&gt;', why)
  493. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))$", rows[i]['block'])
  494. if(b):
  495. ip = rows[i]['block'] + ' (대역)'
  496. else:
  497. ip = rows[i]['block']
  498. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:20%;">' + ip + '</a></td><td style="text-align: center;width:20%;">' + rows[i]['blocker'] + '</td><td style="text-align: center;width:20%;">' + rows[i]['end'] + '</td><td style="text-align: center;width:20%;">' + rows[i]['why'] + '</td><td style="text-align: center;width:20%;">' + rows[i]['today'] + '</td></tr></tbody></table>'
  499. if(i == v):
  500. div = div + '</div>'
  501. if(number == 1):
  502. div = div + '<br><a href="/blocklog/n/' + str(number + 1) + '">(다음)'
  503. else:
  504. div = div + '<br><a href="/blocklog/n/' + str(number - 1) + '">(이전) <a href="/blocklog/n/' + str(number + 1) + '">(다음)'
  505. break
  506. else:
  507. i += 1
  508. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = div, tn = 20, title = '사용자 차단 기록')
  509. else:
  510. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = '', tn = 20, title = '사용자 차단 기록')
  511. @app.route('/history/<path:name>/n/<int:num>', methods=['POST', 'GET'])
  512. def history_view(name = None, num = None):
  513. if(request.method == 'POST'):
  514. return '<meta http-equiv="refresh" content="0;url=/w/' + url_pas(name) + '/r/' + request.form["b"] + '/diff/' + request.form["a"] + '" />'
  515. else:
  516. select = ''
  517. v = num * 50
  518. i = v - 50
  519. div = '<div>'
  520. db_ex("select send, leng, ip, date, title, id from history where title = '" + db_pas(name) + "' order by id + 0 desc")
  521. rows = db_get()
  522. if(rows):
  523. while(True):
  524. style = ''
  525. try:
  526. a = rows[i]
  527. except:
  528. div = div + '</div>'
  529. if(num != 1):
  530. div = div + '<br><a href="/history/' + url_pas(name) + '/n/' + str(num - 1) + '">(이전)'
  531. break
  532. select = '<option value="' + str(i + 1) + '">' + str(i + 1) + '</option>' + select
  533. if(rows[i]['send']):
  534. send = rows[i]['send']
  535. send = re.sub('<a href="\/w\/(?P<in>[^"]*)">(?P<out>[^&]*)<\/a>', '<a href="/w/\g<in>">\g<out></a>', send)
  536. else:
  537. send = '<br>'
  538. m = re.search("\+", rows[i]['leng'])
  539. n = re.search("\-", rows[i]['leng'])
  540. if(m):
  541. leng = '<span style="color:green;">' + rows[i]['leng'] + '</span>'
  542. elif(n):
  543. leng = '<span style="color:red;">' + rows[i]['leng'] + '</span>'
  544. else:
  545. leng = '<span style="color:gray;">' + rows[i]['leng'] + '</span>'
  546. if(re.search("\.", rows[i]["ip"])):
  547. ip = rows[i]["ip"] + ' <a href="/record/' + url_pas(rows[i]["ip"]) + '/n/1">(기록)</a>'
  548. else:
  549. db_ex("select title from data where title = '사용자:" + db_pas(rows[i]['ip']) + "'")
  550. row = db_get()
  551. if(row):
  552. ip = '<a href="/w/' + url_pas('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a> <a href="/record/' + url_pas(rows[i]["ip"]) + '/n/1">(기록)</a>'
  553. else:
  554. ip = '<a class="not_thing" href="/w/' + url_pas('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a> <a href="/record/' + url_pas(rows[i]["ip"]) + '/n/1">(기록)</a>'
  555. if(admin_check() == 1):
  556. db_ex("select * from user where id = '" + db_pas(rows[i]['ip']) + "'")
  557. row = db_get()
  558. if(row):
  559. if(row[0]['acl'] == 'owner' or row[0]['acl'] == 'admin'):
  560. ban = ''
  561. else:
  562. db_ex("select * from ban where block = '" + db_pas(rows[i]['ip']) + "'")
  563. row = db_get()
  564. if(row):
  565. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(해제)</a>'
  566. else:
  567. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(차단)</a>'
  568. else:
  569. db_ex("select * from ban where block = '" + db_pas(rows[i]['ip']) + "'")
  570. row = db_get()
  571. if(row):
  572. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(해제)</a>'
  573. else:
  574. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(차단)</a>'
  575. if(owner_check() == 1):
  576. db_ex("select * from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(rows[i]['id']) + "'")
  577. row = db_get()
  578. if(row):
  579. ip = ip + ' (숨김)'
  580. hidden = ' <a href="/history/' + url_pas(name) + '/r/' + rows[i]['id'] + '/hidden">(공개)'
  581. else:
  582. hidden = ' <a href="/history/' + url_pas(name) + '/r/' + rows[i]['id'] + '/hidden">(숨김)'
  583. else:
  584. db_ex("select * from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(rows[i]['id']) + "'")
  585. row = db_get()
  586. if(row):
  587. ip = '숨김'
  588. hidden = ''
  589. send = '숨김'
  590. ban = ''
  591. style = 'display:none;'
  592. v += 1
  593. else:
  594. hidden = ''
  595. else:
  596. ban = ''
  597. db_ex("select * from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(rows[i]['id']) + "'")
  598. row = db_get()
  599. if(row):
  600. ip = '숨김'
  601. hidden = ''
  602. send = '숨김'
  603. ban = ''
  604. style = 'display:none;'
  605. v += 1
  606. else:
  607. hidden = ''
  608. div = div + '<table style="width: 100%;' + style + '"><tbody><tr><td style="text-align: center;width:33.33%;">' + rows[i]['id'] + '판</a> <a href="/w/' + url_pas(rows[i]['title']) + '/r/' + rows[i]['id'] + '">(w)</a> <a href="/w/' + url_pas(rows[i]['title']) + '/raw/' + rows[i]['id'] + '">(Raw)</a> <a href="/revert/' + url_pas(rows[i]['title']) + '/r/' + rows[i]['id'] + '">(되돌리기)</a> (' + leng + ')</td><td style="text-align: center;width:33.33%;">' + ip + ban + hidden + '</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>'
  609. if(i == v):
  610. div = div + '</div>'
  611. if(num == 1):
  612. div = div + '<br><a href="/history/' + url_pas(name) + '/n/' + str(num + 1) + '">(다음)'
  613. else:
  614. div = div + '<br><a href="/history/' + url_pas(name) + '/n/' + str(num - 1) + '">(이전) <a href="/history/' + url_pas(name) + '/n/' + str(num + 1) + '">(다음)'
  615. break
  616. else:
  617. i += 1
  618. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = div, tn = 5, title = name, page = url_pas(name), select = select, sub = '역사')
  619. else:
  620. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = '', tn = 5, title = name, page = url_pas(name), select = select, sub = '역사')
  621. @app.route('/search', methods=['POST'])
  622. def search():
  623. db_ex("select title from data where title like '%" + db_pas(request.form["search"]) + "%'")
  624. rows = db_get()
  625. if(rows):
  626. i = 0
  627. div = '<li>문서가 없습니다. <a href="/w/' + url_pas(request.form["search"]) + '">바로가기</a></li><br>'
  628. while(True):
  629. try:
  630. div = div + '<li><a href="/w/' + url_pas(rows[i]['title']) + '">' + rows[i]['title'] + '</a></li>'
  631. except:
  632. break
  633. i += 1
  634. else:
  635. return '<meta http-equiv="refresh" content="0;url=/w/' + url_pas(request.form["search"]) + '" />'
  636. return web_render('index.html', login = login_check(), logo = set_data['name'], data = div, title = '검색')
  637. @app.route('/goto', methods=['POST'])
  638. def goto():
  639. db_ex("select title from data where title = '" + db_pas(request.form["search"]) + "'")
  640. rows = db_get()
  641. if(rows):
  642. return '<meta http-equiv="refresh" content="0;url=/w/' + url_pas(request.form["search"]) + '" />'
  643. else:
  644. db_ex("select title from data where title like '%" + db_pas(request.form["search"]) + "%'")
  645. rows = db_get()
  646. if(rows):
  647. i = 0
  648. div = '<li>문서가 없습니다. <a href="/w/' + url_pas(request.form["search"]) + '">바로가기</a></li><br>'
  649. while(True):
  650. try:
  651. div = div + '<li><a href="/w/' + url_pas(rows[i]['title']) + '">' + rows[i]['title'] + '</a></li>'
  652. except:
  653. break
  654. i += 1
  655. else:
  656. return '<meta http-equiv="refresh" content="0;url=/w/' + url_pas(request.form["search"]) + '" />'
  657. return web_render('index.html', login = login_check(), logo = set_data['name'], data = div, title = '검색')
  658. @app.route('/w/<path:name>')
  659. @app.route('/w/<path:name>/from/<path:redirect>')
  660. def read_view(name = None, redirect = None):
  661. i = 0
  662. db_ex("select * from rd where title = '" + db_pas(name) + "' order by date asc")
  663. rows = db_get()
  664. while(True):
  665. try:
  666. a = rows[i]
  667. except:
  668. topic = ""
  669. break
  670. db_ex("select * from stop where title = '" + db_pas(rows[i]['title']) + "' and sub = '" + db_pas(rows[i]['sub']) + "' and close = 'O'")
  671. row = db_get()
  672. if(not row):
  673. topic = "open"
  674. break
  675. else:
  676. i += 1
  677. acl = ''
  678. m = re.search("^(.*)\/(.*)$", name)
  679. if(m):
  680. g = m.groups()
  681. uppage = g[0]
  682. style = ""
  683. else:
  684. uppage = ""
  685. style = "display:none;"
  686. if(admin_check() == 1):
  687. admin_memu = 'ACL'
  688. else:
  689. admin_memu = ''
  690. if(re.search("^분류:", name)):
  691. db_ex("select * from cat where title = '" + db_pas(name) + "' order by cat asc")
  692. rows = db_get()
  693. if(rows):
  694. div = ''
  695. i = 0
  696. while(True):
  697. try:
  698. a = rows[i]
  699. except:
  700. break
  701. db_ex("select * from data where title = '" + db_pas(rows[i]['cat']) + "'")
  702. row = db_get()
  703. if(row):
  704. aa = row[0]['data']
  705. aa = namumark('', aa)
  706. bb = re.search('<div style="width:100%;border: 1px solid #777;padding: 5px;margin-top: 1em;">분류:((?:(?!<\/div>).)*)<\/div>', aa)
  707. if(bb):
  708. cc = bb.groups()
  709. mm = re.search("^분류:(.*)", name)
  710. if(mm):
  711. ee = mm.groups()
  712. if(re.search("<a (class=\"not_thing\")? href=\"\/w\/" + url_pas(name) + "\">" + ee[0] + "<\/a>", cc[0])):
  713. div = div + '<li><a href="/w/' + url_pas(rows[i]['cat']) + '">' + rows[i]['cat'] + '</a></li>'
  714. i += 1
  715. else:
  716. db_ex("delete from cat where title = '" + db_pas(name) + "' and cat = '" + db_pas(rows[i]['cat']) + "'")
  717. db_com()
  718. i += 1
  719. else:
  720. db_ex("delete from cat where title = '" + db_pas(name) + "' and cat = '" + db_pas(rows[i]['cat']) + "'")
  721. db_com()
  722. i += 1
  723. else:
  724. db_ex("delete from cat where title = '" + db_pas(name) + "' and cat = '" + db_pas(rows[i]['cat']) + "'")
  725. db_com()
  726. i += 1
  727. else:
  728. db_ex("delete from cat where title = '" + db_pas(name) + "' and cat = '" + db_pas(rows[i]['cat']) + "'")
  729. db_com()
  730. i += 1
  731. div = '<h2>분류</h2>' + div
  732. else:
  733. div = ''
  734. else:
  735. div = ''
  736. db_ex("select * from data where title = '" + db_pas(name) + "'")
  737. rows = db_get()
  738. if(rows):
  739. if(rows[0]['acl'] == 'admin'):
  740. acl = '(관리자)'
  741. elif(rows[0]['acl'] == 'user'):
  742. acl = '(로그인)'
  743. else:
  744. if(not acl):
  745. acl = ''
  746. m = re.search("^사용자:(.*)", name)
  747. if(m):
  748. g = m.groups()
  749. db_ex("select * from user where id = '" + db_pas(g[0]) + "'")
  750. test = db_get()
  751. if(test):
  752. if(test[0]['acl'] == 'owner'):
  753. acl = '(소유자)'
  754. elif(test[0]['acl'] == 'admin'):
  755. acl = '(관리자)'
  756. db_ex("select * from ban where block = '" + db_pas(g[0]) + "'")
  757. user = db_get()
  758. if(user):
  759. elsedata = '{{{#!wiki style="border:2px solid red;padding:10px;"\r\n{{{+2 {{{#red 이 사용자는 차단 당했습니다.}}}}}}\r\n\r\n차단 해제 일 : ' + user[0]['end'] + '[br]사유 : ' + user[0]['why'] + '}}}[br]' + rows[0]['data']
  760. else:
  761. elsedata = rows[0]['data']
  762. else:
  763. elsedata = rows[0]['data']
  764. if(redirect):
  765. elsedata = re.sub("^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)", " * [[\g<in>]] 문서로 넘겨주기", elsedata)
  766. enddata = namumark(name, elsedata)
  767. m = re.search('<div id="toc">((?:(?!\/div>).)*)<\/div>', enddata)
  768. if(m):
  769. result = m.groups()
  770. left = result[0]
  771. else:
  772. left = ''
  773. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata + div, license = set_data['license'], tn = 1, acl = acl, left = left, uppage = uppage, style = style, topic = topic, redirect = redirect, admin = admin_memu)
  774. else:
  775. m = re.search("^사용자:(.*)", name)
  776. if(m):
  777. g = m.groups()
  778. db_ex("select * from ban where block = '" + db_pas(g[0]) + "'")
  779. user = db_get()
  780. if(user):
  781. elsedata = '{{{#!wiki style="border:2px solid red;padding:10px;"\r\n{{{+2 {{{#red 이 사용자는 차단 당했습니다.}}}}}}\r\n\r\n차단 해제 일 : ' + user[0]['end'] + '[br]사유 : ' + user[0]['why'] + '}}}[br]' + '문서 없음'
  782. else:
  783. elsedata = '문서 없음'
  784. else:
  785. elsedata = '문서 없음'
  786. if(redirect):
  787. elsedata = re.sub("^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)", " * [[\g<in>]] 문서로 넘겨주기", elsedata)
  788. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = namumark(name, elsedata) + div, license = set_data['license'], tn = 1, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, admin = admin_memu), 404
  789. @app.route('/w/<path:name>/r/<int:num>')
  790. def old_view(name = None, num = None):
  791. db_ex("select * from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(str(num)) + "'")
  792. row = db_get()
  793. if(row):
  794. if(owner_check() == 1):
  795. db_ex("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'")
  796. rows = db_get()
  797. if(rows):
  798. enddata = namumark(name, rows[0]['data'])
  799. m = re.search('<div id="toc">((?:(?!\/div>).)*)<\/div>', enddata)
  800. if(m):
  801. result = m.groups()
  802. left = result[0]
  803. else:
  804. left = ''
  805. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata, tn = 6, left = left, sub = '옛 문서')
  806. else:
  807. return redirct('/history/' + url_pas(name))
  808. else:
  809. return redirct('/error/3')
  810. else:
  811. db_ex("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'")
  812. rows = db_get()
  813. if(rows):
  814. enddata = namumark(name, rows[0]['data'])
  815. m = re.search('<div id="toc">((?:(?!\/div>).)*)<\/div>', enddata)
  816. if(m):
  817. result = m.groups()
  818. left = result[0]
  819. else:
  820. left = ''
  821. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata, tn = 6, left = left, sub = '옛 문서')
  822. else:
  823. return redirct('/history/' + url_pas(name))
  824. @app.route('/w/<path:name>/raw/<int:num>')
  825. def old_raw(name = None, num = None):
  826. db_ex("select * from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(str(num)) + "'")
  827. row = db_get()
  828. if(row):
  829. if(owner_check() == 1):
  830. db_ex("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'")
  831. rows = db_get()
  832. if(rows):
  833. enddata = re.sub('<', '&lt;', rows[0]['data'])
  834. enddata = re.sub('>', '&gt;', enddata)
  835. enddata = re.sub('"', '&quot;', enddata)
  836. enddata = '<pre>' + enddata + '</pre>'
  837. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata, sub = '옛 Raw')
  838. else:
  839. return redirct('/history/' + url_pas(name))
  840. else:
  841. return redirct('/error/3')
  842. else:
  843. db_ex("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'")
  844. rows = db_get()
  845. if(rows):
  846. enddata = re.sub('<', '&lt;', rows[0]['data'])
  847. enddata = re.sub('>', '&gt;', enddata)
  848. enddata = re.sub('"', '&quot;', enddata)
  849. enddata = '<pre>' + enddata + '</pre>'
  850. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata, sub = '옛 Raw')
  851. else:
  852. return redirct('/history/' + url_pas(name))
  853. @app.route('/raw/<path:name>')
  854. def raw_view(name = None):
  855. db_ex("select * from data where title = '" + db_pas(name) + "'")
  856. rows = db_get()
  857. if(rows):
  858. enddata = re.sub('<', '&lt;', rows[0]['data'])
  859. enddata = re.sub('>', '&gt;', enddata)
  860. enddata = re.sub('"', '&quot;', enddata)
  861. enddata = '<pre>' + enddata + '</pre>'
  862. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata, tn = 7, sub = 'Raw')
  863. else:
  864. return redirct('/w/' + url_pas(name))
  865. @app.route('/revert/<path:name>/r/<int:num>', methods=['POST', 'GET'])
  866. def revert(name = None, num = None):
  867. ip = ip_check()
  868. can = acl_check(ip, name)
  869. today = get_time()
  870. if(request.method == 'POST'):
  871. db_ex("select * from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(str(num)) + "'")
  872. row = db_get()
  873. if(row):
  874. if(owner_check() == 1):
  875. db_ex("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'")
  876. rows = db_get()
  877. if(rows):
  878. if(can == 1):
  879. return redirct('/ban')
  880. else:
  881. db_ex("select * from data where title = '" + db_pas(name) + "'")
  882. row = db_get()
  883. if(row):
  884. leng = leng_check(len(row[0]['data']), len(rows[0]['data']))
  885. db_ex("update data set data = '" + db_pas(rows[0]['data']) + "' where title = '" + db_pas(name) + "'")
  886. db_com()
  887. else:
  888. leng = '+' + str(len(rows[0]['data']))
  889. db_ex("insert into data (title, data, acl) value ('" + db_pas(name) + "', '" + db_pas(rows[0]['data']) + "', '')")
  890. db_com()
  891. history_plus(name, rows[0]['data'], today, ip, '문서를 ' + str(num) + '판으로 되돌렸습니다.', leng)
  892. return redirct('/w/' + url_pas(name))
  893. else:
  894. return redirct('/w/' + url_pas(name))
  895. else:
  896. return redirct('/error/3')
  897. else:
  898. db_ex("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'")
  899. rows = db_get()
  900. if(rows):
  901. if(can == 1):
  902. return redirct('/ban')
  903. else:
  904. db_ex("select * from data where title = '" + db_pas(name) + "'")
  905. row = db_get()
  906. if(row):
  907. leng = leng_check(len(row[0]['data']), len(rows[0]['data']))
  908. db_ex("update data set data = '" + db_pas(rows[0]['data']) + "' where title = '" + db_pas(name) + "'")
  909. db_com()
  910. else:
  911. leng = '+' + str(len(rows[0]['data']))
  912. db_ex("insert into data (title, data, acl) value ('" + db_pas(name) + "', '" + db_pas(rows[0]['data']) + "', '')")
  913. db_com()
  914. history_plus(name, rows[0]['data'], today, ip, '문서를 ' + str(num) + '판으로 되돌렸습니다.', leng)
  915. return redirct('/w/' + url_pas(name))
  916. else:
  917. return redirct('/w/' + url_pas(name))
  918. else:
  919. db_ex("select * from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(str(num)) + "'")
  920. row = db_get()
  921. if(row):
  922. if(owner_check() == 1):
  923. if(can == 1):
  924. return redirct('/ban')
  925. else:
  926. db_ex("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'")
  927. rows = db_get()
  928. if(rows):
  929. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), r = url_pas(str(num)), tn = 13, plus = '정말 되돌리시겠습니까?', sub = '되돌리기')
  930. else:
  931. return redirct('/w/' + url_pas(name))
  932. else:
  933. return redirct('/error/3')
  934. else:
  935. if(can == 1):
  936. return redirct('/ban')
  937. else:
  938. db_ex("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'")
  939. rows = db_get()
  940. if(rows):
  941. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), r = url_pas(str(num)), tn = 13, plus = '정말 되돌리시겠습니까?', sub = '되돌리기')
  942. else:
  943. return redirct('/w/' + url_pas(name))
  944. @app.route('/edit/<path:name>', methods=['POST', 'GET'])
  945. def edit(name = None):
  946. ip = ip_check()
  947. can = acl_check(ip, name)
  948. if(request.method == 'POST'):
  949. m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.form["send"])
  950. if(m):
  951. return redirct('/error/17')
  952. else:
  953. today = get_time()
  954. content = savemark(request.form["content"])
  955. db_ex("select * from data where title = '" + db_pas(name) + "'")
  956. rows = db_get()
  957. if(rows):
  958. if(rows[0]['data'] == content):
  959. return redirct('/error/18')
  960. else:
  961. if(can == 1):
  962. return redirct('/ban')
  963. else:
  964. leng = leng_check(len(rows[0]['data']), len(content))
  965. history_plus(name, content, today, ip, request.form["send"], leng)
  966. db_ex("update data set data = '" + db_pas(content) + "' where title = '" + db_pas(name) + "'")
  967. db_com()
  968. else:
  969. if(can == 1):
  970. return redirct('/ban')
  971. else:
  972. leng = '+' + str(len(content))
  973. history_plus(name, content, today, ip, request.form["send"], leng)
  974. db_ex("insert into data (title, data, acl) value ('" + db_pas(name) + "', '" + db_pas(content) + "', '')")
  975. db_com()
  976. include_check(name, content)
  977. return redirct('/w/' + url_pas(name))
  978. else:
  979. if(can == 1):
  980. return redirct('/ban')
  981. else:
  982. db_ex("select * from data where title = '" + db_pas(set_data["help"]) + "'")
  983. rows = db_get()
  984. if(rows):
  985. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * [[\g<in>]] 문서로 넘겨주기', rows[0]["data"])
  986. left = namumark(name, newdata)
  987. else:
  988. left = ''
  989. db_ex("select * from data where title = '" + db_pas(name) + "'")
  990. rows = db_get()
  991. if(rows):
  992. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = rows[0]['data'], tn = 2, left = left, sub = '편집')
  993. else:
  994. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = '', tn = 2, left = left, sub = '편집')
  995. @app.route('/edit/<path:name>/section/<int:num>', methods=['POST', 'GET'])
  996. def section_edit(name = None, num = None):
  997. ip = ip_check()
  998. can = acl_check(ip, name)
  999. if(request.method == 'POST'):
  1000. m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.form["send"])
  1001. if(m):
  1002. return redirct('/error/17')
  1003. else:
  1004. today = get_time()
  1005. content = savemark(request.form["content"])
  1006. db_ex("select * from data where title = '" + db_pas(name) + "'")
  1007. rows = db_get()
  1008. if(rows):
  1009. if(request.form["otent"] == content):
  1010. return redirct('/error/18')
  1011. else:
  1012. if(can == 1):
  1013. return redirct('/ban')
  1014. else:
  1015. leng = leng_check(len(request.form['otent']), len(content))
  1016. content = rows[0]['data'].replace(request.form['otent'], content)
  1017. history_plus(name, content, today, ip, request.form["send"], leng)
  1018. db_ex("update data set data = '" + db_pas(content) + "' where title = '" + db_pas(name) + "'")
  1019. db_com()
  1020. include_check(name, content)
  1021. return redirct('/w/' + url_pas(name))
  1022. else:
  1023. return redirct('/w/' + url_pas(name))
  1024. else:
  1025. if(can == 1):
  1026. return redirct('/ban')
  1027. else:
  1028. db_ex("select * from data where title = '" + db_pas(set_data["help"]) + "'")
  1029. rows = db_get()
  1030. if(rows):
  1031. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * [[\g<in>]] 문서로 넘겨주기', rows[0]["data"])
  1032. left = namumark(name, newdata)
  1033. else:
  1034. left = ''
  1035. db_ex("select * from data where title = '" + db_pas(name) + "'")
  1036. rows = db_get()
  1037. if(rows):
  1038. i = 0
  1039. j = 0
  1040. gdata = rows[0]['data'] + '\r\n'
  1041. while(True):
  1042. m = re.search("((?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n(?:(?:(?:(?!(?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n).)*)(?:\n)?)+)", gdata)
  1043. if(m):
  1044. if(i == num - 1):
  1045. g = m.groups()
  1046. gdata = re.sub("\r\n$", "", g[0])
  1047. break
  1048. else:
  1049. gdata = re.sub("((?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n(?:(?:(?:(?!(?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n).)*)(?:\n)?)+)", "", gdata, 1)
  1050. i += 1
  1051. else:
  1052. j = 1
  1053. break
  1054. if(j == 0):
  1055. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = gdata, tn = 2, left = left, section = 1, number = num, sub = '편집')
  1056. else:
  1057. return redirct('/w/' + url_pas(name))
  1058. else:
  1059. return redirct('/w/' + url_pas(name))
  1060. @app.route('/preview/<path:name>', methods=['POST'])
  1061. def preview(name = None):
  1062. ip = ip_check()
  1063. can = acl_check(ip, name)
  1064. if(can == 1):
  1065. return redirct('/ban')
  1066. else:
  1067. newdata = request.form["content"]
  1068. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * [[\g<in>]] 문서로 넘겨주기', newdata)
  1069. enddata = namumark(name, newdata)
  1070. db_ex("select * from data where title = '" + db_pas(set_data["help"]) + "'")
  1071. rows = db_get()
  1072. if(rows):
  1073. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * [[\g<in>]] 문서로 넘겨주기', rows[0]["data"])
  1074. left = namumark(name, newdata)
  1075. else:
  1076. left = ''
  1077. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = request.form["content"], tn = 2, preview = 1, enddata = enddata, left = left, sub = '미리보기')
  1078. @app.route('/preview/<path:name>/section/<int:num>', methods=['POST'])
  1079. def section_preview(name = None, num = None):
  1080. ip = ip_check()
  1081. can = acl_check(ip, name)
  1082. if(can == 1):
  1083. return redirct('/ban')
  1084. else:
  1085. newdata = request.form["content"]
  1086. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * [[\g<in>]] 문서로 넘겨주기', newdata)
  1087. enddata = namumark(name, newdata)
  1088. db_ex("select * from data where title = '" + db_pas(set_data["help"]) + "'")
  1089. rows = db_get()
  1090. if(rows):
  1091. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * [[\g<in>]] 문서로 넘겨주기', rows[0]["data"])
  1092. left = namumark(name, newdata)
  1093. else:
  1094. left = ''
  1095. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = request.form["content"], tn = 2, preview = 1, enddata = enddata, left = left, section = 1, number = num, odata = request.form["otent"], sub = '미리보기')
  1096. @app.route('/delete/<path:name>', methods=['POST', 'GET'])
  1097. def delete(name = None):
  1098. ip = ip_check()
  1099. can = acl_check(ip, name)
  1100. if(request.method == 'POST'):
  1101. db_ex("select * from data where title = '" + db_pas(name) + "'")
  1102. rows = db_get()
  1103. if(rows):
  1104. if(can == 1):
  1105. return redirct('/ban')
  1106. else:
  1107. today = get_time()
  1108. leng = '-' + str(len(rows[0]['data']))
  1109. history_plus(name, '', today, ip, '문서를 삭제 했습니다.', leng)
  1110. db_ex("delete from data where title = '" + db_pas(name) + "'")
  1111. db_com()
  1112. return redirct('/w/' + url_pas(name))
  1113. else:
  1114. return redirct('/w/' + url_pas(name))
  1115. else:
  1116. db_ex("select * from data where title = '" + db_pas(name) + "'")
  1117. rows = db_get()
  1118. if(rows):
  1119. if(can == 1):
  1120. return redirct('/ban')
  1121. else:
  1122. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), tn = 8, plus = '정말 삭제 하시겠습니까?', sub = '삭제')
  1123. else:
  1124. return redirct('/w/' + url_pas(name))
  1125. @app.route('/move/<path:name>', methods=['POST', 'GET'])
  1126. def move(name = None):
  1127. ip = ip_check()
  1128. can = acl_check(ip, name)
  1129. today = get_time()
  1130. if(request.method == 'POST'):
  1131. db_ex("select * from data where title = '" + db_pas(name) + "'")
  1132. rows = db_get()
  1133. if(can == 1):
  1134. return redirct('/ban')
  1135. else:
  1136. leng = '0'
  1137. db_ex("select * from history where title = '" + db_pas(request.form["title"]) + "'")
  1138. row = db_get()
  1139. if(row):
  1140. return redirct('/error/19')
  1141. else:
  1142. history_plus(name, rows[0]['data'], today, ip, '<a href="/w/' + url_pas(name) + '">' + name + '</a> 문서를 <a href="/w/' + url_pas(request.form["title"]) + '">' + request.form["title"] + '</a> 문서로 이동 했습니다.', leng)
  1143. if(rows):
  1144. db_ex("update data set title = '" + db_pas(request.form["title"]) + "' where title = '" + db_pas(name) + "'")
  1145. db_ex("update history set title = '" + db_pas(request.form["title"]) + "' where title = '" + db_pas(name) + "'")
  1146. db_com()
  1147. return '<meta http-equiv="refresh" content="0;url=/w/' + url_pas(request.form["title"]) + '" />'
  1148. else:
  1149. if(can == 1):
  1150. return redirct('/ban')
  1151. else:
  1152. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), tn = 9, plus = '정말 이동 하시겠습니까?', sub = '이동')
  1153. @app.route('/other')
  1154. def other():
  1155. return web_render('index.html', login = login_check(), title = '기타 메뉴', logo = set_data['name'], data = '<h2 style="margin-top: 0px;">기록</h2><li><a href="/blocklog/n/1">사용자 차단 기록</a></li><li><a href="/userlog/n/1">사용자 가입 기록</a></li><li><a href="/manager/6">사용자 기록</a></li><h2>기타</h2><li><a href="/titleindex">모든 문서</a></li><li><a href="/acllist">ACL 문서 목록</a></li><li><a href="/upload">업로드</a></li><li><a href="/adminlist">관리자 목록</a></li><li><a href="/manager/1">관리자 메뉴</a></li><br>이 오픈나무의 버전은 <a href="https://github.com/2DU/openNAMU/blob/master/version.md">1.9.2</a> 입니다.')
  1156. @app.route('/manager/<int:num>', methods=['POST', 'GET'])
  1157. def manager(num = None):
  1158. if(num == 1):
  1159. return web_render('index.html', login = login_check(), title = '관리자 메뉴', logo = set_data['name'], data = '<h2 style="margin-top: 0px;">관리자 및 소유자</h2><li><a href="/manager/2">문서 ACL</a></li><li><a href="/manager/3">사용자 체크</a></li><li><a href="/manager/4">사용자 차단</a></li><h2>소유자</h2><li><a href="/backreset">모든 역링크 재 생성</a></li><li><a href="/manager/5">관리자 권한 주기</a></li><h2>기타</h2><li>이 메뉴에 없는 기능은 해당 문서의 역사나 토론에서 바로 사용 가능함</li>')
  1160. elif(num == 2):
  1161. if(request.method == 'POST'):
  1162. return '<meta http-equiv="refresh" content="0;url=/acl/' + url_pas(request.form["name"]) + '" />'
  1163. else:
  1164. return web_render('index.html', login = login_check(), title = 'ACL 이동', logo = set_data['name'], data = '<form id="usrform" method="POST" action="/manager/2"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button></form>')
  1165. elif(num == 3):
  1166. if(request.method == 'POST'):
  1167. return '<meta http-equiv="refresh" content="0;url=/check/' + url_pas(request.form["name"]) + '" />'
  1168. else:
  1169. return web_render('index.html', login = login_check(), title = '체크 이동', logo = set_data['name'], data = '<form id="usrform" method="POST" action="/manager/3"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button></form>')
  1170. elif(num == 4):
  1171. if(request.method == 'POST'):
  1172. return '<meta http-equiv="refresh" content="0;url=/ban/' + url_pas(request.form["name"]) + '" />'
  1173. else:
  1174. return web_render('index.html', login = login_check(), title = '차단 이동', logo = set_data['name'], data = '<form id="usrform" method="POST" action="/manager/4"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button><br><br><span>아이피 앞 두자리 (XXX.XXX) 입력하면 대역 차단</span></form>')
  1175. elif(num == 5):
  1176. if(request.method == 'POST'):
  1177. return '<meta http-equiv="refresh" content="0;url=/admin/' + url_pas(request.form["name"]) + '" />'
  1178. else:
  1179. return web_render('index.html', login = login_check(), title = '권한 이동', logo = set_data['name'], data = '<form id="usrform" method="POST" action="/manager/5"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button></form>')
  1180. elif(num == 6):
  1181. if(request.method == 'POST'):
  1182. return '<meta http-equiv="refresh" content="0;url=/record/' + url_pas(request.form["name"]) + '/n/1" />'
  1183. else:
  1184. return web_render('index.html', login = login_check(), title = '기록 이동', logo = set_data['name'], data = '<form id="usrform" method="POST" action="/manager/6"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button></form>')
  1185. else:
  1186. return redirct('/')
  1187. @app.route('/titleindex')
  1188. def title_index():
  1189. i = 0
  1190. data = '<div>'
  1191. db_ex("select title from data order by title asc")
  1192. title_list = db_get()
  1193. if(title_list):
  1194. while(True):
  1195. try:
  1196. a = title_list[i]
  1197. except:
  1198. break
  1199. data = data + '<li>' + str(i + 1) + '. <a href="/w/' + url_pas(title_list[i]['title']) + '">' + title_list[i]['title'] + '</a></li>'
  1200. i += 1
  1201. data = data + '</div>'
  1202. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = data + '<br><span>이 위키에는 총 ' + str(i) + '개의 문서가 있습니다.</span>', tn = 4, title = '모든 문서')
  1203. else:
  1204. return web_render('index.html', login = login_check(), logo = set_data['name'], rows = '', tn = 4, title = '모든 문서')
  1205. @app.route('/topic/<path:name>', methods=['POST', 'GET'])
  1206. def topic_list(name = None):
  1207. if(request.method == 'POST'):
  1208. return '<meta http-equiv="refresh" content="0;url=/topic/' + url_pas(name) + '/sub/' + url_pas(request.form["topic"]) + '" />'
  1209. else:
  1210. div = '<div>'
  1211. i = 0
  1212. j = 1
  1213. db_ex("select * from rd where title = '" + db_pas(name) + "' order by date asc")
  1214. rows = db_get()
  1215. while(True):
  1216. try:
  1217. a = rows[i]
  1218. except:
  1219. div = div + '</div>'
  1220. break
  1221. db_ex("select * from topic where title = '" + db_pas(rows[i]['title']) + "' and sub = '" + db_pas(rows[i]['sub']) + "' and id = '1' order by sub asc")
  1222. aa = db_get()
  1223. indata = namumark(name, aa[0]['data'])
  1224. if(aa[0]['block'] == 'O'):
  1225. indata = '블라인드 되었습니다.'
  1226. block = 'style="background: gainsboro;"'
  1227. else:
  1228. block = ''
  1229. ip = ip_pas(aa[0]['ip'])
  1230. db_ex("select * from stop where title = '" + db_pas(rows[i]['title']) + "' and sub = '" + db_pas(rows[i]['sub']) + "' and close = 'O'")
  1231. row = db_get()
  1232. if(not row):
  1233. div = div + '<h2><a href="/topic/' + url_pas(rows[i]['title']) + '/sub/' + url_pas(rows[i]['sub']) + '">' + str(j) + '. ' + rows[i]['sub'] + '</a></h2><table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="1">#1</a> ' + ip + ' <span style="float:right;">' + aa[0]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  1234. j += 1
  1235. i += 1
  1236. return web_render('index.html', login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], plus = div, tn = 10, list = 1, sub = '토론 목록')
  1237. @app.route('/topic/<path:name>/close')
  1238. def close_topic_list(name = None):
  1239. div = '<div>'
  1240. i = 0
  1241. db_ex("select * from stop where title = '" + db_pas(name) + "' and close = 'O' order by sub asc")
  1242. rows = db_get()
  1243. while(True):
  1244. try:
  1245. a = rows[i]
  1246. except:
  1247. div = div + '</div>'
  1248. break
  1249. db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(rows[i]['sub']) + "' and id = '1'")
  1250. row = db_get()
  1251. if(row):
  1252. indata = namumark(name, row[0]['data'])
  1253. if(row[0]['block'] == 'O'):
  1254. indata = '블라인드 되었습니다.'
  1255. block = 'style="background: gainsboro;"'
  1256. else:
  1257. block = ''
  1258. ip = ip_pas(row[0]['ip'])
  1259. div = div + '<h2><a href="/topic/' + url_pas(name) + '/sub/' + url_pas(rows[i]['sub']) + '">' + str((i + 1)) + '. ' + rows[i]['sub'] + '</a></h2><table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="1">#1</a> ' + ip + ' <span style="float:right;">' + row[0]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  1260. i += 1
  1261. return web_render('index.html', login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], plus = div, tn = 10, sub = '닫힌 토론')
  1262. @app.route('/topic/<path:name>/agree')
  1263. def agree_topic_list(name = None):
  1264. div = '<div>'
  1265. i = 0
  1266. db_ex("select * from agreedis where title = '" + db_pas(name) + "' order by sub asc")
  1267. agree_list = db_get()
  1268. while(True):
  1269. try:
  1270. a = agree_list[i]
  1271. except:
  1272. div = div + '</div>'
  1273. break
  1274. db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(agree_list[i]['sub']) + "' and id = '1'")
  1275. data = db_get()
  1276. if(data):
  1277. indata = namumark(name, data[0]['data'])
  1278. if(data[0]['block'] == 'O'):
  1279. indata = '블라인드 되었습니다.'
  1280. block = 'style="background: gainsboro;"'
  1281. else:
  1282. block = ''
  1283. ip = ip_pas(data[0]['ip'])
  1284. div = div + '<h2><a href="/topic/' + url_pas(name) + '/sub/' + url_pas(data[i]['sub']) + '">' + str(i + 1) + '. ' + data[i]['sub'] + '</a></h2><table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="1">#1</a> ' + 아이디 + ' <span style="float:right;">' + data[0]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  1285. i += 1
  1286. return web_render('index.html', login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], plus = div, tn = 10, sub = '합의된 토론')
  1287. @app.route('/topic/<path:name>/sub/<path:sub>', methods=['POST', 'GET'])
  1288. def topic(name = None, sub = None):
  1289. ip = ip_check()
  1290. ban = topic_check(ip, name, sub)
  1291. admin = admin_check()
  1292. if(request.method == 'POST'):
  1293. db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
  1294. rows = db_get()
  1295. if(rows):
  1296. number = int(rows[0]['id']) + 1
  1297. else:
  1298. number = 1
  1299. if(ban == 1 and not admin == 1):
  1300. return redirct('/ban')
  1301. else:
  1302. db_ex("select * from user where id = '" + db_pas(ip) + "'")
  1303. rows = db_get()
  1304. if(rows):
  1305. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  1306. ip = ip + ' - Admin'
  1307. today = get_time()
  1308. rd_plus(name, sub, today)
  1309. aa = request.form["content"]
  1310. aa = re.sub("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", "[br]", aa)
  1311. aa = savemark(aa)
  1312. db_ex("insert into topic (id, title, sub, data, date, ip, block) value ('" + str(number) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', '" + db_pas(aa) + "', '" + today + "', '" + ip + "', '')")
  1313. db_com()
  1314. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1315. else:
  1316. style = ''
  1317. db_ex("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = 'O'")
  1318. close = db_get()
  1319. db_ex("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = ''")
  1320. stop = db_get()
  1321. if(admin == 1):
  1322. div = '<div>'
  1323. if(close):
  1324. div = div + '<a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/close">(토론 열기)</a> '
  1325. else:
  1326. div = div + '<a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/close">(토론 닫기)</a> '
  1327. if(stop):
  1328. div = div + '<a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/stop">(토론 재개)</a> '
  1329. else:
  1330. div = div + '<a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/stop">(토론 정지)</a> '
  1331. db_ex("select * from agreedis where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
  1332. agree = db_get()
  1333. if(agree):
  1334. div = div + '<a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/agree">(합의 취소)</a>'
  1335. else:
  1336. div = div + '<a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/agree">(합의 완료)</a>'
  1337. div = div + '<br><br>'
  1338. else:
  1339. div = '<div>'
  1340. if(stop or close):
  1341. if(not admin == 1):
  1342. style = 'display:none;'
  1343. db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 asc")
  1344. rows = db_get()
  1345. db_ex("select * from distop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 asc")
  1346. top = db_get()
  1347. i = 0
  1348. if(top):
  1349. while(True):
  1350. try:
  1351. a = top[i]
  1352. except:
  1353. break
  1354. num = int(top[i]['id']) - 1
  1355. if(i == 0):
  1356. start = rows[num]['ip']
  1357. top_data = namumark('', rows[num]['data'])
  1358. top_data = re.sub("(?P<in>#(?:[0-9]*))", '<a href="\g<in>">\g<in></a>', top_data)
  1359. ip = ip_pas(rows[num]['ip'])
  1360. div = div + '<table id="toron"><tbody><tr><td id="toroncolorred"><a href="#' + top[i]['id'] + '" id="' + top[i]['id'] + '-nt">#' + top[i]['id'] + '</a> ' + ip + ' <span style="float:right;">' + rows[num]['date'] + '</span></td></tr><tr><td>' + top_data + '</td></tr></tbody></table><br>'
  1361. i = i + 1
  1362. i = 0
  1363. while(True):
  1364. try:
  1365. a = rows[i]
  1366. except:
  1367. div = div + '</div>'
  1368. break
  1369. if(i == 0):
  1370. start = rows[i]['ip']
  1371. indata = namumark('', rows[i]['data'])
  1372. indata = re.sub("(?P<in>#(?:[0-9]*))", '<a href="\g<in>">\g<in></a>', indata)
  1373. if(rows[i]['block'] == 'O'):
  1374. indata = '블라인드 되었습니다.'
  1375. block = 'style="background: gainsboro;"'
  1376. else:
  1377. block = ''
  1378. m = re.search("^([^-]*)\s\-\s(Close|Reopen|Stop|Restart|Agreement|Settlement)$", rows[i]['ip'])
  1379. if(m):
  1380. ban = ""
  1381. else:
  1382. if(admin == 1):
  1383. if(rows[i]['block'] == 'O'):
  1384. isblock = ' <a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/b/' + str(i + 1) + '">(해제)</a>'
  1385. else:
  1386. isblock = ' <a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/b/' + str(i + 1) + '">(블라인드)</a>'
  1387. db_ex("select * from distop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + db_pas(str(i + 1)) + "'")
  1388. row = db_get()
  1389. if(row):
  1390. isblock = isblock + ' <a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/notice/' + str(i + 1) + '">(해제)</a>'
  1391. else:
  1392. isblock = isblock + ' <a href="/topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '/notice/' + str(i + 1) + '">(공지)</a>'
  1393. n = re.search("\- (?:Admin)$", rows[i]['ip'])
  1394. if(n):
  1395. ban = isblock
  1396. else:
  1397. db_ex("select * from ban where block = '" + db_pas(rows[i]['ip']) + "'")
  1398. row = db_get()
  1399. if(row):
  1400. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(해제)</a>' + isblock
  1401. else:
  1402. ban = ' <a href="/ban/' + url_pas(rows[i]['ip']) + '">(차단)</a>' + isblock
  1403. else:
  1404. ban = ""
  1405. ip = ip_pas(rows[i]['ip'])
  1406. if(rows[i]['ip'] == start):
  1407. j = i + 1
  1408. div = div + '<table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="' + str(j) + '">#' + str(j) + '</a> ' + ip + ban + ' <span style="float:right;">' + rows[i]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  1409. else:
  1410. j = i + 1
  1411. div = div + '<table id="toron"><tbody><tr><td id="toroncolor"><a href="javascript:void(0);" id="' + str(j) + '">#' + str(j) + '</a> ' + ip + ban + ' <span style="float:right;">' + rows[i]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  1412. i += 1
  1413. return web_render('index.html', login = login_check(), title = name, page = url_pas(name), suburl = url_pas(sub), toron = sub, logo = set_data['name'], rows = div, tn = 11, ban = ban, style = style, sub = '토론')
  1414. @app.route('/topic/<path:name>/sub/<path:sub>/b/<int:num>')
  1415. def topic_block(name = None, sub = None, num = None):
  1416. if(admin_check() == 1):
  1417. db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
  1418. block = db_get()
  1419. if(block):
  1420. if(block[0]['block'] == 'O'):
  1421. db_ex("update topic set block = '' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
  1422. else:
  1423. db_ex("update topic set block = 'O' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
  1424. db_com()
  1425. rd_plus(name, sub, get_time())
  1426. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1427. else:
  1428. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1429. else:
  1430. return redirct('/error/3')
  1431. @app.route('/topic/<path:name>/sub/<path:sub>/notice/<int:num>')
  1432. def topic_top(name = None, sub = None, num = None):
  1433. if(admin_check() == 1):
  1434. db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
  1435. topic_data = db_get()
  1436. if(topic_data):
  1437. db_ex("select * from distop where id = '" + str(num) + "' and title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
  1438. top_data = db_get()
  1439. if(top_data):
  1440. db_ex("delete from distop where id = '" + str(num) + "' and title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
  1441. else:
  1442. db_ex("insert into distop (id, title, sub) value ('" + db_pas(str(num)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "')")
  1443. db_com()
  1444. rd_plus(name, sub, get_time())
  1445. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1446. else:
  1447. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1448. else:
  1449. return redirct('/error/3')
  1450. @app.route('/topic/<path:name>/sub/<path:sub>/stop')
  1451. def topic_stop(name = None, sub = None):
  1452. if(admin_check() == 1):
  1453. ip = ip_check()
  1454. db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' limit 1")
  1455. topic_check = db_get()
  1456. if(topic_check):
  1457. time = get_time()
  1458. db_ex("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = ''")
  1459. stop = db_get()
  1460. if(stop):
  1461. db_ex("insert into topic (id, title, sub, data, date, ip, block) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Restart', '" + db_pas(time) + "', '" + db_pas(ip) + " - Restart', '')")
  1462. db_ex("delete from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = ''")
  1463. else:
  1464. db_ex("insert into topic (id, title, sub, data, date, ip, block) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Stop', '" + db_pas(time) + "', '" + db_pas(ip) + " - Stop', '')")
  1465. db_ex("insert into stop (title, sub, close) value ('" + db_pas(name) + "', '" + db_pas(sub) + "', '')")
  1466. db_com()
  1467. rd_plus(name, sub, time)
  1468. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1469. else:
  1470. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1471. else:
  1472. return redirct('/error/3')
  1473. @app.route('/topic/<path:name>/sub/<path:sub>/close')
  1474. def topic_close(name = None, sub = None):
  1475. if(admin_check() == 1):
  1476. ip = ip_check()
  1477. db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
  1478. topic_check = db_get()
  1479. if(topic_check):
  1480. time = get_time()
  1481. db_ex("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = 'O'")
  1482. close = db_get()
  1483. if(close):
  1484. db_ex("insert into topic (id, title, sub, data, date, ip, block) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Reopen', '" + db_pas(time) + "', '" + db_pas(ip) + " - Reopen', '')")
  1485. db_ex("delete from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = 'O'")
  1486. else:
  1487. db_ex("insert into topic (id, title, sub, data, date, ip, block) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Close', '" + db_pas(time) + "', '" + db_pas(ip) + " - Close', '')")
  1488. db_ex("insert into stop (title, sub, close) value ('" + db_pas(name) + "', '" + db_pas(sub) + "', 'O')")
  1489. db_com()
  1490. rd_plus(name, sub, time)
  1491. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1492. else:
  1493. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1494. else:
  1495. return redirct('/error/3')
  1496. @app.route('/topic/<path:name>/sub/<path:sub>/agree')
  1497. def topic_agree(name = None, sub = None):
  1498. if(admin_check() == 1):
  1499. ip = ip_check()
  1500. db_ex("select id from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
  1501. topic_check = db_get()
  1502. if(topic_check):
  1503. time = get_time()
  1504. db_ex("select * from agreedis where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
  1505. agree = db_get()
  1506. if(agree):
  1507. db_ex("insert into topic (id, title, sub, data, date, ip, block) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Settlement', '" + db_pas(time) + "', '" + db_pas(ip) + " - Settlement', '')")
  1508. db_ex("delete from agreedis where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
  1509. else:
  1510. db_ex("insert into topic (id, title, sub, data, date, ip, block) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Agreement', '" + db_pas(time) + "', '" + db_pas(ip) + " - Agreement', '')")
  1511. db_ex("insert into agreedis (title, sub) value ('" + db_pas(name) + "', '" + db_pas(sub) + "')")
  1512. db_com()
  1513. rd_plus(name, sub, time)
  1514. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1515. else:
  1516. return redirct('/topic/' + url_pas(name) + '/sub/' + url_pas(sub))
  1517. else:
  1518. return redirct('/error/3')
  1519. @app.route('/login', methods=['POST', 'GET'])
  1520. def login():
  1521. ip = ip_check()
  1522. ban = ban_check(ip)
  1523. if(request.method == 'POST'):
  1524. if(ban == 1):
  1525. return redirct('/ban')
  1526. else:
  1527. db_ex("select * from user where id = '" + db_pas(request.form["id"]) + "'")
  1528. user = db_get()
  1529. if(user):
  1530. if(session.get('Now') == True):
  1531. return redirct('/error/11')
  1532. elif(bcrypt.checkpw(bytes(request.form["pw"], 'utf-8'), bytes(user[0]['pw'], 'utf-8'))):
  1533. session['Now'] = True
  1534. session['DREAMER'] = request.form["id"]
  1535. db_ex("insert into login (user, ip, today) value ('" + db_pas(request.form["id"]) + "', '" + db_pas(ip) + "', '" + db_pas(get_time()) + "')")
  1536. db_com()
  1537. return redirct('/user')
  1538. else:
  1539. return redirct('/error/13')
  1540. else:
  1541. return redirct('/error/12')
  1542. else:
  1543. if(ban == 1):
  1544. return redirct('/ban')
  1545. else:
  1546. if(session.get('Now') == True):
  1547. return redirct('/error/11')
  1548. else:
  1549. return web_render('index.html', login = login_check(), title = '로그인', enter = '로그인', logo = set_data['name'], tn = 15)
  1550. @app.route('/change', methods=['POST', 'GET'])
  1551. def change_password():
  1552. ip = ip_check()
  1553. ban = ban_check(ip)
  1554. if(request.method == 'POST'):
  1555. if(request.form["pw2"] == request.form["pw3"]):
  1556. if(ban == 1):
  1557. return redirct('/ban')
  1558. else:
  1559. db_ex("select * from user where id = '" + db_pas(request.form["id"]) + "'")
  1560. user = db_get()
  1561. if(user):
  1562. if(session.get('Now') == True):
  1563. session['Now'] = False
  1564. session.pop('DREAMER', None)
  1565. return redirct('/change')
  1566. elif(bcrypt.checkpw(bytes(request.form["pw"], 'utf-8'), bytes(user[0]['pw'], 'utf-8'))):
  1567. hashed = bcrypt.hashpw(bytes(request.form["pw2"], 'utf-8'), bcrypt.gensalt())
  1568. db_ex("update user set pw = '" + db_pas(hashed.decode()) + "' where id = '" + db_pas(request.form["id"]) + "'")
  1569. db_com()
  1570. return redirct('/login')
  1571. else:
  1572. return redirct('/error/10')
  1573. else:
  1574. return redirct('/error/9')
  1575. else:
  1576. return redirct('/error/20')
  1577. else:
  1578. if(ban == 1):
  1579. return redirct('/ban')
  1580. else:
  1581. if(session.get('Now') == True):
  1582. session['Now'] = False
  1583. session.pop('DREAMER', None)
  1584. return redirct('/change')
  1585. else:
  1586. return web_render('index.html', login = login_check(), title = '비밀번호 변경', enter = '변경', logo = set_data['name'], tn = 15)
  1587. @app.route('/check/<name>')
  1588. def user_check(name = None, sub = None):
  1589. db_ex("select * from user where id = '" + db_pas(name) + "'")
  1590. user = db_get()
  1591. if(user and user[0]['acl'] == 'owner' or user and user[0]['acl'] == 'admin'):
  1592. return redirct('/error/4')
  1593. else:
  1594. if(admin_check() == 1):
  1595. m = re.search('(?:[0-9](?:[0-9][0-9])?\.[0-9](?:[0-9][0-9])?\.[0-9](?:[0-9][0-9])?\.[0-9](?:[0-9][0-9])?)', name)
  1596. if(m):
  1597. db_ex("select * from login where ip = '" + db_pas(name) + "' order by today desc")
  1598. row = db_get()
  1599. if(row):
  1600. i = 0
  1601. c = ''
  1602. while(True):
  1603. try:
  1604. c = c + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;">' + row[i]['user'] + '</td><td style="text-align: center;width:33.33%;">' + row[i]['ip'] + '</td><td style="text-align: center;width:33.33%;">' + row[i]['today'] + '</td></tr></tbody></table>'
  1605. except:
  1606. break
  1607. i += 1
  1608. return web_render('index.html', login = login_check(), title = '다중 검사', logo = set_data['name'], tn = 22, rows = c)
  1609. else:
  1610. return web_render('index.html', login = login_check(), title = '다중 검사', logo = set_data['name'], tn = 22, rows = '')
  1611. else:
  1612. db_ex("select * from login where user = '" + db_pas(name) + "' order by today desc")
  1613. row = db_get()
  1614. if(row):
  1615. i = 0
  1616. c = ''
  1617. while(True):
  1618. try:
  1619. c = c + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;">' + row[i]['user'] + '</td><td style="text-align: center;width:33.33%;">' + row[i]['ip'] + '</td><td style="text-align: center;width:33.33%;">' + row[i]['today'] + '</td></tr></tbody></table>'
  1620. except:
  1621. break
  1622. i += 1
  1623. return web_render('index.html', login = login_check(), title = '다중 검사', logo = set_data['name'], tn = 22, rows = c)
  1624. else:
  1625. return web_render('index.html', login = login_check(), title = '다중 검사', logo = set_data['name'], tn = 22, rows = '')
  1626. else:
  1627. return redirct('/error/3')
  1628. @app.route('/register', methods=['POST', 'GET'])
  1629. def register():
  1630. ip = ip_check()
  1631. ban = ban_check(ip)
  1632. if(request.method == 'POST'):
  1633. if(request.form["pw"] == request.form["pw2"]):
  1634. if(ban == 1):
  1635. return redirct('/ban')
  1636. else:
  1637. m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.form["id"])
  1638. if(m):
  1639. return redirct('/error/8')
  1640. else:
  1641. if(len(request.form["id"]) > 20):
  1642. return redirct('/error/7')
  1643. else:
  1644. db_ex("select * from user where id = '" + db_pas(request.form["id"]) + "'")
  1645. rows = db_get()
  1646. if(rows):
  1647. return redirct('/error/6')
  1648. else:
  1649. hashed = bcrypt.hashpw(bytes(request.form["pw"], 'utf-8'), bcrypt.gensalt())
  1650. if(request.form["id"] == set_data['owner']):
  1651. db_ex("insert into user (id, pw, acl) value ('" + db_pas(request.form["id"]) + "', '" + db_pas(hashed.decode()) + "', 'owner')")
  1652. else:
  1653. db_ex("insert into user (id, pw, acl) value ('" + db_pas(request.form["id"]) + "', '" + db_pas(hashed.decode()) + "', 'user')")
  1654. db_com()
  1655. return redirct('/login')
  1656. else:
  1657. return redirct('/error/20')
  1658. else:
  1659. if(ban == 1):
  1660. return redirct('/ban')
  1661. else:
  1662. return web_render('index.html', login = login_check(), title = '회원가입', enter = '회원가입', logo = set_data['name'], tn = 15)
  1663. @app.route('/logout')
  1664. def logout():
  1665. session['Now'] = False
  1666. session.pop('DREAMER', None)
  1667. return redirct('/user')
  1668. @app.route('/ban/<name>', methods=['POST', 'GET'])
  1669. def user_ban(name = None):
  1670. db_ex("select * from user where id = '" + db_pas(name) + "'")
  1671. user = db_get()
  1672. if(user and user[0]['acl'] == 'owner' or user and user[0]['acl'] == 'admin'):
  1673. return redirct('/error/4')
  1674. else:
  1675. if(request.method == 'POST'):
  1676. if(admin_check() == 1):
  1677. ip = ip_check()
  1678. if(not re.search("[0-9]{4}-[0-9]{2}-[0-9]{2}", request.form["end"])):
  1679. end = ''
  1680. else:
  1681. end = request.form["end"]
  1682. db_ex("select * from ban where block = '" + db_pas(name) + "'")
  1683. row = db_get()
  1684. if(row):
  1685. rb_plus(name, '해제', 시간(), ip, '')
  1686. db_ex("delete from ban where block = '" + db_pas(name) + "'")
  1687. else:
  1688. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))$", name)
  1689. if(b):
  1690. rb_plus(name, end, 시간(), ip, request.form["why"])
  1691. db_ex("insert into ban (block, end, why, band) value ('" + db_pas(name) + "', '" + db_pas(end) + "', '" + db_pas(request.form["why"]) + "', 'O')")
  1692. else:
  1693. rb_plus(name, end, 시간(), ip, request.form["why"])
  1694. db_ex("insert into ban (block, end, why, band) value ('" + db_pas(name) + "', '" + db_pas(end) + "', '" + db_pas(request.form["why"]) + "', '')")
  1695. db_com()
  1696. return redirct('/w/' + url_pas(data['frontpage']))
  1697. else:
  1698. return redirct('/error/3')
  1699. else:
  1700. if(admin_check() == 1):
  1701. db_ex("select * from ban where block = '" + db_pas(name) + "'")
  1702. row = db_get()
  1703. if(row):
  1704. now = '차단 해제'
  1705. else:
  1706. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))$", name)
  1707. if(b):
  1708. now = '대역 차단'
  1709. else:
  1710. now = '차단'
  1711. return web_render('index.html', login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], tn = 16, now = now, today = get_time(), sub = '차단')
  1712. else:
  1713. return redirct('/error/3')
  1714. @app.route('/acl/<path:name>', methods=['POST', 'GET'])
  1715. def acl(name = None):
  1716. if(request.method == 'POST'):
  1717. if(admin_check() == 1):
  1718. db_ex("select acl from data where title = '" + db_pas(name) + "'")
  1719. row = db_get()
  1720. if(row):
  1721. if(request.form["select"] == 'admin'):
  1722. db_ex("update data set acl = 'admin' where title = '" + db_pas(name) + "'")
  1723. elif(request.form["select"] == 'user'):
  1724. db_ex("update data set acl = 'user' where title = '" + db_pas(name) + "'")
  1725. else:
  1726. db_ex("update data set acl = '' where title = '" + db_pas(name) + "'")
  1727. db_com()
  1728. return redirct('/w/' + url_pas(name))
  1729. else:
  1730. return redirct('/error/3')
  1731. else:
  1732. if(admin_check() == 1):
  1733. db_ex("select acl from data where title = '" + db_pas(name) + "'")
  1734. row = db_get()
  1735. if(row):
  1736. if(row[0]['acl'] == 'admin'):
  1737. now = '관리자만'
  1738. elif(row[0]['acl'] == 'user'):
  1739. now = '로그인 이상'
  1740. else:
  1741. now = '일반'
  1742. return web_render('index.html', login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], tn = 19, now = '현재 ACL 상태는 ' + now, sub = 'ACL')
  1743. else:
  1744. return redirct('/w/' + url_pas(name))
  1745. else:
  1746. return redirct('/error/3')
  1747. @app.route('/admin/<name>', methods=['POST', 'GET'])
  1748. def user_admin(name = None):
  1749. if(request.method == 'POST'):
  1750. if(owner_check() == 1):
  1751. db_ex("select * from user where id = '" + db_pas(name) + "'")
  1752. user = db_get()
  1753. if(user):
  1754. if(user[0]['acl'] == 'admin' or user[0]['acl'] == 'owner'):
  1755. db_ex("update user set acl = 'user' where id = '" + db_pas(name) + "'")
  1756. else:
  1757. db_ex("update user set acl = '" + db_pas(request.form["select"]) + "' where id = '" + db_pas(name) + "'")
  1758. db_com()
  1759. return redirct('/w/' + url_pas(data['frontpage']))
  1760. else:
  1761. return redirct('/error/5')
  1762. else:
  1763. return redirct('/error/3')
  1764. else:
  1765. if(owner_check() == 1):
  1766. db_ex("select * from user where id = '" + db_pas(name) + "'")
  1767. user = db_get()
  1768. if(user):
  1769. if(user[0]['acl'] == 'admin' or user[0]['acl'] == 'owner'):
  1770. now = '권한 해제'
  1771. else:
  1772. now = '권한 부여'
  1773. return web_render('index.html', login = login_check(), title = name, page = url_pas(name), logo = data['name'], tn = 18, now = now, sub = '권한 부여')
  1774. else:
  1775. return redirct('/error/5')
  1776. else:
  1777. return redirct('/error/3')
  1778. @app.route('/ban')
  1779. def are_you_ban():
  1780. ip = ip_check()
  1781. if(ban_check(ip) == 1):
  1782. db_ex("select * from ban where block = '" + db_pas(ip) + "'")
  1783. rows = db_get()
  1784. if(rows):
  1785. if(rows[0]['end']):
  1786. end = rows[0]['end'] + ' 까지 차단 상태 입니다. / 사유 : ' + rows[0]['why']
  1787. now = get_time()
  1788. now = re.sub(':', '', now)
  1789. now = re.sub('\-', '', now)
  1790. now = re.sub(' ', '', now)
  1791. now = int(now)
  1792. day = rows[0]['end']
  1793. day = re.sub('\-', '', day)
  1794. if(now >= int(day + '000000')):
  1795. db_ex("delete from ban where block = '" + db_pas(ip) + "'")
  1796. db_com()
  1797. end = '차단이 풀렸습니다. 다시 시도 해 보세요.'
  1798. else:
  1799. end = '영구 차단 상태 입니다. / 사유 : ' + rows[0]['why']
  1800. else:
  1801. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip)
  1802. if(b):
  1803. results = b.groups()
  1804. db_ex("select * from ban where block = '" + db_pas(results[0]) + "' and band = 'O'")
  1805. row = db_get()
  1806. if(row):
  1807. if(row[0]['end']):
  1808. end = row[0]['end'] + ' 까지 차단 상태 입니다. / 사유 : ' + rows[0]['why']
  1809. now = get_time()
  1810. now = re.sub(':', '', now)
  1811. now = re.sub('\-', '', now)
  1812. now = re.sub(' ', '', now)
  1813. now = int(now)
  1814. day = row[0]['end']
  1815. day = re.sub('\-', '', day)
  1816. if(now >= int(day + '000000')):
  1817. db_ex("delete from ban where block = '" + db_pas(results[0]) + "' and band = 'O'")
  1818. db_com()
  1819. end = '차단이 풀렸습니다. 다시 시도 해 보세요.'
  1820. else:
  1821. end = '영구 차단 상태 입니다. / 사유 : ' + row[0]['why']
  1822. else:
  1823. end = '권한이 맞지 않는 상태 입니다.'
  1824. return web_render('index.html', login = login_check(), title = '권한 오류', logo = set_data['name'], data = end), 401
  1825. @app.route('/w/<path:name>/r/<int:a>/diff/<int:b>')
  1826. def diff_data(name = None, a = None, b = None):
  1827. db_ex("select * from history where id = '" + db_pas(str(a)) + "' and title = '" + db_pas(name) + "'")
  1828. a_raw_data = db_get()
  1829. if(a_raw_data):
  1830. db_ex("select * from history where id = '" + db_pas(str(b)) + "' and title = '" + db_pas(name) + "'")
  1831. b_raw_data = db_get()
  1832. if(b_raw_data):
  1833. a_data = re.sub('<', '&lt;', a_raw_data[0]['data'])
  1834. a_data = re.sub('>', '&gt;', a_data)
  1835. a_data = re.sub('"', '&quot;', a_data)
  1836. b_data = re.sub('<', '&lt;', b_raw_data[0]['data'])
  1837. b_data = re.sub('>', '&gt;', b_data)
  1838. b_data = re.sub('"', '&quot;', b_data)
  1839. diff_data = difflib.SequenceMatcher(None, a_data, b_data)
  1840. result = diff(diff_data)
  1841. result = '<pre>' + result + '</pre>'
  1842. return web_render('index.html', login = login_check(), title = name, logo = set_data['name'], data = result, sub = '비교')
  1843. else:
  1844. return redirct('/history/' + url_pas(name))
  1845. else:
  1846. return redirct('/history/' + url_pas(name))
  1847. @app.route('/user')
  1848. def user_info():
  1849. ip = ip_check()
  1850. raw_ip = ip
  1851. db_ex("select * from user where id = '" + db_pas(ip) + "'")
  1852. rows = db_get()
  1853. if(ban_check(ip) == 0):
  1854. if(rows):
  1855. if(rows[0]['acl'] == 'admin' or rows[0]['acl'] == 'owner'):
  1856. if(rows[0]['acl'] == 'admin'):
  1857. acl = '관리자'
  1858. else:
  1859. acl = '소유자'
  1860. else:
  1861. acl = '로그인'
  1862. else:
  1863. acl = '일반'
  1864. else:
  1865. acl = '차단'
  1866. ip = ip_pas(ip)
  1867. return web_render('index.html', login = login_check(), title = '사용자 메뉴', logo = set_data['name'], data = ip + '<br><br><span>권한 상태 : ' + acl + '<h2>로그인 관련</h2><li><a href="/login">로그인</a></li><li><a href="/logout">로그아웃</a></li><li><a href="/register">회원가입</a></li><h2>기타</h2><li><a href="/change">비밀번호 변경</a></li><li><a href="/count">기여 횟수</a></li><li><a href="/record/' + raw_ip + '/n/1">기여 목록</a></li>')
  1868. @app.route('/count')
  1869. def count_edit():
  1870. db_ex("select count(title) from history where ip = '" + ip_check() + "'")
  1871. i = db_get()
  1872. if(i):
  1873. return web_render('index.html', login = login_check(), title = '기여 횟수', logo = set_data['name'], data = "기여 횟수 : " + str(i[0]["count(title)"]))
  1874. else:
  1875. return web_render('index.html', login = login_check(), title = '기여 횟수', logo = set_data['name'], data = "기여 횟수 : 0")
  1876. @app.route('/random')
  1877. def random():
  1878. db_ex("select title from data order by rand() limit 1")
  1879. rows = db_get()
  1880. if(rows):
  1881. return redirct('/w/' + url_pas(rows[0]['title']))
  1882. else:
  1883. return redirct('/')
  1884. @app.route('/error/<int:num>')
  1885. def error_page(num = None):
  1886. if(num == 1):
  1887. return web_render('index.html', login = login_check(), title = '권한 오류', logo = set_data['name'], data = '비 로그인 상태 입니다.'), 401
  1888. elif(num == 2):
  1889. return web_render('index.html', login = login_check(), title = '권한 오류', logo = set_data['name'], data = '이 계정이 없습니다.'), 401
  1890. elif(num == 3):
  1891. return web_render('index.html', login = login_check(), title = '권한 오류', logo = set_data['name'], data = '권한이 모자랍니다.'), 401
  1892. elif(num == 4):
  1893. return web_render('index.html', login = login_check(), title = '권한 오류', logo = set_data['name'], data = '관리자는 차단, 검사 할 수 없습니다.'), 401
  1894. elif(num == 5):
  1895. return web_render('index.html', login = login_check(), title = '사용자 오류', logo = set_data['name'], data = '그런 계정이 없습니다.'), 401
  1896. elif(num == 6):
  1897. return web_render('index.html', login = login_check(), title = '가입 오류', logo = set_data['name'], data = '동일한 아이디의 사용자가 있습니다.'), 401
  1898. elif(num == 7):
  1899. return web_render('index.html', login = login_check(), title = '가입 오류', logo = set_data['name'], data = '아이디는 20글자보다 짧아야 합니다.'), 401
  1900. elif(num == 8):
  1901. return web_render('index.html', login = login_check(), title = '가입 오류', logo = set_data['name'], data = '아이디에는 한글과 알파벳과 공백만 허용 됩니다.'), 401
  1902. elif(num == 9):
  1903. return web_render('index.html', login = login_check(), title = '변경 오류', logo = set_data['name'], data = '그런 계정이 없습니다.'), 401
  1904. elif(num == 10):
  1905. return web_render('index.html', login = login_check(), title = '변경 오류', logo = set_data['name'], data = '비밀번호가 다릅니다.'), 401
  1906. elif(num == 11):
  1907. return web_render('index.html', login = login_check(), title = '로그인 오류', logo = set_data['name'], data = '이미 로그인 되어 있습니다.'), 401
  1908. elif(num == 12):
  1909. return web_render('index.html', login = login_check(), title = '로그인 오류', logo = set_data['name'], data = '그런 계정이 없습니다.'), 401
  1910. elif(num == 13):
  1911. return web_render('index.html', login = login_check(), title = '로그인 오류', logo = set_data['name'], data = '비밀번호가 다릅니다.'), 401
  1912. elif(num == 14):
  1913. return web_render('index.html', login = login_check(), title = '업로드 오류', logo = set_data['name'], data = 'jpg, gif, jpeg, png만 가능 합니다.'), 401
  1914. elif(num == 15):
  1915. return web_render('index.html', login = login_check(), title = '업로드 오류', logo = set_data['name'], data = '파일 명에 . / \ * < > | : ? 가 들어 갈 수 없습니다.'), 401
  1916. elif(num == 16):
  1917. return web_render('index.html', login = login_check(), title = '업로드 오류', logo = set_data['name'], data = '동일한 이름의 파일이 있습니다.'), 401
  1918. elif(num == 17):
  1919. return web_render('index.html', login = login_check(), title = '편집 오류', logo = set_data['name'], data = '편집 내용 기록에는 한글과 영어와 숫자, 공백만 허용 됩니다.'), 401
  1920. elif(num == 18):
  1921. return web_render('index.html', login = login_check(), title = '편집 오류', logo = set_data['name'], data = '내용이 원래 문서와 동일 합니다.'), 401
  1922. elif(num == 19):
  1923. return web_render('index.html', login = login_check(), title = '이동 오류', logo = set_data['name'], data = '이동 하려는 곳에 문서가 이미 있습니다.'), 401
  1924. elif(num == 20):
  1925. return web_render('index.html', login = login_check(), title = '비밀번호 오류', logo = set_data['name'], data = '재 확인이랑 비밀번호가 다릅니다.'), 401
  1926. else:
  1927. return redirct('/')
  1928. @app.errorhandler(404)
  1929. def uncaughtError(error):
  1930. return redirct('/w/' + url_pas(set_data['frontpage']))
  1931. @app.errorhandler(413)
  1932. def uncaughtError(error):
  1933. app.config['MAX_CONTENT_LENGTH'] = (1024**3)
  1934. return error, 401
  1935. if(__name__ == '__main__'):
  1936. app.run(host = '0.0.0.0', port = int(set_data['port']))