Removed interactive entry prompt

Former-commit-id: 83c9d7e9ef2c54cf33f0f0d6827929928359d1da
Former-commit-id: a907b990c17f2931a3a38777bf5e11752020efb9
This commit is contained in:
2023-02-28 16:53:26 -05:00
parent 6aa9a663b5
commit 0429070b5d
+43 -92
View File
@@ -13,7 +13,7 @@ from sys import argv, exit as s_exit
def entry_list_gen(_directory=expanduser('~/.local/share/sshyp/')): # generates and prints full entry list def entry_list_gen(_directory=expanduser('~/.local/share/sshyp/')): # generates and prints full entry list
from textwrap import fill from textwrap import fill
print('\n\u001b[38;5;0;48;5;15msshyp entries:\u001b[0m\n') print("\nfor a list of usable commands, run 'sshyp help'\n\n\u001b[38;5;0;48;5;15msshyp entries:\u001b[0m\n")
_entry_list, _color_alternator = [], 1 _entry_list, _color_alternator = [], 1
for _entry in sorted(listdir(_directory)): for _entry in sorted(listdir(_directory)):
if Path(f"{_directory}{_entry}").is_file(): if Path(f"{_directory}{_entry}").is_file():
@@ -82,18 +82,6 @@ def entry_reader(_decrypted_entry): # displays the contents of an entry in a re
print(f"\u001b[38;5;15;48;5;238mpassword:\u001b[0m\n{_entry_lines[0]}\n") print(f"\u001b[38;5;15;48;5;238mpassword:\u001b[0m\n{_entry_lines[0]}\n")
def entry_name_fetch(_entry_name_location=None): # fetches and returns entry name from user input
if _entry_name_location is not None:
entry_list_gen()
_entry_name = str(input(_entry_name_location))
else:
_entry_name = arguments[0]
if _entry_name.startswith('/'):
return _entry_name.replace('/', '', 1)
else:
return _entry_name.strip()
def string_gen(_complexity, _length): # generates and returns a random string based on input def string_gen(_complexity, _length): # generates and returns a random string based on input
from random import SystemRandom from random import SystemRandom
import string import string
@@ -444,7 +432,8 @@ def print_info(): # prints help text based on argument
print(' note/-n copy the note of an entry to your clipboard') print(' note/-n copy the note of an entry to your clipboard')
print('gen:') print('gen:')
print(' update/-u generate a password for an existing entry') print(' update/-u generate a password for an existing entry')
print("\n\u001b[1mtip:\u001b[0m you can quickly read an entry with 'sshyp /<entry name>'\n") print("\n\u001b[1mtip 1:\u001b[0m you can quickly read an entry with 'sshyp /<entry name>'")
print("\u001b[1mtip 2:\u001b[0m type 'sshyp' to view a list of saved entries\n")
else: else:
print('\n\u001b[1musage:\u001b[0m sshyp [option [flag] [<device id>]]\n') print('\n\u001b[1musage:\u001b[0m sshyp [option [flag] [<device id>]]\n')
print('\u001b[1moptions:\u001b[0m') print('\u001b[1moptions:\u001b[0m')
@@ -460,23 +449,6 @@ def print_info(): # prints help text based on argument
print(' del remove a device id from the quick-unlock whitelist\n') print(' del remove a device id from the quick-unlock whitelist\n')
def no_arg(): # displays a list of entries and gives an option to select one for viewing
print("\nfor a list of usable commands, run 'sshyp help'")
_entry_name = entry_name_fetch('entry to read: ')
if not Path(f"{directory}{_entry_name}.gpg").exists():
if not _entry_name:
print(f"\n\u001b[38;5;9merror: missing entry name\u001b[0m\n")
elif isdir(f"{directory}{_entry_name}"):
print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) is a directory\u001b[0m\n")
else:
print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) does not exist\u001b[0m\n")
s_exit(2)
_shm_folder, _shm_entry = shm_gen()
determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry)
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
rmtree(f"{tmp_dir}{_shm_folder}")
def read_shortcut(): # shortcut to quickly read an entry def read_shortcut(): # shortcut to quickly read an entry
if not Path(f"{directory}{arguments[0].replace('/', '', 1)}.gpg").exists(): if not Path(f"{directory}{arguments[0].replace('/', '', 1)}.gpg").exists():
if not arguments[0].replace('/', '', 1): if not arguments[0].replace('/', '', 1):
@@ -605,14 +577,11 @@ def whitelist_manage(): # adds or removes quick-unlock whitelisted device ids
def add_entry(): # adds a new entry def add_entry(): # adds a new entry
_shm_folder, _shm_entry = None, None # set to avoid PEP8 warnings _shm_folder, _shm_entry = None, None # set to avoid PEP8 warnings
if arg_start == 0: _entry_name = arguments[0]
_entry_name = entry_name_fetch('name of new entry: ')
else:
_entry_name = entry_name_fetch()
if Path(f"{directory}{_entry_name}.gpg").is_file(): if Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) already exists\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) already exists\u001b[0m\n")
s_exit(3) s_exit(3)
if arguments[arg_start_p] in ('note', '-n'): # note entry if arguments[2] in ('note', '-n'): # note entry
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
run([editor, f"{tmp_dir}{_shm_folder}/{_shm_entry}-n"]) run([editor, f"{tmp_dir}{_shm_folder}/{_shm_entry}-n"])
_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read() _notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read()
@@ -636,10 +605,7 @@ def add_entry(): # adds a new entry
def add_folder(): # creates a new folder def add_folder(): # creates a new folder
if arg_start == 0: _entry_name = arguments[0]
_entry_name = entry_name_fetch('name of new folder: ')
else:
_entry_name = entry_name_fetch()
Path(directory + _entry_name).mkdir(mode=0o700, parents=True, exist_ok=True) Path(directory + _entry_name).mkdir(mode=0o700, parents=True, exist_ok=True)
if not ssh_error: if not ssh_error:
run(['ssh', '-i', expanduser('~/.ssh/sshyp'), '-p', port, f"{username_ssh}@{ip}", run(['ssh', '-i', expanduser('~/.ssh/sshyp'), '-p', port, f"{username_ssh}@{ip}",
@@ -649,14 +615,13 @@ def add_folder(): # creates a new folder
def rename(): # renames an entry or folder def rename(): # renames an entry or folder
from shutil import copy from shutil import copy
if arg_start == 0: _entry_name = arguments[0]
_entry_name = entry_name_fetch('entry/folder to rename/relocate: ')
else:
_entry_name = entry_name_fetch()
if not Path(f"{directory}{_entry_name}.gpg").is_file() and not Path(f"{directory}{_entry_name}").is_dir(): if not Path(f"{directory}{_entry_name}.gpg").is_file() and not Path(f"{directory}{_entry_name}").is_dir():
print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) does not exist\u001b[0m\n")
s_exit(2) s_exit(2)
_new_name = entry_name_fetch('new name: ') _new_name = str(input('new name: '))
if _new_name.startswith('/'):
_new_name.replace('/', '', 1)
if Path(f"{directory}{_new_name}.gpg").is_file() or Path(f"{directory}{_new_name}").is_dir(): if Path(f"{directory}{_new_name}.gpg").is_file() or Path(f"{directory}{_new_name}").is_dir():
print(f"\n\u001b[38;5;9merror: (/{_new_name}) already exists\u001b[0m\n") print(f"\n\u001b[38;5;9merror: (/{_new_name}) already exists\u001b[0m\n")
s_exit(3) s_exit(3)
@@ -680,22 +645,19 @@ def rename(): # renames an entry or folder
def edit(): # edits the contents of an entry def edit(): # edits the contents of an entry
_shm_folder, _shm_entry, _detail, _edit_line = None, None, None, None # set to avoid PEP8 warnings _shm_folder, _shm_entry, _detail, _edit_line = None, None, None, None # set to avoid PEP8 warnings
if arg_start == 0: _entry_name = arguments[0]
_entry_name = entry_name_fetch('entry to edit: ')
else:
_entry_name = entry_name_fetch()
if not Path(f"{directory}{_entry_name}.gpg").is_file(): if not Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) does not exist\u001b[0m\n")
s_exit(2) s_exit(2)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry) determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry)
if arguments[arg_start_p] in ('username', '-u'): if arguments[2] in ('username', '-u'):
_detail, _edit_line = str(input('username: ')), 1 _detail, _edit_line = str(input('username: ')), 1
elif arguments[arg_start_p] in ('password', '-p'): elif arguments[2] in ('password', '-p'):
_detail, _edit_line = str(input('password: ')), 0 _detail, _edit_line = str(input('password: ')), 0
elif arguments[arg_start_p] in ('url', '-l'): elif arguments[2] in ('url', '-l'):
_detail, _edit_line = str(input('url: ')), 2 _detail, _edit_line = str(input('url: ')), 2
if arguments[arg_start_p] in ('note', '-n'): if arguments[2] in ('note', '-n'):
_edit_line = 2 _edit_line = 2
_new_lines = optimized_edit(edit_note(_shm_folder, _shm_entry, _new_lines = optimized_edit(edit_note(_shm_folder, _shm_entry,
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines()), None, -1) open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines()), None, -1)
@@ -710,13 +672,9 @@ def edit(): # edits the contents of an entry
def gen(): # generates a password for a new or an existing entry def gen(): # generates a password for a new or an existing entry
_username, _url, _notes = None, None, None # set to avoid PEP8 warnings _username, _url, _notes = None, None, None # set to avoid PEP8 warnings
if arg_start == 0: _entry_name = arguments[0]
_entry_name = entry_name_fetch('name of entry: ')
else:
_entry_name = entry_name_fetch()
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
if ((arg_count == 2 and arg_start == 0) or (arg_count == 3 and arg_start == 1)) and arguments[arg_start_p] \ if arg_count == 3 and arguments[2] in ('update', '-u'): # gen update
in ('update', '-u'): # gen update
if not Path(f"{directory}{_entry_name}.gpg").is_file(): if not Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) does not exist\u001b[0m\n")
s_exit(2) s_exit(2)
@@ -746,23 +704,20 @@ def gen(): # generates a password for a new or an existing entry
def copy_data(): # copies a specified field of an entry to the clipboard def copy_data(): # copies a specified field of an entry to the clipboard
from subprocess import Popen from subprocess import Popen
if arg_start == 0: _entry_name = arguments[0]
_entry_name = entry_name_fetch('entry to copy: ')
else:
_entry_name = entry_name_fetch()
if not Path(f"{directory}{_entry_name}.gpg").is_file(): if not Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{_entry_name}) does not exist\u001b[0m\n")
s_exit(2) s_exit(2)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry) determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry)
_copy_line, _index = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines(), 0 _copy_line, _index = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines(), 0
if arguments[arg_start_p] in ('username', '-u'): if arguments[2] in ('username', '-u'):
_index = 1 _index = 1
elif arguments[arg_start_p] in ('password', '-p'): elif arguments[2] in ('password', '-p'):
_index = 0 _index = 0
elif arguments[arg_start_p] in ('url', '-l'): elif arguments[2] in ('url', '-l'):
_index = 2 _index = 2
elif arguments[arg_start_p] in ('note', '-n'): elif arguments[2] in ('note', '-n'):
_index = 3 _index = 3
if 'WAYLAND_DISPLAY' in environ: # Wayland clipboard detection if 'WAYLAND_DISPLAY' in environ: # Wayland clipboard detection
run(['wl-copy', _copy_line[_index].rstrip()]) run(['wl-copy', _copy_line[_index].rstrip()])
@@ -780,10 +735,7 @@ def copy_data(): # copies a specified field of an entry to the clipboard
def remove_data(): # deletes an entry from the server and flags it for local deletion on sync def remove_data(): # deletes an entry from the server and flags it for local deletion on sync
if arg_start == 0: _entry_name = arguments[0]
_entry_name = entry_name_fetch('entry/folder to shear: ')
else:
_entry_name = entry_name_fetch()
determine_decrypt(expanduser('~/.config/sshyp/lock.gpg'), None, None) determine_decrypt(expanduser('~/.config/sshyp/lock.gpg'), None, None)
if not ssh_error: if not ssh_error:
run(['ssh', '-i', expanduser('~/.ssh/sshyp'), '-p', port, f"{username_ssh}@{ip}", run(['ssh', '-i', expanduser('~/.ssh/sshyp'), '-p', port, f"{username_ssh}@{ip}",
@@ -813,7 +765,7 @@ def extension_runner(): # checks extension config files for matches to argument
if __name__ == "__main__": if __name__ == "__main__":
try: try:
ssh_error, success_flag, sync_flag, silent_sync = False, False, False, False ssh_error, success_flag, sync_flag, silent_sync = False, False, False, False
arg_start, arg_start_p, device_type = None, None, None # set to avoid PEP8 warnings arg_start, device_type = None, None # set to avoid PEP8 warnings
# retrieve typed argument # retrieve typed argument
arguments = argv[1:] arguments = argv[1:]
arg_count = len(arguments) arg_count = len(arguments)
@@ -823,7 +775,6 @@ if __name__ == "__main__":
arg_start = 1 arg_start = 1
else: else:
arg_start = 0 arg_start = 0
arg_start_p = arg_start + 1
# import saved userdata # import saved userdata
tmp_dir = expanduser('~/.config/sshyp/tmp/') tmp_dir = expanduser('~/.config/sshyp/tmp/')
@@ -861,47 +812,47 @@ if __name__ == "__main__":
# run function based on arguments # run function based on arguments
if device_type == 'client': if device_type == 'client':
if arg_count < 1: if arg_count < 1:
no_arg() entry_list_gen()
elif (arg_count == 2 and arg_start == 0) or (arg_count == 3 and arg_start == 1): elif arg_count == 3 and arg_start == 1:
if arguments[arg_start] == 'copy': if arguments[1] == 'copy':
if arguments[arg_start_p] in ('username', '-u', 'password', '-p', 'url', '-l', 'note', '-n'): if arguments[2] in ('username', '-u', 'password', '-p', 'url', '-l', 'note', '-n'):
try: try:
success_flag = 1 success_flag = 1
copy_data() copy_data()
except IndexError: except IndexError:
print(f"\n\u001b[38;5;9merror: field does not exist in entry\u001b[0m\n") print(f"\n\u001b[38;5;9merror: field does not exist in entry\u001b[0m\n")
s_exit(2) s_exit(2)
elif arguments[arg_start] == 'add': elif arguments[1] == 'add':
if arguments[arg_start_p] in ('note', '-n', 'password', '-p'): if arguments[2] in ('note', '-n', 'password', '-p'):
success_flag, sync_flag = True, True success_flag, sync_flag = True, True
add_entry() add_entry()
elif arguments[arg_start_p] in ('folder', '-f'): elif arguments[2] in ('folder', '-f'):
success_flag = 1 success_flag = 1
add_folder() add_folder()
elif arguments[arg_start] == 'edit': elif arguments[1] == 'edit':
if arguments[arg_start_p] in ('rename', 'relocate', '-r'): if arguments[2] in ('rename', 'relocate', '-r'):
success_flag, sync_flag, silent_sync = True, True, True success_flag, sync_flag, silent_sync = True, True, True
rename() rename()
elif arguments[arg_start_p] in ('username', '-u', 'password', '-p', 'url', '-l', 'note', '-n'): elif arguments[2] in ('username', '-u', 'password', '-p', 'url', '-l', 'note', '-n'):
success_flag, sync_flag = True, True success_flag, sync_flag = True, True
edit() edit()
elif arguments[arg_start] == 'gen' and arguments[arg_start_p] in ('update', '-u'): elif arguments[1] == 'gen' and arguments[2] in ('update', '-u'):
success_flag, sync_flag = True, True success_flag, sync_flag = True, True
gen() gen()
elif arg_count == 1 or (arg_count == 2 and arg_start == 1): elif arg_count == 2 and arg_start == 1:
if arg_count == 1 and arg_start == 1: if arg_count == 1:
success_flag = True success_flag = True
read_shortcut() read_shortcut()
elif arguments[arg_start] == 'gen': elif arguments[1] == 'gen':
success_flag, sync_flag = True, True success_flag, sync_flag = True, True
gen() gen()
elif arguments[arg_start] == 'shear': elif arguments[1] == 'shear':
success_flag, sync_flag = True, True success_flag, sync_flag = True, True
remove_data() remove_data()
else: # server arguments elif arg_count == 0: # server arguments
if arg_count > 1 and arguments[0] == 'whitelist': if arg_count > 1 and arguments[0] == 'whitelist':
if arguments[1] in ('list', '-l'): if arguments[1] in ('list', '-l'):
success_flag = True success_flag = True
@@ -913,12 +864,12 @@ if __name__ == "__main__":
success_flag = True success_flag = True
whitelist_setup() whitelist_setup()
if success_flag == 0 and arguments[0] != 'sync': if arg_count > 0 and success_flag == 0 and arguments[0] != 'sync':
if device_type == 'client' and arguments[arg_start] not in ('help', '-h'): if device_type == 'client' and arguments[0] not in ('help', '-h'):
extension_runner() extension_runner()
else: else:
print_info() print_info()
elif (not ssh_error and sync_flag) or arguments[0] == 'sync': elif (not ssh_error and sync_flag) or (arg_count > 0 and arguments[0] == 'sync'):
sync() sync()
except KeyboardInterrupt: except KeyboardInterrupt: