diff --git a/nc_password_client/nc_password_client.py b/nc_password_client/nc_password_client.py index 31dcc83..7fd0dc5 100755 --- a/nc_password_client/nc_password_client.py +++ b/nc_password_client/nc_password_client.py @@ -15,6 +15,7 @@ import json import sys import os import time +import re import logging from xml.dom import minidom import binascii @@ -1291,6 +1292,38 @@ class NcPasswordClient: ) return True + def search(self, pattern, limit): + '''Search for a password (or passwords) matching in any field the given pattern''' + passwords = self.nc.list_passwords() + if passwords is None: + self.info( + { + "action": "search", + "message": "No passwords obtained" + } + ) + return False + count = 0 + for password in passwords: + for key in password.keys(): + match = re.search(password[key], pattern) + if match: + self.info( + password + ) + count += 1 + if count >= limit: + return True + self.info( + { + "action": "search", + "message": "No passwords found with the given pattern", + "patter": pattern, + "total_passwords": len(passwords) + } + ) + return False + def _init_log(self): ''' Initialize log object ''' self._log = logging.getLogger("nc_password_client") @@ -1455,6 +1488,15 @@ def delete_passwords_folder(ctx, name): '''Delete a password folder''' ctx.obj['NcPasswordClient'].delete_passwords_folder(name) +@cli.command() +@click.option('--pattern', '-p', required=True, help='Regular expression pattern to search in the password fields') +@click.option('--limit', '-l', default=1, help='Maximun number of passwords to show') +@click_config_file.configuration_option() +@click.pass_context +def search(ctx, pattern, limit): + '''Search for a password (or passwords) that match the given pattern in its fields''' + ctx.obj['NcPasswordClient'].search(pattern, limit) + @cli.command() @click.option( '--limit', '-l',