def get_trash_can_info(username): from diskcloud.libs.mysql import select_execute dir_list = [] file_list = [] result = select_execute( 'select type, name, trash_can_time, star, size, path from storage where username = %s and trash_can = %s', (username, 1)) for i in range(len(result)): is_internal = False path = result[i][5] if path != '.': for n in range(len(result)): if result[i][5].rsplit('/', maxsplit=1)[-1] == result[n][1]: is_internal = True break if not is_internal: if result[i][0] == 1: dir_list.append( [result[i][1], result[i][2], result[i][3], result[i][5]]) else: file_list.append([ result[i][1], result[i][2], result[i][3], result[i][4], result[i][5] ]) json_obj = {'directories': dir_list, 'files': file_list} return json_obj
def get_username_cookie(cookie_id): from diskcloud.libs.mysql import select_execute result = select_execute("select username from user where cookie_id = %s",(cookie_id,)) if len(result) != 0: return result[0][0] return False
def in_trash_can(username, path, name): result = select_execute( 'select name from storage where username = %s and path = %s and name = %s and trash_can = %s', (username, path, name, 1)) if len(result) != 0: return True return False
def Register(self): from os import mkdir from pathlib import Path from diskcloud.libs.string import hash_sha3 from diskcloud.libs.session import create_session from diskcloud.libs.mysql import select_execute, insert_execute, db_commit, db_rollback if current_app.config['CAN_REGISTER']: username = request.json.get('username') password = request.json.get('password') email = request.json.get('email') pw_hashed = hash_sha3(password) result = select_execute( 'select password from user where username = %s', (username, )) if len(result) == 0: result = select_execute( 'select password from user where email = %s', (email, )) if len(result) == 0: result = insert_execute( 'insert into user(username, password, email) values(%s, %s, %s)', (username, pw_hashed, email)) if result: user_path = Path(current_app.config['FILES_FOLDER'], 'user', username).as_posix() trash_can_path = Path( current_app.config['FILES_FOLDER'], 'trash_can', username).as_posix() tar_path = Path(current_app.config['FILES_FOLDER'], 'tar', username).as_posix() try: mkdir(user_path) mkdir(trash_can_path) mkdir(tar_path) except FileExistsError: pass except: raise db_commit() create_session('username', username) return ('', 200) else: db_rollback() return gen_error_res('数据库插入数据失败', 500) return gen_error_res('该email已被使用', 403) return gen_error_res('该用户名已被使用', 403) return gen_error_res('注册功能暂不开放', 403)
def generate_name(username, path, name, trash_can): from diskcloud.libs.mysql import select_execute from re import escape def get_index(name): if name.rfind(')') + 1 == name.rfind( '.') or name.rfind(')') + 1 == len(name): name_stem = name.rsplit('.', maxsplit=1)[0] index1 = name_stem.rfind('(') index2 = name_stem.rfind(')') try: index = int(name_stem[index1 + 1:index2]) except ValueError: return False return index return False if 1 <= get_index(name) < 10000: name1 = name[0:name.rfind('(')] + name[name.rfind(')') + 1:] else: name1 = name name_stem = name1.rsplit('.', maxsplit=1)[0] try: name_suffix = name1.rsplit('.', maxsplit=1)[1] except IndexError: name_suffix = '' if name_suffix == '': name_exp = '^' + escape(name1) + '(\\([1-9]{1}[0-9]*\\))?$' else: name_exp = '^' + escape( name_stem) + '(\\([1-9]{1}[0-9]*\\))?\\.' + escape( name_suffix) + '$' result = select_execute( 'select name from storage where username = %s and path = %s and name REGEXP %s and trash_can = %s', (username, path, name_exp, trash_can)) number = [] for i in range(len(result)): if result[i][0] == name: number.append(0) index = get_index(name) if index: number.append(index) else: index = get_index(result[i][0]) if index: number.append(index) for i in range(10000): if i not in number: if i == 0: af_name = name else: index = len(name_stem) af_name = name1[0:index] + '(' + str(i) + ')' + name1[index:] break return af_name
def walk(username, path): dir_dict = {} result = select_execute( 'select name from storage where username = %s and path = %s and type = %s and trash_can = %s', (username, path, 1, 0)) for i in range(len(result)): dir_dict[result[i][0]] = walk(username, Path(path, result[i][0]).as_posix()) if len(dir_dict) == 0: return '0' return dir_dict
def valid_url_path(url_path, root_ok=False, trash_can=False): from pathlib import Path from diskcloud.libs.session import valid_session from diskcloud.libs.response import gen_error_res from diskcloud.libs.mysql import select_execute url_path = url_path.strip().replace('..', '').replace('~', '') if url_path.endswith('/'): return gen_error_res('无效的路径', 400) if url_path.count('/') == 0: if root_ok == False: return gen_error_res('无效的路径,该路径不得为根目录', 404) username = url_path if valid_session('username', username): return { 'username': username, 'path': '.', 'name': '.', 'is_file': False } else: return gen_error_res('无效的session', 401) elif url_path.count('/') == 1: path = '.' username, name = url_path.split('/', maxsplit=1) else: username, others = url_path.split('/', maxsplit=1) path, name = others.rsplit('/', maxsplit=1) if valid_session('username', username): if trash_can == False: trash_can = 0 elif trash_can == True: trash_can = 1 result = select_execute( "select type from storage where username = %s and path = %s and name = %s and trash_can = %s", (username, path, name, trash_can)) if result[0][0] == 0: return { 'username': username, 'path': path, 'name': name, 'is_file': True } elif result[0][0] == 1: return { 'username': username, 'path': path, 'name': name, 'is_file': False } else: return gen_error_res('无效的路径', 404) else: return gen_error_res('无效的session', 401)
def valid_sid(sid): from diskcloud.libs.valid import re_match from diskcloud.libs.mysql import select_execute if re_match('[a-zA-Z0-9]{8}', sid): result = select_execute( 'select expire_time,username,path,name from storage where sid = %s and trash_can = %s', (sid, 0)) if len(result) != 0: if valid_expire_time(result[0][0]): return [result[0][1], result[0][2], result[0][3]] return False
def valid_user(username, pw_hashed): from diskcloud.libs.mysql import select_execute if len(username) > 32: return False result = select_execute('select password from user where username = %s', (username, )) if len(result) == 0: return False if result[0][0] == pw_hashed: return True return False
def get_sid(username, path, name): from diskcloud.libs.mysql import select_execute from diskcloud.libs.response import gen_error_res from pathlib import Path result = select_execute( 'select sid from storage where username = %s and path = %s and name = %s and trash_can = %s', (username, path, name, 0)) sid = result[0][0] if sid != None: return {'sid': sid} else: return gen_error_res('获取分享ID失败', 500)
def generate_id(username, path, name, id_life): from diskcloud.libs.mysql import select_execute, update_execute, db_commit, db_rollback from diskcloud.libs.string import generate_random_str from diskcloud.libs.time import strftime, now_time, now_time_str from datetime import timedelta from pathlib import Path # set expire time string if id_life != 0: expire_time = now_time() + timedelta(hours=id_life) expire_time_str = strftime(expire_time) else: expire_time_str = 'permanent' result_sel = select_execute( "select expire_time,sid from storage where username = %s and path = %s and name = %s and trash_can = %s", (username, path, name, 0)) if result_sel[0][0] != None and result_sel[0][1] != None: result_life = valid_expire_time(result_sel[0][0]) if result_life == 'permanent': return generate_id_return(True, result_sel[0][1]) elif result_life: result_update = update_execute( 'update storage set share_time = %s, expire_time = %s where username = %s and path = %s and name = %s and trash_can = %s', (now_time_str(), expire_time_str, username, path, name, 0)) if result_update: db_commit() return generate_id_return(True, result_sel[0][1]) db_rollback() return generate_id_return(False, 'Fail to update expired share.') else: sid = generate_random_str(8) result_update = update_execute( 'update storage set share_time = %s, expire_time = %s, sid = %s where username = %s and path = %s and name = %s and trash_can = %s', (now_time_str(), expire_time_str, sid, username, path, name, 0)) if result_update: db_commit() return generate_id_return(True, sid) db_rollback() return generate_id_return(False, 'Fail to generate a share id') sid = generate_random_str(8) result_update = update_execute( 'update storage set share = %s, share_time = %s, expire_time = %s, sid = %s where username = %s and path = %s and name = %s and trash_can = %s', (1, now_time_str(), expire_time_str, sid, username, path, name, 0)) if result_update: db_commit() return generate_id_return(True, sid) db_rollback() return generate_id_return(False, 'Fail to generate a share id')
def walk(username, path, af_path): result = select_execute( 'select name, type from storage where username = %s and path = %s and trash_can = %s', (username, path, 1)) update_result = True for i in range(len(result)): update_result = update_result and update_execute( 'update storage set path = %s, trash_can = %s, trash_can_time = %s where username = %s and path = %s and name = %s and trash_can = %s', (af_path, 0, now_time_str(), username, path, result[i][0], 1)) if result[i][1] == 1: update_result = update_result and walk( username, Path(path, result[i][0]).as_posix(), Path(af_path, result[i][0]).as_posix()) return update_result
def delete_folder_db(username, path, name): if delete_db(username, path, name): path = Path(path, name).as_posix() result = select_execute( 'select name, type from storage where username = %s and path = %s and trash_can = %s', (username, path, 1)) for i in range(len(result)): if result[i][1] == 0: if delete_db(username, path, result[i][0]) is False: return False else: if delete_folder_db(username, path, result[i][0]) is False: return False return True return False
def get_star_info(username): from diskcloud.libs.mysql import select_execute dir_list = [] file_list = [] result = select_execute( 'select type, name, star_time, size, path from storage where username = %s and star = %s and trash_can = %s', (username, 1, 0)) for i in range(len(result)): if result[i][0] == 1: dir_list.append([result[i][1], result[i][2], result[i][4]]) else: file_list.append( [result[i][1], result[i][2], result[i][3], result[i][4]]) json_obj = {'directories': dir_list, 'files': file_list} return json_obj
def get_folder_content(username, path, name): from pathlib import Path from diskcloud.libs.mysql import select_execute path = Path(path, name).as_posix() dir_list = [] file_list = [] result = select_execute( 'select type, name, modify_time, star, size from storage where username = %s and path = %s and trash_can = %s', (username, path, 0)) for i in range(len(result)): if result[i][0] == 1: dir_list.append([result[i][1], result[i][2], result[i][3]]) else: file_list.append( [result[i][1], result[i][2], result[i][3], result[i][4]]) json_obj = {'directories': dir_list, 'files': file_list} return json_obj
def get_search_info(username, search_name): from diskcloud.libs.mysql import select_execute from diskcloud.libs.string import name_parse dir_list = [] file_list = [] result = select_execute( 'select type, name, modify_time, star, size, path from storage where username = %s and trash_can = %s and name like %s', (username, 0, name_parse(search_name))) for i in range(len(result)): if result[i][0] == 1: dir_list.append( [result[i][1], result[i][2], result[i][3], result[i][5]]) else: file_list.append([ result[i][1], result[i][2], result[i][3], result[i][4], result[i][5] ]) json_obj = {'directories': dir_list, 'files': file_list} return json_obj
def remove_user(username): from diskcloud.libs.mysql import select_execute, delete_execute, db_commit, db_rollback from diskcloud.libs.valid import valid_username from shutil import rmtree from pathlib import Path from flask import current_app if not valid_username(username): click.echo("invalid username!") return False user_path = Path(current_app.config['FILES_FOLDER'], 'user', username).as_posix() trash_can_path = Path(current_app.config['FILES_FOLDER'], 'trash_can', username).as_posix() tar_path = Path(current_app.config['FILES_FOLDER'], 'tar', username).as_posix() result = select_execute('select password from user where username = %s', (username, )) if len(result) != 0: try: rmtree(user_path) rmtree(trash_can_path) rmtree(tar_path) except FileNotFoundError: pass except: raise delete_execute('delete from storage where username = %s', (username, )) result = delete_execute('delete from user where username = %s', (username, )) else: click.echo("this user is not exist!") return False if result: db_commit() click.echo("remove user success!") return True db_rollback() click.echo("remove user fail!") return False
def walk(username, bf_path, af_path): result = select_execute( 'select name, type from storage where username = %s and path = %s and trash_can = %s', (username, bf_path.as_posix(), 0)) update_result = True for i in range(len(result)): af_name = generate_name(username, af_path.as_posix(), result[i][0], 1) folder_path = Path(current_app.config['FILES_FOLDER'], 'user', username, bf_path) update_result = update_result and update_execute( 'update storage set path = %s, name = %s, trash_can = %s, trash_can_time = %s where username = %s and path = %s and name = %s and trash_can = %s', (af_path.as_posix(), af_name, 1, now_time_str(), username, bf_path.as_posix(), result[i][0], 0)) if af_name != result[i][0]: Path(folder_path, result[i][0]).rename(Path(folder_path, af_name)) if result[i][1] == 1: update_result = update_result and walk( username, Path(bf_path, result[i][0]), Path(af_path, af_name)) return update_result
def add_user(username, password, email, force): from diskcloud.libs.mysql import select_execute, update_execute, insert_execute, delete_execute, db_commit, db_rollback from diskcloud.libs.string import hash_sha3 from diskcloud.libs.valid import valid_username, valid_password from shutil import rmtree from os import makedirs from pathlib import Path from flask import current_app from time import sleep if not valid_username(username): click.echo("invalid username!") return False elif not valid_password(password): click.echo("invalid password!") return False password = hash_sha3(password) user_path = Path(current_app.config['FILES_FOLDER'], 'user', username).as_posix() trash_can_path = Path(current_app.config['FILES_FOLDER'], 'trash_can', username).as_posix() tar_path = Path(current_app.config['FILES_FOLDER'], 'tar', username).as_posix() result = select_execute('select password from user where username = %s', (username, )) if len(result) != 0: if not force: click.echo( "the username already exist,if you want to delete it,please add '--force' to enforce." ) return False else: try: rmtree(user_path) rmtree(trash_can_path) rmtree(tar_path) sleep(2) makedirs(user_path) makedirs(trash_can_path) makedirs(tar_path) except: raise delete_execute('delete from storage where username = %s', (username, )) result = update_execute( 'update user set password = %s where username = %s', (password, username)) else: try: makedirs(user_path) makedirs(trash_can_path) makedirs(tar_path) except: raise result = insert_execute( 'insert into user(username, password, email) values(%s, %s, %s)', (username, password, email)) if result: db_commit() click.echo("create user success!") return True db_rollback() click.echo("create user fail!") return False