from bottle import route, run, template, error, request, static_file, app, BaseRequest
from bottle.ext import beaker
import bcrypt
import os
import difflib
import hashlib
import json
import pymysql
json_data = open('set.json').read()
set_data = json.loads(json_data)
session_opts = {
'session.type': 'file',
'session.data_dir': './app_session/',
'session.auto': True
}
app = beaker.middleware.SessionMiddleware(app(), session_opts)
BaseRequest.MEMFILE_MAX = 1024 * 1024
def start():
try:
db_ex("create table data(title text, data longtext, acl text)")
except:
pass
try:
db_ex("create table history(id text, title text, data longtext, date text, ip text, send text, leng text)")
except:
pass
try:
db_ex("create table rd(title text, sub text, date text)")
except:
pass
try:
db_ex("create table user(id text, pw text, acl text)")
except:
pass
try:
db_ex("create table ban(block text, end text, why text, band text)")
except:
pass
try:
db_ex("create table topic(id text, title text, sub text, data longtext, date text, ip text, block text, top text)")
except:
pass
try:
db_ex("create table stop(title text, sub text, close text)")
except:
pass
try:
db_ex("create table rb(block text, end text, today text, blocker text, why text)")
except:
pass
try:
db_ex("create table login(user text, ip text, today text)")
except:
pass
try:
db_ex("create table back(title text, link text, type text)")
except:
pass
try:
db_ex("create table cat(title text, cat text)")
except:
pass
try:
db_ex("create table hidhi(title text, re text)")
except:
pass
try:
db_ex("create table agreedis(title text, sub text)")
except:
pass
try:
db_ex("create table custom(user text, css longtext)")
except:
pass
try:
db_ex("create table other(name text, data text)")
except:
pass
try:
db_ex("create table alist(name text, acl text)")
except:
pass
conn = pymysql.connect(host = set_data['host'], user = set_data['user'], password = set_data['pw'], charset = 'utf8mb4')
curs = conn.cursor(pymysql.cursors.DictCursor)
def redirect(data):
return('')
db_ex = curs.execute
db_pas = pymysql.escape_string
try:
db_ex("use " + set_data['db'])
except:
db_ex("create database " + set_data['db'])
db_ex("use " + set_data['db'])
db_ex("alter database " + set_data['db'] + " character set = utf8mb4 collate = utf8mb4_unicode_ci")
from func import *
from mark import *
def db_com():
return(conn.commit())
def db_get():
return(curs.fetchall())
start()
r_ver = '2.0.5c'
db_ex('select data from other where name = "version"')
version = db_get()
if(version):
t_ver = re.sub('\.', '', version[0]['data'])
t_ver = re.sub('[a-z]$', '', t_ver)
r_t_ver = re.sub('\.', '', r_ver)
r_t_ver = re.sub('[a-z]$', '', r_t_ver)
if(int(t_ver) <= int(r_t_ver)):
db_ex("update other set data = '" + db_pas(r_ver) + "' where name = 'version'")
else:
db_ex("insert into other (name, data) value ('version', '" + db_pas(r_ver) + "')")
t_ver = 0
db_ex('select name from alist limit 1')
getalist = db_get()
if(getalist and int(t_ver) < 204):
db_ex("delete from alist where name = 'owner'")
db_ex("delete from alist where name = 'admin'")
if(int(t_ver) < 202 or not getalist):
db_ex("insert into alist (name, acl) value ('owner', 'owner')")
db_ex("insert into alist (name, acl) value ('admin', 'ban')")
db_ex("insert into alist (name, acl) value ('admin', 'mdel')")
db_ex("insert into alist (name, acl) value ('admin', 'toron')")
db_ex("insert into alist (name, acl) value ('admin', 'check')")
db_ex("insert into alist (name, acl) value ('admin', 'acl')")
if(int(t_ver) < 203):
db_ex('select title from topic limit 1')
top_yes = db_get()
if(top_yes):
db_ex('rename table topic to old_topic')
db_ex('rename table distop to old_distop')
db_ex('create table topic(id text, title text, sub text, data longtext, date text, ip text, block text, top text)')
db_ex('select * from old_topic')
topic_old = db_get()
if(topic_old):
i = 0
for move_topic in topic_old:
db_ex("select id from distop where id = '" + db_pas(move_topic['id']) + "' and title = '" + db_pas(move_topic['title']) + "' and sub = '" + db_pas(move_topic['sub']) + "'")
distop = db_get()
if(distop):
top = 'O'
else:
top = ''
db_ex("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + db_pas(move_topic['id']) + "', '" + db_pas(move_topic['title']) + "', '" + db_pas(move_topic['sub']) + "', '" + db_pas(move_topic['data']) + "', '" + db_pas(move_topic['date']) + "', '" + db_pas(move_topic['ip']) + "', '" + db_pas(move_topic['block']) + "', '" + db_pas(top) + "')")
# db_ex('drop table old_topic')
# db_ex('drop table distop')
db_com()
@route('/upload', method=['GET', 'POST'])
def upload():
MEMFILE_MAX = int(set_data['upload']) * 1024 * 1024
ip = ip_check()
ban = ban_check(ip)
if(request.method == 'POST'):
if(ban == 1):
return(redirect('/ban'))
else:
file = request.files.file
if(file):
exist = re.search('^(.+)(\.(?:[Jj][Pp][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg]|[Pp][Nn][Gg]))$', file.filename)
if(exist):
if((int(set_data['upload']) * 1024 * 1024) < request.content_length):
return(redirect('/error/17'))
else:
file_info = exist.groups()
file_data = file_info[0] + file_info[1]
file_name = sha224(file_info[0]) + file_info[1]
if(os.path.exists(os.path.join('image', file_name))):
return(redirect('/error/16'))
else:
file.save(os.path.join('image', file_name))
db_ex("select title from data where title = '" + db_pas('파일:' + file_data) + "'")
exist_db = db_get()
if(not exist_db):
db_ex("insert into data (title, data, acl) value ('" + db_pas('파일:' + file_data) + "', '" + db_pas('[[파일:' + file_data + ']][br][br]{{{[[파일:' + file_data + ']]}}}') + "', '')")
db_com()
history_plus('파일:' + file_data, '[[파일:' + file_data + ']][br][br]{{{[[파일:' + file_data + ']]}}}', get_time(), ip, '파일:' + file_data + ' 업로드', '0')
return(redirect('/w/' + url_pas('파일:' + file_data)))
else:
return(redirect('/error/14'))
else:
return(redirect('/error/14'))
else:
if(ban == 1):
return(redirect('/ban'))
else:
return(template('upload', custom = custom_css_user(), license = set_data['license'], login = login_check(), logo = set_data['name'], title = '업로드', number = set_data['upload']))
@route('/image/')
def static(name = None):
if(os.path.exists(os.path.join('image', name))):
return(static_file(name, root = 'image'))
else:
return(redirect('/'))
@route('/acllist')
def acl_list():
data = '
'
i = 0
db_ex("select title, acl from data where acl = 'admin' or acl = 'user' order by acl desc")
list_data = db_get()
if(list_data):
while(True):
try:
if(list_data[i]['acl'] == 'admin'):
acl = '관리자'
else:
acl = '로그인'
data += '
'
else:
data = ''
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), logo = set_data['name'], data = data, title = 'ACL 목록'))
@route('/adminplus/', method=['POST', 'GET'])
def admin_plus(name = None):
if(admin_check(None) == 1):
if(request.method == 'POST'):
db_ex("delete from alist where name = '" + db_pas(name) + "'")
if(request.forms.ban):
db_ex("insert into alist (name, acl) value ('" + db_pas(name) + "', 'ban')")
if(request.forms.mdel):
db_ex("insert into alist (name, acl) value ('" + db_pas(name) + "', 'mdel')")
if(request.forms.toron):
db_ex("insert into alist (name, acl) value ('" + db_pas(name) + "', 'toron')")
if(request.forms.check):
db_ex("insert into alist (name, acl) value ('" + db_pas(name) + "', 'check')")
if(request.forms.acl):
db_ex("insert into alist (name, acl) value ('" + db_pas(name) + "', 'acl')")
if(request.forms.hidel):
db_ex("insert into alist (name, acl) value ('" + db_pas(name) + "', 'hidel')")
if(request.forms.owner):
db_ex("insert into alist (name, acl) value ('" + db_pas(name) + "', 'owner')")
db_com()
return(redirect('/'))
else:
db_ex('select acl from alist where name = "' + db_pas(name) + '"')
test = db_get()
list = ''
exist_list = ['', '', '', '', '', '', '', '', '']
i = 0
while(True):
try:
if(test[i]['acl'] == 'ban'):
exist_list[0] = 'checked="checked"'
elif(test[i]['acl'] == 'mdel'):
exist_list[1] = 'checked="checked"'
elif(test[i]['acl'] == 'toron'):
exist_list[2] = 'checked="checked"'
elif(test[i]['acl'] == 'check'):
exist_list[3] = 'checked="checked"'
elif(test[i]['acl'] == 'acl'):
exist_list[4] = 'checked="checked"'
elif(test[i]['acl'] == 'hidel'):
exist_list[5] = 'checked="checked"'
elif(test[i]['acl'] == 'owner'):
exist_list[7] = 'checked="checked"'
i += 1
except:
break
list += '
차단
'
list += '
많은 문서 삭제
'
list += '
토론 관리
'
list += '
사용자 검사
'
list += '
문서 ACL
'
list += '
역사 숨김
'
list += '
소유자
'
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = '관리 그룹 추가', logo = set_data['name'], data = ''))
else:
return(redirect('/error/3'))
@route('/adminlist')
def admin_list():
i = 0
div = '
'
db_ex("select * from user where acl = 'admin' or acl = 'owner'")
user_data = db_get()
if(user_data):
while(True):
try:
db_ex("select title from data where title = '사용자:" + user_data[i]['id'] + "'")
user = db_get()
if(user):
name = '' + user_data[i]['id'] + ' (' + user_data[i]['acl'] + ')'
else:
name = '' + user_data[i]['id'] + ' (' + user_data[i]['acl'] + ')'
div += '
' + str(i + 1) + '. ' + name + '
'
i += 1
except:
div += '
'
break
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), logo = set_data['name'], data = div, title = '관리자 목록'))
else:
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), logo = set_data['name'], title = '관리자 목록'))
@route('/recentchanges')
def recent_changes():
i = 0
ydmin = admin_check(1)
zdmin = admin_check(6)
div = '
문서명
기여자
시간
'
db_ex("select id, title, date, ip, send, leng from history order by date desc limit 50")
rows = db_get()
if(rows):
while(True):
try:
if(rows[i]['send']):
if(re.search("^(?: *)$", rows[i]['send'])):
send = ' '
else:
send = rows[i]['send']
else:
send = ' '
title = rows[i]['title']
title = re.sub('<', '<', 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(ydmin == 1):
db_ex("select * from ban where block = '" + db_pas(rows[i]['ip']) + "'")
row = db_get()
if(row):
ban = ' (해제)'
else:
ban = ' (차단)'
else:
ban = ''
ip = ip_pas(rows[i]['ip'], None)
if((int(rows[i]['id']) - 1) == 0):
revert = ''
else:
revert = '(비교)(되돌리기)'
style = ''
if(zdmin == 1):
db_ex("select * from hidhi where title = '" + db_pas(rows[i]['title']) + "' and re = '" + db_pas(rows[i]['id']) + "'")
row = db_get()
if(row):
ip += ' (숨김)'
hidden = ' (공개)'
else:
hidden = ' (숨김)'
else:
db_ex("select * from hidhi where title = '" + db_pas(rows[i]['title']) + "' and re = '" + db_pas(rows[i]['id']) + "'")
row = db_get()
if(row):
ip = '숨김'
hidden = ''
send = '숨김'
ban = ''
style = 'display:none;'
else:
hidden = ''
div += '
'
else:
div = ' None '
div += ' (이전)(이후)'
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), logo = set_data['name'], data = div, title = name, page = url_pas(name), select = select, sub = '역사'))
@route('/search', method=['POST'])
def search():
return(redirect('/search/' + url_pas(request.forms.search)))
@route('/goto', method=['POST'])
def goto():
db_ex("select title from data where title = '" + db_pas(request.forms.search) + "'")
data = db_get()
if(data):
return(redirect('/w/' + url_pas(request.forms.search)))
else:
return(redirect('/search/' + url_pas(request.forms.search)))
@route('/search/')
@route('/search//n/')
def deep_search(name = None, num = 1):
v = num * 50
i = v - 50
div = ''
div_plus = ''
end = ''
db_ex("select title from data where title like '%" + db_pas(name) + "%'")
title_list = db_get()
db_ex("select title from data where data like '%" + db_pas(name) + "%'")
data_list = db_get()
db_ex("select title from data where title = '" + db_pas(name) + "'")
exist = db_get()
if(exist):
div = '
'
else:
data = ' None'
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), logo = set_data['name'], data = data, title = '모든 문서'))
@route('/topic//sub//b/')
def topic_block(name = None, sub = None, num = None):
if(admin_check(3) == 1):
db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
block = db_get()
if(block):
if(block[0]['block'] == 'O'):
db_ex("update topic set block = '' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
else:
db_ex("update topic set block = 'O' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
db_com()
rd_plus(name, sub, get_time())
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/error/3'))
@route('/topic//sub//notice/')
def topic_top(name = None, sub = None, num = None):
if(admin_check(3) == 1):
db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
topic_data = db_get()
if(topic_data):
db_ex("select * from topic where id = '" + str(num) + "' and title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
top_data = db_get()
if(top_data):
if(top_data[0]['top'] == 'O'):
db_ex("update topic set top = '' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
else:
db_ex("update topic set top = 'O' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
db_com()
rd_plus(name, sub, get_time())
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/error/3'))
@route('/topic//sub//stop')
def topic_stop(name = None, sub = None):
if(admin_check(3) == 1):
ip = ip_check()
db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
topic_check = db_get()
if(topic_check):
time = get_time()
db_ex("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = ''")
stop = db_get()
if(stop):
db_ex("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Restart', '" + db_pas(time) + "', '" + db_pas(ip) + " - Restart', '', '')")
db_ex("delete from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = ''")
else:
db_ex("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Stop', '" + db_pas(time) + "', '" + db_pas(ip) + " - Stop', '', '')")
db_ex("insert into stop (title, sub, close) value ('" + db_pas(name) + "', '" + db_pas(sub) + "', '')")
db_com()
rd_plus(name, sub, time)
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/error/3'))
@route('/topic//sub//close')
def topic_close(name = None, sub = None):
if(admin_check(3) == 1):
ip = ip_check()
db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
topic_check = db_get()
if(topic_check):
time = get_time()
db_ex("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = 'O'")
close = db_get()
if(close):
db_ex("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Reopen', '" + db_pas(time) + "', '" + db_pas(ip) + " - Reopen', '', '')")
db_ex("delete from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = 'O'")
else:
db_ex("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Close', '" + db_pas(time) + "', '" + db_pas(ip) + " - Close', '', '')")
db_ex("insert into stop (title, sub, close) value ('" + db_pas(name) + "', '" + db_pas(sub) + "', 'O')")
db_com()
rd_plus(name, sub, time)
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/error/3'))
@route('/topic//sub//agree')
def topic_agree(name = None, sub = None):
if(admin_check(3) == 1):
ip = ip_check()
db_ex("select id from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
topic_check = db_get()
if(topic_check):
time = get_time()
db_ex("select * from agreedis where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
agree = db_get()
if(agree):
db_ex("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Settlement', '" + db_pas(time) + "', '" + db_pas(ip) + " - Settlement', '', '')")
db_ex("delete from agreedis where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
else:
db_ex("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + db_pas(str(int(topic_check[0]['id']) + 1)) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', 'Agreement', '" + db_pas(time) + "', '" + db_pas(ip) + " - Agreement', '', '')")
db_ex("insert into agreedis (title, sub) value ('" + db_pas(name) + "', '" + db_pas(sub) + "')")
db_com()
rd_plus(name, sub, time)
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/error/3'))
@route('/topic//sub/', method=['POST', 'GET'])
def topic(name = None, sub = None):
ip = ip_check()
ban = topic_check(ip, name, sub)
admin = admin_check(3)
if(request.method == 'POST'):
db_ex("select id from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
rows = db_get()
if(rows):
number = int(rows[0]['id']) + 1
else:
number = 1
if(ban == 1 and not admin == 1):
return(redirect('/ban'))
else:
db_ex("select * from user where id = '" + db_pas(ip) + "'")
rows = db_get()
if(rows):
if(not rows[0]['acl'] == 'user'):
ip = ip + ' - Admin'
today = get_time()
rd_plus(name, sub, today)
aa = request.forms.content
aa = re.sub("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", "[br]", aa)
aa = savemark(aa)
db_ex("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + str(number) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', '" + db_pas(aa) + "', '" + today + "', '" + ip + "', '', '')")
db_com()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
style = ''
db_ex("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = 'O'")
close = db_get()
db_ex("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = ''")
stop = db_get()
if(admin == 1):
div = '
'
if(close):
div += '(토론 열기) '
else:
div += '(토론 닫기) '
if(stop):
div += '(토론 재개) '
else:
div += '(토론 정지) '
db_ex("select * from agreedis where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
agree = db_get()
if(agree):
div += '(합의 취소)'
else:
div += '(합의 완료)'
div += '
'
else:
div = '
'
if(stop or close):
if(not admin == 1):
style = 'display:none;'
db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 asc")
rows = db_get()
db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and top = 'O' order by id + 0 asc")
top = db_get()
i = 0
if(top):
while(True):
try:
top_data = namumark('', top[i]['data'])
top_data = re.sub("(?P#(?:[0-9]*))", '\g', top_data)
ip = ip_pas(top[i]['ip'], 1)
div += '
'
break
return(template('vstopic', 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, ban = ban, style = style, sub = '토론'))
@route('/topic//close')
def close_topic_list(name = None):
div = '
'
i = 0
db_ex("select * from stop where title = '" + db_pas(name) + "' and close = 'O' order by sub asc")
rows = db_get()
while(True):
try:
db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(rows[i]['sub']) + "' and id = '1'")
row = db_get()
if(row):
indata = namumark(name, row[0]['data'])
if(row[0]['block'] == 'O'):
indata = '블라인드 되었습니다.'
block = 'id="block"'
else:
block = ''
ip = ip_pas(row[0]['ip'], 1)
div += '
'
break
return(template('topic', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], plus = div, sub = '닫힘'))
@route('/topic//agree')
def agree_topic_list(name = None):
div = '
'
i = 0
db_ex("select * from agreedis where title = '" + db_pas(name) + "' order by sub asc")
agree_list = db_get()
while(True):
try:
db_ex("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(agree_list[i]['sub']) + "' and id = '1'")
data = db_get()
if(data):
indata = namumark(name, data[0]['data'])
if(data[0]['block'] == 'O'):
indata = '블라인드 되었습니다.'
block = 'id="block"'
else:
block = ''
ip = ip_pas(data[0]['ip'], 1)
div += '
'
break
return(template('topic', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], plus = div, sub = '합의'))
@route('/topic/', method=['POST', 'GET'])
def topic_list(name = None):
if(request.method == 'POST'):
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(request.forms.topic)))
else:
div = '
'
i = 0
j = 1
db_ex("select * from rd where title = '" + db_pas(name) + "' order by date asc")
rows = db_get()
while(True):
try:
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")
aa = db_get()
indata = namumark(name, aa[0]['data'])
if(aa[0]['block'] == 'O'):
indata = '블라인드 되었습니다.'
block = 'id="block"'
else:
block = ''
ip = ip_pas(aa[0]['ip'], 1)
db_ex("select * from stop where title = '" + db_pas(rows[i]['title']) + "' and sub = '" + db_pas(rows[i]['sub']) + "' and close = 'O'")
row = db_get()
if(not row):
div += '
'
break
return(template('topic', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], plus = div, list = 1, sub = '토론 목록'))
@route('/login', method=['POST', 'GET'])
def login():
session = request.environ.get('beaker.session')
ip = ip_check()
ban = ban_check(ip)
if(request.method == 'POST'):
if(ban == 1):
return(redirect('/ban'))
else:
db_ex("select * from user where id = '" + db_pas(request.forms.id) + "'")
user = db_get()
if(user):
if(session.get('Now') == True):
return(redirect('/error/11'))
elif(bcrypt.checkpw(bytes(request.forms.pw, 'utf-8'), bytes(user[0]['pw'], 'utf-8'))):
session['Now'] = True
session['DREAMER'] = request.forms.id
db_ex("select * from custom where user = '" + db_pas(request.forms.id) + "'")
css_data = db_get()
if(css_data):
session['Daydream'] = css_data[0]['css']
else:
session['Daydream'] = ''
db_ex("insert into login (user, ip, today) value ('" + db_pas(request.forms.id) + "', '" + db_pas(ip) + "', '" + db_pas(get_time()) + "')")
db_com()
return(redirect('/user'))
else:
return(redirect('/error/13'))
else:
return(redirect('/error/12'))
else:
if(ban == 1):
return(redirect('/ban'))
else:
if(session.get('Now') == True):
return(redirect('/error/11'))
else:
return(template('login', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = '로그인', enter = '로그인', logo = set_data['name']))
@route('/change', method=['POST', 'GET'])
def change_password():
ip = ip_check()
ban = ban_check(ip)
if(request.method == 'POST'):
if(request.forms.pw2 == request.forms.pw3):
if(ban == 1):
return(redirect('/ban'))
else:
db_ex("select * from user where id = '" + db_pas(request.forms.id) + "'")
user = db_get()
if(user):
if(not re.search('\.', ip)):
return(redirect('/logout'))
elif(bcrypt.checkpw(bytes(request.forms.pw, 'utf-8'), bytes(user[0]['pw'], 'utf-8'))):
hashed = bcrypt.hashpw(bytes(request.forms.pw2, 'utf-8'), bcrypt.gensalt())
db_ex("update user set pw = '" + db_pas(hashed.decode()) + "' where id = '" + db_pas(request.forms.id) + "'")
db_com()
return(redirect('/login'))
else:
return(redirect('/error/10'))
else:
return(redirect('/error/9'))
else:
return(redirect('/error/20'))
else:
if(ban == 1):
return(redirect('/ban'))
else:
if(not re.search('\.', ip)):
return(redirect('/logout'))
else:
return(template('login', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = '비밀번호 변경', enter = '변경', logo = set_data['name']))
@route('/check/')
def user_check(name = None):
db_ex("select * from user where id = '" + db_pas(name) + "'")
user = db_get()
if(user and not user[0]['acl'] == 'user'):
return(redirect('/error/4'))
else:
if(admin_check(4) == 1):
m = re.search('^(?:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}?)$', name)
if(m):
db_ex("select * from login where ip = '" + db_pas(name) + "' order by today desc")
row = db_get()
if(row):
i = 0
c = '
이름
아이피
언제
'
while(True):
try:
c += '
' + row[i]['user'] + '
' + row[i]['ip'] + '
' + row[i]['today'] + '
'
i += 1
except:
c += '
'
break
else:
c = ' None'
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = '다중 검사', logo = set_data['name'], data = c))
else:
db_ex("select * from login where user = '" + db_pas(name) + "' order by today desc")
row = db_get()
if(row):
i = 0
c = '
이름
아이피
언제
'
while(True):
try:
c += '
' + row[i]['user'] + '
' + row[i]['ip'] + '
' + row[i]['today'] + '
'
i += 1
except:
c += '
'
break
else:
c = ' None'
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = '다중 검사', logo = set_data['name'], data = c))
else:
return(redirect('/error/3'))
@route('/register', method=['POST', 'GET'])
def register():
ip = ip_check()
ban = ban_check(ip)
if(request.method == 'POST'):
if(request.forms.pw == request.forms.pw2):
if(ban == 1):
return(redirect('/ban'))
else:
m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.forms.id)
if(m):
return(redirect('/error/8'))
else:
if(len(request.forms.id) > 20):
return(redirect('/error/7'))
else:
db_ex("select * from user where id = '" + db_pas(request.forms.id) + "'")
rows = db_get()
if(rows):
return(redirect('/error/6'))
else:
hashed = bcrypt.hashpw(bytes(request.forms.pw, 'utf-8'), bcrypt.gensalt())
db_ex("select * from user limit 1")
user_ex = db_get()
if(not user_ex):
db_ex("insert into user (id, pw, acl) value ('" + db_pas(request.forms.id) + "', '" + db_pas(hashed.decode()) + "', 'owner')")
else:
db_ex("insert into user (id, pw, acl) value ('" + db_pas(request.forms.id) + "', '" + db_pas(hashed.decode()) + "', 'user')")
db_com()
return(redirect('/login'))
else:
return(redirect('/error/20'))
else:
if(ban == 1):
return(redirect('/ban'))
else:
return(template('login', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = '회원가입', enter = '회원가입', logo = set_data['name']))
@route('/logout')
def logout():
session = request.environ.get('beaker.session')
session['Now'] = False
session.pop('DREAMER', None)
return(redirect('/user'))
@route('/ban/', method=['POST', 'GET'])
def user_ban(name = None):
db_ex("select * from user where id = '" + db_pas(name) + "'")
user = db_get()
if(user and not user[0]['acl'] == 'user'):
return(redirect('/error/4'))
else:
if(request.method == 'POST'):
if(admin_check(1) == 1):
ip = ip_check()
if(not re.search("[0-9]{4}-[0-9]{2}-[0-9]{2}", request.forms.end)):
end = ''
else:
end = request.forms.end
db_ex("select * from ban where block = '" + db_pas(name) + "'")
row = db_get()
if(row):
rb_plus(name, '해제', get_time(), ip, '')
db_ex("delete from ban where block = '" + db_pas(name) + "'")
else:
b = re.search("^([0-9]{1,3}\.[0-9]{1,3})$", name)
if(b):
rb_plus(name, end, get_time(), ip, request.forms.why)
db_ex("insert into ban (block, end, why, band) value ('" + db_pas(name) + "', '" + db_pas(end) + "', '" + db_pas(request.forms.why) + "', 'O')")
else:
rb_plus(name, end, get_time(), ip, request.forms.why)
db_ex("insert into ban (block, end, why, band) value ('" + db_pas(name) + "', '" + db_pas(end) + "', '" + db_pas(request.forms.why) + "', '')")
db_com()
return(redirect('/'))
else:
return(redirect('/error/3'))
else:
if(admin_check(1) == 1):
db_ex("select * from ban where block = '" + db_pas(name) + "'")
row = db_get()
if(row):
now = '차단 해제'
else:
b = re.search("^([0-9]{1,3}\.[0-9]{1,3})$", name)
if(b):
now = '대역 차단'
else:
now = '차단'
return(template('ban', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], now = now, today = get_time(), sub = '차단'))
else:
return(redirect('/error/3'))
@route('/acl/', method=['POST', 'GET'])
def acl(name = None):
if(request.method == 'POST'):
if(admin_check(5) == 1):
db_ex("select acl from data where title = '" + db_pas(name) + "'")
row = db_get()
if(row):
if(request.forms.select == 'admin'):
db_ex("update data set acl = 'admin' where title = '" + db_pas(name) + "'")
elif(request.forms.select == 'user'):
db_ex("update data set acl = 'user' where title = '" + db_pas(name) + "'")
else:
db_ex("update data set acl = '' where title = '" + db_pas(name) + "'")
db_com()
return(redirect('/w/' + url_pas(name)) )
else:
return(redirect('/error/3'))
else:
if(admin_check(5) == 1):
db_ex("select acl from data where title = '" + db_pas(name) + "'")
row = db_get()
if(row):
if(row[0]['acl'] == 'admin'):
now = '관리자만'
elif(row[0]['acl'] == 'user'):
now = '로그인 이상'
else:
now = '일반'
return(template('acl', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, page = url_pas(name), logo = set_data['name'], now = '현재 ACL 상태는 ' + now, sub = 'ACL'))
else:
return(redirect('/w/' + url_pas(name)) )
else:
return(redirect('/error/3'))
@route('/admin/', method=['POST', 'GET'])
def user_admin(name = None):
if(request.method == 'POST'):
if(admin_check(None) == 1):
db_ex("select * from user where id = '" + db_pas(name) + "'")
user = db_get()
if(user):
if(not user[0]['acl'] == 'user'):
db_ex("update user set acl = 'user' where id = '" + db_pas(name) + "'")
else:
db_ex("update user set acl = '" + db_pas(request.forms.select) + "' where id = '" + db_pas(name) + "'")
db_com()
return(redirect('/'))
else:
return(redirect('/error/5'))
else:
return(redirect('/error/3'))
else:
if(admin_check(None) == 1):
db_ex("select * from user where id = '" + db_pas(name) + "'")
user = db_get()
if(user):
if(not user[0]['acl'] == 'user'):
now = '권한 해제'
else:
now = '권한 부여'
div = ''
db_ex('select name from alist order by name asc')
get_alist = db_get()
if(get_alist):
i = 0
name_rem = ''
while(True):
try:
if(not name_rem == get_alist[i]['name']):
name_rem = get_alist[i]['name']
div += ''
i += 1
except:
break
return(template('admin', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, page = url_pas(name), datalist = div, logo = set_data['name'], now = now, sub = '권한 부여'))
else:
return(redirect('/error/5'))
else:
return(redirect('/error/3'))
@route('/ban')
def are_you_ban():
ip = ip_check()
if(ban_check(ip) == 1):
db_ex("select * from ban where block = '" + db_pas(ip) + "'")
rows = db_get()
if(rows):
if(rows[0]['end']):
end = rows[0]['end'] + ' 까지 차단 상태 입니다. / 사유 : ' + rows[0]['why']
now = re.sub(':', '', get_time())
now = re.sub('\-', '', now)
now = int(re.sub(' ', '', now))
day = re.sub('\-', '', rows[0]['end'])
if(now >= int(day + '000000')):
db_ex("delete from ban where block = '" + db_pas(ip) + "'")
db_com()
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_ex("select * from ban where block = '" + db_pas(results[0]) + "' and band = 'O'")
row = db_get()
if(row):
if(row[0]['end']):
end = row[0]['end'] + ' 까지 차단 상태 입니다. / 사유 : ' + rows[0]['why']
now = re.sub(':', '', get_time())
now = re.sub('\-', '', now)
now = int(re.sub(' ', '', now))
day = re.sub('\-', '', row[0]['end'])
if(now >= int(day + '000000')):
db_ex("delete from ban where block = '" + db_pas(results[0]) + "' and band = 'O'")
db_com()
end = '차단이 풀렸습니다. 다시 시도 해 보세요.'
else:
end = '영구 차단 상태 입니다. / 사유 : ' + row[0]['why']
else:
end = '권한이 맞지 않는 상태 입니다.'
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = '권한 오류', logo = set_data['name'], data = end))
@route('/w//r//diff/')
def diff_data(name = None, a = None, b = None):
db_ex("select * from history where id = '" + db_pas(str(a)) + "' and title = '" + db_pas(name) + "'")
a_raw_data = db_get()
if(a_raw_data):
db_ex("select * from history where id = '" + db_pas(str(b)) + "' and title = '" + db_pas(name) + "'")
b_raw_data = db_get()
if(b_raw_data):
a_data = re.sub('<', '<', a_raw_data[0]['data'])
a_data = re.sub('>', '>', a_data)
a_data = re.sub('"', '"', a_data)
b_data = re.sub('<', '<', b_raw_data[0]['data'])
b_data = re.sub('>', '>', b_data)
b_data = re.sub('"', '"', b_data)
diff_data = difflib.SequenceMatcher(None, a_data, b_data)
result = diff(diff_data)
result = '
' + result + '
'
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, logo = set_data['name'], data = result, sub = '비교', page = url_pas(name)))
else:
return(redirect('/history/' + url_pas(name)))
else:
return(redirect('/history/' + url_pas(name)))
@route('/w/')
@route('/w//from/')
def read_view(name = None, redirect = None):
i = 0
db_ex("select * from rd where title = '" + db_pas(name) + "' order by date asc")
rows = db_get()
while(True):
try:
a = rows[i]
except:
topic = ""
break
db_ex("select * from stop where title = '" + db_pas(rows[i]['title']) + "' and sub = '" + db_pas(rows[i]['sub']) + "' and close = 'O'")
row = db_get()
if(not row):
topic = "open"
break
else:
i += 1
acl = ''
m = re.search("^(.*)\/(.*)$", name)
if(m):
g = m.groups()
uppage = g[0]
style = ""
else:
uppage = ""
style = "display:none;"
if(admin_check(5) == 1):
admin_memu = 'ACL'
else:
admin_memu = ''
if(re.search("^분류:", name)):
db_ex("select * from cat where title = '" + db_pas(name) + "' order by cat asc")
rows = db_get()
if(rows):
div = ''
i = 0
while(True):
try:
a = rows[i]
except:
break
db_ex("select * from data where title = '" + db_pas(rows[i]['cat']) + "'")
row = db_get()
if(row):
aa = row[0]['data']
aa = namumark('', 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 += '
'
i += 1
else:
db_ex("delete from cat where title = '" + db_pas(name) + "' and cat = '" + db_pas(rows[i]['cat']) + "'")
db_com()
i += 1
else:
db_ex("delete from cat where title = '" + db_pas(name) + "' and cat = '" + db_pas(rows[i]['cat']) + "'")
db_com()
i += 1
else:
db_ex("delete from cat where title = '" + db_pas(name) + "' and cat = '" + db_pas(rows[i]['cat']) + "'")
db_com()
i += 1
else:
db_ex("delete from cat where title = '" + db_pas(name) + "' and cat = '" + db_pas(rows[i]['cat']) + "'")
db_com()
i += 1
div = '
분류
' + div
else:
div = ''
else:
div = ''
db_ex("select * from data where title = '" + db_pas(name) + "'")
rows = db_get()
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_ex("select * from user where id = '" + db_pas(g[0]) + "'")
test = db_get()
if(test):
if(test[0]['acl'] == 'owner'):
acl = '(소유자)'
elif(test[0]['acl'] == 'admin'):
acl = '(관리자)'
db_ex("select * from ban where block = '" + db_pas(g[0]) + "'")
user = db_get()
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 = namumark(name, elsedata)
return(template('read', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata + div, acl = acl, uppage = uppage, style = style, topic = topic, redirect = redirect, admin = admin_memu))
else:
m = re.search("^사용자:(.*)$", name)
if(m):
g = m.groups()
db_ex("select * from ban where block = '" + db_pas(g[0]) + "'")
user = db_get()
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]' + 'None'
else:
elsedata = 'None'
else:
elsedata = 'None'
if(redirect):
elsedata = re.sub("^#(?:redirect|넘겨주기)\s(?P[^\n]*)", " * [[\g]] 문서로 넘겨주기", elsedata)
return(template('read', 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, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, admin = admin_memu, data_none = True))
@route('/user//topic')
@route('/user//topic/')
def user_topic_list(name = None, num = 1):
v = num * 50
i = v - 50
ydmin = admin_check(1)
div = '
토론명
작성자
시간
'
db_ex("select * from topic where ip = '" + db_pas(name) + "' or ip = '" + db_pas(name) + " - Admin' order by date desc")
rows = db_get()
if(rows):
while(True):
try:
title = re.sub('<', '<', rows[i]['title'])
title = re.sub('>', '>', title)
title = re.sub('"', '"', title)
sub = re.sub('<', '<', rows[i]['sub'])
sub = re.sub('>', '>', sub)
sub = re.sub('"', '"', sub)
if(ydmin == 1):
db_ex("select * from ban where block = '" + db_pas(rows[i]['ip']) + "'")
row = db_get()
if(row):
ban = ' (해제)'
else:
ban = ' (차단)'
else:
ban = ''
ip = ip_pas(rows[i]['ip'], 1)
div += '
' + title + ' (' + sub + ') (#' + rows[i]['id'] + ')
' + ip + ban + '
' + rows[i]['date'] + '
'
if(i == v):
div = div + '
'
if(num == 1):
div += ' (다음)'
else:
div += ' (이전)(다음)'
break
i += 1
except:
div += '
'
if(num != 1):
div += ' (이전)'
break
else:
div = ' None'
db_ex("select end, why from ban where block = '" + db_pas(name) + "'")
ban_it = db_get()
if(ban_it):
div = namumark('', '{{{#!wiki style="border:2px solid red;padding:10px;"\r\n{{{+2 {{{#red 이 사용자는 차단 당했습니다.}}}}}}\r\n\r\n차단 해제 일 : ' + ban_it[0]['end'] + '[br]사유 : ' + ban_it[0]['why'] + '}}}') + ' ' + div
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), logo = set_data['name'], data = div, title = '사용자 토론 기록'))
@route('/user')
def user_info():
ip = ip_check()
raw_ip = ip
db_ex("select * from user where id = '" + db_pas(ip) + "'")
rows = db_get()
if(ban_check(ip) == 0):
if(rows):
if(not rows[0]['acl'] == 'user'):
acl = rows[0]['acl']
else:
acl = '로그인'
else:
acl = '일반'
else:
acl = '차단'
ip = ip_pas(ip, 2)
return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = '사용자 메뉴', logo = set_data['name'], data = ip + '