from bottle import *
from bottle.ext import beaker
import bcrypt
import os
import difflib
import hashlib
import json
import sqlite3
import html
try:
json_data = open('set.json').read()
set_data = json.loads(json_data)
except:
new_json = []
print('DB 이름 : ', end = '')
new_json += [input()]
print('위키 포트 : ', end = '')
new_json += [input()]
with open("set.json", "w") as f:
f.write('{ "db" : "' + new_json[0] + '", "port" : "' + new_json[1] + '" }')
json_data = open('set.json').read()
set_data = json.loads(json_data)
conn = sqlite3.connect(set_data['db'] + '.db')
curs = conn.cursor()
session_opts = {
'session.type': 'file',
'session.data_dir': './app_session/',
'session.auto': 1
}
app = beaker.middleware.SessionMiddleware(app(), session_opts)
BaseRequest.MEMFILE_MAX = 1000 ** 4
def redirect(data):
return('')
from func import *
r_ver = '2.3.1'
p_ver = ''
try:
curs.execute('select data from other where name = "version"')
version = curs.fetchall()
if(version):
t_ver = re.sub('\.', '', version[0][0])
r_t_ver = re.sub('\.', '', r_ver)
if(int(t_ver) < int(r_t_ver)):
curs.execute("update other set data = ? where name = 'version'", [r_ver])
except:
pass
try:
curs.execute('select who from re_admin limit 1')
except:
curs.execute("create table re_admin(who text, what text, time text)")
conn.commit()
'''@route('/upload', method=['POST', 'GET'])
def upload():
return(
template(
'index',
imp = ['파일 올리기', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '
',
menu = [['other', '기타']]
)
)'''
@route('/setup', method=['GET', 'POST'])
def setup():
try:
curs.execute("select title from data limit 1", [that])
except:
try:
curs.execute("create table data(title text, data text, acl text)")
curs.execute("create table history(id text, title text, data text, 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 text, 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 text)")
curs.execute("create table other(name text, data text)")
curs.execute("create table alist(name text, acl text)")
curs.execute("create table re_admin(who text, what text, time text)")
curs.execute("insert into alist (name, acl) values ('owner', 'owner')")
curs.execute("insert into other (name, data) values ('version', ?)", [r_ver])
curs.execute('insert into other (name, data) values ("name", "wiki")')
curs.execute('insert into other (name, data) values ("frontpage", "위키:대문")')
curs.execute('insert into other (name, data) values ("license", "CC 0")')
curs.execute('insert into other (name, data) values ("upload", "2")')
conn.commit()
except:
pass
return(redirect('/'))
@route('/edit_set', method=['POST', 'GET'])
def edit_set():
if(admin_check(None, 'edit_set') == 1):
if(request.method == 'POST'):
curs.execute("update other set data = ? where name = ?", [request.forms.name, 'name'])
curs.execute("update other set data = ? where name = 'frontpage'", [request.forms.frontpage])
curs.execute("update other set data = ? where name = 'license'", [request.forms.license])
curs.execute("update other set data = ? where name = 'upload'", [request.forms.upload])
conn.commit()
return(redirect('/'))
else:
curs.execute('select data from other where name = ?', ['name'])
name_d = curs.fetchall()
curs.execute('select data from other where name = "frontpage"')
frontpage_d = curs.fetchall()
curs.execute('select data from other where name = "license"')
license_d = curs.fetchall()
curs.execute('select data from other where name = "upload"')
upload_d = curs.fetchall()
return(
template(
'index',
imp = ['설정 편집', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['manager', '관리자']]
)
)
else:
return(redirect('/ban'))
@route('/update')
@route('/update/')
def update(num = 1):
if(admin_check(None, 'update') == 1):
if(num == 1):
return(
template(
'index',
imp = ['업데이트 목록', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '
',
menu = [['manager', '관리자']]
)
)
elif(num == 2):
curs.execute('insert into other (name, data) values ("name", ?)', [set_data['name']])
curs.execute('insert into other (name, data) values ("frontpage", ?)', [set_data['frontpage']])
curs.execute('insert into other (name, data) values ("license", ?)', [set_data['license']])
curs.execute('insert into other (name, data) values ("upload", ?)', [set_data['upload']])
conn.commit()
return(redirect('/'))
else:
return(redirect('/ban'))
@route('/not_close_topic')
def not_close_topic():
div = ''
i = 1
curs.execute('select title, sub from rd order by date desc')
n_list = curs.fetchall()
for data in n_list:
curs.execute('select * from stop where title = ? and sub = ? and close = "O"', [data[0], data[1]])
is_close = curs.fetchall()
if(not is_close):
div += '
'
i += 1
else:
div += ' \
(생성)'
return(
template(
'index',
imp = ['ACL 목록', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = re.sub('^ ', '', div),
menu = [['manager', '관리자']]
)
)
@route('/admin_plus/', method=['POST', 'GET'])
def admin_plus(name = None):
if(admin_check(None, 'admin_plus (' + name + ')') == 1):
if(request.method == 'POST'):
curs.execute("delete from alist where name = ?", [name])
if(request.forms.ban):
curs.execute("insert into alist (name, acl) values (?, 'ban')", [name])
if(request.forms.mdel):
curs.execute("insert into alist (name, acl) values (?, 'mdel')", [name])
if(request.forms.toron):
curs.execute("insert into alist (name, acl) values (?, 'toron')", [name])
if(request.forms.check):
curs.execute("insert into alist (name, acl) values (?, 'check')", [name])
if(request.forms.acl):
curs.execute("insert into alist (name, acl) values (?, 'acl')", [name])
if(request.forms.hidel):
curs.execute("insert into alist (name, acl) values (?, 'hidel')", [name])
if(request.forms.owner):
curs.execute("insert into alist (name, acl) values (?, 'owner')", [name])
conn.commit()
return(redirect('/admin_plus/admin'))
else:
curs.execute('select acl from alist where name = ?', [name])
test = curs.fetchall()
data = ''
exist_list = ['', '', '', '', '', '', '', '', '']
for go in test:
if(go[0] == 'ban'):
exist_list[0] = 'checked="checked"'
elif(go[0] == 'mdel'):
exist_list[1] = 'checked="checked"'
elif(go[0] == 'toron'):
exist_list[2] = 'checked="checked"'
elif(go[0] == 'check'):
exist_list[3] = 'checked="checked"'
elif(go[0] == 'acl'):
exist_list[4] = 'checked="checked"'
elif(go[0] == 'hidel'):
exist_list[5] = 'checked="checked"'
elif(go[0] == 'owner'):
exist_list[7] = 'checked="checked"'
data += '
차단
'
data += '
많은 문서 삭제
'
data += '
토론 관리
'
data += '
사용자 검사
'
data += '
문서 ACL
'
data += '
역사 숨김
'
data += '
소유자
'
return(
template(
'index',
imp = ['관리 그룹 추가', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['manager', '관리자']]
)
)
else:
return(redirect('/error/3'))
@route('/admin_list')
def admin_list():
i = 1
div = ''
curs.execute("select id, acl from user where not acl = 'user'")
user_data = curs.fetchall()
for data in user_data:
name = ip_pas(data[0], 2) + ' (' + data[1] + ')'
div += '
' + str(i) + '. ' + name + '
'
i += 1
return(
template(
'index',
imp = ['관리자 목록', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = div,
menu = [['other', '기타']]
)
)
@route('/record/')
@route('/record//n/')
@route('/recent_changes')
def recent_changes(name = None, num = 1):
ydmin = admin_check(1, None)
zdmin = admin_check(6, None)
ban = ''
send = ' '
div = '
\
\
\
문서명
\
기여자
\
시간
\
'
if(name):
if(num * 50 <= 0):
v = 50
else:
v = num * 50
i = v - 50
curs.execute("select id, title, date, ip, send, leng from history where ip = ? order by date desc limit ?, ?", [name, str(i), str(v)])
else:
curs.execute("select id, title, date, ip, send, leng from history order by date desc limit 50")
rows = curs.fetchall()
for data in rows:
send = ' '
if(data[4]):
if(not re.search("^(?: *)$", data[4])):
send = data[4]
title = html.escape(data[1])
if(re.search("\+", data[5])):
leng = '' + data[5] + ''
elif(re.search("\-", data[5])):
leng = '' + data[5] + ''
else:
leng = '' + data[5] + ''
if(ydmin == 1):
curs.execute("select * from ban where block = ?", [data[3]])
row = curs.fetchall()
if(row):
ban = ' (해제)'
else:
ban = ' (차단)'
ip = ip_pas(data[3], None)
if((int(data[0]) - 1) == 0):
revert = ''
else:
revert = '(비교)(되돌리기)'
style = ''
curs.execute("select * from hidhi where title = ? and re = ?", [data[1], data[0]])
row = curs.fetchall()
if(zdmin == 1):
if(row):
ip += ' (숨김)'
hidden = ' (공개)'
else:
hidden = ' (숨김)'
else:
if(row):
ip = '숨김'
hidden = ''
send = '숨김'
ban = ''
style = 'display:none;'
else:
hidden = ''
div += '
'
j += 1
else:
list_data += ' \
주의 : 권한 사용 안하고 열람만 해도 기록되는 경우도 있습니다. \
\
\
(이전)(이후)'
return(
template(
'index',
imp = ['관리자 권한 기록', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = list_data,
menu = [['other', '기타']]
)
)
@route('/back_reset')
def back_reset():
if(admin_check(None, 'back_reset') == 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[0])
namumark(end[0], end[1], 1, 0)
return(redirect('/'))
else:
return(redirect('/error/3'))
@route('/xref/')
@route('/xref//n/')
def xref(name = None, num = 1):
if(num * 50 <= 0):
v = 50
else:
v = num * 50
i = v - 50
div = ''
curs.execute("delete from back where title = ? and link = ''", [name])
conn.commit()
curs.execute("select link, type from back where title = ? order by link asc limit ?, ?", [name, str(i), str(v)])
rows = curs.fetchall()
for data in rows:
div += '
' + data[0] + ''
if(data[1]):
div += ' (' + data[1] + ')'
div += '
'
else:
div += ' \
(이전)(이후)'
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (역링크)'],
data = div,
menu = [['w/' + url_pas(name), '문서']]
)
)
@route('/recent_discuss')
@route('/recent_discuss/')
def recent_discuss(tools = 'normal'):
if(tools == 'normal' or tools == 'close'):
div = ''
if(tools == 'normal'):
div += '(닫힌 토론)'
m_sub = 0
else:
div += '(열린 토론)'
m_sub = ' (닫힘)'
div += ' \
\
\
\
\
토론명
\
시간
\
'
else:
return(redirect('/'))
curs.execute("select title, sub, date from rd order by date desc limit 50")
rows = curs.fetchall()
for data in rows:
title = html.escape(data[0])
sub = html.escape(data[1])
close = 0
if(tools == 'normal'):
curs.execute("select title from stop where title = ? and sub = ? and close = 'O'", [data[0], data[1]])
if(curs.fetchall()):
close = 1
else:
curs.execute("select title from stop where title = ? and sub = ? and close = 'O'", [data[0], data[1]])
if(not curs.fetchall()):
close = 1
if(close == 0):
div += '
'
return(
template(
'index',
imp = ['최근 토론내역', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), m_sub],
data = div,
menu = 0
)
)
@route('/block_log')
@route('/block_log/n/')
def block_log(num = 1):
if(num * 50 <= 0):
v = 50
else:
v = num * 50
i = v - 50
div = '
\
\
\
차단자
\
관리자
\
기간
\
\
\
이유
\
시간
\
'
curs.execute("select why, block, blocker, end, today from rb order by today desc limit ?, ?", [str(i), str(v)])
rows = curs.fetchall()
for data in rows:
why = html.escape(data[0])
b = re.search("^([0-9]{1,3}\.[0-9]{1,3})$", data[1])
if(b):
ip = data[1] + ' (대역)'
else:
ip = ip_pas(data[1], 2)
if(not data[3] == ''):
end = data[3]
else:
end = '무기한'
div += '
\
\
(이전)(이후)'
div = '' + div
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (역사)'],
data = div,
menu = [['w/' + url_pas(name), '문서']]
)
)
@route('/search', method=['POST'])
def search():
return(redirect('/search/' + url_pas(request.forms.search)))
@route('/goto', method=['POST'])
def goto():
curs.execute("select title from data where title = ?", [request.forms.search])
data = curs.fetchall()
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):
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 ?", ['%' + name + '%'])
title_list = curs.fetchall()
curs.execute("select title from data where data like ?", ['%' + name + '%'])
data_list = curs.fetchall()
curs.execute("select title from data where title = ?", [name])
exist = curs.fetchall()
if(exist):
div = '
'
div += div_plus + end
div += ' \
(이전)(이후)'
return(
template(
'index',
imp = ['검색', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = div,
menu = 0
)
)
@route('/raw/')
@route('/raw//r/')
def raw_view(name = None, num = None):
if(num):
curs.execute("select title from hidhi where title = ? and re = ?", [name, str(num)])
hid = curs.fetchall()
if(hid and admin_check(6, None) != 1):
return(redirect('/error/3'))
curs.execute("select data from history where title = ? and id = ?", [name, str(num)])
else:
curs.execute("select data from data where title = ?", [name])
rows = curs.fetchall()
if(rows):
enddata = html.escape(rows[0][0])
enddata = ''
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (원본)'],
data = enddata,
menu = [['w/' + url_pas(name), '문서'], ['history/' + url_pas(name), '역사']]
)
)
else:
return(redirect('/w/' + url_pas(name)))
@route('/revert//r/', method=['POST', 'GET'])
def revert(name = None, num = None):
ip = ip_check()
can = acl_check(ip, name)
today = get_time()
if(request.method == 'POST'):
curs.execute("select title from hidhi where title = ? and re = ?", [name, str(num)])
hid = curs.fetchall()
if(hid and admin_check(6, None) != 1):
return(redirect('/error/3'))
if(can == 1):
return(redirect('/ban'))
else:
curs.execute("delete from back where link = ?", [name])
curs.execute("delete from cat where cat = ?", [name])
conn.commit()
curs.execute("select data from history where title = ? and id = ?", [name, str(num)])
rows = curs.fetchall()
if(rows):
curs.execute("select data from data where title = ?", [name])
row = curs.fetchall()
if(row):
leng = leng_check(len(row[0][0]), len(rows[0][0]))
curs.execute("update data set data = ? where title = ?", [rows[0][0], name])
conn.commit()
else:
leng = '+' + str(len(rows[0][0]))
curs.execute("insert into data (title, data, acl) values (?, ?, '')", [name, rows[0][0]])
conn.commit()
history_plus(
name,
rows[0][0],
today,
ip,
'문서를 ' + str(num) + '판으로 되돌렸습니다.',
leng
)
return(redirect('/w/' + url_pas(name)))
else:
curs.execute("select title from hidhi where title = ? and re = ?", [name, str(num)])
hid = curs.fetchall()
if(hid and admin_check(6, None) != 1):
return(redirect('/error/3'))
if(can == 1):
return(redirect('/ban'))
else:
curs.execute("select title from history where title = ? and id = ?", [name, str(num)])
rows = curs.fetchall()
if(rows):
l_c = login_check()
if(l_c == 0):
plus = '비 로그인 상태입니다. 비 로그인으로 작업 시 아이피가 역사에 기록됩니다. \
\
'
else:
plus = ''
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), l_c, custom_css(), custom_js(), ' (되돌리기)'],
data = plus + ' \
',
menu = [['history/' + url_pas(name), '역사'], ['recent_changes', '최근 변경']]
)
)
else:
return(redirect('/w/' + url_pas(name)))
@route('/m_del', method=['POST', 'GET'])
def m_del():
today = get_time()
ip = ip_check()
if(admin_check(2, 'm_del') == 1):
if(request.method == 'POST'):
data = request.forms.content + '\r\n'
m = re.findall('(.*)\r\n', data)
for g in m:
curs.execute("select data from data where title = ?", [g])
rows = curs.fetchall()
if(rows):
curs.execute("delete from back where title = ?", [g])
curs.execute("delete from cat where title = ?", [g])
leng = '-' + str(len(rows[0][0]))
curs.execute("delete from data where title = ?", [g])
history_plus(
g,
'',
today,
ip,
request.forms.send + ' (대량 삭제)',
leng
)
data = re.sub('(.*)\r\n', '', data, 1)
conn.commit()
return(redirect('/'))
else:
return(
template(
'index',
imp = ['많은 문서 삭제', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = ' \
문서명 A \
\
문서명 B \
\
문서명 C \
\
\
이런 식으로 기제 하시오 \
\
\
\
',
menu = [['manager', '관리자']]
)
)
else:
return(redirect('/error/3'))
@route('/edit/', method=['POST', 'GET'])
@route('/edit//section/', method=['POST', 'GET'])
def edit(name = None, num = None):
ip = ip_check()
can = acl_check(ip, name)
if(request.method == 'POST'):
if(len(request.forms.send) > 500):
return(redirect('/error/15'))
else:
today = get_time()
content = savemark(request.forms.content)
if(can == 1):
return(redirect('/ban'))
else:
curs.execute("delete from back where link = ?", [name])
curs.execute("delete from cat where cat = ?", [name])
curs.execute("select data from data where title = ?", [name])
rows = curs.fetchall()
if(rows):
if(request.forms.otent == content):
return(redirect('/error/18'))
leng = leng_check(len(request.forms.otent), len(content))
if(num):
content = rows[0][0].replace(request.forms.otent, content)
curs.execute("update data set data = ? where title = ?", [content, name])
else:
leng = '+' + str(len(content))
curs.execute("insert into data (title, data, acl) values (?, ?, '')", [name, content])
history_plus(
name,
content,
today,
ip,
send_p(request.forms.send),
leng
)
include_check(name, content)
conn.commit()
return(redirect('/w/' + url_pas(name)))
else:
if(can == 1):
return(redirect('/ban'))
else:
curs.execute("select data from data where title = ?", [name])
rows = curs.fetchall()
if(rows):
if(num):
i = 0
j = 0
data = rows[0][0] + '\r\n'
while(1):
m = re.search("((?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n(?:(?:(?:(?!(?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n).)*)(?:\n)?)+)", data)
if(m):
if(i == num - 1):
g = m.groups()
data = re.sub("\r\n$", "", g[0])
break
else:
data = re.sub("((?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n(?:(?:(?:(?!(?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n).)*)(?:\n)?)+)", "", data, 1)
i += 1
else:
j = 1
break
if(j == 0):
data = re.sub("\r\n$", "", data)
else:
data = rows[0][0]
else:
data = ''
if(num):
action = '/section/' + str(num)
else:
action = ''
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (수정)'],
data = '',
menu = [['w/' + url_pas(name), '문서']]
)
)
@route('/preview//section/', method=['POST'])
@route('/preview/', method=['POST'])
def preview(name = None, num = None):
ip = ip_check()
can = acl_check(ip, name)
if(can == 1):
return(redirect('/ban'))
else:
newdata = request.forms.content
newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P[^\n]*)', ' * [[\g]] 문서로 넘겨주기', newdata)
enddata = namumark(name, newdata, 0, 0)
if(num):
action = '/section/' + str(num)
else:
action = ''
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (미리보기)'],
data = ' \
' + enddata,
menu = [['w/' + url_pas(name), '문서']]
)
)
@route('/delete/', method=['POST', 'GET'])
def delete(name = None):
ip = ip_check()
can = acl_check(ip, name)
if(request.method == 'POST'):
curs.execute("select data from data where title = ?", [name])
rows = curs.fetchall()
if(rows):
if(can == 1):
return(redirect('/ban'))
today = get_time()
curs.execute("delete from back where link = ?", [name])
curs.execute("delete from cat where cat = ?", [name])
leng = '-' + str(len(rows[0][0]))
history_plus(
name,
'',
today,
ip,
request.forms.send + ' (삭제)',
leng
)
curs.execute("delete from data where title = ?", [name])
conn.commit()
return(redirect('/w/' + url_pas(name)))
else:
curs.execute("select title from data where title = ?", [name])
rows = curs.fetchall()
if(rows):
if(can == 1):
return(redirect('/ban'))
else:
l_c = login_check()
if(l_c == 0):
plus = '비 로그인 상태입니다. 비 로그인으로 작업 시 아이피가 역사에 기록됩니다.
'
else:
plus = ''
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), l_c, custom_css(), custom_js(), ' (삭제)'],
data = '',
menu = [['w/' + url_pas(name), '문서']]
)
)
else:
return(redirect('/w/' + url_pas(name)))
@route('/move/', method=['POST', 'GET'])
def move(name = None):
ip = ip_check()
can = acl_check(ip, name)
today = get_time()
if(can == 1):
return(redirect('/ban'))
if(request.method == 'POST'):
curs.execute("select data from data where title = ?", [name])
rows = curs.fetchall()
leng = '0'
curs.execute("select title from history where title = ?", [request.forms.title])
row = curs.fetchall()
if(row):
return(redirect('/error/19'))
history_plus(
name,
rows[0][0],
today,
ip,
request.forms.send + ' (' + name + ' - ' + request.forms.title + ' 이동)',
leng
)
if(rows):
curs.execute("update data set title = ? where title = ?", [request.forms.title, name])
curs.execute("delete from back where link = ?", [name])
curs.execute("delete from cat where cat = ?", [name])
curs.execute("update history set title = ? where title = ?", [request.forms.title, name])
conn.commit()
return(redirect('/w/' + url_pas(request.forms.title)))
else:
l_c = login_check()
if(l_c == 0):
plus = '비 로그인 상태입니다. 비 로그인으로 작업 시 아이피가 역사에 기록됩니다.
'
else:
plus = ''
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), l_c, custom_css(), custom_js(), ' (이동)'],
data = '',
menu = [['w/' + url_pas(name), '문서']]
)
)
@route('/other')
def other():
return(
template(
'index',
imp = ['기타 메뉴', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = namumark('', '[목차(없음)]\r\n' + \
'== 기록 ==\r\n' + \
' * [[wiki:block_log|차단 기록]]\r\n' + \
' * [[wiki:user_log|가입 기록]]\r\n' + \
' * [[wiki:admin_log|권한 기록]]\r\n' + \
' * [[wiki:manager/6|기여 기록]]\r\n' + \
' * [[wiki:manager/7|토론 기록]]\r\n' + \
' * [[wiki:not_close_topic|열린 토론 목록]]\r\n' + \
'== 기타 ==\r\n' + \
' * [[wiki:title_index|모든 문서]]\r\n' + \
' * [[wiki:acl_list|ACL 문서]]\r\n' + \
' * [[wiki:admin_list|관리자 목록]]\r\n' + \
' * [[wiki:manager/1|관리자 메뉴]]\r\n' + \
'== 버전 ==\r\n' + \
'이 오픈나무는 [[https://github.com/2DU/openNAMU/blob/SQLite/version.md|' + r_ver + p_ver + ']]판 입니다.', 0, 0),
menu = 0
)
)
@route('/manager', method=['POST', 'GET'])
@route('/manager/', method=['POST', 'GET'])
def manager(num = 1):
if(num == 1):
return(
template('index',
imp = ['관리자 메뉴', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = namumark('', '[목차(없음)]\r\n' + \
'== 목록 ==\r\n' + \
' * [[wiki:manager/2|문서 ACL]]\r\n' + \
' * [[wiki:manager/3|사용자 검사]]\r\n' + \
' * [[wiki:manager/4|사용자 차단]]\r\n' + \
' * [[wiki:manager/5|권한 주기]]\r\n' + \
' * [[wiki:m_del|여러 문서 삭제]]\r\n' + \
'== 소유자 ==\r\n' + \
' * [[wiki:back_reset|역링크, 분류 다시 생성]]\r\n' + \
' * [[wiki:manager/8|ACL 문서]]\r\n' + \
' * [[wiki:update|관리 그룹 생성]]\r\n' + \
' * [[wiki:edit_set|업데이트 메뉴]]\r\n' + \
' * [[wiki:manager/9|JSON 출력]]\r\n' + \
' * [[wiki:json_in|JSON 입력]]\r\n' + \
'== 기타 ==\r\n' + \
' * 이 메뉴에 없는 기능은 해당 문서의 역사나 토론에서 바로 사용 가능함', 0, 0),
menu = [['other', '기타']]
)
)
elif(num == 2):
if(request.method == 'POST'):
return(redirect('/acl/' + url_pas(request.forms.name)))
else:
return(
template('index',
imp = ['ACL 이동', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['manager', '관리자']]
)
)
elif(num == 3):
if(request.method == 'POST'):
return(redirect('/check/' + url_pas(request.forms.name)))
else:
return(
template('index',
imp = ['검사 이동', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['manager', '관리자']]
)
)
elif(num == 4):
if(request.method == 'POST'):
return(redirect('/ban/' + url_pas(request.forms.name)))
else:
return(
template('index',
imp = ['차단 이동', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['manager', '관리자']]
)
)
elif(num == 5):
if(request.method == 'POST'):
return(redirect('/admin/' + url_pas(request.forms.name)))
else:
return(
template('index',
imp = ['권한 이동', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['manager', '관리자']]
)
)
elif(num == 6):
if(request.method == 'POST'):
return(redirect('/record/' + url_pas(request.forms.name)))
else:
return(
template('index',
imp = ['기록 이동', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['other', '기타']]
)
)
elif(num == 7):
if(request.method == 'POST'):
return(redirect('/user/' + url_pas(request.forms.name) + '/topic'))
else:
return(
template('index',
imp = ['토론 기록 이동', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['other', '기타']]
)
)
elif(num == 8):
if(request.method == 'POST'):
return(redirect('/admin_plus/' + url_pas(request.forms.name)))
else:
return(
template('index',
imp = ['그룹 생성 이동', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['manager', '관리자']]
)
)
elif(num == 9):
if(request.method == 'POST'):
return(redirect('/json_out/' + url_pas(request.forms.name)))
else:
return(
template('index',
imp = ['문서 출력 이동', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['manager', '관리자']]
)
)
else:
return(redirect('/'))
@route('/json_out/')
def json_out(name = None):
if(admin_check(None, 'json_out') == 1):
curs.execute('select data from data where title = ?', [name])
get_d = curs.fetchall()
if(get_d):
da = get_d[0][0]
else:
da = ''
curs.execute('select ip from history where title = ? order by ip asc', [name])
get_h = curs.fetchall()
var_n = ''
hi_d = ''
for hi in get_h:
if(hi[0] != var_n):
var_n = hi[0]
hi_d += json.dumps(hi[0]) + ', '
else:
hi_d = re.sub(', $', '', hi_d)
if(hi_d == ''):
return(redirect('/w/' + url_pas(name)))
json_f = '{ "title" : ' + json.dumps(name) + ', "data" : ' + json.dumps(da) + ', "history" : [' + hi_d + '] }'
return(json_f)
else:
return(redirect('/error/3'))
@route('/json_in', method=['POST', 'GET'])
def json_in():
if(admin_check(None, 'json_in') == 1):
if(request.method == 'POST'):
data = json.loads(request.forms.data)
title = data["title"]
curs.execute('select title from history where title = ?', [title])
get_d = curs.fetchall()
if(get_d):
return(redirect('/w/' + url_pas(title)))
curs.execute('insert into data (title, data, acl) values (?, ?, "")', [title, data["data"]])
i = 0
date = get_time()
for hi in data["history"]:
i += 1
curs.execute('insert into history (id, title, data, date, ip, send, leng) values (?, ?, "", ?, ?, "", "0")', [i, title, date, hi])
conn.commit()
return(redirect('/w/' + url_pas(title)))
else:
return(
template('index',
imp = ['문서 JSON 입력', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['manager', '관리자']]
)
)
else:
return(redirect('/error/3'))
@route('/title_index')
def title_index():
i = [0, 0, 0, 0, 0, 0]
data = ''
curs.execute("select title from data order by title asc")
title_list = curs.fetchall()
for list_data in title_list:
data += '
'
return(
template('index',
imp = ['모든 문서', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = data,
menu = [['other', '기타']]
)
)
@route('/topic//sub//b/')
def topic_block(name = None, sub = None, num = None):
if(admin_check(3, 'blind (' + name + ' - ' + sub + '#' + str(num) + ')') == 1):
curs.execute("select block from topic where title = ? and sub = ? and id = ?", [name, sub, str(num)])
block = curs.fetchall()
if(block):
if(block[0][0] == 'O'):
curs.execute("update topic set block = '' where title = ? and sub = ? and id = ?", [name, sub, str(num)])
else:
curs.execute("update topic set block = 'O' where title = ? and sub = ? and id = ?", [name, sub, str(num)])
conn.commit()
rd_plus(
name,
sub,
get_time()
)
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, 'notice (' + name + ' - ' + sub + '#' + str(num) + ')') == 1):
curs.execute("select * from topic where title = ? and sub = ? and id = ?", [name, sub, str(num)])
topic_data = curs.fetchall()
if(topic_data):
curs.execute("select top from topic where id = ? and title = ? and sub = ?", [str(num), name, sub])
top_data = curs.fetchall()
if(top_data):
if(top_data[0][0] == 'O'):
curs.execute("update topic set top = '' where title = ? and sub = ? and id = ?", [name, sub, str(num)])
else:
curs.execute("update topic set top = 'O' where title = ? and sub = ? and id = ?", [name, sub, str(num)])
conn.commit()
rd_plus(
name,
sub,
get_time()
)
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/error/3'))
@route('/topic//sub//tool/agree')
def topic_agree(name = None, sub = None):
if(admin_check(3, 'agree (' + name + ' - ' + sub + ')') == 1):
ip = ip_check()
curs.execute("select id from topic where title = ? and sub = ? order by id + 0 desc limit 1", [name, sub])
topic_check = curs.fetchall()
if(topic_check):
time = get_time()
curs.execute("select title from agreedis where title = ? and sub = ?", [name, sub])
agree = curs.fetchall()
if(agree):
curs.execute("insert into topic (id, title, sub, data, date, ip, block, top) values (?, ?, ?, '합의 결렬', ?, ?, '', '1')", [str(int(topic_check[0][0]) + 1), name, sub, time, ip])
curs.execute("delete from agreedis where title = ? and sub = ?", [name, sub])
else:
curs.execute("insert into topic (id, title, sub, data, date, ip, block, top) values (?, ?, ?, '합의 완료', ?, ?, '', '1')", [str(int(topic_check[0][0]) + 1), name, sub, time, ip])
curs.execute("insert into agreedis (title, sub) values (?, ?)", [name, sub])
conn.commit()
rd_plus(
name,
sub,
time
)
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
return(redirect('/error/3'))
@route('/topic//sub//tool/')
def topic_stop(name = None, sub = None, tool = None):
if(tool == 'close'):
close = 'O'
n_close = ''
data = '토론 닫음'
n_data = '토론 다시 열기'
elif(tool == 'stop'):
close = ''
n_close = 'O'
data = '토론 정지'
n_data = '토론 재 시작'
else:
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
if(admin_check(3, 'topic stop and end (' + name + ' - ' + sub + ')') == 1):
ip = ip_check()
curs.execute("select id from topic where title = ? and sub = ? order by id + 0 desc limit 1", [name, sub])
topic_check = curs.fetchall()
if(topic_check):
time = get_time()
curs.execute("select title from stop where title = ? and sub = ? and close = ?", [name, sub, close])
stop = curs.fetchall()
if(stop):
curs.execute("insert into topic (id, title, sub, data, date, ip, block, top) values (?, ?, ?, ?, ?, ?, '', '1')", [str(int(topic_check[0][0]) + 1), name, sub, n_data, time, ip])
curs.execute("delete from stop where title = ? and sub = ? and close = ?", [name, sub, close])
else:
curs.execute("insert into topic (id, title, sub, data, date, ip, block, top) values (?, ?, ?, ?, ?, ?, '', '1')", [str(int(topic_check[0][0]) + 1), name, sub, data, time, ip])
curs.execute("insert into stop (title, sub, close) values (?, ?, ?)", [name, sub, close])
curs.execute("delete from stop where title = ? and sub = ? and close = ?", [name, sub, n_close])
conn.commit()
rd_plus(
name,
sub,
time
)
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, None)
if(request.method == 'POST'):
curs.execute("select id from topic where title = ? and sub = ? order by id + 0 desc limit 1", [name, sub])
rows = curs.fetchall()
if(rows):
num = int(rows[0][0]) + 1
else:
num = 1
if(ban == 1 and admin != 1):
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) values (?, ?, ?, ?, ?, ?, '', '')", [str(num), name, sub, aa, today, ip])
conn.commit()
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
else:
style = ''
div = ''
curs.execute("select title from stop where title = ? and sub = ? and close = 'O'", [name, sub])
close = curs.fetchall()
curs.execute("select title from stop where title = ? and sub = ? and close = ''", [name, sub])
stop = curs.fetchall()
if(admin == 1):
if(close):
div += '(토론 열기) '
else:
div += '(토론 닫기) '
if(stop):
div += '(토론 재개) '
else:
div += '(토론 정지) '
curs.execute("select title from agreedis where title = ? and sub = ?", [name, sub])
agree = curs.fetchall()
if(agree):
div += '(합의 취소)'
else:
div += '(합의 완료)'
div += '
'
if((stop or close) and admin != 1):
style = 'display:none;'
curs.execute("select data, id, date, ip, block, top from topic where title = ? and sub = ? order by id + 0 asc", [name, sub])
toda = curs.fetchall()
curs.execute("select data, id, date, ip from topic where title = ? and sub = ? and top = 'O' order by id + 0 asc", [name, sub])
top = curs.fetchall()
for dain in top:
top_data = namumark('', dain[0], 0, 0)
top_data = re.sub("(?P#(?:[0-9]*))", '\g', top_data)
ip = ip_pas(dain[3], 1)
chad = ''
curs.execute("select who from re_admin where what = ? order by time desc limit 1", ['notice (' + name + ' - ' + sub + '#' + dain[1] + ')'])
no_da = curs.fetchall()
if(no_da):
chad += ' @' + no_da[0][0]
div += '
\
'
i = 0
for dain in toda:
if(i == 0):
start = dain[3]
indata = namumark('', dain[0], 0, 0)
indata = re.sub("(?P#(?:[0-9]*))", '\g', indata)
chad = ''
if(dain[4] == 'O'):
indata = ' '
block = 'style="display: none;"'
curs.execute("select who from re_admin where what = ? order by time desc limit 1", ['blind (' + name + ' - ' + sub + '#' + str(i + 1) + ')'])
bl_da = curs.fetchall()
if(bl_da):
chad += ' @' + bl_da[0][0]
else:
block = ''
if(admin == 1):
if(dain[4] == 'O'):
isblock = ' (해제)'
else:
isblock = ' (가림)'
curs.execute("select id from topic where title = ? and sub = ? and id = ? and top = 'O'", [name, sub, str(i + 1)])
row = curs.fetchall()
if(row):
isblock = isblock + ' (해제)'
else:
isblock = isblock + ' (공지)'
curs.execute("select end from ban where block = ?", [dain[3]])
ban_it = curs.fetchall()
if(ban_it):
ban = ' (해제)' + isblock
else:
ban = ' (차단)' + isblock
else:
curs.execute("select end from ban where block = ?", [dain[3]])
ban_it = curs.fetchall()
if(ban_it):
ban = ' †'
else:
ban = ''
curs.execute('select acl from user where id = ?', [dain[3]])
adch = curs.fetchall()
if(adch and adch[0][0] != 'user'):
chad += ' ★'
ip = ip_pas(dain[3], 1)
if(dain[5] == '1'):
color = '_blue'
elif(dain[3] == start):
color = '_green'
else:
color = ''
div += '
\
'
i += 1
l_c = login_check()
if(not ban == 1):
data = ' \
\
\
'
if(l_c == 0 and style == ''):
data += '비 로그인 상태입니다. 비 로그인으로 작업 시 아이피가 토론에 기록됩니다.'
else:
data = ''
return(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (토론)'],
data = '
' + sub + '
\
\
' + div + ' \
' + data,
menu = [['topic/' + url_pas(name), '목록']]
)
)
@route('/topic/', method=['POST', 'GET'])
@route('/topic//', method=['GET'])
def close_topic_list(name = None, tool = None):
div = ''
i = 0
list_d = 0
if(request.method == 'POST'):
t_num = ''
while(1):
curs.execute("select title from topic where title = ? and sub = ? limit 1", [name, request.forms.topic + t_num])
t_data = curs.fetchall()
if(t_data):
if(t_num == ''):
t_num = ' 2'
else:
t_num = ' ' + str(int(t_num.replace(' ', '')) + 1)
else:
break
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(request.forms.topic + t_num)))
else:
plus = ''
menu = [['topic/' + url_pas(name), '목록']]
if(tool == 'close'):
curs.execute("select sub from stop where title = ? and close = 'O' order by sub asc", [name])
sub = '닫힘'
elif(tool == 'agree'):
curs.execute("select sub from agreedis where title = ? order by sub asc", [name])
sub = '합의'
else:
curs.execute("select sub from rd where title = ? order by date desc", [name])
sub = '토론 목록'
menu = [['w/' + url_pas(name), '문서']]
plus = ' \
(닫힘)(합의) \
\
\
\
\
\
'
rows = curs.fetchall()
for data in rows:
curs.execute("select data, date, ip, block from topic where title = ? and sub = ? and id = '1'", [name, data[0]])
row = curs.fetchall()
if(row):
indata = namumark(name, row[0][0], 0, 0)
if(row[0][3] == 'O'):
indata = ' '
block = 'id="block"'
else:
block = ''
ip = ip_pas(row[0][2], 1)
it_p = 0
if(sub == '토론 목록'):
curs.execute("select title from stop where title = ? and sub = ? and close = 'O' order by sub asc", [name, data[0]])
close = curs.fetchall()
if(close):
it_p = 1
if(not it_p == 1):
div += '
\
'
i += 1
return(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (' + sub + ')'],
data = '',
menu = menu
)
)
@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'))
curs.execute("select pw from user where id = ?", [request.forms.id])
user = curs.fetchall()
if(user):
if(session.get('Now') == 1):
return(redirect('/error/11'))
if(bcrypt.checkpw(bytes(request.forms.pw, 'utf-8'), bytes(user[0][0], 'utf-8'))):
session['Now'] = 1
session['DREAMER'] = request.forms.id
curs.execute("select css from custom where user = ?", [request.forms.id])
css_data = curs.fetchall()
if(css_data):
session['Daydream'] = css_data[0][0]
else:
session['Daydream'] = ''
curs.execute("insert into login (user, ip, today) values (?, ?, ?)", [request.forms.id, ip, get_time()])
conn.commit()
return(redirect('/user'))
else:
return(redirect('/error/10'))
else:
return(redirect('/error/5'))
else:
if(ban == 1):
return(redirect('/ban'))
if(session.get('Now') == 1):
return(redirect('/error/11'))
return(
template(
'index',
imp = ['로그인', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['user', '사용자']]
)
)
@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'))
curs.execute("select pw from user where id = ?", [request.forms.id])
user = curs.fetchall()
if(user):
if(not re.search('(\.|:)', ip)):
return(redirect('/logout'))
else:
if(bcrypt.checkpw(bytes(request.forms.pw, 'utf-8'), bytes(user[0][0], 'utf-8'))):
hashed = bcrypt.hashpw(bytes(request.forms.pw2, 'utf-8'), bcrypt.gensalt())
curs.execute("update user set pw = ? where id = ?", [hashed.decode(), request.forms.id])
conn.commit()
return(redirect('/login'))
else:
return(redirect('/error/10'))
else:
return(redirect('/error/5'))
else:
return(redirect('/error/20'))
else:
if(ban == 1):
return(redirect('/ban'))
if(not re.search('(\.|:)', ip)):
return(redirect('/logout'))
return(
template(
'index',
imp = ['비밀번호 변경', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['user', '사용자']]
)
)
@route('/check/')
def user_check(name = None):
curs.execute("select acl from user where id = ?", [name])
user = curs.fetchall()
if(user and user[0][0] != 'user'):
return(redirect('/error/4'))
if(admin_check(4, 'check (' + name + ')') == 1):
if(re.search('^(?:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}?)$', name)):
curs.execute("select user, ip, today from login where ip = ? order by today desc", [name])
else:
curs.execute("select user, ip, today from login where user = ? order by today desc", [name])
row = curs.fetchall()
if(row):
c = '
\
\
\
이름
\
아이피
\
언제
\
'
for data in row:
c += '
\
' + ip_pas(data[0], 2) + '
\
' + ip_pas(data[1], 2) + '
\
' + data[2] + '
\
'
else:
c += ' \
'
else:
c = ''
return(
template(
'index',
imp = ['다중 검사', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = c,
menu = [['manager', '관리자']]
)
)
else:
return(redirect('/error/3'))
@route('/register', method=['POST', 'GET'])
def register():
ip = ip_check()
ban = ban_check(ip)
if(ban == 1):
return(redirect('/ban'))
if(request.method == 'POST'):
if(request.forms.pw == request.forms.pw2):
m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.forms.id)
if(m):
return(redirect('/error/8'))
if(len(request.forms.id) > 32):
return(redirect('/error/7'))
curs.execute("select id from user where id = ?", [request.forms.id])
rows = curs.fetchall()
if(rows):
return(redirect('/error/6'))
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) values (?, ?, 'owner')", [request.forms.id, hashed.decode()])
else:
curs.execute("insert into user (id, pw, acl) values (?, ?, 'user')", [request.forms.id, hashed.decode()])
conn.commit()
return(redirect('/login'))
else:
return(redirect('/error/20'))
else:
return(
template(
'index',
imp = ['회원가입', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = '',
menu = [['user', '사용자']]
)
)
@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):
curs.execute("select acl from user where id = ?", [name])
user = curs.fetchall()
if(user and user[0][0] != 'user'):
return(redirect('/error/4'))
if(request.method == 'POST'):
if(admin_check(1, 'ban (' + name + ')') == 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 block from ban where block = ?", [name])
row = curs.fetchall()
if(row):
rb_plus(name, '해제', get_time(), ip, '')
curs.execute("delete from ban where block = ?", [name])
else:
b = re.search("^([0-9]{1,3}\.[0-9]{1,3})$", name)
if(b):
band_d = 'O'
else:
band_d = ''
rb_plus(name, end, get_time(), ip, request.forms.why)
curs.execute("insert into ban (block, end, why, band) values (?, ?, ?, ?)", [name, end, request.forms.why, band_d])
conn.commit()
return(redirect('/ban/' + url_pas(name)))
else:
return(redirect('/error/3'))
else:
if(admin_check(1, None) == 1):
curs.execute("select * from ban where block = ?", [name])
row = curs.fetchall()
if(row):
now = '차단 해제'
data = ''
else:
b = re.search("^([0-9]{1,3}\.[0-9]{1,3})$", name)
if(b):
now = '대역 차단'
else:
now = '차단'
data = ' \
\
\
아무것도 안 적으면 무기한 차단입니다. \
\
\
차단 일 지정시 형식은 YYYY-MM-DD로 기록해야 합니다. (예시: 2017-01-20, 2017-10-15) \
\
\
지금 시각은 ' + get_time() + ' 입니다. \
\
\
\
\
\
사유를 쓰는 곳입니다. \
\
'
return(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (' + now + ')'],
data = '',
menu = [['manager', '관리자']]
)
)
else:
return(redirect('/error/3'))
@route('/acl/', method=['POST', 'GET'])
def acl(name = None):
if(request.method == 'POST'):
if(admin_check(5, 'acl (' + name + ')') == 1):
curs.execute("select acl from data where title = ?", [name])
row = curs.fetchall()
if(row):
if(request.forms.select == 'admin'):
curs.execute("update data set acl = 'admin' where title = ?", [name])
elif(request.forms.select == 'user'):
curs.execute("update data set acl = 'user' where title = ?", [name])
else:
curs.execute("update data set acl = '' where title = ?", [name])
conn.commit()
return(redirect('/w/' + url_pas(name)))
else:
return(redirect('/error/3'))
else:
if(admin_check(5, None) == 1):
curs.execute("select acl from data where title = ?", [name])
row = curs.fetchall()
if(row):
if(row[0][0] == 'admin'):
now = '관리자만'
elif(row[0][0] == 'user'):
now = '로그인 이상'
else:
now = '일반'
return(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (ACL)'],
data = '현재 ACL : ' + now + ' \
\
\
',
menu = [['w/' + url_pas(name), '문서'], ['manager', '관리자']]
)
)
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, 'admin (' + name + ')') == 1):
curs.execute("select acl from user where id = ?", [name])
user = curs.fetchall()
if(user):
if(user[0][0] != 'user'):
curs.execute("update user set acl = 'user' where id = ?", [name])
else:
curs.execute("update user set acl = ? where id = ?", [request.forms.select, name])
conn.commit()
return(redirect('/admin/' + url_pas(name)))
else:
return(redirect('/error/5'))
else:
return(redirect('/error/3'))
else:
if(admin_check(None, None) == 1):
curs.execute("select acl from user where id = ?", [name])
user = curs.fetchall()
if(user):
if(user[0][0] != '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(name_rem != data[0]):
name_rem = data[0]
div += ''
if(now == '권한 부여'):
plus = ' \
\
'
else:
plus = ''
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (권한 부여)'],
data = '',
menu = [['manager', '관리자']]
)
)
else:
return(redirect('/error/5'))
else:
return(redirect('/error/3'))
@route('/ban')
def are_you_ban():
ip = ip_check()
if(ban_check(ip) == 1):
curs.execute("select end, why from ban where block = ?", [ip])
rows = curs.fetchall()
if(not rows):
data = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip)
if(data):
results = data.groups()
curs.execute("select end, why from ban where block = ? and band = 'O'", [results[0]])
rows = curs.fetchall()
if(rows):
if(rows[0][0]):
end = rows[0][0] + ' 까지 차단 상태 입니다. / 사유 : ' + rows[0][1]
now = re.sub(':', '', get_time())
now = re.sub('\-', '', now)
now = int(re.sub(' ', '', now))
day = re.sub('\-', '', rows[0][0])
if(now >= int(day + '000000')):
curs.execute("delete from ban where block = ?", [ip])
conn.commit()
end = '차단이 풀렸습니다. 다시 시도 해 보세요.'
else:
end = '영구 차단 상태 입니다. / 사유 : ' + rows[0][1]
else:
end = '권한이 맞지 않는 상태 입니다.'
else:
end = '권한이 맞지 않는 상태 입니다.'
return(
template(
'index',
imp = ['권한 오류', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0],
data = end,
menu = 0
)
)
@route('/w//r//diff/')
def diff_data(name = None, a = None, b = None):
curs.execute("select data from history where id = ? and title = ?", [str(a), name])
a_raw_data = curs.fetchall()
if(a_raw_data):
curs.execute("select data from history where id = ? and title = ?", [str(b), name])
b_raw_data = curs.fetchall()
if(b_raw_data):
a_data = html.escape(a_raw_data[0][0])
b_data = html.escape(b_raw_data[0][0])
diff_data = difflib.SequenceMatcher(None, a_data, b_data)
result_1 = diff(diff_data, 1)
result_2 = diff(diff_data, 0)
if(a_data == result_1):
result = '
' + result_2 + '
'
elif(b_data == result_2):
result = '
' + result_1 + '
'
else:
result = '
' + result_1 + '' + result_2 + '
'
return(
template(
'index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (비교)'],
data = result,
menu = [['history/' + url_pas(name), '역사']]
)
)
return(redirect('/history/' + url_pas(name)))
@route('/down/')
def down(name = None):
curs.execute("select title from data where title like ?", ['%' + name + '/%'])
under = curs.fetchall()
div = ''
i = 0
for data in under:
div += '
\
' + enddata
menu += [['w/' + url_pas(name), '넘기기']]
if(not uppage == 0):
menu += [['w/' + url_pas(uppage), '상위']]
if(down):
menu += [['down/' + url_pas(name), '하위']]
if(num):
menu = [['history/' + url_pas(name), '역사']]
sub = ' (' + str(num) + '판)'
acl = ''
return(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), sub + acl],
data = enddata + namumark(name, div, 0, 0),
menu = menu
)
)
@route('/user//topic')
@route('/user//topic/')
def user_topic_list(name = None, num = 1):
if(num * 50 <= 0):
v = 50
else:
v = num * 50
i = v - 50
ydmin = admin_check(1, None)
div = '
\
\
\
토론명
\
작성자
\
시간
\
'
curs.execute("select title, id, sub, ip, date from topic where ip = ? order by date desc limit ?, ?", [name, str(i), str(v)])
rows = curs.fetchall()
if(rows):
for data in rows:
title = html.escape(data[0])
sub = html.escape(data[2])
if(ydmin == 1):
curs.execute("select * from ban where block = ?", [data[3]])
row = curs.fetchall()
if(row):
ban = ' (해제)'
else:
ban = ' (차단)'
else:
ban = ''
ip = ip_pas(data[3], 1)
div += '