from flask import Flask, request, session, render_template, send_file app = Flask(__name__) from urllib import parse import json import pymysql import time import re import bcrypt import os import difflib import hashlib from code import * from namumark import * json_data = open('set.json').read() data = json.loads(json_data) print('port : ' + data['port']) import logging log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR) def 시작(): try: DB_실행("select * from data limit 1") except: DB_실행("create table data(title text, data longtext, acl text)") try: DB_실행("select * from history limit 1") except: DB_실행("create table history(id text, title text, data longtext, date text, ip text, send text, leng text)") try: DB_실행("select * from rd limit 1") except: DB_실행("create table rd(title text, sub text, date text)") try: DB_실행("select * from user limit 1") except: DB_실행("create table user(id text, pw text, acl text)") try: DB_실행("select * from ban limit 1") except: DB_실행("create table ban(block text, end text, why text, band text)") try: DB_실행("select * from topic limit 1") except: DB_실행("create table topic(id text, title text, sub text, data longtext, date text, ip text, block text)") try: DB_실행("select * from stop limit 1") except: DB_실행("create table stop(title text, sub text, close text)") try: DB_실행("select * from rb limit 1") except: DB_실행("create table rb(block text, end text, today text, blocker text, why text)") try: DB_실행("select * from login limit 1") except: DB_실행("create table login(user text, ip text, today text)") try: DB_실행("select * from back limit 1") except: DB_실행("create table back(title text, link text, type text)") try: DB_실행("select * from cat limit 1") except: DB_실행("create table cat(title text, cat text)") try: DB_실행("select * from hidhi limit 1") except: DB_실행("create table hidhi(title text, re text)") try: DB_실행("select * from distop limit 1") except: DB_실행("create table distop(id text, title text, sub text)") try: DB_실행("select * from agreedis limit 1") except: DB_실행("create table agreedis(title text, sub text)") conn = pymysql.connect(host = data['host'], user = data['user'], password = data['pw'], charset = 'utf8mb4') curs = conn.cursor(pymysql.cursors.DictCursor) def DB_갱신(): conn.commit() def URL_인코딩(데이터): return parse.quote(데이터).replace('/','%2F') def DB_가져오기(): return curs.fetchall() 웹_디자인 = render_template DB_실행 = curs.execute DB_인코딩 = pymysql.escape_string try: DB_실행("use " + data['db']) except: DB_실행("create database " + data['db']) DB_실행("use " + data['db']) DB_실행("alter database " + data['db'] + " character set = utf8mb4 collate = utf8mb4_unicode_ci") 시작() app.secret_key = hashlib.sha512(bytes(data['key'], 'ascii')).hexdigest() @app.route('/upload', methods=['GET', 'POST']) def 업로드(): app.config['MAX_CONTENT_LENGTH'] = int(data['upload']) * 1024 * 1024 if(request.method == 'POST'): ip = 아이피_확인() ban = 차단_체크(ip) if(ban == 1): return '' else: file = request.files['file'] if(file): if(re.search('^([^./\\*<>|:?"]+)\.([Jj][Pp][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg]|[Pp][Nn][Gg])$', file.filename)): filename = file.filename if(os.path.exists(os.path.join('image', filename))): return '' else: file.save(os.path.join('image', filename)) DB_실행("insert into data (title, data, acl) value ('" + DB_인코딩('파일:' + filename) + "', '" + DB_인코딩('[[파일:' + filename + ']][br][br]{{{[[파일:' + filename + ']]}}}') + "', '')") DB_갱신() 역사_추가('파일:' + filename, '[[파일:' + filename + ']][br][br]{{{[[파일:' + filename + ']]}}}', 시간(), ip, '파일:' + filename + ' 업로드', '0') return '' else: return '' else: return '' else: ip = 아이피_확인() ban = 차단_체크(ip) if(ban == 1): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], title = '업로드', tn = 21, number = data['upload']) @app.route('/image/') def 이미지(name = None): if(os.path.exists(os.path.join('image', name))): return send_file(os.path.join('image', name), mimetype='image') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], data = '이미지 없음.', title = '이미지 보기'), 404 @app.route('/adminlist') def 관리자_목록(): i = 0 div = '
' DB_실행("select * from user where acl = 'admin' or acl = 'owner'") rows = DB_가져오기() if(rows): while(True): try: a = rows[i] except: div = div + '
' break if(rows[i]['acl'] == 'owner'): acl = '소유자' else: acl = '관리자' DB_실행("select * from data where title = '사용자:" + rows[i]['id'] + "'") user = DB_가져오기() if(user): name = '' + rows[i]['id'] + ' (' + acl + ')' else: name = '' + rows[i]['id'] + ' (' + acl + ')' div = div + '
  • ' + str(i + 1) + '. ' + name + '
  • ' i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], data = div, title = '관리자 목록') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], title = '관리자 목록') @app.route('/recentchanges') def 최근바뀜(): i = 0 div = '
    ' DB_실행("select * from history order by date desc limit 50") rows = DB_가져오기() if(rows): admin = 관리자_확인() while(True): try: a = rows[i] except: div = div + '
    ' break if(rows[i]['send']): send = rows[i]['send'] send = re.sub('(?P[^&]*)<\/a>', '\g', send) else: send = '
    ' title = rows[i]['title'] title = re.sub('<', '<', title) title = re.sub('>', '>', title) m = re.search("\+", rows[i]['leng']) n = re.search("\-", rows[i]['leng']) if(m): leng = '' + rows[i]['leng'] + '' elif(n): leng = '' + rows[i]['leng'] + '' else: leng = '' + rows[i]['leng'] + '' if(admin == 1): DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'") row = DB_가져오기() if(row): ban = ' (해제)' else: ban = ' (차단)' else: ban = '' if(re.search('\.', rows[i]['ip'])): ip = rows[i]['ip'] + ' (기록)' else: DB_실행("select * from data where title = '사용자:" + DB_인코딩(rows[i]['ip']) + "'") row = DB_가져오기() if(row): ip = '' + rows[i]['ip'] + ' (기록)' else: ip = '' + rows[i]['ip'] + ' (기록)' if((int(rows[i]['id']) - 1) == 0): revert = '' else: revert = '(되돌리기)' div = div + '
    ' + title + ' (역사) ' + revert + ' (' + leng + ')' + ip + ban + '' + rows[i]['date'] + '
    ' + send + '
    ' i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = div, tn = 3, title = '최근 변경내역') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = '', tn = 3, title = '최근 변경내역') @app.route('/history//r//hidden') def 역사_숨기기(name = None, num = None): if(소유자_확인() == 1): DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(num)) + "'") rows = DB_가져오기() if(rows): DB_실행("delete from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(num)) + "'") else: DB_실행("insert into hidhi (title, re) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(str(num)) + "')") DB_갱신() return '' else: return '' @app.route('/record//n/') def 사용자_기록(name = None, number = None): v = number * 50 i = v - 50 div = '
    ' DB_실행("select * from history where ip = '" + DB_인코딩(name) + "' order by date desc") rows = DB_가져오기() if(rows): admin = 관리자_확인() while(True): try: a = rows[i] except: div = div + '
    ' if(number != 1): div = div + '
    (이전)' break if(rows[i]['send']): send = rows[i]['send'] send = re.sub('(?P[^&]*)<\/a>', '\g', send) else: send = '
    ' title = rows[i]['title'] title = re.sub('<', '<', title) title = re.sub('>', '>', title) m = re.search("\+", rows[i]['leng']) n = re.search("\-", rows[i]['leng']) if(m): leng = '' + rows[i]['leng'] + '' elif(n): leng = '' + rows[i]['leng'] + '' else: leng = '' + rows[i]['leng'] + '' if(admin == 1): DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'") row = DB_가져오기() if(row): ban = ' (해제)' else: ban = ' (차단)' else: ban = '' if(re.search('\.', rows[i]['ip'])): ip = rows[i]['ip'] else: DB_실행("select * from data where title = '사용자:" + DB_인코딩(rows[i]['ip']) + "'") row = DB_가져오기() if(row): ip = '' + rows[i]['ip'] + '' else: ip = '' + rows[i]['ip'] + '' if((int(rows[i]['id']) - 1) == 0): revert = '' else: revert = '(되돌리기)' div = div + '
    ' + title + ' r' + rows[i]['id'] + ' (역사) ' + revert + ' (' + leng + ')' + ip + ban + '' + rows[i]['date'] + '
    ' + send + '
    ' if(i == v): div = div + '' if(number == 1): div = div + '
    (다음)' else: div = div + '
    (이전) (다음)' break else: i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = div, tn = 3, title = '유저 기록') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = '', tn = 3, title = '유저 기록') @app.route('/userlog/n/') def 모든_사용자(number = None): 숫자_1 = number * 50 숫자_2 = 숫자_1 - 50 목록 = '' DB_실행("select * from user") 사용자_목록 = DB_가져오기() if(사용자_목록): 관리자 = 관리자_확인() while(True): try: 임시_변수 = 사용자_목록[숫자_2] except: if(number != 1): 목록 = 목록 + '
    (이전)' break if(관리자 == 1): DB_실행("select * from ban where block = '" + DB_인코딩(사용자_목록[숫자_2]['id']) + "'") 차단인가 = DB_가져오기() if(차단인가): 차단_버튼 = ' (해제)' else: 차단_버튼 = ' (차단)' else: 차단_버튼 = '' DB_실행("select * from data where title = '사용자:" + DB_인코딩(사용자_목록[숫자_2]['id']) + "'") 자료 = DB_가져오기() if(자료): 아이피 = '' + 사용자_목록[숫자_2]['id'] + ' (기록)' else: 아이피 = '' + 사용자_목록[숫자_2]['id'] + ' (기록)' 목록 = 목록 + '
  • ' + str(숫자_2 + 1) + '. ' + 아이피 + 차단_버튼 + '
  • ' if(숫자_2 == 숫자_1): if(number == 1): 목록 = 목록 + '
    (다음)' else: 목록 = 목록 + '
    (이전) (다음)' break else: 숫자_2 += 1 return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], data = 목록, title = '유저 가입 기록') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], data = '', title = '유저 가입 기록') @app.route('/backlink//n/') def 역링크(name = None, number = None): v = number * 50 i = v - 50 div = '' restart = 0 DB_실행("select * from back where title = '" + DB_인코딩(name) + "' order by link asc") rows = DB_가져오기() if(rows): while(True): try: a = rows[i] except: if(number != 1): div = div + '
    (이전)' break if(rows[i]['type'] == 'include'): DB_실행("select * from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "' and type = ''") test = DB_가져오기() if(test): restart = 1 DB_실행("delete from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "' and type = ''") DB_갱신() if(not re.search('^사용자:', rows[i]['link'])): DB_실행("select * from data where title = '" + DB_인코딩(rows[i]['link']) + "'") row = DB_가져오기() if(row): aa = row[0]['data'] aa = re.sub("(?P\[include\((?P(?:(?!\)\]|,).)*)((?:,\s?(?:[^)]*))+)?\)\])", "\g\n\n[[\g]]\n\n", aa) aa = re.sub('^#(?:redirect|넘겨주기)\s(?P[^\n]*)', '[[\g]]', aa) aa = 나무마크('', aa) if(re.search("([^<]*)<\/a>", aa)): div = div + '
  • ' + rows[i]['link'] + '' if(rows[i]['type']): div = div + ' (' + rows[i]['type'] + ')
  • ' else: div = div + '' if(i == v): if(number == 1): div = div + '
    (다음)' else: div = div + '
    (이전) (다음)' break else: i = i + 1 else: DB_실행("delete from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "'") DB_갱신() i = i + 1 v = v + 1 else: DB_실행("delete from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "'") DB_갱신() i = i + 1 v = v + 1 else: DB_실행("delete from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "'") DB_갱신() i = i + 1 v = v + 1 if(restart == 1): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], data = div, title = name, page = URL_인코딩(name), sub = '역링크') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], data = '', title = name, page = URL_인코딩(name), sub = '역링크') @app.route('/recentdiscuss') def 최근_토론(): i = 0 div = '
    ' DB_실행("select * from rd order by date desc limit 50") rows = DB_가져오기() if(rows): while(True): try: a = rows[i] except: div = div + '
    ' break title = rows[i]['title'] title = re.sub('<', '<', title) title = re.sub('>', '>', title) sub = rows[i]['sub'] sub = re.sub('<', '<', sub) sub = re.sub('>', '>', sub) div = div + '
    ' + title + ' (' + sub + ')' + rows[i]['date'] + '
    ' i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = div, tn = 12, title = '최근 토론내역') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = '', tn = 12, title = '최근 토론내역') @app.route('/blocklog/n/') def blocklog(number = None): v = number * 50 i = v - 50 div = '
    ' DB_실행("select * from rb order by today desc") rows = DB_가져오기() if(rows): while(True): try: a = rows[i] except: div = div + '
    ' if(number != 1): div = div + '
    (이전)' break why = rows[i]['why'] why = re.sub('<', '<', why) why = re.sub('>', '>', why) b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))$", rows[i]['block']) if(b): ip = rows[i]['block'] + ' (대역)' else: ip = rows[i]['block'] div = div + '
    ' + ip + '' + rows[i]['blocker'] + '' + rows[i]['end'] + '' + rows[i]['why'] + '' + rows[i]['today'] + '
    ' if(i == v): div = div + '' if(number == 1): div = div + '
    (다음)' else: div = div + '
    (이전) (다음)' break else: i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = div, tn = 20, title = '유저 차단 기록') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = '', tn = 20, title = '유저 차단 기록') @app.route('/history//n/', methods=['POST', 'GET']) def 역사_보기(name = None, number = None): if(request.method == 'POST'): return '' else: select = '' v = number * 50 i = v - 50 div = '
    ' DB_실행("select * from history where title = '" + DB_인코딩(name) + "' order by id+0 desc") rows = DB_가져오기() if(rows): admin = 관리자_확인() while(True): style = '' try: a = rows[i] except: div = div + '
    ' if(number != 1): div = div + '
    (이전)' break select = '' + select if(rows[i]['send']): send = rows[i]['send'] send = re.sub('(?P[^&]*)<\/a>', '\g', send) else: send = '
    ' m = re.search("\+", rows[i]['leng']) n = re.search("\-", rows[i]['leng']) if(m): leng = '' + rows[i]['leng'] + '' elif(n): leng = '' + rows[i]['leng'] + '' else: leng = '' + rows[i]['leng'] + '' if(re.search("\.", rows[i]["ip"])): ip = rows[i]["ip"] + ' (기록)' else: DB_실행("select * from data where title = '사용자:" + DB_인코딩(rows[i]['ip']) + "'") row = DB_가져오기() if(row): ip = '' + rows[i]['ip'] + ' (기록)' else: ip = '' + rows[i]['ip'] + ' (기록)' if(admin == 1): DB_실행("select * from user where id = '" + DB_인코딩(rows[i]['ip']) + "'") row = DB_가져오기() if(row): if(row[0]['acl'] == 'owner' or row[0]['acl'] == 'admin'): ban = '' else: DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'") row = DB_가져오기() if(row): ban = ' (해제)' else: ban = ' (차단)' else: DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'") row = DB_가져오기() if(row): ban = ' (해제)' else: ban = ' (차단)' if(소유자_확인() == 1): DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(rows[i]['id']) + "'") row = DB_가져오기() if(row): ip = ip + ' (숨김)' hidden = ' (공개)' else: hidden = ' (숨김)' else: DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(rows[i]['id']) + "'") row = DB_가져오기() if(row): ip = '숨김' hidden = '' send = '숨김' ban = '' style = 'display:none;' v = v + 1 else: hidden = '' else: ban = '' DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(rows[i]['id']) + "'") row = DB_가져오기() if(row): ip = '숨김' hidden = '' send = '숨김' ban = '' style = 'display:none;' v = v + 1 else: hidden = '' div = div + '
    r' + rows[i]['id'] + ' (w) (Raw) (되돌리기) (' + leng + ')' + ip + ban + hidden + '' + rows[i]['date'] + '
    ' + send + '
    ' if(i == v): div = div + '' if(number == 1): div = div + '
    (다음)' else: div = div + '
    (이전) (다음)' break else: i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = div, tn = 5, title = name, page = URL_인코딩(name), select = select, sub = '역사') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = '', tn = 5, title = name, page = URL_인코딩(name), select = select, sub = '역사') @app.route('/search', methods=['POST']) def search(): DB_실행("select * from data where title = '" + DB_인코딩(request.form["search"]) + "'") rows = DB_가져오기() if(rows): return '' else: DB_실행("select * from data where title like '%" + DB_인코딩(request.form["search"]) + "%'") rows = DB_가져오기() if(rows): i = 0 div = '
  • 문서가 없습니다. 바로가기

  • ' while(True): try: div = div + '
  • ' + rows[i]['title'] + '
  • ' except: break i = i + 1 else: return '' return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], data = div, title = '검색') @app.route('/w/') @app.route('/w//from/') def 문서_보기(name = None, redirect = None): i = 0 DB_실행("select * from rd where title = '" + DB_인코딩(name) + "' order by date asc") rows = DB_가져오기() while(True): try: a = rows[i] except: topic = "" break DB_실행("select * from stop where title = '" + DB_인코딩(rows[i]['title']) + "' and sub = '" + DB_인코딩(rows[i]['sub']) + "' and close = 'O'") row = DB_가져오기() if(not row): topic = "open" break else: i = i + 1 acl = '' m = re.search("^(.*)\/(.*)$", name) if(m): g = m.groups() uppage = g[0] style = "" else: uppage = "" style = "display:none;" if(관리자_확인() == 1): 관리자_메뉴 = 'ACL' else: 관리자_메뉴 = '' if(re.search("^분류:", name)): DB_실행("select * from cat where title = '" + DB_인코딩(name) + "' order by cat asc") rows = DB_가져오기() if(rows): div = '' i = 0 while(True): try: 임시_변수 = rows[i] except: break DB_실행("select * from data where title = '" + DB_인코딩(rows[i]['cat']) + "'") row = DB_가져오기() if(row): aa = row[0]['data'] aa = 나무마크('', aa) bb = re.search('
    분류:((?:(?!<\/div>).)*)<\/div>', aa) if(bb): cc = bb.groups() mm = re.search("^분류:(.*)", name) if(mm): ee = mm.groups() if(re.search("" + ee[0] + "<\/a>", cc[0])): div = div + '
  • ' + rows[i]['cat'] + '
  • ' i = i + 1 else: DB_실행("delete from cat where title = '" + DB_인코딩(name) + "' and cat = '" + DB_인코딩(rows[i]['cat']) + "'") DB_갱신() i = i + 1 else: DB_실행("delete from cat where title = '" + DB_인코딩(name) + "' and cat = '" + DB_인코딩(rows[i]['cat']) + "'") DB_갱신() i = i + 1 else: DB_실행("delete from cat where title = '" + DB_인코딩(name) + "' and cat = '" + DB_인코딩(rows[i]['cat']) + "'") DB_갱신() i = i + 1 else: DB_실행("delete from cat where title = '" + DB_인코딩(name) + "' and cat = '" + DB_인코딩(rows[i]['cat']) + "'") DB_갱신() i = i + 1 div = '

    분류

    ' + div DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") 문서_데이터 = DB_가져오기() if(문서_데이터): if(문서_데이터[0]['acl'] == 'admin'): acl = '(관리자)' elif(문서_데이터[0]['acl'] == 'user'): acl = '(유저)' else: if(not acl): acl = '' if(redirect): 데이터 = re.sub("^#(?:redirect|넘겨주기)\s(?P[^\n]*)", " * [[\g]] 문서로 넘겨주기", 문서_데이터[0]['data']) else: 데이터 = 문서_데이터[0]['data'] 최종_데이터 = 나무마크(name, 데이터) m = re.search('
    ((?:(?!\/div>).)*)<\/div>', 최종_데이터) if(m): result = m.groups() left = result[0] else: left = '' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = 최종_데이터 + '
    ' + div, license = data['license'], tn = 1, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, admin = 관리자_메뉴) else: return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = div, license = data['license'], tn = 1, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, admin = 관리자_메뉴) else: return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = '분류 문서 없음', license = data['license'], tn = 1, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, admin = 관리자_메뉴), 404 else: DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows): if(rows[0]['acl'] == 'admin'): acl = '(관리자)' elif(rows[0]['acl'] == 'user'): acl = '(유저)' else: if(not acl): acl = '' m = re.search("^사용자:(.*)", name) if(m): g = m.groups() DB_실행("select * from user where id = '" + DB_인코딩(g[0]) + "'") test = DB_가져오기() if(test): if(test[0]['acl'] == 'owner'): acl = '(소유자)' elif(test[0]['acl'] == 'admin'): acl = '(관리자)' DB_실행("select * from ban where block = '" + DB_인코딩(g[0]) + "'") user = DB_가져오기() if(user): 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'] else: elsedata = rows[0]['data'] else: elsedata = rows[0]['data'] if(redirect): elsedata = re.sub("^#(?:redirect|넘겨주기)\s(?P[^\n]*)", " * [[\g]] 문서로 넘겨주기", elsedata) enddata = 나무마크(name, elsedata) m = re.search('
    ((?:(?!\/div>).)*)<\/div>', enddata) if(m): result = m.groups() left = result[0] else: left = '' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'], tn = 1, acl = acl, left = left, uppage = uppage, style = style, topic = topic, redirect = redirect, admin = 관리자_메뉴) else: m = re.search("^사용자:(.*)", name) if(m): g = m.groups() DB_실행("select * from ban where block = '" + DB_인코딩(g[0]) + "'") user = DB_가져오기() if(user): 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]' + '문서 없음' else: elsedata = '문서 없음' else: elsedata = '문서 없음' if(redirect): elsedata = re.sub("^#(?:redirect|넘겨주기)\s(?P[^\n]*)", " * [[\g]] 문서로 넘겨주기", elsedata) return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = 나무마크(name, elsedata), license = data['license'], tn = 1, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, admin = 관리자_메뉴), 404 @app.route('/w//r/') def rew(name = None, number = None): DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(number)) + "'") row = DB_가져오기() if(row): if(소유자_확인() == 1): DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'") rows = DB_가져오기() if(rows): enddata = 나무마크(name, rows[0]['data']) m = re.search('
    ((?:(?!\/div>).)*)<\/div>', enddata) if(m): result = m.groups() left = result[0] else: left = '' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'], tn = 6, left = left, sub = '옛 문서') else: return '' else: return '' else: DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'") rows = DB_가져오기() if(rows): enddata = 나무마크(name, rows[0]['data']) m = re.search('
    ((?:(?!\/div>).)*)<\/div>', enddata) if(m): result = m.groups() left = result[0] else: left = '' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'], tn = 6, left = left, sub = '옛 문서') else: return '' @app.route('/w//raw/') def 역사_RAW(name = None, number = None): DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(number)) + "'") row = DB_가져오기() if(row): if(소유자_확인() == 1): DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'") rows = DB_가져오기() if(rows): enddata = re.sub('<', '<', rows[0]['data']) enddata = re.sub('>', '>', enddata) enddata = re.sub('"', '"', enddata) enddata = '
    ' + enddata + '
    ' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license']) else: return '' else: return '' else: DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'") rows = DB_가져오기() if(rows): enddata = re.sub('<', '<', rows[0]['data']) enddata = re.sub('>', '>', enddata) enddata = re.sub('"', '"', enddata) enddata = '
    ' + enddata + '
    ' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license']) else: return '' @app.route('/raw/') def RAW(name = None): DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows): enddata = re.sub('<', '<', rows[0]['data']) enddata = re.sub('>', '>', enddata) enddata = re.sub('"', '"', enddata) enddata = '
    ' + enddata + '
    ' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'], tn = 7, sub = 'Raw') else: return '' @app.route('/revert//r/', methods=['POST', 'GET']) def 되돌리기(name = None, number = None): if(request.method == 'POST'): DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(number)) + "'") row = DB_가져오기() if(row): if(소유자_확인() == 1): DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'") rows = DB_가져오기() if(rows): ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: today = 시간() DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") row = DB_가져오기() if(row): leng = 길이_확인(len(row[0]['data']), len(rows[0]['data'])) DB_실행("update data set data = '" + DB_인코딩(rows[0]['data']) + "' where title = '" + DB_인코딩(name) + "'") DB_갱신() else: leng = '+' + str(len(rows[0]['data'])) DB_실행("insert into data (title, data, acl) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(rows[0]['data']) + "', '')") DB_갱신() 역사_추가(name, rows[0]['data'], today, ip, '문서를 ' + str(number) + '판으로 되돌렸습니다.', leng) return '' else: return '' else: return '' else: DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'") rows = DB_가져오기() if(rows): ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: today = 시간() DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") row = DB_가져오기() if(row): leng = 길이_확인(len(row[0]['data']), len(rows[0]['data'])) DB_실행("update data set data = '" + DB_인코딩(rows[0]['data']) + "' where title = '" + DB_인코딩(name) + "'") DB_갱신() else: leng = '+' + str(len(rows[0]['data'])) DB_실행("insert into data (title, data, acl) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(rows[0]['data']) + "', '')") DB_갱신() 역사_추가(name, rows[0]['data'], today, ip, '문서를 ' + str(number) + '판으로 되돌렸습니다.', leng) return '' else: return '' else: DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(number)) + "'") row = DB_가져오기() if(row): if(소유자_확인() == 1): ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'") rows = DB_가져오기() if(rows): return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), r = URL_인코딩(str(number)), tn = 13, plus = '정말 되돌리시겠습니까?', sub = '되돌리기') else: return '' else: return '' else: ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'") rows = DB_가져오기() if(rows): return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), r = URL_인코딩(str(number)), tn = 13, plus = '정말 되돌리시겠습니까?', sub = '되돌리기') else: return '' @app.route('/edit/', methods=['POST', 'GET']) def 문서_편집(name = None): if(request.method == 'POST'): m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.form["send"]) if(m): return '' else: today = 시간() content = 세이브마크(request.form["content"]) DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows): if(rows[0]['data'] == content): return '' else: ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: leng = 길이_확인(len(rows[0]['data']), len(content)) 역사_추가(name, content, today, ip, request.form["send"], leng) DB_실행("update data set data = '" + DB_인코딩(content) + "' where title = '" + DB_인코딩(name) + "'") DB_갱신() else: ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: leng = '+' + str(len(content)) 역사_추가(name, content, today, ip, request.form["send"], leng) DB_실행("insert into data (title, data, acl) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(content) + "', '')") DB_갱신() 틀_확인(name, content) return '' else: ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: DB_실행("select * from data where title = '" + DB_인코딩(data["help"]) + "'") rows = DB_가져오기() if(rows): newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P[^\n]*)', ' * [[\g]] 문서로 넘겨주기', rows[0]["data"]) left = 나무마크(name, newdata) else: left = '' DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows): return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = rows[0]['data'], tn = 2, left = left, sub = '편집') else: return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = '', tn = 2, left = left, sub = '편집') @app.route('/edit//section/', methods=['POST', 'GET']) def 문단_편집(name = None, number = None): if(request.method == 'POST'): m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.form["send"]) if(m): return '' else: today = 시간() content = 세이브마크(request.form["content"]) DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows): if(request.form["otent"] == content): return '' else: ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: leng = 길이_확인(len(request.form['otent']), len(content)) content = rows[0]['data'].replace(request.form['otent'], content) 역사_추가(name, content, today, ip, request.form["send"], leng) DB_실행("update data set data = '" + DB_인코딩(content) + "' where title = '" + DB_인코딩(name) + "'") DB_갱신() 틀_확인(name, content) return '' else: return '' else: ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: DB_실행("select * from data where title = '" + DB_인코딩(data["help"]) + "'") rows = DB_가져오기() if(rows): newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P[^\n]*)', ' * [[\g]] 문서로 넘겨주기', rows[0]["data"]) left = 나무마크(name, newdata) else: left = '' DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows): i = 0 j = 0 gdata = rows[0]['data'] + '\r\n' while(True): m = re.search("((?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n(?:(?:(?:(?!(?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n).)*)(?:\n)?)+)", gdata) if(m): if(i == number - 1): g = m.groups() gdata = re.sub("\r\n$", "", g[0]) break else: gdata = re.sub("((?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n(?:(?:(?:(?!(?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n).)*)(?:\n)?)+)", "", gdata, 1) i = i + 1 else: j = 1 break if(j == 0): return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = gdata, tn = 2, left = left, section = 1, number = number, sub = '편집') else: return '' else: return '' @app.route('/preview/', methods=['POST']) def 미리보기(name = None): ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: newdata = request.form["content"] newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P[^\n]*)', ' * [[\g]] 문서로 넘겨주기', newdata) enddata = 나무마크(name, newdata) DB_실행("select * from data where title = '" + DB_인코딩(data["help"]) + "'") rows = DB_가져오기() if(rows): newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P[^\n]*)', ' * [[\g]] 문서로 넘겨주기', rows[0]["data"]) left = 나무마크(name, newdata) else: left = '' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = request.form["content"], tn = 2, preview = 1, enddata = enddata, left = left, sub = '미리보기') @app.route('/preview//section/', methods=['POST']) def 문단_미리보기(name = None, number = None): ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: if(re.search('\.', ip)): notice = '비 로그인 상태 입니다. 비 로그인으로 편집시 아이피가 역사에 기록 됩니다. 편집 시 동의 함으로 간주 됩니다.' else: notice = '' newdata = request.form["content"] newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P[^\n]*)', ' * [[\g]] 문서로 넘겨주기', newdata) enddata = 나무마크(name, newdata) DB_실행("select * from data where title = '" + DB_인코딩(data["help"]) + "'") rows = DB_가져오기() if(rows): newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P[^\n]*)', ' * [[\g]] 문서로 넘겨주기', rows[0]["data"]) left = 나무마크(name, newdata) else: left = '' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), data = request.form["content"], tn = 2, preview = 1, enddata = enddata, left = left, notice = notice, section = 1, number = number, odata = request.form["otent"], sub = '미리보기') @app.route('/delete/', methods=['POST', 'GET']) def 문서_삭제(name = None): if(request.method == 'POST'): DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows): ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: today = 시간() leng = '-' + str(len(rows[0]['data'])) 역사_추가(name, '', today, ip, '문서를 삭제 했습니다.', leng) DB_실행("delete from data where title = '" + DB_인코딩(name) + "'") DB_갱신() return '' else: return '' else: DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows): ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), tn = 8, plus = '정말 삭제 하시겠습니까?', sub = '삭제') else: return '' @app.route('/move/', methods=['POST', 'GET']) def 문서_이동(name = None): if(request.method == 'POST'): DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows): ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: today = 시간() leng = '0' DB_실행("select * from history where title = '" + DB_인코딩(request.form["title"]) + "'") row = DB_가져오기() if(row): return '' else: 역사_추가(name, rows[0]['data'], today, ip, '' + name + ' 문서를 ' + request.form["title"] + ' 문서로 이동 했습니다.', leng) DB_실행("update data set title = '" + DB_인코딩(request.form["title"]) + "' where title = '" + DB_인코딩(name) + "'") DB_실행("update history set title = '" + DB_인코딩(request.form["title"]) + "' where title = '" + DB_인코딩(name) + "'") DB_갱신() return '' else: ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: today = 시간() leng = '0' DB_실행("select * from history where title = '" + DB_인코딩(request.form["title"]) + "'") row = DB_가져오기() if(row): return '' else: 역사_추가(name, '', today, ip, '' + name + ' 문서를 ' + request.form["title"] + ' 문서로 이동 했습니다.', leng) DB_실행("update history set title = '" + DB_인코딩(request.form["title"]) + "' where title = '" + DB_인코딩(name) + "'") DB_갱신() return '' else: ip = 아이피_확인() can = ACL_체크(ip, name) if(can == 1): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], page = URL_인코딩(name), tn = 9, plus = '정말 이동 하시겠습니까?', sub = '이동') @app.route('/other') def 나머지(): return 웹_디자인('index.html', login = 로그인_확인(), title = '기타 메뉴', logo = data['name'], data = '

    기록

  • 유저 차단 기록
  • 유저 가입 기록
  • 유저 기록
  • 기타

  • 모든 문서
  • 업로드
  • 관리자 목록
  • 관리자 메뉴

  • 이 오픈나무의 버전은 1.9.1 입니다.') @app.route('/manager/', methods=['POST', 'GET']) def 관리_기능(num = None): if(num == 1): return 웹_디자인('index.html', login = 로그인_확인(), title = '관리자 메뉴', logo = data['name'], data = '

    관리자 및 소유자

  • 문서 ACL
  • 유저 체크
  • 유저 차단
  • 소유자

  • 관리자 권한 주기
  • 기타

  • 이 메뉴에 없는 기능은 해당 문서의 역사나 토론에서 바로 사용 가능함
  • ') elif(num == 2): if(request.method == 'POST'): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = 'ACL 이동', logo = data['name'], data = '


    ') elif(num == 3): if(request.method == 'POST'): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = '체크 이동', logo = data['name'], data = '


    ') elif(num == 4): if(request.method == 'POST'): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = '차단 이동', logo = data['name'], data = '




    아이피 앞 두자리 (XXX.XXX) 입력하면 대역 차단
    ') elif(num == 5): if(request.method == 'POST'): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = '권한 이동', logo = data['name'], data = '


    ') elif(num == 6): if(request.method == 'POST'): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = '기록 이동', logo = data['name'], data = '


    ') else: return '' @app.route('/titleindex') def 모든_문서(): 숫자 = 0 데이터 = '
    ' DB_실행("select title from data order by title asc") 문서명 = DB_가져오기() if(문서명): while(True): try: 덤 = 문서명[숫자] except: break 데이터 = 데이터 + '
  • ' + str(숫자 + 1) + '. ' + 문서명[숫자]['title'] + '
  • ' 숫자 += 1 데이터 = 데이터 + '
    ' return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = 데이터 + '
    이 위키에는 총 ' + str(숫자) + '개의 문서가 있습니다.', tn = 4, title = '모든 문서') else: return 웹_디자인('index.html', login = 로그인_확인(), logo = data['name'], rows = '', tn = 4, title = '모든 문서') @app.route('/topic/', methods=['POST', 'GET']) def 토론_목록(name = None): if(request.method == 'POST'): return '' else: div = '
    ' i = 0 j = 1 DB_실행("select * from rd where title = '" + DB_인코딩(name) + "' order by date asc") rows = DB_가져오기() while(True): try: a = rows[i] except: div = div + '
    ' break DB_실행("select * from topic where title = '" + DB_인코딩(rows[i]['title']) + "' and sub = '" + DB_인코딩(rows[i]['sub']) + "' and id = '1' order by sub asc") aa = DB_가져오기() indata = 나무마크(name, aa[0]['data']) if(aa[0]['block'] == 'O'): indata = '블라인드 되었습니다.' block = 'style="background: gainsboro;"' else: block = '' ip = 아이디_파싱(aa[0]['ip']) DB_실행("select * from stop where title = '" + DB_인코딩(rows[i]['title']) + "' and sub = '" + DB_인코딩(rows[i]['sub']) + "' and close = 'O'") row = DB_가져오기() if(not row): div = div + '

    ' + str(j) + '. ' + rows[i]['sub'] + '

    #1 ' + ip + ' ' + aa[0]['date'] + '
    ' + indata + '

    ' j = j + 1 i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), title = name, page = URL_인코딩(name), logo = data['name'], plus = div, tn = 10, list = 1, sub = '토론 목록') @app.route('/topic//close') def 닫힌_토론_목록(name = None): div = '
    ' i = 0 DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and close = 'O' order by sub asc") rows = DB_가져오기() while(True): try: a = rows[i] except: div = div + '
    ' break DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(rows[i]['sub']) + "' and id = '1'") row = DB_가져오기() if(row): indata = 나무마크(name, row[0]['data']) if(row[0]['block'] == 'O'): indata = '블라인드 되었습니다.' block = 'style="background: gainsboro;"' else: block = '' 아이디 = 아이디_파싱(row[0]['ip']) div = div + '

    ' + str((i + 1)) + '. ' + rows[i]['sub'] + '

    #1 ' + 아이디 + ' ' + row[0]['date'] + '
    ' + indata + '

    ' i += 1 return 웹_디자인('index.html', login = 로그인_확인(), title = name, page = URL_인코딩(name), logo = data['name'], plus = div, tn = 10, sub = '닫힌 토론') @app.route('/topic//agree') def 합의된_토론_목록(name = None): 보여줄_내용 = '
    ' 숫자 = 0 DB_실행("select * from agreedis where title = '" + DB_인코딩(name) + "' order by sub asc") 합의_토론 = DB_가져오기() while(True): try: 덤 = 합의_토론[숫자] except: 보여줄_내용 = 보여줄_내용 + '
    ' break DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(합의_토론[숫자]['sub']) + "' and id = '1'") 내용 = DB_가져오기() if(내용): 내용_파싱 = 나무마크(name, 내용[0]['data']) if(내용[0]['block'] == 'O'): 내용_파싱 = '블라인드 되었습니다.' 가리기 = 'style="background: gainsboro;"' else: 가리기 = '' 아이디 = 아이디_파싱(내용[0]['ip']) 보여줄_내용 = 보여줄_내용 + '

    ' + str((숫자 + 1)) + '. ' + 내용[숫자]['sub'] + '

    #1 ' + 아이디 + ' ' + 내용[0]['date'] + '
    ' + 내용_파싱 + '

    ' 숫자 += 1 return 웹_디자인('index.html', login = 로그인_확인(), title = name, page = URL_인코딩(name), logo = data['name'], plus = 보여줄_내용, tn = 10, sub = '합의된 토론') @app.route('/topic//sub/', methods=['POST', 'GET']) def 토론(name = None, sub = None): if(request.method == 'POST'): DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 desc limit 1") rows = DB_가져오기() if(rows): number = int(rows[0]['id']) + 1 else: number = 1 ip = 아이피_확인() ban = 토론자_체크(ip, name, sub) admin = 관리자_확인() if(ban == 1 and not admin == 1): return '' else: DB_실행("select * from user where id = '" + DB_인코딩(ip) + "'") rows = DB_가져오기() if(rows): if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'): ip = ip + ' - Admin' today = 시간() 최근_토론_추가(name, sub, today) aa = request.form["content"] aa = re.sub("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", "[br]", aa) aa = 세이브마크(aa) DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + str(number) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', '" + DB_인코딩(aa) + "', '" + today + "', '" + ip + "', '')") DB_갱신() return '' else: style = '' ip = 아이피_확인() ban = 토론자_체크(ip, name, sub) admin = 관리자_확인() DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = 'O'") 닫음 = DB_가져오기() DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = ''") 정지 = DB_가져오기() if(admin == 1): div = '
    ' if(닫음): div = div + '(토론 열기) ' else: div = div + '(토론 닫기) ' if(정지): div = div + '(토론 재개) ' else: div = div + '(토론 정지) ' DB_실행("select * from agreedis where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'") 합의 = DB_가져오기() if(합의): div = div + '(합의 취소)' else: div = div + '(합의 완료)' div = div + '

    ' else: div = '
    ' if(닫음 or 정지): if(not admin == 1): style = 'display:none;' DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 asc") rows = DB_가져오기() DB_실행("select * from distop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 asc") 공지 = DB_가져오기() i = 0 if(공지): while(True): try: a = 공지[i] except: break num = int(공지[i]['id']) - 1 if(i == 0): start = rows[num]['ip'] 공지_데이터 = 나무마크('', rows[num]['data']) 공지_데이터 = re.sub("(?P#(?:[0-9]*))", '\g', 공지_데이터) ip = 아이디_파싱(rows[num]['ip']) div = div + '
    #' + 공지[i]['id'] + ' ' + ip + ' ' + rows[num]['date'] + '
    ' + 공지_데이터 + '

    ' i = i + 1 i = 0 while(True): try: a = rows[i] except: div = div + '
    ' break if(i == 0): start = rows[i]['ip'] indata = 나무마크('', rows[i]['data']) indata = re.sub("(?P#(?:[0-9]*))", '\g', indata) if(rows[i]['block'] == 'O'): indata = '블라인드 되었습니다.' block = 'style="background: gainsboro;"' else: block = '' m = re.search("^([^-]*)\s\-\s(Close|Reopen|Stop|Restart|Agreement|Settlement)$", rows[i]['ip']) if(m): ban = "" else: if(admin == 1): if(rows[i]['block'] == 'O'): isblock = ' (해제)' else: isblock = ' (블라인드)' DB_실행("select * from distop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + DB_인코딩(str(i + 1)) + "'") row = DB_가져오기() if(row): isblock = isblock + ' (해제)' else: isblock = isblock + ' (공지)' n = re.search("\- (?:Admin)$", rows[i]['ip']) if(n): ban = isblock else: DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'") row = DB_가져오기() if(row): ban = ' (해제)' + isblock else: ban = ' (차단)' + isblock else: ban = "" ip = 아이디_파싱(rows[i]['ip']) if(rows[i]['ip'] == start): j = i + 1 div = div + '
    #' + str(j) + ' ' + ip + ban + ' ' + rows[i]['date'] + '
    ' + indata + '

    ' else: j = i + 1 div = div + '
    #' + str(j) + ' ' + ip + ban + ' ' + rows[i]['date'] + '
    ' + indata + '

    ' i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), title = name, page = URL_인코딩(name), suburl = URL_인코딩(sub), toron = sub, logo = data['name'], rows = div, tn = 11, ban = ban, style = style, sub = '토론') @app.route('/topic//sub//b/') def 토론_블라인드(name = None, sub = None, number = None): if(관리자_확인() == 1): DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + str(number) + "'") 가리기 = DB_가져오기() if(가리기): if(가리기[0]['block'] == 'O'): DB_실행("update topic set block = '' where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + str(number) + "'") else: DB_실행("update topic set block = 'O' where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + str(number) + "'") DB_갱신() 최근_토론_추가(name, sub, 시간()) return '' else: return '' else: return '' @app.route('/topic//sub//notice/') def 토론_공지(name = None, sub = None, number = None): if(관리자_확인() == 1): DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + str(number) + "'") 토론_내용 = DB_가져오기() if(토론_내용): DB_실행("select * from distop where id = '" + str(number) + "' and title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'") 공지_내용 = DB_가져오기() if(공지_내용): DB_실행("delete from distop where id = '" + str(number) + "' and title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'") else: DB_실행("insert into distop (id, title, sub) value ('" + DB_인코딩(str(number)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "')") DB_갱신() 최근_토론_추가(name, sub, 시간()) return '' else: return '' else: return '' @app.route('/topic//sub//stop') def 토론_정지(name = None, sub = None): if(관리자_확인() == 1): 아이피 = 아이피_확인() DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' limit 1") 토론_확인 = DB_가져오기() if(토론_확인): 현재_시간 = 시간() DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = ''") 정지 = DB_가져오기() if(정지): DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론_확인[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Restart', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Restart', '')") DB_실행("delete from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = ''") else: DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론_확인[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Stop', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Stop', '')") DB_실행("insert into stop (title, sub, close) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', '')") DB_갱신() 최근_토론_추가(name, sub, 현재_시간) return '' else: return '' else: return '' @app.route('/topic//sub//close') def 토론_닫기(name = None, sub = None): if(관리자_확인() == 1): 아이피 = 아이피_확인() DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 desc limit 1") 토론_확인 = DB_가져오기() if(토론_확인): 현재_시간 = 시간() DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = 'O'") 닫기 = DB_가져오기() if(닫기): DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론_확인[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Reopen', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Reopen', '')") DB_실행("delete from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = 'O'") else: DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론_확인[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Close', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Close', '')") DB_실행("insert into stop (title, sub, close) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'O')") DB_갱신() 최근_토론_추가(name, sub, 현재_시간) return '' else: return '' else: return '' @app.route('/topic//sub//agree') def 토론_관리자_기능(name = None, sub = None): if(관리자_확인() == 1): 아이피 = 아이피_확인() DB_실행("select id from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 desc limit 1") 토론 = DB_가져오기() if(토론): 현재_시간 = 시간() DB_실행("select * from agreedis where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'") 합의안 = DB_가져오기() if(합의안): DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Settlement', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Settlement', '')") DB_실행("delete from agreedis where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'") else: DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Agreement', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Agreement', '')") DB_실행("insert into agreedis (title, sub) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "')") DB_갱신() 최근_토론_추가(name, sub, 시간()) return '' else: return '' else: return '' @app.route('/login', methods=['POST', 'GET']) def 로그인(): 아이피 = 아이피_확인() 차단인가 = 차단_체크(아이피) if(request.method == 'POST'): if(차단인가 == 1): return '' else: DB_실행("select * from user where id = '" + DB_인코딩(request.form["id"]) + "'") 사용자_정보 = DB_가져오기() if(사용자_정보): if(session.get('Now') == True): return '' elif(bcrypt.checkpw(bytes(request.form["pw"], 'utf-8'), bytes(사용자_정보[0]['pw'], 'utf-8'))): session['Now'] = True session['DREAMER'] = request.form["id"] DB_실행("insert into login (user, ip, today) value ('" + DB_인코딩(request.form["id"]) + "', '" + DB_인코딩(아이피) + "', '" + DB_인코딩(시간()) + "')") DB_갱신() return '' else: return '' else: return '' else: if(차단인가 == 1): return '' else: if(session.get('Now') == True): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = '로그인', enter = '로그인', logo = data['name'], tn = 15) @app.route('/change', methods=['POST', 'GET']) def 비밀번호_변경(): 아이피 = 아이피_확인() 차단인가 = 차단_체크(아이피) if(request.method == 'POST'): if(request.form["pw2"] == request.form["pw3"]): if(차단인가 == 1): return '' else: DB_실행("select * from user where id = '" + DB_인코딩(request.form["id"]) + "'") 사용자_정보 = DB_가져오기() if(사용자_정보): if(session.get('Now') == True): session['Now'] = False session.pop('DREAMER', None) return '' elif(bcrypt.checkpw(bytes(request.form["pw"], 'utf-8'), bytes(사용자_정보[0]['pw'], 'utf-8'))): hashed = bcrypt.hashpw(bytes(request.form["pw2"], 'utf-8'), bcrypt.gensalt()) DB_실행("update user set pw = '" + DB_인코딩(hashed.decode()) + "' where id = '" + DB_인코딩(request.form["id"]) + "'") DB_갱신() return '' else: return '' else: return '' else: return '' else: if(차단인가 == 1): return '' else: if(session.get('Now') == True): session['Now'] = False session.pop('DREAMER', None) return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = '비밀번호 변경', enter = '변경', logo = data['name'], tn = 15) @app.route('/check/') def 사용자_아이피_확인(name = None, sub = None, number = None): DB_실행("select * from user where id = '" + DB_인코딩(name) + "'") 사용자_정보 = DB_가져오기() if(사용자_정보 and 사용자_정보[0]['acl'] == 'owner' or 사용자_정보 and 사용자_정보[0]['acl'] == 'admin'): return '' else: if(관리자_확인() == 1): 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) if(m): DB_실행("select * from login where ip = '" + DB_인코딩(name) + "' order by today desc") row = DB_가져오기() if(row): i = 0 c = '' while(True): try: c = c + '
    ' + row[i]['user'] + '' + row[i]['ip'] + '' + row[i]['today'] + '
    ' except: break i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), title = '다중 검사', logo = data['name'], tn = 22, rows = c) else: return 웹_디자인('index.html', login = 로그인_확인(), title = '다중 검사', logo = data['name'], tn = 22, rows = '') else: DB_실행("select * from login where user = '" + DB_인코딩(name) + "' order by today desc") row = DB_가져오기() if(row): i = 0 c = '' while(True): try: c = c + '
    ' + row[i]['user'] + '' + row[i]['ip'] + '' + row[i]['today'] + '
    ' except: break i = i + 1 return 웹_디자인('index.html', login = 로그인_확인(), title = '다중 검사', logo = data['name'], tn = 22, rows = c) else: return 웹_디자인('index.html', login = 로그인_확인(), title = '다중 검사', logo = data['name'], tn = 22, rows = '') else: return '' @app.route('/register', methods=['POST', 'GET']) def 가입(): 아이피 = 아이피_확인() 차단인가 = 차단_체크(아이피) if(request.method == 'POST'): if(request.form["pw"] == request.form["pw2"]): if(차단인가 == 1): return '' else: m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.form["id"]) if(m): return '' else: if(len(request.form["id"]) > 20): return '' else: DB_실행("select * from user where id = '" + DB_인코딩(request.form["id"]) + "'") rows = DB_가져오기() if(rows): return '' else: hashed = bcrypt.hashpw(bytes(request.form["pw"], 'utf-8'), bcrypt.gensalt()) if(request.form["id"] == data['owner']): DB_실행("insert into user (id, pw, acl) value ('" + DB_인코딩(request.form["id"]) + "', '" + DB_인코딩(hashed.decode()) + "', 'owner')") else: DB_실행("insert into user (id, pw, acl) value ('" + DB_인코딩(request.form["id"]) + "', '" + DB_인코딩(hashed.decode()) + "', 'user')") DB_갱신() return '' else: return '' else: if(차단인가 == 1): return '' else: return 웹_디자인('index.html', login = 로그인_확인(), title = '회원가입', enter = '회원가입', logo = data['name'], tn = 15) @app.route('/logout') def 로그아웃(): session['Now'] = False session.pop('DREAMER', None) return '' @app.route('/ban/', methods=['POST', 'GET']) def 사용자_차단(name = None): DB_실행("select * from user where id = '" + DB_인코딩(name) + "'") rows = DB_가져오기() if(rows and rows[0]['acl'] == 'owner' or rows and rows[0]['acl'] == 'admin'): return '' else: if(request.method == 'POST'): if(관리자_확인() == 1): ip = 아이피_확인() if(not re.search("[0-9]{4}-[0-9]{2}-[0-9]{2}", request.form["end"])): end = '' else: end = request.form["end"] DB_실행("select * from ban where block = '" + DB_인코딩(name) + "'") row = DB_가져오기() if(row): 최근_차단_추가(name, '해제', 시간(), ip, '') DB_실행("delete from ban where block = '" + DB_인코딩(name) + "'") else: b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))$", name) if(b): 최근_차단_추가(name, end, 시간(), ip, request.form["why"]) DB_실행("insert into ban (block, end, why, band) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(end) + "', '" + DB_인코딩(request.form["why"]) + "', 'O')") else: 최근_차단_추가(name, end, 시간(), ip, request.form["why"]) DB_실행("insert into ban (block, end, why, band) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(end) + "', '" + DB_인코딩(request.form["why"]) + "', '')") DB_갱신() return '' else: return '' else: if(관리자_확인() == 1): DB_실행("select * from ban where block = '" + DB_인코딩(name) + "'") row = DB_가져오기() if(row): now = '차단 해제' else: b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))$", name) if(b): now = '대역 차단' else: now = '차단' return 웹_디자인('index.html', login = 로그인_확인(), title = name, page = URL_인코딩(name), logo = data['name'], tn = 16, now = now, today = 시간(), sub = '차단') else: return '' @app.route('/acl/', methods=['POST', 'GET']) def ACL(name = None): if(request.method == 'POST'): if(관리자_확인() == 1): DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") row = DB_가져오기() if(row): if(request.form["select"] == 'admin'): DB_실행("update data set acl = 'admin' where title = '" + DB_인코딩(name) + "'") elif(request.form["select"] == 'user'): DB_실행("update data set acl = 'user' where title = '" + DB_인코딩(name) + "'") else: DB_실행("update data set acl = '' where title = '" + DB_인코딩(name) + "'") DB_갱신() return '' else: return '' else: if(관리자_확인() == 1): DB_실행("select * from data where title = '" + DB_인코딩(name) + "'") row = DB_가져오기() if(row): if(row[0]['acl'] == 'admin'): now = '관리자만' elif(row[0]['acl'] == 'user'): now = '유저 이상' else: now = '일반' return 웹_디자인('index.html', login = 로그인_확인(), title = name, page = URL_인코딩(name), logo = data['name'], tn = 19, now = '현재 ACL 상태는 ' + now, sub = 'ACL') else: return '' else: return '' @app.route('/admin/', methods=['POST', 'GET']) def 관리자_부여(name = None): if(request.method == 'POST'): if(소유자_확인() == 1): DB_실행("select * from user where id = '" + DB_인코딩(name) + "'") 사용자_정보 = DB_가져오기() if(사용자_정보): if(사용자_정보[0]['acl'] == 'admin' or 사용자_정보[0]['acl'] == 'owner'): DB_실행("update user set acl = 'user' where id = '" + DB_인코딩(name) + "'") else: DB_실행("update user set acl = '" + DB_인코딩(request.form["select"]) + "' where id = '" + DB_인코딩(name) + "'") DB_갱신() return '' else: return '' else: return '' else: if(소유자_확인() == 1): DB_실행("select * from user where id = '" + DB_인코딩(name) + "'") 사용자_정보 = DB_가져오기() if(사용자_정보): if(사용자_정보[0]['acl'] == 'admin' or 사용자_정보[0]['acl'] == 'owner'): now = '권한 해제' else: now = '권한 부여' return 웹_디자인('index.html', login = 로그인_확인(), title = name, page = URL_인코딩(name), logo = data['name'], tn = 18, now = now, sub = '권한 부여') else: return '' else: return '' @app.route('/ban') def 차단_확인_페이지(): ip = 아이피_확인() if(차단_체크(ip) == 1): DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'") rows = DB_가져오기() if(rows): if(rows[0]['end']): end = rows[0]['end'] + ' 까지 차단 상태 입니다. / 사유 : ' + rows[0]['why'] now = 시간() now = re.sub(':', '', now) now = re.sub('\-', '', now) now = re.sub(' ', '', now) now = int(now) day = rows[0]['end'] day = re.sub('\-', '', day) if(now >= int(day + '000000')): DB_실행("delete from ban where block = '" + DB_인코딩(ip) + "'") DB_갱신() end = '차단이 풀렸습니다. 다시 시도 해 보세요.' else: end = '영구 차단 상태 입니다. / 사유 : ' + rows[0]['why'] else: b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip) if(b): results = b.groups() DB_실행("select * from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'") row = DB_가져오기() if(row): if(row[0]['end']): end = row[0]['end'] + ' 까지 차단 상태 입니다. / 사유 : ' + rows[0]['why'] now = 시간() now = re.sub(':', '', now) now = re.sub('\-', '', now) now = re.sub(' ', '', now) now = int(now) day = row[0]['end'] day = re.sub('\-', '', day) if(now >= int(day + '000000')): DB_실행("delete from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'") DB_갱신() end = '차단이 풀렸습니다. 다시 시도 해 보세요.' else: end = '영구 차단 상태 입니다. / 사유 : ' + row[0]['why'] else: end = '권한이 맞지 않는 상태 입니다.' return 웹_디자인('index.html', login = 로그인_확인(), title = '권한 오류', logo = data['name'], data = end), 401 @app.route('/w//r//diff/') def 문서_비교(name = None, a = None, b = None): DB_실행("select * from history where id = '" + DB_인코딩(str(a)) + "' and title = '" + DB_인코딩(name) + "'") 앞_자료 = DB_가져오기() if(앞_자료): DB_실행("select * from history where id = '" + DB_인코딩(str(b)) + "' and title = '" + DB_인코딩(name) + "'") 뒷_자료 = DB_가져오기() if(뒷_자료): 앞_파싱_자료 = re.sub('<', '<', 앞_자료[0]['data']) 앞_파싱_자료 = re.sub('>', '>', 앞_파싱_자료) 앞_파싱_자료 = re.sub('"', '"', 앞_파싱_자료) 뒷_파싱_자료 = re.sub('<', '<', 뒷_자료[0]['data']) 뒷_파싱_자료 = re.sub('>', '>', 뒷_파싱_자료) 뒷_파싱_자료 = re.sub('"', '"', 뒷_파싱_자료) 비교_내용 = difflib.SequenceMatcher(None, 앞_파싱_자료, 뒷_파싱_자료) 결과 = 비교(비교_내용) 결과 = '
    ' + 결과 + '
    ' return 웹_디자인('index.html', login = 로그인_확인(), title = name, logo = data['name'], data = 결과, sub = '비교') else: return '' else: return '' @app.route('/user') def 사용자(): 아이피 = 아이피_확인() 원래_아이피 = 아이피 DB_실행("select * from user where id = '" + DB_인코딩(아이피) + "'") rows = DB_가져오기() if(차단_체크(아이피) == 0): if(rows): if(rows[0]['acl'] == 'admin' or rows[0]['acl'] == 'owner'): if(rows[0]['acl'] == 'admin'): acl = '관리자' else: acl = '소유자' else: acl = '유저' else: acl = '일반' else: acl = '차단' if(not re.search('\.', 아이피)): DB_실행("select * from data where title = '사용자:" + DB_인코딩(아이피) + "'") row = DB_가져오기() if(row): 아이피 = '' + 아이피 + '' else: 아이피 = '' + 아이피 + '' return 웹_디자인('index.html', login = 로그인_확인(), title = '유저 메뉴', logo = data['name'], data = 아이피 + '

    권한 상태 : ' + acl + '

    로그인 관련

  • 로그인
  • 로그아웃
  • 회원가입
  • 기타

  • 비밀번호 변경
  • 기여 횟수
  • 기여 목록
  • ') @app.route('/count') def 기여_횟수(): DB_실행("select count(title) from history where ip = '" + 아이피_확인() + "'") 숫자 = DB_가져오기() if(숫자): return 웹_디자인('index.html', login = 로그인_확인(), title = '기여 횟수', logo = data['name'], data = "기여 횟수 : " + str(숫자[0]["count(title)"])) else: return 웹_디자인('index.html', login = 로그인_확인(), title = '기여 횟수', logo = data['name'], data = "기여 횟수 : 0") @app.route('/random') def 무작위_문서(): DB_실행("select * from data order by rand() limit 1") rows = DB_가져오기() if(rows): return '' else: return '' @app.route('/error/') def 오류(num = None): if(num == 1): return 웹_디자인('index.html', login = 로그인_확인(), title = '권한 오류', logo = data['name'], data = '비 로그인 상태 입니다.'), 401 elif(num == 2): return 웹_디자인('index.html', login = 로그인_확인(), title = '권한 오류', logo = data['name'], data = '이 계정이 없습니다.'), 401 elif(num == 3): return 웹_디자인('index.html', login = 로그인_확인(), title = '권한 오류', logo = data['name'], data = '권한이 모자랍니다.'), 401 elif(num == 4): return 웹_디자인('index.html', login = 로그인_확인(), title = '권한 오류', logo = data['name'], data = '관리자는 차단, 검사 할 수 없습니다.'), 401 elif(num == 5): return 웹_디자인('index.html', login = 로그인_확인(), title = '유저 오류', logo = data['name'], data = '그런 계정이 없습니다.'), 401 elif(num == 6): return 웹_디자인('index.html', login = 로그인_확인(), title = '가입 오류', logo = data['name'], data = '동일한 아이디의 유저가 있습니다.'), 401 elif(num == 7): return 웹_디자인('index.html', login = 로그인_확인(), title = '가입 오류', logo = data['name'], data = '아이디는 20글자보다 짧아야 합니다.'), 401 elif(num == 8): return 웹_디자인('index.html', login = 로그인_확인(), title = '가입 오류', logo = data['name'], data = '아이디에는 한글과 알파벳과 공백만 허용 됩니다.'), 401 elif(num == 9): return 웹_디자인('index.html', login = 로그인_확인(), title = '변경 오류', logo = data['name'], data = '그런 계정이 없습니다.'), 401 elif(num == 10): return 웹_디자인('index.html', login = 로그인_확인(), title = '변경 오류', logo = data['name'], data = '비밀번호가 다릅니다.'), 401 elif(num == 11): return 웹_디자인('index.html', login = 로그인_확인(), title = '로그인 오류', logo = data['name'], data = '이미 로그인 되어 있습니다.'), 401 elif(num == 12): return 웹_디자인('index.html', login = 로그인_확인(), title = '로그인 오류', logo = data['name'], data = '그런 계정이 없습니다.'), 401 elif(num == 13): return 웹_디자인('index.html', login = 로그인_확인(), title = '로그인 오류', logo = data['name'], data = '비밀번호가 다릅니다.'), 401 elif(num == 14): return 웹_디자인('index.html', login = 로그인_확인(), title = '업로드 오류', logo = data['name'], data = 'jpg, gif, jpeg, png만 가능 합니다.'), 401 elif(num == 15): return 웹_디자인('index.html', login = 로그인_확인(), title = '업로드 오류', logo = data['name'], data = '파일 명에 . / \ * < > | : ? 가 들어 갈 수 없습니다.'), 401 elif(num == 16): return 웹_디자인('index.html', login = 로그인_확인(), title = '업로드 오류', logo = data['name'], data = '동일한 이름의 파일이 있습니다.'), 401 elif(num == 17): return 웹_디자인('index.html', login = 로그인_확인(), title = '편집 오류', logo = data['name'], data = '편집 내용 기록에는 한글과 영어와 숫자, 공백만 허용 됩니다.'), 401 elif(num == 18): return 웹_디자인('index.html', login = 로그인_확인(), title = '편집 오류', logo = data['name'], data = '내용이 원래 문서와 동일 합니다.'), 401 elif(num == 19): return 웹_디자인('index.html', login = 로그인_확인(), title = '이동 오류', logo = data['name'], data = '이동 하려는 곳에 문서가 이미 있습니다.'), 401 elif(num == 20): return 웹_디자인('index.html', login = 로그인_확인(), title = '비밀번호 오류', logo = data['name'], data = '재 확인이랑 비밀번호가 다릅니다.'), 401 else: return '' @app.errorhandler(404) def uncaughtError(error): return '' @app.errorhandler(413) def uncaughtError(error): app.config['MAX_CONTENT_LENGTH'] = (1024**3) return error, 401 if(__name__ == '__main__'): app.run(host = '0.0.0.0', port = int(data['port']), threaded = True)