Add pass-otp support.

This commit is contained in:
Unknown 2019-01-10 16:03:52 +01:00
parent efe14098b3
commit 36bb30aea4

View File

@ -83,6 +83,12 @@ class SearchPassService(dbus.service.Object):
pass pass
def get_result_set(self, terms): def get_result_set(self, terms):
if terms[0] == 'otp':
otp = True
terms = terms[1:]
else:
otp = False
name = ''.join(terms) name = ''.join(terms)
password_list = [] password_list = []
@ -98,17 +104,15 @@ class SearchPassService(dbus.service.Object):
path = path_join(dir_path, filename)[:-4] path = path_join(dir_path, filename)[:-4]
password_list.append(path) password_list.append(path)
return [entry[0] for entry in process.extract(name, results = [e[0] for e in process.extract(name, password_list, limit=5,
password_list, scorer=fuzz.partial_ratio)]
scorer=fuzz.partial_ratio, if otp:
limit=5)] results = [f'otp {r}' for r in results]
return results
def send_password_to_gpaste(self, name): def send_password_to_gpaste(self, base_args, name):
pass_cmd = subprocess.run( pass_cmd = subprocess.run(base_args + [name], stdout=subprocess.PIPE,
['pass', 'show', name], stderr=subprocess.PIPE)
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
password = re.sub(b'\n$', b'', pass_cmd.stdout) password = re.sub(b'\n$', b'', pass_cmd.stdout)
error = re.sub(b'\n$', b'', pass_cmd.stderr) error = re.sub(b'\n$', b'', pass_cmd.stderr)
if not pass_cmd.returncode: if not pass_cmd.returncode:
@ -120,25 +124,35 @@ class SearchPassService(dbus.service.Object):
password, password,
dbus_interface='org.gnome.GPaste1' dbus_interface='org.gnome.GPaste1'
) )
self.notify('Password {} copied to clipboard.'.format(name)) if 'otp' in base_args:
self.notify(f'OTP password {name} copied to clipboard.')
else:
self.notify(f'Password {name} copied to clipboard.')
else: else:
self.notify('Failed to copy password', body=error, error=True) self.notify('Failed to copy password', body=error, error=True)
def send_password_to_native_clipboard(self, name): def send_password_to_native_clipboard(self, base_args, name):
pass_cmd = subprocess.run(['pass', 'show', '-c', name]) pass_cmd = subprocess.run(base_args + ['-c', name])
if pass_cmd.returncode: if pass_cmd.returncode:
self.notify('Failed to copy password!', error=True) self.notify('Failed to copy password!', error=True)
elif 'otp' in base_args:
self.notify(f'OTP password {name} copied to clipboard.')
else: else:
self.notify('Password {} copied to clipboard.'.format(name)) self.notify(f'Password {name} copied to clipboard.')
def send_password_to_clipboard(self, name): def send_password_to_clipboard(self, name):
if name.startswith('otp '):
base_args = ['pass', 'otp', 'code']
name = name[4:]
else:
base_args = ['pass', 'show']
try: try:
self.send_password_to_gpaste(name) self.send_password_to_gpaste(base_args, name)
except dbus.DBusException: except dbus.DBusException:
# We couldn't join GPaste over D-Bus, # We couldn't join GPaste over D-Bus,
# use pass native clipboard copy # use pass native clipboard copy
self.send_password_to_native_clipboard(name) self.send_password_to_native_clipboard(base_args, name)
def notify(self, message, body='', error=False): def notify(self, message, body='', error=False):
try: try: