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 redirect(data):
return('')
from func import *
from mark import *
db_pas = pymysql.escape_string
r_ver = '2.1.6'
try:
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
curs.execute('select data from other where name = "version"')
version = curs.fetchall()
if(version):
t_ver = re.sub('\.', '', version[0]['data'])
r_t_ver = re.sub('\.', '', r_ver)
if(int(t_ver) <= int(r_t_ver)):
curs.execute("update other set data = '" + db_pas(r_ver) + "' where name = 'version'")
conn.commit()
conn.commit()
conn.close()
except:
pass
@route('/setup', method=['GET', 'POST'])
def setup():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4'
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(request.method == 'POST'):
if(not request.forms.owner == set_data['pw']):
conn.close()
return(redirect('/error/3'))
else:
try:
curs.execute("use " + set_data['db'])
except:
curs.execute("create database " + set_data['db'])
curs.execute("use " + set_data['db'])
curs.execute("alter database " + set_data['db'] + " character set = utf8mb4 collate = utf8mb4_unicode_ci")
curs.execute("create table data(title text, data longtext, acl text)")
curs.execute("create table history(id text, title text, data longtext, date text, ip text, send text, leng text)")
curs.execute("create table rd(title text, sub text, date text)")
curs.execute("create table user(id text, pw text, acl text)")
curs.execute("create table ban(block text, end text, why text, band text)")
curs.execute("create table topic(id text, title text, sub text, data longtext, date text, ip text, block text, top text)")
curs.execute("create table stop(title text, sub text, close text)")
curs.execute("create table rb(block text, end text, today text, blocker text, why text)")
curs.execute("create table login(user text, ip text, today text)")
curs.execute("create table back(title text, link text, type text)")
curs.execute("create table cat(title text, cat text)")
curs.execute("create table hidhi(title text, re text)")
curs.execute("create table agreedis(title text, sub text)")
curs.execute("create table custom(user text, css longtext)")
curs.execute("create table other(name text, data text)")
curs.execute("create table alist(name text, acl text)")
curs.execute("delete from alist where name = 'owner'")
curs.execute("insert into alist (name, acl) value ('owner', 'owner')")
curs.execute("delete from other where name = 'version'")
curs.execute("insert into other (name, data) value ('version', '" + db_pas(r_ver) + "')")
conn.commit()
conn.close()
return(redirect('/'))
else:
conn.close()
return(
template('other',
custom = custom_css_user(),
license = set_data['license'],
login = login_check(),
logo = set_data['name'],
data = '
',
title = '오픈나무 설치'
)
)
@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():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
div = '
'
i = 0
curs.execute("select title, acl from data where acl = 'admin' or acl = 'user' order by acl desc")
list_data = curs.fetchall()
if(list_data):
for data in list_data:
if(data['acl'] == 'admin'):
acl = '관리자'
else:
acl = '로그인'
div += '
'
else:
div = '(생성)'
conn.close()
return(
template('other',
custom = custom_css_user(),
license = set_data['license'],
login = login_check(),
logo = set_data['name'],
data = div,
title = 'ACL 목록'
)
)
@route('/adminplus/', method=['POST', 'GET'])
def admin_plus(name = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(admin_check(None) == 1):
if(request.method == 'POST'):
curs.execute("delete from alist where name = '" + db_pas(name) + "'")
if(request.forms.ban):
curs.execute("insert into alist (name, acl) value ('" + db_pas(name) + "', 'ban')")
if(request.forms.mdel):
curs.execute("insert into alist (name, acl) value ('" + db_pas(name) + "', 'mdel')")
if(request.forms.toron):
curs.execute("insert into alist (name, acl) value ('" + db_pas(name) + "', 'toron')")
if(request.forms.check):
curs.execute("insert into alist (name, acl) value ('" + db_pas(name) + "', 'check')")
if(request.forms.acl):
curs.execute("insert into alist (name, acl) value ('" + db_pas(name) + "', 'acl')")
if(request.forms.hidel):
curs.execute("insert into alist (name, acl) value ('" + db_pas(name) + "', 'hidel')")
if(request.forms.owner):
curs.execute("insert into alist (name, acl) value ('" + db_pas(name) + "', 'owner')")
conn.commit()
conn.close()
return(redirect('/adminplus/admin'))
else:
curs.execute('select acl from alist where name = "' + db_pas(name) + '"')
test = curs.fetchall()
data = ''
exist_list = ['', '', '', '', '', '', '', '', '']
for go in test:
if(go['acl'] == 'ban'):
exist_list[0] = 'checked="checked"'
elif(go['acl'] == 'mdel'):
exist_list[1] = 'checked="checked"'
elif(go['acl'] == 'toron'):
exist_list[2] = 'checked="checked"'
elif(go['acl'] == 'check'):
exist_list[3] = 'checked="checked"'
elif(go['acl'] == 'acl'):
exist_list[4] = 'checked="checked"'
elif(go['acl'] == 'hidel'):
exist_list[5] = 'checked="checked"'
elif(go['acl'] == 'owner'):
exist_list[7] = 'checked="checked"'
data += '
차단
'
data += '
많은 문서 삭제
'
data += '
토론 관리
'
data += '
사용자 검사
'
data += '
문서 ACL
'
data += '
역사 숨김
'
data += '
소유자
'
conn.close()
return(
template('other',
custom = custom_css_user(),
license = set_data['license'],
login = login_check(),
title = '관리 그룹 추가',
logo = set_data['name'],
data = ''
)
)
else:
conn.close()
return(redirect('/error/3'))
@route('/adminlist')
def admin_list():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
i = 1
div = '
'
curs.execute("select * from user where not acl = 'user'")
user_data = curs.fetchall()
if(user_data):
for data in user_data:
name = ip_pas(data['id'], 2) + ' (' + data['acl'] + ')'
div += '
' + str(i) + '. ' + name + '
'
i += 1
else:
div += '
'
conn.close()
return(
template('other',
custom = custom_css_user(),
license = set_data['license'],
login = login_check(),
logo = set_data['name'],
data = div,
title = '관리자 목록'
)
)
else:
conn.close()
return(
template('other',
custom = custom_css_user(),
license = set_data['license'],
login = login_check(),
logo = set_data['name'],
title = '관리자 목록'
)
)
@route('/recentchanges')
def recentchanges():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
ydmin = admin_check(1)
zdmin = admin_check(6)
div = '
\
\
\
\
문서명
\
기여자
\
시간
\
'
curs.execute("select id, title, date, ip, send, leng from history order by date desc limit 50")
rows = curs.fetchall()
if(rows):
for data in rows:
if(data['send']):
if(re.search("^(?: *)$", data['send'])):
send = ' '
else:
send = data['send']
else:
send = ' '
title = data['title']
title = re.sub('<', '<', title)
title = re.sub('>', '>', title)
title = re.sub('"', '"', title)
m = re.search("\+", data['leng'])
n = re.search("\-", data['leng'])
if(m):
leng = '' + data['leng'] + ''
elif(n):
leng = '' + data['leng'] + ''
else:
leng = '' + data['leng'] + ''
if(ydmin == 1):
curs.execute("select * from ban where block = '" + db_pas(data['ip']) + "'")
row = curs.fetchall()
if(row):
ban = ' (해제)'
else:
ban = ' (차단)'
else:
ban = ''
ip = ip_pas(data['ip'], None)
if((int(data['id']) - 1) == 0):
revert = ''
else:
revert = '(비교)(되돌리기)'
style = ''
if(zdmin == 1):
curs.execute("select * from hidhi where title = '" + db_pas(data['title']) + "' and re = '" + db_pas(data['id']) + "'")
row = curs.fetchall()
if(row):
ip += ' (숨김)'
hidden = ' (공개)'
else:
hidden = ' (숨김)'
else:
curs.execute("select * from hidhi where title = '" + db_pas(data['title']) + "' and re = '" + db_pas(data['id']) + "'")
row = curs.fetchall()
if(row):
ip = '숨김'
hidden = ''
send = '숨김'
ban = ''
style = 'display:none;'
else:
hidden = ''
div += '
'
else:
div = 'None \
'
div += ' \
(이전)(이후)'
curs.execute("select end, why from ban where block = '" + db_pas(name) + "'")
ban_it = curs.fetchall()
if(ban_it):
sub = '차단'
else:
sub = None
conn.close()
return(
template('other',
custom = custom_css_user(),
license = set_data['license'],
login = login_check(),
logo = set_data['name'],
data = div,
title = '사용자 기록',
sub = sub
)
)
@route('/userlog')
@route('/userlog/n/')
def user_log(num = 1):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(num * 50 <= 0):
i = 50
else:
i = num * 50
j = i - 50
list_data = ''
ydmin = admin_check(1)
curs.execute("select * from user limit " + str(j) + ", " + str(i))
user_list = curs.fetchall()
for data in user_list:
if(ydmin == 1):
curs.execute("select * from ban where block = '" + db_pas(data['id']) + "'")
ban_exist = curs.fetchall()
if(ban_exist):
ban_button = ' (해제)'
else:
ban_button = ' (차단)'
else:
ban_button = ''
ip = ip_pas(data['id'], None)
list_data += '
' + str(j + 1) + '. ' + ip + ban_button + '
'
j += 1
else:
list_data += ' \
(이전)(이후)'
conn.close()
return(
template('other',
custom = custom_css_user(),
license = set_data['license'],
login = login_check(),
logo = set_data['name'],
data = list_data,
title = '사용자 가입 기록'
)
)
@route('/backreset')
def xref_reset():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(admin_check(None) == 1):
curs.execute("delete from back")
curs.execute("delete from cat")
conn.commit()
curs.execute("select title, data from data")
data = curs.fetchall()
for end in data:
print(end['title'])
namumark(end['title'], end['data'], 1)
conn.close()
return(redirect('/'))
else:
conn.close()
return(redirect('/error/3'))
@route('/xref/')
@route('/xref//n/')
def xref(name = None, num = 1):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(num * 50 <= 0):
v = 50
else:
v = num * 50
i = v - 50
div = ''
curs.execute("delete from back where title = '" + db_pas(name) + "' and link = ''")
conn.commit()
curs.execute("select * from back where title = '" + db_pas(name) + "' order by link asc limit " + str(i) + ", " + str(v))
rows = curs.fetchall()
for data in rows:
div += '
'
else:
div += ''
else:
div += ' \
(이전)(이후)'
conn.close()
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),
sub = '역링크'
)
)
@route('/recentdiscuss')
def recentdiscuss():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
div = '
\
\
\
\
토론명
\
시간
\
'
curs.execute("select * from rd order by date desc limit 50")
rows = curs.fetchall()
for data in rows:
title = data['title']
title = re.sub('<', '<', title)
title = re.sub('>', '>', title)
title = re.sub('"', '"', title)
sub = data['sub']
sub = re.sub('<', '<', sub)
sub = re.sub('>', '>', sub)
sub = re.sub('"', '"', sub)
div += '
\
\
(이전)(이후)'
conn.close()
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():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
curs.execute("select title from data where title = '" + db_pas(request.forms.search) + "'")
data = curs.fetchall()
conn.close()
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):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(num * 50 <= 0):
v = num * 50
else:
v = 50
i = v - 50
div = ''
div_plus = ''
end = ''
curs.execute("select title from data where title like '%" + db_pas(name) + "%'")
title_list = curs.fetchall()
curs.execute("select title from data where data like '%" + db_pas(name) + "%'")
data_list = curs.fetchall()
curs.execute("select title from data where title = '" + db_pas(name) + "'")
exist = curs.fetchall()
if(exist):
div = '
'
else:
data = 'None'
conn.close()
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):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(admin_check(3) == 1):
curs.execute("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
block = curs.fetchall()
if(block):
if(block[0]['block'] == 'O'):
curs.execute("update topic set block = '' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
else:
curs.execute("update topic set block = 'O' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
conn.commit()
rd_plus(
name,
sub,
get_time()
)
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
conn.close()
return(redirect('/error/3'))
@route('/topic//sub//notice/')
def topic_top(name = None, sub = None, num = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(admin_check(3) == 1):
curs.execute("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
topic_data = curs.fetchall()
if(topic_data):
curs.execute("select * from topic where id = '" + str(num) + "' and title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
top_data = curs.fetchall()
if(top_data):
if(top_data[0]['top'] == 'O'):
curs.execute("update topic set top = '' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
else:
curs.execute("update topic set top = 'O' where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and id = '" + str(num) + "'")
conn.commit()
rd_plus(
name,
sub,
get_time()
)
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
conn.close()
return(redirect('/error/3'))
@route('/topic//sub//stop')
def topic_stop(name = None, sub = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(admin_check(3) == 1):
ip = ip_check()
curs.execute("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
topic_check = curs.fetchall()
if(topic_check):
time = get_time()
curs.execute("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = ''")
stop = curs.fetchall()
if(stop):
curs.execute("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) + "', '토론 재 시작', '" + db_pas(time) + "', '" + db_pas(ip) + "', '', '1')")
curs.execute("delete from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = ''")
else:
curs.execute("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) + "', '토론 정지', '" + db_pas(time) + "', '" + db_pas(ip) + "', '', '1')")
curs.execute("insert into stop (title, sub, close) value ('" + db_pas(name) + "', '" + db_pas(sub) + "', '')")
conn.commit()
rd_plus(
name,
sub,
time
)
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
conn.close()
return(redirect('/error/3'))
@route('/topic//sub//close')
def topic_close(name = None, sub = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(admin_check(3) == 1):
ip = ip_check()
curs.execute("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
topic_check = curs.fetchall()
if(topic_check):
time = get_time()
curs.execute("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = 'O'")
close = curs.fetchall()
if(close):
curs.execute("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) + "', '토론 다시 열기', '" + db_pas(time) + "', '" + db_pas(ip) + "', '', '1')")
curs.execute("delete from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = 'O'")
else:
curs.execute("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) + "', '토론 닫음', '" + db_pas(time) + "', '" + db_pas(ip) + "', '', '1')")
curs.execute("insert into stop (title, sub, close) value ('" + db_pas(name) + "', '" + db_pas(sub) + "', 'O')")
conn.commit()
rd_plus(
name,
sub,
time
)
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
conn.close()
return(redirect('/error/3'))
@route('/topic//sub//agree')
def topic_agree(name = None, sub = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(admin_check(3) == 1):
ip = ip_check()
curs.execute("select id from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
topic_check = curs.fetchall()
if(topic_check):
time = get_time()
curs.execute("select * from agreedis where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
agree = curs.fetchall()
if(agree):
curs.execute("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) + "', '합의 결렬', '" + db_pas(time) + "', '" + db_pas(ip) + "', '', '1')")
curs.execute("delete from agreedis where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
else:
curs.execute("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) + "', '합의 완료', '" + db_pas(time) + "', '" + db_pas(ip) + "', '', '1')")
curs.execute("insert into agreedis (title, sub) value ('" + db_pas(name) + "', '" + db_pas(sub) + "')")
conn.commit()
rd_plus(
name,
sub,
time
)
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
conn.close()
return(redirect('/error/3'))
@route('/topic//sub/', method=['POST', 'GET'])
def topic(name = None, sub = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
ip = ip_check()
ban = topic_check(ip, name, sub)
admin = admin_check(3)
if(request.method == 'POST'):
curs.execute("select id from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 desc limit 1")
rows = curs.fetchall()
if(rows):
num = int(rows[0]['id']) + 1
else:
num = 1
if(ban == 1 and not admin == 1):
conn.close()
return(redirect('/ban'))
else:
today = get_time()
rd_plus(
name,
sub,
today
)
aa = re.sub("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", "[br]", request.forms.content)
aa = savemark(aa)
curs.execute("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + str(num) + "', '" + db_pas(name) + "', '" + db_pas(sub) + "', '" + db_pas(aa) + "', '" + today + "', '" + ip + "', '', '')")
conn.commit()
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
style = ''
curs.execute("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = 'O'")
close = curs.fetchall()
curs.execute("select * from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and close = ''")
stop = curs.fetchall()
if(admin == 1):
div = '
'
if(close):
div += '(토론 열기) '
else:
div += '(토론 닫기) '
if(stop):
div += '(토론 재개) '
else:
div += '(토론 정지) '
curs.execute("select * from agreedis where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "'")
agree = curs.fetchall()
if(agree):
div += '(합의 취소)'
else:
div += '(합의 완료)'
div += '
'
else:
div = '
'
if(stop or close):
if(not admin == 1):
style = 'display:none;'
curs.execute("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' order by id + 0 asc")
toda = curs.fetchall()
curs.execute("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(sub) + "' and top = 'O' order by id + 0 asc")
top = curs.fetchall()
if(top):
for dain in top:
top_data = namumark('', dain['data'], 0)
top_data = re.sub("(?P#(?:[0-9]*))", '\g', top_data)
ip = ip_pas(dain['ip'], 1)
div += '
\
'
i += 1
conn.close()
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):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
div = '
'
i = 0
curs.execute("select * from stop where title = '" + db_pas(name) + "' and close = 'O' order by sub asc")
rows = curs.fetchall()
for data in rows:
curs.execute("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(data['sub']) + "' and id = '1'")
row = curs.fetchall()
if(row):
indata = namumark(name, row[0]['data'], 0)
if(row[0]['block'] == 'O'):
indata = ' '
block = 'id="block"'
else:
block = ''
ip = ip_pas(row[0]['ip'], 1)
div += '
'
conn.close()
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):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
div = '
'
i = 0
curs.execute("select * from agreedis where title = '" + db_pas(name) + "' order by sub asc")
agree_list = curs.fetchall()
for data in agree_list:
curs.execute("select * from topic where title = '" + db_pas(name) + "' and sub = '" + db_pas(data['sub']) + "' and id = '1'")
topic_data = curs.fetchall()
if(topic_data):
indata = namumark(name, topic_data[0]['data'], 0)
if(topic_data[0]['block'] == 'O'):
indata = ' '
block = 'id="block"'
else:
block = ''
ip = ip_pas(topic_data[0]['ip'], 1)
div += '
'
conn.close()
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):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(request.method == 'POST'):
conn.close()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(request.forms.topic)))
else:
div = '
'
j = 1
curs.execute("select * from rd where title = '" + db_pas(name) + "' order by date asc")
rows = curs.fetchall()
for data in rows:
curs.execute("select * from topic where title = '" + db_pas(data['title']) + "' and sub = '" + db_pas(data['sub']) + "' and id = '1' order by sub asc")
aa = curs.fetchall()
indata = namumark(name, aa[0]['data'], 0)
if(aa[0]['block'] == 'O'):
indata = ' '
block = 'id="block"'
else:
block = ''
ip = ip_pas(aa[0]['ip'], 1)
curs.execute("select * from stop where title = '" + db_pas(data['title']) + "' and sub = '" + db_pas(data['sub']) + "' and close = 'O'")
row = curs.fetchall()
if(not row):
div += '
'
conn.close()
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():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
session = request.environ.get('beaker.session')
ip = ip_check()
ban = ban_check(ip)
if(request.method == 'POST'):
if(ban == 1):
conn.close()
return(redirect('/ban'))
else:
curs.execute("select * from user where id = '" + db_pas(request.forms.id) + "'")
user = curs.fetchall()
if(user):
if(session.get('Now') == 1):
conn.close()
return(redirect('/error/11'))
elif(bcrypt.checkpw(bytes(request.forms.pw, 'utf-8'), bytes(user[0]['pw'], 'utf-8'))):
session['Now'] = 1
session['DREAMER'] = request.forms.id
curs.execute("select * from custom where user = '" + db_pas(request.forms.id) + "'")
css_data = curs.fetchall()
if(css_data):
session['Daydream'] = css_data[0]['css']
else:
session['Daydream'] = ''
curs.execute("insert into login (user, ip, today) value ('" + db_pas(request.forms.id) + "', '" + db_pas(ip) + "', '" + db_pas(get_time()) + "')")
conn.commit()
conn.close()
return(redirect('/user'))
else:
conn.close()
return(redirect('/error/13'))
else:
conn.close()
return(redirect('/error/12'))
else:
if(ban == 1):
conn.close()
return(redirect('/ban'))
else:
if(session.get('Now') == 1):
conn.close()
return(redirect('/error/11'))
else:
conn.close()
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():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
ip = ip_check()
ban = ban_check(ip)
if(request.method == 'POST'):
if(request.forms.pw2 == request.forms.pw3):
if(ban == 1):
conn.close()
return(redirect('/ban'))
else:
curs.execute("select * from user where id = '" + db_pas(request.forms.id) + "'")
user = curs.fetchall()
if(user):
if(not re.search('(\.|:)', ip)):
conn.close()
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())
curs.execute("update user set pw = '" + db_pas(hashed.decode()) + "' where id = '" + db_pas(request.forms.id) + "'")
conn.commit()
conn.close()
return(redirect('/login'))
else:
conn.close()
return(redirect('/error/10'))
else:
conn.close()
return(redirect('/error/9'))
else:
conn.close()
return(redirect('/error/20'))
else:
if(ban == 1):
conn.close()
return(redirect('/ban'))
else:
if(not re.search('(\.|:)', ip)):
conn.close()
return(redirect('/logout'))
else:
conn.close()
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):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
curs.execute("select * from user where id = '" + db_pas(name) + "'")
user = curs.fetchall()
if(user and not user[0]['acl'] == 'user'):
conn.close()
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):
sql = 'ip'
else:
sql = 'user'
curs.execute("select * from login where " + sql + " = '" + db_pas(name) + "' order by today desc")
row = curs.fetchall()
if(row):
c = '
이름
아이피
언제
'
for data in row:
c += '
' + data['user'] + '
' + data['ip'] + '
' + data['today'] + '
'
else:
c += '
'
else:
c = 'None'
conn.close()
return(
template('other',
custom = custom_css_user(),
license = set_data['license'],
login = login_check(),
title = '다중 검사',
logo = set_data['name'],
data = c
)
)
else:
conn.close()
return(redirect('/error/3'))
@route('/register', method=['POST', 'GET'])
def register():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
ip = ip_check()
ban = ban_check(ip)
if(request.method == 'POST'):
if(request.forms.pw == request.forms.pw2):
if(ban == 1):
conn.close()
return(redirect('/ban'))
else:
m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.forms.id)
if(m):
conn.close()
return(redirect('/error/8'))
else:
if(len(request.forms.id) > 20):
conn.close()
return(redirect('/error/7'))
else:
curs.execute("select * from user where id = '" + db_pas(request.forms.id) + "'")
rows = curs.fetchall()
if(rows):
conn.close()
return(redirect('/error/6'))
else:
hashed = bcrypt.hashpw(bytes(request.forms.pw, 'utf-8'), bcrypt.gensalt())
curs.execute("select id from user limit 1")
user_ex = curs.fetchall()
if(not user_ex):
curs.execute("insert into user (id, pw, acl) value ('" + db_pas(request.forms.id) + "', '" + db_pas(hashed.decode()) + "', 'owner')")
else:
curs.execute("insert into user (id, pw, acl) value ('" + db_pas(request.forms.id) + "', '" + db_pas(hashed.decode()) + "', 'user')")
conn.commit()
conn.close()
return(redirect('/login'))
else:
conn.close()
return(redirect('/error/20'))
else:
if(ban == 1):
conn.close()
return(redirect('/ban'))
else:
conn.close()
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'] = 0
session.pop('DREAMER', None)
return(redirect('/user'))
@route('/ban/', method=['POST', 'GET'])
def user_ban(name = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
curs.execute("select * from user where id = '" + db_pas(name) + "'")
user = curs.fetchall()
if(user and not user[0]['acl'] == 'user'):
conn.close()
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
curs.execute("select * from ban where block = '" + db_pas(name) + "'")
row = curs.fetchall()
if(row):
rb_plus(name, '해제', get_time(), ip, '')
curs.execute("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)
curs.execute("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)
curs.execute("insert into ban (block, end, why, band) value ('" + db_pas(name) + "', '" + db_pas(end) + "', '" + db_pas(request.forms.why) + "', '')")
conn.commit()
conn.close()
return(redirect('/ban/' + url_pas(name)))
else:
conn.close()
return(redirect('/error/3'))
else:
if(admin_check(1) == 1):
curs.execute("select * from ban where block = '" + db_pas(name) + "'")
row = curs.fetchall()
if(row):
now = '차단 해제'
else:
b = re.search("^([0-9]{1,3}\.[0-9]{1,3})$", name)
if(b):
now = '대역 차단'
else:
now = '차단'
conn.close()
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:
conn.close()
return(redirect('/error/3'))
@route('/acl/', method=['POST', 'GET'])
def acl(name = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(request.method == 'POST'):
if(admin_check(5) == 1):
curs.execute("select acl from data where title = '" + db_pas(name) + "'")
row = curs.fetchall()
if(row):
if(request.forms.select == 'admin'):
curs.execute("update data set acl = 'admin' where title = '" + db_pas(name) + "'")
elif(request.forms.select == 'user'):
curs.execute("update data set acl = 'user' where title = '" + db_pas(name) + "'")
else:
curs.execute("update data set acl = '' where title = '" + db_pas(name) + "'")
conn.commit()
conn.close()
return(redirect('/w/' + url_pas(name)) )
else:
conn.close()
return(redirect('/error/3'))
else:
if(admin_check(5) == 1):
curs.execute("select acl from data where title = '" + db_pas(name) + "'")
row = curs.fetchall()
if(row):
if(row[0]['acl'] == 'admin'):
now = '관리자만'
elif(row[0]['acl'] == 'user'):
now = '로그인 이상'
else:
now = '일반'
conn.close()
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:
conn.close()
return(redirect('/w/' + url_pas(name)) )
else:
conn.close()
return(redirect('/error/3'))
@route('/admin/', method=['POST', 'GET'])
def user_admin(name = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(request.method == 'POST'):
if(admin_check(None) == 1):
curs.execute("select * from user where id = '" + db_pas(name) + "'")
user = curs.fetchall()
if(user):
if(not user[0]['acl'] == 'user'):
curs.execute("update user set acl = 'user' where id = '" + db_pas(name) + "'")
else:
curs.execute("update user set acl = '" + db_pas(request.forms.select) + "' where id = '" + db_pas(name) + "'")
conn.commit()
conn.close()
return(redirect('/'))
else:
conn.close()
return(redirect('/error/5'))
else:
conn.close()
return(redirect('/error/3'))
else:
if(admin_check(None) == 1):
curs.execute("select * from user where id = '" + db_pas(name) + "'")
user = curs.fetchall()
if(user):
if(not user[0]['acl'] == 'user'):
now = '권한 해제'
else:
now = '권한 부여'
div = ''
curs.execute('select name from alist order by name asc')
get_alist = curs.fetchall()
if(get_alist):
i = 0
name_rem = ''
for data in get_alist:
if(not name_rem == data['name']):
name_rem = data['name']
div += ''
conn.close()
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:
conn.close()
return(redirect('/error/5'))
else:
conn.close()
return(redirect('/error/3'))
@route('/ban')
def are_you_ban():
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
ip = ip_check()
if(ban_check(ip) == 1):
curs.execute("select * from ban where block = '" + db_pas(ip) + "'")
rows = curs.fetchall()
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')):
curs.execute("delete from ban where block = '" + db_pas(ip) + "'")
conn.commit()
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()
curs.execute("select * from ban where block = '" + db_pas(results[0]) + "' and band = 'O'")
row = curs.fetchall()
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')):
curs.execute("delete from ban where block = '" + db_pas(results[0]) + "' and band = 'O'")
conn.commit()
end = '차단이 풀렸습니다. 다시 시도 해 보세요.'
else:
end = '영구 차단 상태 입니다. / 사유 : ' + row[0]['why']
else:
end = '권한이 맞지 않는 상태 입니다.'
conn.close()
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):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
curs.execute("select * from history where id = '" + db_pas(str(a)) + "' and title = '" + db_pas(name) + "'")
a_raw_data = curs.fetchall()
if(a_raw_data):
curs.execute("select * from history where id = '" + db_pas(str(b)) + "' and title = '" + db_pas(name) + "'")
b_raw_data = curs.fetchall()
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 + '
'
conn.close()
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:
conn.close()
return(redirect('/history/' + url_pas(name)))
else:
conn.close()
return(redirect('/history/' + url_pas(name)))
@route('/down/')
def down(name = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
curs.execute("select title from data where title like '%" + db_pas(name) + "/%'")
under = curs.fetchall()
div = ''
i = 0
for data in under:
div += '
'
i += 1
conn.close()
return(
template('other',
custom = custom_css_user(),
license = set_data['license'],
login = login_check(),
title = name,
logo = set_data['name'],
data = div,
sub = '하위 문서',
page = url_pas(name)
)
)
@route('/w/')
@route('/w//r/')
@route('/w//from/')
def read_view(name = None, num = None, redirect = None):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
data_none = 0
sub = 0
acl = ''
div = ''
topic = ''
curs.execute("select sub from rd where title = '" + db_pas(name) + "' order by date asc")
rows = curs.fetchall()
for data in rows:
curs.execute("select title from stop where title = '" + db_pas(name) + "' and sub = '" + db_pas(data['sub']) + "' and close = 'O'")
row = curs.fetchall()
if(not row):
topic = "open"
break
curs.execute("select title from data where title like '%" + db_pas(name) + "/%'")
under = curs.fetchall()
if(under):
down = 1
else:
down = 0
m = re.search("^(.*)\/(.*)$", name)
if(m):
uppage = m.groups()[0]
else:
uppage = 0
if(admin_check(5) == 1):
admin_memu = 'ACL'
else:
admin_memu = ''
if(re.search("^분류:", name)):
curs.execute("delete from cat where title = '" + db_pas(name) + "' and cat = ''")
conn.commit()
curs.execute("select * from cat where title = '" + db_pas(name) + "' order by cat asc")
rows = curs.fetchall()
if(rows):
div = '
'
if(num):
curs.execute("select * from hidhi where title = '" + db_pas(name) + "' and re = '" + db_pas(str(num)) + "'")
hid = curs.fetchall()
if(hid):
if(not admin_check(6) == 1):
conn.close()
return(redirect('/history/' + url_pas(name)))
curs.execute("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'")
else:
curs.execute("select * from data where title = '" + db_pas(name) + "'")
rows = curs.fetchall()
if(rows):
if(not num):
if(rows[0]['acl'] == 'admin'):
acl = '(관리자)'
elif(rows[0]['acl'] == 'user'):
acl = '(로그인)'
elsedata = rows[0]['data']
else:
data_none = 1
elsedata = 'None'
m = re.search("^사용자:([^/]*)", name)
if(m):
g = m.groups()
curs.execute("select acl from user where id = '" + db_pas(g[0]) + "'")
test = curs.fetchall()
if(test):
if(not test[0]['acl'] == 'user'):
acl = '(관리자)'
curs.execute("select block from ban where block = '" + db_pas(g[0]) + "'")
user = curs.fetchall()
if(user):
sub = '차단'
if(redirect):
elsedata = re.sub("^#(?:redirect|넘겨주기)\s(?P[^\n]*)", " * [[\g]] 문서로 넘겨주기", elsedata)
enddata = namumark(name, elsedata, 1)
conn.close()
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,
uppage = uppage,
acl = acl,
topic = topic,
redirect = redirect,
admin = admin_memu,
data_none = data_none,
sub = sub,
down = down
)
)
@route('/user//topic')
@route('/user//topic/')
def user_topic_list(name = None, num = 1):
conn = pymysql.connect(
user = set_data['user'],
password = set_data['pw'],
charset = 'utf8mb4',
db = set_data['db']
)
curs = conn.cursor(pymysql.cursors.DictCursor)
if(num * 50 <= 0):
v = 50
else:
v = num * 50
i = v - 50
ydmin = admin_check(1)
div = '
\
\
\
\
토론명
\
작성자
\
시간
\
'
curs.execute("select title, id, sub, ip, date from topic where ip = '" + db_pas(name) + "' order by date desc limit " + str(i) + ", " + str(v))
rows = curs.fetchall()
if(rows):
for data in rows:
title = re.sub('<', '<', data['title'])
title = re.sub('>', '>', title)
title = re.sub('"', '"', title)
sub = re.sub('<', '<', data['sub'])
sub = re.sub('>', '>', sub)
sub = re.sub('"', '"', sub)
if(ydmin == 1):
curs.execute("select * from ban where block = '" + db_pas(data['ip']) + "'")
row = curs.fetchall()
if(row):
ban = ' (해제)'
else:
ban = ' (차단)'
else:
ban = ''
ip = ip_pas(data['ip'], 1)
div += '