def _find_dictionary(self, filename, settings_dir): """Find Dictionary Finds the file that contains the dictionary of words used to construct pass phrases. Initially looks in the settings directory, if not there look in install directory. """ path = make_path(settings_dir, filename) #if not exists(path): # path = make_path(get_head(__file__), filename) if not exists(path): path = make_path(get_head(__file__), make_path('..', filename)) if not file_is_readable(path): self.logger.error("%s: cannot open dictionary." % path) return path
def _read_accounts_file(self): if not self.path: # There is no accounts file self.data = {} return self.data if not exists(self.path): # If file does not exist, look for encrypted versions for ext in ['gpg', 'asc']: new_path = '.'.join([self.path, ext]) if exists(new_path): self.path = new_path break logger = self.logger accounts_data = {} try: if get_extension(self.path) in ['gpg', 'asc']: # Accounts file is GPG encrypted, decrypt it before loading with open(self.path, 'rb') as f: decrypted = self.gpg.decrypt_file(f) if not decrypted.ok: logger.error("%s\n%s" % ( "%s: unable to decrypt." % (self.path), decrypted.stderr)) code = compile(decrypted.data, self.path, 'exec') exec(code, accounts_data) else: # Accounts file is not encrypted with open(self.path) as f: code = compile(f.read(), self.path, 'exec') exec(code, accounts_data) if 'accounts' not in accounts_data: logger.error( "%s: defective accounts file, 'accounts' not found." % self.path ) for account in accounts_data['accounts'].values(): account['_source_file_'] = self.path # Load additional accounts files additional_accounts = accounts_data.get('additional_accounts', []) if type(additional_accounts) == str: additional_accounts = [additional_accounts] for each in additional_accounts: more_accounts = {} path = make_path(get_head(self.path), each) try: if get_extension(path) in ['gpg', 'asc']: # Accounts file is GPG encrypted, decrypt it with open(path, 'rb') as f: decrypted = self.gpg.decrypt_file(f) if not decrypted.ok: logger.error("%s\n%s" % ( "%s: unable to decrypt." % (path), decrypted.stderr)) continue code = compile(decrypted.data, path, 'exec') exec(code, more_accounts) else: # Accounts file is not encrypted with open(path) as f: code = compile(f.read(), path, 'exec') exec(code, more_accounts) except IOError as err: logger.display('%s: %s. Ignored' % ( err.filename, err.strerror )) continue existing_names = set(accounts_data['accounts'].keys()) new_accounts = more_accounts.get('accounts', {}) new_names = set(new_accounts.keys()) names_in_common = sorted( existing_names.intersection(new_names)) if len(names_in_common) > 2: logger.display( "%s: overrides existing accounts:\n %s" % ( path, ',\n '.join(sorted(names_in_common)))) elif names_in_common: logger.display("%s: overrides existing account: %s" % ( path, names_in_common[0])) for account in new_accounts.values(): account['_source_file_'] = path accounts_data['accounts'].update(new_accounts) except IOError as err: logger.error('%s: %s.' % (err.filename, err.strerror)) except SyntaxError as err: traceback.print_exc(0) sys.exit() self.data = accounts_data return accounts_data['accounts']