def load_credentials_list():

    credentials_list = os.listdir(credentials_path)
    credentials_list.sort()

    if len(credentials_list) <= 0 :
        return None

    group_dic = {}
    max_count = 0
    last_group_name = util.extract_grouping_name(credentials_list[-1])

    for cre in credentials_list:
        group_name = util.extract_grouping_name(cre) 
        name_count = count_alphabet(group_name)
        if max_count <  name_count:
            max_count = name_count 
        group_dic[group_name] = cre

    rec_list = []
    with open('./recover_list.txt') as f:
        for line in f:
            rec_list.append(line.strip())

    group_alphabet = 'a'
    while True:
        recover_group(group_alphabet, max_count, group_dic, rec_list)
        if group_alphabet == last_group_name[0]:
            break
        group_alphabet = chr(ord(group_alphabet)+1)
def make_storage(id):

    grouping_name = ""
    group_info = None
    cre_obj = None

    for g_info in datas.credentials_list:

        if g_info.get_usable_state() == datas.GroupInfo.STATE_DISABLE_GROUP:

            for cre_file in g_info.credentials_list:
                if cre_file.get_state() == datas.CredentialsInfo.STATE_RECOVERY_WAIT:
                    group_info = g_info
                    grouping_name = cre_file.get_group_name()
                    cre_obj = cre_file
                    break
        if group_info != None:
            break

    if group_info == None:
        end_file_name = util.get_end_credentials_name()
        if end_file_name == None:
            grouping_name = "a0"
        else:
            end_grouping_name = util.extract_grouping_name(end_file_name)
            if end_grouping_name[-1] != "2":
                end_grouping_name = end_grouping_name[:-1] + "2"
            grouping_name = util.make_grouping_name(end_grouping_name)

        group_info = datas.GroupInfo(grouping_name[:-1])
        cre_obj = group_info.credentials_list[0]
        datas.credentials_list.append(group_info)

    file_name = util.make_credentials_name(id, grouping_name)
    credential_path = os.path.join(datas.credentials_path, file_name)

    datas.credential_dic[id] = file_name

    return oauth2client.file.Storage(credential_path), group_info, cre_obj
def recover():

    while True:

        time.sleep(5)

        lines = []
        with open('./recover_list.txt', 'r') as f:
            lines = f.readlines()

        if len(lines) <= 0:
            continue

        print('recovering start...')

        credentials = lines[0].strip()
        group_name = util.extract_grouping_name(credentials)
        group_alphabet = group_name[:-1]

        group_info = None
        for g in datas.credentials_list:
            if group_alphabet == g.get_group_alphabet():
                group_info = g
                break
        
        origin_cre_info = None
        recover_cre_info = None
        if group_info:
    
            for cre in group_info.credentials_list:
                print(cre.get_credentials_name())
                if cre.get_state() == datas.CredentialsInfo.STATE_USABLE:
                    origin_cre_info = cre
                if cre.get_credentials_name() == credentials:
                    recover_cre_info = cre

        if (origin_cre_info == None) or (recover_cre_info == None):
            continue

        store = credentials_mgr.get_storage(origin_cre_info.get_user_id())
        service_o = credentials_mgr.get_service(store)
        store = credentials_mgr.get_storage(recover_cre_info.get_user_id())
        service_r = credentials_mgr.get_service(store)
        
        all_origin_files = credentials_mgr.retrieve_all_files(service_o)
        recover_files = credentials_mgr.retrieve_all_files(service_r)

        origin_jigsaw_folder_id = ''
        for file in all_origin_files:
            if file['title'] == 'jigsaw':
                origin_jigsaw_folder_id = file['id']
                break

        origin_children_folder_dic = credentials_mgr.get_children_folder(all_origin_files, origin_jigsaw_folder_id)

        recover_jigsaw_folder_info = None        
        for file in recover_files:
            if file['title'] == 'jigsaw':
                recover_jigsaw_folder_info = file
                break
        if recover_jigsaw_folder_info == None:
            recover_jigsaw_folder_info = credentials_mgr.create_public_folder(service_r, 'jigsaw')

        recover_children_folder_dic = {}
        for folder_name in origin_children_folder_dic.values():
            folder_info = credentials_mgr.create_public_folder(service_r, folder_name, recover_jigsaw_folder_info['id'])
            recover_children_folder_dic[folder_info['title']] = folder_info['id']

        for file in all_origin_files:
        
           parent_folder_id = file['parents'][0]['id']
           if parent_folder_id in origin_children_folder_dic:
                folder_name = origin_children_folder_dic[parent_folder_id]
                file_name = folder_name + '_' + file['title']
                file_path_name = './recover_files/'+ file_name
                #download
                credentials_mgr.download_file(service_o, file['id'],file_path_name ) 
                #upload
                credentials_mgr.upload_file(service_r, recover_children_folder_dic[folder_name], file_name, file['mimeType'], file_path_name)

        recover_cre_info.set_usable_state()
        group_info.compute_group_state()        

        lines.pop(0)
        with open('./recover_list.txt', 'w') as f:
            f.write('')
            for str in lines:
                f.write(str)

        git_manager.recover_add()
def credentials_delete():

    try:
        id = request.args.get('id', None)
        if id == None:
            id = 'anyone'

        store  = credentials_mgr.get_storage(id) 
        if store == None:
            return 'credentials not exist'

        credentials = store.get()
        if credentials == None:
            return 'already revoked'
        
        credentials.revoke(httplib2.Http())
    except Exception as e:
        return 'revoke fail : ' + e

    try:
        file_name = store._filename.split('/')[-1]
        group_name = util.extract_grouping_name(file_name)
        group_alphabet = group_name[:-1]
                
        group_info = None
        for g_info in datas.credentials_list:
            if g_info.group_alphabet_ == group_alphabet:
                group_info = g_info
        
        if group_info == None:
            return 'revoked.'

        for cre in group_info.credentials_list:
            if cre.get_group_name() == group_name:
                cre.set_recovery_wait_state()
                cre.set_id_credentials_name('','')

        group_info.compute_group_state()

        end_group_info = datas.credentials_list[-1]
        if group_alphabet == end_group_info.group_alphabet_:
            state = datas.CredentialsInfo.STATE_RECOVERY_WAIT
            for cre in end_group_info.credentials_list:
                if cre.get_state() == datas.CredentialsInfo.STATE_USABLE:
                    state = cre.get_state()
                    break
            if state != datas.CredentialsInfo.STATE_USABLE:

                for cre in end_group_info.credentials_list:
                    try:
                        os.remove(datas.credentials_path + cre.get_credentials_name())
                    except:
                        pass

                datas.credentials_list.pop()

        datas.credential_dic.pop(id)

    except Exception as e:
        print(e)
        return 'revoked..'

    return 'revoked'