from bottle import route, run, template, error, request, static_file, app, BaseRequest from bottle.ext import beaker import bcrypt import os import difflib import hashlib import json import pymysql json_data = open('set.json').read() set_data = json.loads(json_data) session_opts = { 'session.type': 'file', 'session.data_dir': './app_session/', 'session.auto': True } app = beaker.middleware.SessionMiddleware(app(), session_opts) BaseRequest.MEMFILE_MAX = 1024 * 1024 def redirect(data): return('') db_pas = pymysql.escape_string from func import * from mark import * r_ver = '2.0.7' @route('/setup', method=['GET', 'POST']) def setup(): conn = pymysql.connect(user = set_data['user'], password = set_data['pw'], charset = 'utf8mb4') curs = conn.cursor(pymysql.cursors.DictCursor) if(request.method == 'POST'): if(not request.forms.owner == set_data['pw']): conn.close() return(redirect('/error/3')) else: try: curs.execute("use " + set_data['db']) except: curs.execute("create database " + set_data['db']) curs.execute("use " + set_data['db']) curs.execute("alter database " + set_data['db'] + " character set = utf8mb4 collate = utf8mb4_unicode_ci") try: curs.execute("create table data(title text, data longtext, acl text)") except: pass try: curs.execute("create table history(id text, title text, data longtext, date text, ip text, send text, leng text)") except: pass try: curs.execute("create table rd(title text, sub text, date text)") except: pass try: curs.execute("create table user(id text, pw text, acl text)") except: pass try: curs.execute("create table ban(block text, end text, why text, band text)") except: pass try: curs.execute("create table topic(id text, title text, sub text, data longtext, date text, ip text, block text, top text)") except: pass try: curs.execute("create table stop(title text, sub text, close text)") except: pass try: curs.execute("create table rb(block text, end text, today text, blocker text, why text)") except: pass try: curs.execute("create table login(user text, ip text, today text)") except: pass try: curs.execute("create table back(title text, link text, type text)") except: pass try: curs.execute("create table cat(title text, cat text)") except: pass try: curs.execute("create table hidhi(title text, re text)") except: pass try: curs.execute("create table agreedis(title text, sub text)") except: pass try: curs.execute("create table custom(user text, css longtext)") except: pass try: curs.execute("create table other(name text, data text)") except: pass try: curs.execute("create table alist(name text, acl text)") except: pass curs.execute('select data from other where name = "version"') version = curs.fetchall() if(version): t_ver = re.sub('\.', '', version[0]['data']) t_ver = re.sub('[a-z]$', '', t_ver) r_t_ver = re.sub('\.', '', r_ver) r_t_ver = re.sub('[a-z]$', '', r_t_ver) if(int(t_ver) <= int(r_t_ver)): curs.execute("update other set data = '" + db_pas(r_ver) + "' where name = 'version'") else: curs.execute("insert into other (name, data) value ('version', '" + db_pas(r_ver) + "')") t_ver = 0 curs.execute('select name from alist limit 1') getalist = curs.fetchall() if(getalist and int(t_ver) < 204): curs.execute("delete from alist where name = 'owner'") curs.execute("delete from alist where name = 'admin'") if(int(t_ver) < 202 or not getalist): curs.execute("insert into alist (name, acl) value ('owner', 'owner')") curs.execute("insert into alist (name, acl) value ('admin', 'ban')") curs.execute("insert into alist (name, acl) value ('admin', 'mdel')") curs.execute("insert into alist (name, acl) value ('admin', 'toron')") curs.execute("insert into alist (name, acl) value ('admin', 'check')") curs.execute("insert into alist (name, acl) value ('admin', 'acl')") if(int(t_ver) < 203): curs.execute('select title from topic limit 1') top_yes = curs.fetchall() if(top_yes): curs.execute('rename table topic to old_topic') curs.execute('rename table distop to old_distop') curs.execute('create table topic(id text, title text, sub text, data longtext, date text, ip text, block text, top text)') curs.execute('select * from old_topic') topic_old = curs.fetchall() if(topic_old): i = 0 for move_topic in topic_old: curs.execute("select id from distop where id = '" + db_pas(move_topic['id']) + "' and title = '" + db_pas(move_topic['title']) + "' and sub = '" + db_pas(move_topic['sub']) + "'") distop = curs.fetchall() if(distop): top = 'O' else: top = '' curs.execute("insert into topic (id, title, sub, data, date, ip, block, top) value ('" + db_pas(move_topic['id']) + "', '" + db_pas(move_topic['title']) + "', '" + db_pas(move_topic['sub']) + "', '" + db_pas(move_topic['data']) + "', '" + db_pas(move_topic['date']) + "', '" + db_pas(move_topic['ip']) + "', '" + db_pas(move_topic['block']) + "', '" + db_pas(top) + "')") conn.commit() conn.close() return(redirect('/')) else: conn.close() return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), logo = set_data['name'], data = '
', title = '오픈나무 설치')) @route('/upload', method=['GET', 'POST']) def upload(): conn = pymysql.connect(user = set_data['user'], password = set_data['pw'], charset = 'utf8mb4', db = set_data['db']) curs = conn.cursor(pymysql.cursors.DictCursor) MEMFILE_MAX = int(set_data['upload']) * 1024 * 1024 ip = ip_check() ban = ban_check(ip) if(request.method == 'POST'): if(ban == 1): conn.close() return(redirect('/ban')) else: file = request.files.file if(file): comp = re.compile("^(.+)(\.(?:jpg|gif|png|jpeg))$", re.I) exist = comp.search(file.filename) if(exist): if((int(set_data['upload']) * 1024 * 1024) < request.content_length): conn.close() return(redirect('/error/17')) else: file_info = exist.groups() file_data = file_info[0] + file_info[1] file_name = sha224(file_info[0]) + file_info[1] if(os.path.exists(os.path.join('image', file_name))): conn.close() return(redirect('/error/16')) else: file.save(os.path.join('image', file_name)) curs.execute("select title from data where title = '" + db_pas('파일:' + file_data) + "'") exist_db = curs.fetchall() if(not exist_db): curs.execute("insert into data (title, data, acl) value ('" + db_pas('파일:' + file_data) + "', '" + db_pas('[[파일:' + file_data + ']][br][br]{{{[[파일:' + file_data + ']]}}}') + "', '')") conn.commit() history_plus('파일:' + file_data, '[[파일:' + file_data + ']][br][br]{{{[[파일:' + file_data + ']]}}}', get_time(), ip, '파일:' + file_data + ' 업로드', '0') conn.close() return(redirect('/w/' + url_pas('파일:' + file_data))) else: conn.close() return(redirect('/error/14')) else: conn.close() return(redirect('/error/14')) else: if(ban == 1): conn.close() return(redirect('/ban')) else: conn.close() return(template('upload', custom = custom_css_user(), license = set_data['license'], login = login_check(), logo = set_data['name'], title = '업로드', number = set_data['upload'])) @route('/image/| 문서명 | 기여자 | 시간 |
| ' + title + ' (' + rows[i]['id'] + '판) ' + revert + ' (' + leng + ') | ' + ip + ban + hidden + ' | ' + rows[i]['date'] + ' |
| ' + send + ' | ||
| 토론명 | 시간 |
| ' + title + ' (' + sub + ') | ' + rows[i]['date'] + ' |
| 차단자 | 관리자 | 기간 | 이유 | 시간 |
| ' + ip + ' | ' + rows[i]['blocker'] + ' | ' + rows[i]['end'] + ' | ' + rows[i]['why'] + ' | ' + rows[i]['today'] + ' |
| 판 | 기여자 | 시간 |
| 숨김 | ||
| ' + data['id'] + '판 (보기) (원본) (되돌리기) (' + leng + ') | ' + ip + ban + hidden + ' | ' + data['date'] + ' |
| ' + send + ' | ||
' + enddata + '' conn.close() return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata, sub = '옛 원본')) else: conn.close() return(redirect('/history/' + url_pas(name))) else: conn.close() return(redirect('/error/3')) else: curs.execute("select * from history where title = '" + db_pas(name) + "' and id = '" + str(num) + "'") rows = curs.fetchall() if(rows): enddata = re.sub('<', '<', rows[0]['data']) enddata = re.sub('>', '>', enddata) enddata = re.sub('"', '"', enddata) enddata = '
' + enddata + '' conn.close() return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata, sub = '옛 원본')) else: conn.close() return(redirect('/history/' + url_pas(name))) @route('/raw/
' + enddata + '' conn.close() return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, logo = set_data['name'], page = url_pas(name), data = enddata, sub = '원본')) else: conn.close() return(redirect('/w/' + url_pas(name))) @route('/revert/
| #' + dain['id'] + ' ' + ip + ' ' + dain['date'] + ' |
| ' + top_data + ' |
| #' + str(i + 1) + ' ' + ip + chad + ban + ' ' + dain['date'] + ' |
| ' + indata + ' |
| #1 ' + ip + ' ' + row[0]['date'] + ' |
| ' + indata + ' |
| #1 ' + ip + ' ' + data[0]['date'] + ' |
| ' + indata + ' |
| #1 ' + ip + ' ' + aa[0]['date'] + ' |
| ' + indata + ' |
| 이름 | 아이피 | 언제 |
| ' + row[i]['user'] + ' | ' + row[i]['ip'] + ' | ' + row[i]['today'] + ' |
| 이름 | 아이피 | 언제 |
| ' + row[i]['user'] + ' | ' + row[i]['ip'] + ' | ' + row[i]['today'] + ' |
' + result + '' conn.close() return(template('other', custom = custom_css_user(), license = set_data['license'], login = login_check(), title = name, logo = set_data['name'], data = result, sub = '비교', page = url_pas(name))) else: conn.close() return(redirect('/history/' + url_pas(name))) else: conn.close() return(redirect('/history/' + url_pas(name))) @route('/w/
| 토론명 | 작성자 | 시간 |
| ' + title + ' (' + sub + ') (#' + rows[i]['id'] + ') | ' + ip + ban + ' | ' + rows[i]['date'] + ' |