',
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])
curs.execute("update other set data = ? where name = 'edit'", [request.forms.edit])
curs.execute("update other set data = ? where name = 'reg'", [request.forms.reg])
conn.commit()
return(redirect('/edit_set/1'))
else:
i_list = ['name', 'frontpage', 'license', 'upload', 'skin', 'edit', 'reg']
n_list = ['무명위키', '위키:대문', 'CC 0', '2', '', 'normal', '']
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()
div = ''
if(d_list[5] == 'login'):
div += ''
div += ''
div += ''
elif(d_list[5] == 'admin'):
div += ''
div += ''
div += ''
else:
div += ''
div += ''
div += ''
if(d_list[6]):
ch_1 = 'checked="checked"'
else:
ch_1 = ''
return(
html_minify(
template('index',
imp = ['기본 설정', wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), 0, 0],
data = '',
menu = [['edit_set', '설정 편집']]
)
)
)
elif(num == 2):
if(admin_check(None, 'edit_set') == 1):
if(request.method == 'POST'):
curs.execute("update other set data = ? where name = ?", [request.forms.contract, 'contract'])
conn.commit()
return(redirect('/edit_set/2'))
else:
i_list = ['contract']
n_list = ['']
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), custom(0), custom(1), custom(2), 0, 0],
data = '',
menu = [['edit_set', '설정 편집']]
)
)
)
else:
return(re_error('/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(not re.search('^사용자:', data[0])):
if(data[1] == 'admin'):
acl = '관리자'
else:
acl = '사용자'
div += '
'
return(
html_minify(
template('index',
imp = ['관리 그룹 추가', wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), 0, 0],
data = '',
menu = [['manager', '관리자']]
)
)
)
else:
return(re_error('/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]) + ' (' + 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), custom(0), custom(1), custom(2), 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])
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), custom(0), custom(1), custom(2), 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])
list_data += '
\
주의 : 권한 사용 안하고 열람만 해도 기록되는 경우도 있습니다. \
\
\
(이전)(이후)'
return(
html_minify(
template('index',
imp = ['관리자 권한 기록', wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), 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), custom(0), custom(1), custom(2), 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(re_error('/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), custom(0), custom(1), custom(2), ' (역링크)', 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), custom(0), custom(1), custom(2), 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])
if(data[3] != ''):
end = data[3]
else:
end = '무기한'
div += '
\
\
(이전)(이후)'
div = '' + div
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), ' (역사)', 0],
data = div,
menu = [['w/' + url_pas(name), '문서'], ['move_data/' + 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), custom(0), custom(1), custom(2), ' (검색)', 0],
data = div,
menu = 0
)
)
)
@route('/raw/')
@route('/raw//r/')
@route('/topic//sub//raw/')
def raw_view(name = None, sub_t = None, num = None):
v_name = name
sub = ' (원본)'
if(not sub_t and 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(re_error('/error/3'))
curs.execute("select data from history where title = ? and id = ?", [name, str(num)])
sub += ' (' + str(num) + '판)'
menu = [['history/' + url_pas(name), '역사']]
elif(sub_t):
curs.execute("select data from topic where id = ? and title = ? and sub = ? and block = ''", [str(num), name, sub_t])
v_name = '토론 원본'
sub = ' (' + str(num) + '번)'
menu = [['topic/' + url_pas(name) + '/sub/' + url_pas(sub_t) + '#' + str(num), '토론']]
else:
curs.execute("select data from data where title = ?", [name])
menu = [['w/' + url_pas(name), '문서']]
data = curs.fetchall()
if(data):
p_data = html.escape(data[0][0])
p_data = ''
return(
html_minify(
template('index',
imp = [v_name, wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), sub, 0],
data = p_data,
menu = menu
)
)
)
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(re_error('/error/3'))
if(can == 1):
return(re_error('/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(re_error('/error/3'))
if(can == 1):
return(re_error('/ban'))
else:
curs.execute("select title from history where title = ? and id = ?", [name, str(num)])
rows = curs.fetchall()
if(rows):
l_c = custom(0)
if(l_c == 0):
plus = '비 로그인 상태입니다. 비 로그인으로 작업 시 아이피가 역사에 기록됩니다. \
\
'
else:
plus = ''
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), l_c, custom(1), custom(2), ' (되돌리기)', 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), custom(0), custom(1), custom(2), 0, 0],
data = ' \
문서명 A \
\
문서명 B \
\
문서명 C \
\
\
이런 식으로 적으세요. \
\
\
\
',
menu = [['manager', '관리자']]
)
)
)
else:
return(re_error('/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(re_error('/ban'))
if(len(request.forms.send) > 500):
return(re_error('/error/15'))
if(request.forms.otent == request.forms.content):
return(re_error('/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)
print(request.forms.otent)
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(re_error('/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), custom(0), custom(1), custom(2), ' (수정)', 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(re_error('/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), custom(0), custom(1), custom(2), ' (미리보기)', 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(re_error('/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(re_error('/ban'))
else:
l_c = custom(0)
if(l_c == 0):
plus = '비 로그인 상태입니다. 비 로그인으로 작업 시 아이피가 역사에 기록됩니다.
'
else:
plus = ''
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), l_c, custom(1), custom(2), ' (삭제)', 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), custom(0), custom(1), custom(2), ' (이동)', 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(re_error('/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(re_error('/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 = custom(0)
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), custom(0), custom(1), custom(2), ' (' + 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) + '#' + str(num)))
else:
return(re_error('/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) + '#' + str(num)))
else:
return(re_error('/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(re_error('/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(re_error('/error/3'))
@route('/topic//sub//admin/')
def topic_admin(name = None, sub = None, num = None):
curs.execute("select block, ip from topic where title = ? and sub = ? and id = ?", [name, sub, str(num)])
data = curs.fetchall()
if(not data):
return(redirect('/topic/' + url_pas(name) + '/sub/' + url_pas(sub)))
is_ban = '
',
menu = [['topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '#' + str(num), '토론']]
)
)
)
@route('/topic//sub/', method=['POST', 'GET'])
def topic(name = None, sub = None):
ban = topic_check(name, sub)
admin = admin_check(3, None)
if(request.method == 'POST'):
ip = ip_check()
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(re_error('/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:
s = ''
div = ''
curs.execute("select title from stop where title = ? and sub = ? and close = 'O'", [name, sub])
cd = curs.fetchall()
curs.execute("select title from stop where title = ? and sub = ? and close = ''", [name, sub])
sd = curs.fetchall()
if(admin == 1):
if(cd):
div += '(열기) '
else:
div += '(닫기) '
if(sd):
div += '(재개) '
else:
div += '(정지) '
curs.execute("select title from agreedis where title = ? and sub = ?", [name, sub])
if(curs.fetchall()):
div += '(합의)'
else:
div += '(취소)'
div += '
'
if((sd or cd) and admin != 1):
s = 'display: none;'
curs.execute("select data, id, date, ip, block, top from topic where title = ? and sub = ? order by id + 0 asc", [name, sub])
t1 = 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])
t2 = curs.fetchall()
for d in t2:
a = ''
curs.execute("select who from re_admin where what = ? order by time desc limit 1", ['notice (' + name + ' - ' + sub + '#' + d[1] + ')'])
m = curs.fetchall()
if(m):
a += ' @' + m[0][0]
div += '
\
'
i = 1
for d in t1:
if(i == 1):
start = d[3]
p = d[0]
if(d[4] == 'O'):
bd = 'style="background: gainsboro;"'
if(admin != 1):
curs.execute("select who from re_admin where what = ? order by time desc limit 1", ['blind (' + name + ' - ' + sub + '#' + str(i) + ')'])
b = curs.fetchall()
if(b):
p = '[[사용자:' + b[0][0] + ']]님이 가림'
else:
p = '관리자가 가림'
else:
bd = ''
p = namumark('', p, 0, 0, 0)
ip = ip_pas(d[3])
curs.execute('select acl from user where id = ?', [d[3]])
user_acl = curs.fetchall()
if(user_acl and user_acl[0][0] != 'user'):
ip += ' ★'
if(admin == 1 or bd == ''):
ip += ' (원본)'
if(admin == 1):
ip += ' (관리)'
curs.execute("select end from ban where block = ?", [d[3]])
if(curs.fetchall()):
ip += ' †'
if(d[5] == '1'):
c = '_blue'
elif(d[3] == start):
c = '_green'
else:
c = ''
if(p == ''):
p = ' '
div += '
\
'
i += 1
l = custom(0)
if(ban != 1):
data = ' \
\
\
'
if(l == 0 and s == ''):
data += '비 로그인 상태입니다. 비 로그인으로 작업 시 아이피가 토론에 기록됩니다.'
else:
data = ''
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), l, custom(1), custom(2), ' (토론)', 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])
if(curs.fetchall()):
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), custom(0), custom(1), custom(2), ' (' + sub + ')', 0],
data = '',
menu = menu
)
)
)
@route('/login', method=['POST', 'GET'])
def login():
session = request.environ.get('beaker.session')
agent = request.environ.get('HTTP_USER_AGENT')
ip = ip_check()
ban = ban_check()
if(request.method == 'POST'):
if(ban == 1):
return(re_error('/ban'))
curs.execute("select pw from user where id = ?", [request.forms.id])
user = curs.fetchall()
if(user):
if(session.get('Now') == 1):
return(re_error('/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 ua_d (name, ip, ua, today, sub) values (?, ?, ?, ?, '')", [request.forms.id, ip, agent, get_time()])
conn.commit()
return(redirect('/user'))
else:
return(re_error('/error/10'))
else:
return(re_error('/error/5'))
else:
if(ban == 1):
return(re_error('/ban'))
if(session.get('Now') == 1):
return(re_error('/error/11'))
return(
html_minify(
template('index',
imp = ['로그인', wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), 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(re_error('/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(re_error('/error/10'))
else:
return(re_error('/error/5'))
else:
return(re_error('/error/20'))
else:
if(ban == 1):
return(re_error('/ban'))
if(re.search('(\.|:)', ip)):
return(redirect('/login'))
return(
html_minify(
template('index',
imp = ['비밀번호 변경', wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), 0, 0],
data = '',
menu = [['user', '사용자']]
)
)
)
@route('/check/')
@route('/check//')
def user_check(name = None, name2 = None):
curs.execute("select acl from user where id = ? or id = ?", [name, name2])
user = curs.fetchall()
if(user and user[0][0] != 'user'):
if(admin_check(None, None) != 1):
return(re_error('/error/4'))
if(admin_check(4, 'check (' + name + ')') == 1):
if(name2):
if(re.search('(?:\.|:)', name)):
if(re.search('(?:\.|:)', name2)):
curs.execute("select name, ip, ua, today from ua_d where ip = ? or ip = ? order by today desc", [name, name2])
else:
curs.execute("select name, ip, ua, today from ua_d where ip = ? or name = ? order by today desc", [name, name2])
else:
if(re.search('(?:\.|:)', name2)):
curs.execute("select name, ip, ua, today from ua_d where name = ? or ip = ? order by today desc", [name, name2])
else:
curs.execute("select name, ip, ua, today from ua_d where name = ? or name = ? order by today desc", [name, name2])
elif(re.search('(?:\.|:)', name)):
curs.execute("select name, ip, ua, today from ua_d where ip = ? order by today desc", [name])
else:
curs.execute("select name, ip, ua, today from ua_d where name = ? order by today desc", [name])
row = curs.fetchall()
if(row):
c = '
\
\
\
이름
\
아이피
\
언제
\
'
for data in row:
if(data[2]):
ua = data[2]
else:
ua = ' '
c += '
\
' + ip_pas(data[0]) + '
\
' + ip_pas(data[1]) + '
\
' + data[3] + '
\
\
' + ua + '
'
else:
c += ' \
'
else:
c = ''
return(
html_minify(
template('index',
imp = ['다중 검사', wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), 0, 0],
data = c,
menu = [['manager', '관리자']]
)
)
)
else:
return(re_error('/error/3'))
@route('/register', method=['POST', 'GET'])
def register():
ip = ip_check()
ban = ban_check()
if(ban == 1):
return(re_error('/ban'))
if(not admin_check(None, None) == 1):
curs.execute('select data from other where name = "reg"')
set_d = curs.fetchall()
if(set_d and set_d[0][0] == 'on'):
return(re_error('/ban'))
if(request.method == 'POST'):
if(request.forms.pw == request.forms.pw2):
if(re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.forms.id)):
return(re_error('/error/8'))
if(len(request.forms.id) > 32):
return(re_error('/error/7'))
curs.execute("select id from user where id = ?", [request.forms.id])
rows = curs.fetchall()
if(rows):
return(re_error('/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(re_error('/error/20'))
else:
p = ''
curs.execute('select data from other where name = "contract"')
d = curs.fetchall()
if(d):
if(d[0][0] != ''):
p = d[0][0] + '
'
return(
html_minify(
template('index',
imp = ['회원가입', wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), 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'):
if(admin_check(None, None) != 1):
return(re_error('/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(re_error('/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), custom(0), custom(1), custom(2), ' (' + now + ')', 0],
data = '',
menu = [['manager', '관리자']]
)
)
)
else:
return(re_error('/error/3'))
@route('/user_acl/', method=['POST', 'GET'])
def acl(name = None):
ip = ip_check()
if(ip != name or re.search("(\.|:)", name)):
return(redirect('/login'))
if(request.method == 'POST'):
curs.execute("select acl from data where title = ?", ['사용자:' + name])
acl_d = curs.fetchall()
if(acl_d):
if(request.forms.select == 'all'):
curs.execute("update data set acl = 'all' 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)))
curs.execute("select acl from data where title = ?", ['사용자:' + name])
acl_d = curs.fetchall()
if(acl_d):
if(acl_d[0][0] == 'all'):
now = '모두'
elif(acl_d[0][0] == 'user'):
now = '사용자'
else:
now = '일반'
return(
html_minify(
template('index',
imp = [name, wiki_set(1), wiki_set(3), custom(0), custom(1), custom(2), ' (SET)', 0],
data = '현재 ACL : ' + now + ' \
\
\
',
menu = [['user', '사용자']]
)
)
)
else:
return(redirect('/w/' + url_pas(name)))
@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(re_error('/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), custom(0), custom(1), custom(2), ' (ACL)', 0],
data = '현재 ACL : ' + now + ' \
\
\
',
menu = [['w/' + url_pas(name), '문서'], ['manager', '관리자']]
)
)
)
else:
return(redirect('/w/' + url_pas(name)) )
else:
return(re_error('/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(re_error('/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), custom(0), custom(1), custom(2), ' (권한 부여)', 0],
data = '',
menu = [['manager', '관리자']]
)
)
)
else:
return(re_error('/error/5'))
else:
return(re_error('/error/3'))
@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), custom(0), custom(1), custom(2), ' (비교)', 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 = '
' + 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])
div += '