app.py 121 KB

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