Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
 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
Esempio n. 4
0
    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)
Esempio n. 5
0
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
Esempio n. 6
0
 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
Esempio n. 7
0
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)
Esempio n. 8
0
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
Esempio n. 9
0
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
Esempio n. 10
0
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)
Esempio n. 11
0
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')
Esempio n. 12
0
 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
Esempio n. 13
0
 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
Esempio n. 14
0
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
Esempio n. 15
0
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
Esempio n. 16
0
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
Esempio n. 17
0
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
Esempio n. 18
0
 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
Esempio n. 19
0
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