def test_search_shared_folders(self): params = get_synced_params() sfs = api.search_shared_folders(params, '') self.assertEqual(len(sfs), len(params.shared_folder_cache)) sfs = api.search_shared_folders(params, 'folder') self.assertEqual(len(sfs), len(params.shared_folder_cache)) sfs = api.search_shared_folders(params, '1') self.assertEqual(len(sfs), 1) sfs = api.search_shared_folders(params, 'INVALID') self.assertEqual(len(sfs), 0)
def test_search_teams(self): params = get_synced_params() teams = api.search_teams(params, '') self.assertEqual(len(teams), len(params.team_cache)) teams = api.search_shared_folders(params, 'team') self.assertEqual(len(teams), len(params.shared_folder_cache)) teams = api.search_shared_folders(params, '1') self.assertEqual(len(teams), 1) teams = api.search_shared_folders(params, 'INVALID') self.assertEqual(len(teams), 0)
def create_or_update_record(params, criteria): # Scan vault for shared folder sfs = api.search_shared_folders(params, criteria) if len(sfs) == 0: print(f'Shared folder {criteria} not found') return shared_folder = sfs[0] record_title = 'Test Record' record_uid = None if shared_folder.records: records = [api.get_record(params, x['record_uid']) for x in shared_folder.records] record_uid = next((x.record_uid for x in records if x.title.casefold() == record_title.casefold()), None) shared_folder_uid = shared_folder.shared_folder_uid if record_uid: command = RecordEditCommand() command.execute(params, record=record_uid, generate=True) print(f'Updated record {record_uid} in shared folder uid={shared_folder_uid}') else: command = RecordAddCommand() # Inputs - hard coded for demo purposes record_uid = command.execute( params, title='Test Record', login='******', folder=shared_folder_uid, generate=True, # force=True disables asking for missing fields force=True) print(f'Added record {record_uid} to shared folder uid={shared_folder_uid}')
def list_sf(params): try: prompt_for_credentials(params) api.sync_down(params) if (len(params.shared_folder_cache) > 0): results = api.search_shared_folders(params, '') display.formatted_shared_folders(results) except Exception as e: raise click.ClickException(e)
def do_command(params): if (params.command == 'q'): return False elif (params.command == 'l'): if (len(params.record_cache) == 0): print('No records') else: results = api.search_records(params, '') display.formatted_records(results) elif (params.command == 'lsf'): if (len(params.shared_folder_cache) == 0): print('No shared folders') else: results = api.search_shared_folders(params, '') display.formatted_shared_folders(results) elif (params.command[:2] == 'g '): if (api.is_shared_folder(params, params.command[2:])): sf = api.get_shared_folder(params, params.command[2:]) if sf: sf.display() else: r = api.get_record(params, params.command[2:]) if r: r.display() elif (params.command[:2] == 'r '): api.rotate_password(params, params.command[2:]) elif (params.command[:2] == 'd '): api.delete_record(params, params.command[2:]) elif (params.command == 'c'): print(chr(27) + "[2J") elif (params.command[:2] == 's '): results = api.search_records(params, params.command[2:]) display.formatted_records(results) elif (params.command[:2] == 'b '): results = api.search_records(params, params.command[2:]) for r in results: api.rotate_password(params, r.record_uid) elif (params.command[:3] == 'an '): api.append_notes(params, params.command[3:]) elif (params.command == 'd'): api.sync_down(params) elif (params.command == 'a'): api.add_record(params) elif (params.command == 'h'): display.formatted_history(stack) elif (params.command == 'debug'): if params.debug: params.debug = False print('Debug OFF') else: params.debug = True print('Debug ON') elif params.command == '': pass else: print('\n\nCommands:\n') print(' d ... download & decrypt data') print(' l ... list folders and titles') print(' lsf ... list shared folders') print(' s <regex> ... search with regular expression') print(' g <uid> ... get record or shared folder details for uid') print(' r <uid> ... rotate password for uid') print( ' b <regex> ... rotate password for matches of regular expression' ) print(' a ... add a new record interactively') print(' an <uid> ... append some notes to the specified record') print(' c ... clear the screen') print(' h ... show command history') print(' q ... quit') print('') if params.command: if params.command != 'h': stack.append(params.command) stack.reverse() return True
my_params = KeeperParams() while not my_params.user: my_params.user = getpass.getpass(prompt='User(Email): ', stream=None) while not my_params.password: my_params.password = getpass.getpass(prompt='Master Password: '******'Search String: ', stream=None) api.sync_down(my_params) # Search records results = api.search_records(my_params, searchstring) for r in results: print('Record UID ' + r.record_uid + ' matches') # Note: see record.py for available fields or # call display.formatted_records(results) to show all record details # Search shared folders results = api.search_shared_folders(my_params, searchstring) for sf in results: print('Shared Folder UID ' + sf.shared_folder_uid + ' matches') # Search teams results = api.search_teams(my_params, searchstring) for t in results: print('Team UID ' + t.team_uid + ' matches')
def do_command(params): if (params.command == 'q'): return False elif (params.command == 'l'): if (len(params.record_cache) == 0): print('No records') else: results = api.search_records(params, '') display.formatted_records(results) elif (params.command == 'lsf'): if (len(params.shared_folder_cache) == 0): print('No shared folders') else: results = api.search_shared_folders(params, '') display.formatted_shared_folders(results) elif (params.command == 'lt'): if (len(params.team_cache) == 0): print('No teams') else: results = api.search_teams(params, '') display.formatted_teams(results) elif (params.command[:2] == 'g '): if (api.is_shared_folder(params, params.command[2:])): sf = api.get_shared_folder(params, params.command[2:]) if sf: sf.display() elif (api.is_team(params, params.command[2:])): team = api.get_team(params, params.command[2:]) if team: team.display() else: r = api.get_record(params, params.command[2:]) if r: r.display() elif (params.command[:2] == 'r '): api.rotate_password(params, params.command[2:]) elif (params.command[:2] == 'd '): api.delete_record(params, params.command[2:]) elif (params.command == 'c'): print(chr(27) + "[2J") elif (params.command[:2] == 's '): results = api.search_records(params, params.command[2:]) display.formatted_records(results) elif (params.command[:2] == 'b '): results = api.search_records(params, params.command[2:]) for r in results: api.rotate_password(params, r.record_uid) elif (params.command[:3] == 'an '): api.append_notes(params, params.command[3:]) elif (params.command == 'd'): api.sync_down(params) elif (params.command == 'a'): record = Record() while not record.title: record.title = input("... Title (req'd): ") record.folder = input("... Folder: ") record.login = input("... Login: "******"... Password: "******"... Login URL: ") record.notes = input("... Notes: ") while True: custom_dict = {} custom_dict['name'] = input("... Custom Field Name : ") if not custom_dict['name']: break custom_dict['value'] = input("... Custom Field Value : ") custom_dict['type'] = 'text' record.custom_fields.append(custom_dict) api.add_record(params, record) elif (params.command == 'h'): display.formatted_history(stack) elif (params.command == 'debug'): if params.debug: params.debug = False print('Debug OFF') else: params.debug = True print('Debug ON') elif params.command == '': pass else: print('\n\nShell Commands:\n') print(' d ... download & decrypt data') print(' l ... list folders and record titles') print(' lsf ... list shared folders') print(' lt ... list teams') print(' s <regex> ... search with regular expression') print(' g <uid> ... get record or shared folder details for uid') print(' r <uid> ... rotate password for uid') print( ' b <regex> ... rotate password for matches of regular expression' ) print(' a ... add a new record interactively') print(' an <uid> ... append some notes to the specified record') print(' c ... clear the screen') print(' h ... show command history') print(' q ... quit') print('') if params.command: if params.command != 'h': stack.append(params.command) stack.reverse() return True