main.py 115 KB

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