',
menu = [['manager', '관리자']]
)
)
)
elif(num == 1):
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])
curs.execute("update other set data = ? where name = 'skin'", [request.forms.skin])
conn.commit()
return(redirect('/edit_set'))
else:
i_list = ['name', 'frontpage', 'license', 'upload', 'skin']
n_list = ['무명위키', '위키:대문', 'CC 0', '2', '']
d_list = []
x = 0
for i in i_list:
curs.execute('select data from other where name = ?', [i])
sql_d = curs.fetchall()
if(sql_d):
d_list += [sql_d[0][0]]
else:
curs.execute('insert into other (name, data) values (?, ?)', [i, n_list[x]])
d_list += [n_list[x]]
x += 1
conn.commit()
return(
html_minify(
template('index',
imp = ['설정 편집', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 0],
data = '',
menu = [['manager', '관리자']]
)
)
)
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 = 0
curs.execute("select title, acl from data where acl = 'admin' or acl = 'user' order by acl desc")
list_data = curs.fetchall()
for data in list_data:
if(data[1] == 'admin'):
acl = '관리자'
else:
acl = '로그인'
div += '
'
return(
html_minify(
template('index',
imp = ['관리 그룹 추가', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 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 += '
'
if(name):
curs.execute("select end, why from ban where block = ?", [name])
ban_it = curs.fetchall()
if(ban_it):
sub = '(차단)'
else:
sub = 0
title = '사용자 기록'
menu = [['other', '기타'], ['user', '사용자']]
div += ' \
(이전)(이전)'
else:
sub = 0
menu = 0
title = '최근 변경내역'
return(
html_minify(
template('index',
imp = [title, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), sub, 0],
data = div,
menu = menu
)
)
)
@route('/history//r//hidden')
def history_hidden(name = None, num = None):
if(admin_check(6, 'history_hidden (' + name + '#' + str(num) + ')') == 1):
curs.execute("select * from hidhi where title = ? and re = ?", [name, str(num)])
exist = curs.fetchall()
if(exist):
curs.execute("delete from hidhi where title = ? and re = ?", [name, str(num)])
else:
curs.execute("insert into hidhi (title, re) values (?, ?)", [name, str(num)])
conn.commit()
return(redirect('/history/' + url_pas(name)))
@route('/user_log')
@route('/user_log/n/')
def user_log(num = 1):
if(num * 50 <= 0):
i = 50
else:
i = num * 50
j = i - 50
list_data = '
'
ydmin = admin_check(1, None)
curs.execute("select id from user limit ?, ?", [str(j), str(i)])
user_list = curs.fetchall()
for data in user_list:
if(ydmin == 1):
curs.execute("select block from ban where block = ?", [data[0]])
ban_exist = curs.fetchall()
if(ban_exist):
ban_button = ' (해제)'
else:
ban_button = ' (차단)'
else:
ban_button = ''
ip = ip_pas(data[0], 2)
list_data += '
' + str(j + 1) + '. ' + ip + ban_button + '
'
j += 1
else:
list_data += '
(이전)(이후)'
return(
html_minify(
template('index',
imp = ['사용자 가입 기록', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 0],
data = list_data,
menu = [['other', '기타']]
)
)
)
@route('/admin_log')
@route('/admin_log/n/')
def user_log(num = 1):
if(num * 50 <= 0):
i = 50
else:
i = num * 50
j = i - 50
list_data = '
'
curs.execute("select who, what, time from re_admin order by time desc limit ?, ?", [str(j), str(i)])
get_list = curs.fetchall()
for data in get_list:
ip = ip_pas(data[0], 2)
list_data += '
\
주의 : 권한 사용 안하고 열람만 해도 기록되는 경우도 있습니다. \
\
\
(이전)(이후)'
return(
html_minify(
template('index',
imp = ['관리자 권한 기록', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 0],
data = list_data,
menu = [['other', '기타']]
)
)
)
@route('/give_log')
@route('/give_log/n/')
def give_log(num = 1):
if(num * 50 <= 0):
i = 50
else:
i = num * 50
j = i - 50
list_data = '
'
back = ''
curs.execute("select name, acl from alist order by name asc limit ?, ?", [str(j), str(i)])
get_list = curs.fetchall()
for data in get_list:
if(back != data[0]):
back = data[0]
j += 1
list_data += '
' + str(j) + '. ' + data[0] + ' (' + data[1] + ')
'
else:
list_data += '
(이전)(이후)'
return(
html_minify(
template('index',
imp = ['권한 목록', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 0],
data = list_data,
menu = [['other', '기타']]
)
)
)
@route('/indexing')
def indexing():
if(admin_check(None, 'indexing') == 1):
curs.execute("select name from sqlite_master where type in ('table', 'view') and name not like 'sqlite_%' union all select name from sqlite_temp_master where type in ('table', 'view') order by 1;")
data = curs.fetchall()
for table in data:
print('----- ' + table[0] + ' -----')
curs.execute('select sql from sqlite_master where name = ?', [table[0]])
cul = curs.fetchall()
r_cul = re.findall('(?:([^ (]*) text)', str(cul[0]))
for n_cul in r_cul:
print(n_cul)
sql = 'create index index_' + table[0] + '_' + n_cul + ' on ' + table[0] + '(' + n_cul + ')'
curs.execute(sql)
conn.commit()
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(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (역링크)', 0],
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(
html_minify(
template('index',
imp = ['최근 토론내역', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), m_sub, 0],
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(data[3] != ''):
end = data[3]
else:
end = '무기한'
div += '
\
\
(이전)(이후)'
div = '' + div
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (역사)', 0],
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 = '
(이전)(이후)'
return(
html_minify(
template('index',
imp = [name, 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(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (원본)', 0],
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(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])
else:
leng = '+' + str(len(rows[0][0]))
curs.execute("insert into data (title, data, acl) values (?, ?, '')", [name, rows[0][0]])
history_plus(
name,
rows[0][0],
today,
ip,
request.forms.send + ' (' + str(num) + '판)',
leng
)
namumark(name, rows[0][0], 1, 0, 0)
conn.commit()
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(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), l_c, custom_css(), custom_js(), ' (되돌리기)', 0],
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(
html_minify(
template('index',
imp = ['많은 문서 삭제', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 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(name)
if(request.method == 'POST'):
if(can == 1):
return(redirect('/ban'))
if(len(request.forms.send) > 500):
return(redirect('/error/15'))
if(request.forms.otent == request.forms.content):
return(redirect('/error/18'))
today = get_time()
content = savemark(request.forms.content)
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):
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
)
namumark(name, content, 1, 0, 0)
include_check(name, content)
conn.commit()
return(redirect('/w/' + url_pas(name)))
else:
if(can == 1):
return(redirect('/ban'))
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(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (수정)', 0],
data = '',
menu = [['w/' + url_pas(name), '문서']]
)
)
)
@route('/preview/', method=['POST'])
@route('/preview//section/', method=['POST'])
def preview(name = None, num = None):
ip = ip_check()
can = acl_check(name)
if(can == 1):
return(redirect('/ban'))
newdata = request.forms.content
newdata = re.sub('^#(?:redirect|넘겨주기) (?P[^\n]*)', ' * [[\g]] 문서로 넘겨주기', newdata)
enddata = namumark(name, newdata, 0, 0, 0)
if(num):
action = '/section/' + str(num)
else:
action = ''
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (미리보기)', 0],
data = ' \
' + enddata,
menu = [['w/' + url_pas(name), '문서']]
)
)
)
@route('/delete/', method=['POST', 'GET'])
def delete(name = None):
ip = ip_check()
can = acl_check(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()
leng = '-' + str(len(rows[0][0]))
history_plus(
name,
'',
today,
ip,
request.forms.send + ' (삭제)',
leng
)
curs.execute("delete from back where link = ?", [name])
curs.execute("delete from cat where cat = ?", [name])
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(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), l_c, custom_css(), custom_js(), ' (삭제)', 0],
data = '',
menu = [['w/' + url_pas(name), '문서']]
)
)
)
else:
return(redirect('/w/' + url_pas(name)))
@route('/move_data/')
@route('/move_data//')
def move_data(name = None, n = 1):
if(n > 0):
i = n
else:
i = 1
j = i * 50
da = '
'
curs.execute("select origin, new, date, who, send from move where origin = ? or new = ? limit ?, ?", [name, name, j - 50, j])
for d in curs.fetchall():
if(d[4] == ''):
sn = '(없음)'
else:
sn = d[4]
da += '
(이전)(이후)'
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (이동)', 0],
data = da,
menu = [['w/' + url_pas(name), '문서']]
)
)
)
@route('/move/', method=['POST', 'GET'])
def move(name = None):
ip = ip_check()
can = acl_check(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'))
if(rows):
curs.execute("update data set title = ? where title = ?", [request.forms.title, name])
curs.execute("update back set link = ? where link = ?", [request.forms.title, name])
curs.execute("update cat set cat = ? where cat = ?", [request.forms.title, name])
d = rows[0][0]
else:
d = ''
history_plus(
name,
d,
today,
ip,
request.forms.send + ' (' + name + ' - ' + request.forms.title + ' 이동)',
leng
)
curs.execute('insert into move (origin, new, date, who, send) values (?, ?, ?, ?, ?)', [name, request.forms.title, today, ip, request.forms.send])
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 = '비 로그인 상태입니다. 비 로그인으로 작업 시 아이피가 역사에 기록됩니다.
'
if(num == 0):
curs.execute("select title from data order by title asc")
else:
curs.execute("select title from data order by title asc limit ?, ?", [str(v_page - num), str(num)])
title_list = curs.fetchall()
for list_data in title_list:
data += '
(이전)(이후)'
return(
html_minify(
template('index',
imp = ['모든 문서', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (' + str(num) + ')', 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(name, sub)
admin = admin_check(3, None)
if(request.method == 'POST'):
today = get_time()
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
m = re.search('^사용자:(.+)', name)
if(m):
d = m.groups()
curs.execute('insert into alarm (name, data, date) values (?, ?, ?)', [d[0], ip + '님이 사용자 토론을 시작했습니다.', today])
if(ban == 1 and admin != 1):
return(redirect('/ban'))
rd_plus(
name,
sub,
today
)
data = re.sub("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", "[br]", request.forms.content)
m = re.findall("(?:#([0-9]+))", data)
for da in m:
curs.execute("select ip from topic where title = ? and sub = ? and id = ?", [name, sub, da])
row = curs.fetchall()
if(row):
if(not re.search('(\.|:)', row[0][0])):
curs.execute('insert into alarm (name, data, date) values (?, ?, ?)', [row[0][0], ip + '님이 토론에서 언급 했습니다.', today])
data = re.sub("(?P#(?:[0-9]+))", '[[\g]]', data)
data = savemark(data)
curs.execute("insert into topic (id, title, sub, data, date, ip, block, top) values (?, ?, ?, ?, ?, ?, '', '')", [str(num), name, sub, data, 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, 0)
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 += 1
l_c = login_check()
if(ban != 1):
data = ' \
\
\
'
if(l_c == 0 and style == ''):
data += '비 로그인 상태입니다. 비 로그인으로 작업 시 아이피가 토론에 기록됩니다.'
else:
data = ''
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (토론)', 0],
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):
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(it_p != 1):
div += '
'
i += 1
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (' + sub + ')', 0],
data = '',
menu = menu
)
)
)
@route('/login', method=['POST', 'GET'])
def login():
session = request.environ.get('beaker.session')
ip = ip_check()
ban = ban_check()
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(
html_minify(
template('index',
imp = ['로그인', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 0],
data = '',
menu = [['user', '사용자']]
)
)
)
@route('/change', method=['POST', 'GET'])
def change_password():
ip = ip_check()
ban = ban_check()
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(re.search('(\.|:)', ip)):
return(redirect('/login'))
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('/user'))
else:
return(redirect('/error/10'))
else:
return(redirect('/error/5'))
else:
return(redirect('/error/20'))
else:
if(ban == 1):
return(redirect('/ban'))
if(re.search('(\.|:)', ip)):
return(redirect('/login'))
return(
html_minify(
template('index',
imp = ['비밀번호 변경', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 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(
html_minify(
template('index',
imp = ['다중 검사', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 0],
data = c,
menu = [['manager', '관리자']]
)
)
)
else:
return(redirect('/error/3'))
@route('/register', method=['POST', 'GET'])
def register():
ip = ip_check()
ban = ban_check()
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 (?, ?, '소유자')", [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(
html_minify(
template('index',
imp = ['회원가입', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 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(request.forms.year == '09'):
end = ''
else:
end = request.forms.year + '-' + request.forms.month + '-' + request.forms.day
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 = '차단'
year_n = int("%04d" % (time.localtime().tm_year))
year = ''
for i in range(year_n, year_n + 51):
if(i == year_n):
year += ''
else:
year += ''
month = ''
for i in range(2, 13):
month += ''
day = ''
for i in range(2, 32):
day += ''
data = ' \
\
\
\
\
\
\
'
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (' + now + ')', 0],
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(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (ACL)', 0],
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):
if(request.forms.select == 'X'):
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/3'))
else:
if(admin_check(None, None) == 1):
curs.execute("select acl from user where id = ?", [name])
user = curs.fetchall()
if(user):
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]
if(user[0][0] == data[0]):
div += ''
else:
div += ''
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (권한 부여)', 0],
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() == 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(
html_minify(
template('index',
imp = ['권한 오류', wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), 0, 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])
if(a_data == b_data):
result = '내용이 같습니다.'
else:
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(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), ' (비교)', 0],
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 = '
' + enddata
if(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 = ''
r_date = 0
else:
curs.execute("select date from history where title = ? order by date desc limit 1", [name])
date = curs.fetchall()
if(date):
r_date = date[0][0]
else:
r_date = 0
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), login_check(), custom_css(), custom_js(), sub + acl, r_date],
data = enddata + namumark(name, div, 0, 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 += '