start.py 120 KB

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