diff --git a/README.md b/README.md index d1abdef..2d7817e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,7 @@ # rpass -A very simple password manager with rsync (and soon libsecret) integration - alternative to GNU pass - ------ - -rpass will likely be renamed due to the mass quantity of other terminal-based password managers named the same thing. - -The new name may be 'rpazz', 'sspass', or something else. +A very simple password manager with rsync integration - alternative to GNU pass # Installation - Arch Linux (x86_64, aarch64) rpass releases are available in the Arch User Repository as 'rpass'. @@ -24,7 +17,6 @@ makepkg -si Packaging for other distributions coming soon. # Usage - Upon initial installation, be sure to run: ``` @@ -40,10 +32,8 @@ rpass --help ``` # Roadmap - Short-term Goals: -- overhaul error messages - create new file list w/color and w/o file extensions - create a man page - allow for multi-line notes diff --git a/usr/bin/rpass b/usr/bin/rpass index 757745f..7639b23 100755 --- a/usr/bin/rpass +++ b/usr/bin/rpass @@ -15,7 +15,7 @@ import string def clear(): - print("\n" * 100) + print('\n' * 100) def term(cmd): @@ -51,35 +51,18 @@ def encryptfolder(): rmtree('/dev/shm/' + shmfolder) -# argument - filter the argument to usable text - some replacements are only done once to prevent interference +# argument - filter the argument to usable text argument = str(argv).replace('[', '', 1).replace(']', '', 1).replace(',', '').replace("'", '') \ .replace(' ', '', 1).replace('/usr/bin/', '', 1).replace('rpass', '', 1) -# startup help - -if argument == '': - clear() - print("use 'help', '--help', or '-h' to see a list of commands") - print() - print('<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>') - print("If you are receiving errors, run 'rpass config' and go through the guided setup wizard.") - print('This MUST be done before rpass will function!!') - print('<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>') - print() - print('rpass is currently early software with very little polish') - print() - # help if argument == 'help' or argument == '--help' or argument == '-h': - print() - print('rpass Copyright (C) 2021 Randall Winkhart') - print("This program comes with ABSOLUTELY NO WARRANTY; for details type `rpass show w'. This is free software, " + print('\nrpass Copyright (C) 2021 Randall Winkhart') + print("This program comes with ABSOLUTELY NO WARRANTY; for details type `rpass show w'.\nThis is free software, " "and you are welcome to redistribute it under certain conditions; type `rpass show c' for details.") - print() - print('USAGE: rpass [/] [OPTION] [FLAG]') - print() + print('\nUSAGE: rpass [/] [OPTION] [FLAG]\n') print('Options: ') print('help/--help/-h bring up this menu') print('version/-v display rpass version info') @@ -89,8 +72,7 @@ if argument == 'help' or argument == '--help' or argument == '-h': print('edit edit an existing entry') print('copy copy details of an entry to your clipboard') print('remove/-rm delete an existing entry') - print('sync/-s manually sync the entry directory via rsync') - print() + print('sync/-s manually sync the entry directory via rsync\n') print('Flags:') print('add:') print(' password/-p add a password entry') @@ -108,25 +90,21 @@ if argument == 'help' or argument == '--help' or argument == '-h': print(' url/-l copy the URL of an entry to your clipboard') print(' note/-n copy the note of an entry to your clipboard') print('gen:') - print(' update/-u generate a password for an existing entry') - print() + print(' update/-u generate a password for an existing entry\n') print("Tip: You can quickly read an entry with 'rpass /'!") - print("When specifying entry names, do not include the file extension! '.gpg' is assumed!") - print() + print("When specifying entry names, do not include the file extension! '.gpg' is assumed!\n") # version info if argument == 'version' or argument == '-v': - print() - print('////////////////////////////////////////////////////////') + print('\n////////////////////////////////////////////////////////') print('/ /') print('/ rpass Copyright (C) 2021 Randall Winkhart /') print('/ /') - print('/ Version 2021.09.12.pr4 /') + print('/ Version 2021.09.15.pr4 /') print('/ The Housekeeping Update (Pt. 1) /') print('/ /') - print('////////////////////////////////////////////////////////') - print() + print('////////////////////////////////////////////////////////\n') # licensing info @@ -135,114 +113,131 @@ if argument == 'show w': print('This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;') print('without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.') print('See the GNU General Public License for more details.') - print() - print('https://opensource.org/licenses/GPL-3.0') - print() + print('\nhttps://opensource.org/licenses/GPL-3.0\n') if argument == 'show c': clear() print('This program is free software: you can redistribute it and/or modify it under the terms of the GNU General') print('Public License as published by the Free Software Foundation, either version 3 of the License,') - print('or (at your option) any later version.') - print() + print('or (at your option) any later version.\n') # config if argument == 'config': - print() - directorychoice = str(input('Would you like to use the default entry directory (~/.rpass-store/)? (Y/n) ')) - if directorychoice != 'n': - with open("/var/lib/rpass/rpassdir", 'w') as f: - f.write('/home/' + environ.get('USER') + '/.rpass-store/' + '\n') - if directorychoice == 'n': - print() - print('Format: /this/path/ends/with/a/slash/') + try: print() - directory = str(input('Please input a custom directory: ')) - with open("/var/lib/rpass/rpassdir", 'w') as f: - f.write(directory + '\n') - print() - devicetype = str(input('Will this be a client or a server device? (c/S) ')) - if devicetype != 'c': - print() - print('Make sure the ssh service is running and properly configured.') - print() - if devicetype == 'c': + directorychoice = str(input('Would you like to use the default entry directory (~/.rpass-store/)? (Y/n) ')) + if directorychoice == 'n' or directorychoice == 'N': + print('\nFormat: /this/path/ends/with/a/slash/\n') + directory = str(input('Please input a custom directory: ')) + with open("/var/lib/rpass/rpass-dir", 'w') as f: + f.write(directory + '\n') + else: + with open("/var/lib/rpass/rpass-dir", 'w') as f: + f.write('/home/' + environ.get('USER') + '/.rpass-store/' + '\n') print() - gpgpresent = str(input('rpass requires the use of a unique gpg key. Do you already have one you are willing to ' - 'use? (y/N) ')) - if gpgpresent == 'y' or gpgpresent == 'Y': + devicetype = str(input('Will this be a client, server, or offline device? (C/s/o) ')) + if devicetype == 's' or devicetype == 'S': + with open("/var/lib/rpass/rpass-ssh", 'w') as f: + f.write('\n\n\n\n' + devicetype) + print('\nMake sure the ssh service is running and properly configured.\n') + print('Configuration complete!\n') + if devicetype == 'o' or devicetype == 'O' or devicetype == 'c' or devicetype == 'C': print() - gpgid = str(input('Please input the ID of your gpg key: ')) - with open("/var/lib/rpass/rpassgpg", 'w') as f: - f.write(gpgid + '\n') - if gpgpresent != 'y': - print() - gpggen = str( - input('Would you like to generate one now? Note that if you choose not to do this, you will have ' - 'to re-run "rpass config" to specify a gpg key when you acquire one (Y/n) ')) - if gpggen != 'n': - term('gpg --full-generate-key') + gpgpresent = str(input( + 'rpass requires the use of a unique gpg key. Do you already have one you are willing to use? (y/N) ')) + if gpgpresent == 'y' or gpgpresent == 'Y': print() gpgid = str(input('Please input the ID of your gpg key: ')) - with open("/var/lib/rpass/rpassgpg", 'w') as f: + with open("/var/lib/rpass/rpass-gpg", 'w') as f: f.write(gpgid + '\n') - if gpggen == 'n' or gpggen == 'N': - exit() - print() - print('Make sure the ssh service on the remote server is running and properly configured.') - print() - sshgen = str(input('rsync support requires a unique ssh key. Would you like to have this ' - 'automatically generated? (Y/n) ')) - if sshgen != 'n': - term('ssh-keygen -f ~/.ssh/rpass') - print() - print('Example input: 10.10.10.10:9999') - print() - ip_port = str(input('What is the IP and ssh port of the remote server? ')) - print() - ip, sep, port = ip_port.partition(':') - usernamessh = str(input('What is the username of the remote server? ')) - print() - print('Default directory: ' + '/home/' + usernamessh + '/.rpass-store/') - print() - directoryssh = str(input('Is the remote server using the default password directory? (Y/n) ')) - if directoryssh != 'n': - directoryssh = ('/home/' + usernamessh + '/.rpass-store/') - if directoryssh == 'n' or directoryssh == 'N': - print() - print('Format: /this/path/ends/with/a/slash/') + else: + print() + gpggen = str( + input('Would you like to generate one now? Note that if you choose not to do this, you will have ' + 'to re-run "rpass config" to specify a gpg key when you acquire one (Y/n) ')) + if gpggen == 'n' or gpggen == 'N': + exit() + else: + term('gpg --full-generate-key') + print() + gpgid = str(input('Please input the ID of your gpg key: ')) + with open("/var/lib/rpass/rpass-gpg", 'w') as f: + f.write(gpgid + '\n') + if devicetype == 'o' or devicetype == 'O': + with open("/var/lib/rpass/rpass-ssh", 'w') as f: + f.write('\n\n\n\n' + devicetype) + print('\nConfiguration complete!\n') + elif devicetype != 's' and devicetype != 'S': + print('\nMake sure the ssh service on the remote server is running and properly configured.\n') + sshgen = str(input('rsync support requires a unique ssh key. Would you like to have this ' + 'automatically generated? (Y/n) ')) + if sshgen != 'n' and sshgen != 'N': + term('ssh-keygen -f ~/.ssh/rpass') + print('\nExample input: 10.10.10.10:9999\n') + ip_port = str(input('What is the IP and ssh port of the remote server? ')) print() - directoryssh = str(input('What directory is the server using?: ')) - with open("/var/lib/rpass/rpass-ssh", 'w') as f: - f.write(usernamessh + '\n' + ip + '\n' + port + '\n' + directoryssh) - print() - print('Configuration complete!') - print() + ip, sep, port = ip_port.partition(':') + usernamessh = str(input('What is the username of the remote server? ')) + print('\nDefault directory: ' + '/home/' + usernamessh + '/.rpass-store/\n') + directoryssh = str(input('Is the remote server using the default password directory? (Y/n) ')) + if directoryssh == 'n' or directoryssh == 'N': + print('\nFormat: /this/path/ends/with/a/slash/\n') + directoryssh = str(input('What directory is the server using?: ')) + else: + directoryssh = ('/home/' + usernamessh + '/.rpass-store/') + with open("/var/lib/rpass/rpass-ssh", 'w') as f: + f.write(usernamessh + '\n' + ip + '\n' + port + '\n' + directoryssh + '\n' + devicetype) + print('\nConfiguration complete!\n') + except KeyboardInterrupt: + print('\n\nConfiguration cancelled.\n') + exit() + + +# startup help + +if argument == '': + clear() + print("Use 'help', '--help', or '-h' to see a list of commands.\n") + print('rpass is currently early software with very little polish\n') # import userdata -sshinfo = open("/var/lib/rpass/rpass-ssh").readlines() -usernamessh = sshinfo[0].replace('\n', '') -ip = sshinfo[1].replace('\n', '') -port = sshinfo[2].replace('\n', '') -directoryssh = sshinfo[3].replace('\n', '') -with open("/var/lib/rpass/rpassgpg") as f: - gpgid = f.read().strip() -with open("/var/lib/rpass/rpassdir") as f: - directory = f.read().strip() -term('mkdir -p ' + directory) +try: + sshinfo = open("/var/lib/rpass/rpass-ssh").readlines() + usernamessh = sshinfo[0].replace('\n', '') + ip = (sshinfo[1].replace('\n', '')) + port = (sshinfo[2].replace('\n', '')) + directoryssh = (sshinfo[3].replace('\n', '')) + devicetype = (sshinfo[4].replace('\n', '')) +except (FileNotFoundError, IndexError): + usernamessh, ip, port, directoryssh, devicetype = (0, 0, 0, 0, 0) +try: + with open("/var/lib/rpass/rpass-gpg") as f: + gpgid = f.read().strip() + with open("/var/lib/rpass/rpass-dir") as f: + directory = f.read().strip() + term('mkdir -p ' + directory) +except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print("Not all necessary configuration files are present. Please run 'rpass config'!") + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + exit() # no argument if argument == '': - print() - term('cd ~/.rpass-store; ls -1 *') - print() - readentry = str(input('Entry to read: ')) - clear() - term('gpg -d ' + directory + "'" + readentry.replace('/', '', 1) + "'" + '.gpg') - print() + try: + print() + term('cd ' + directory + '; ls -1 *') + print() + readentry = str(input('Entry to read: ')) + clear() + term('gpg -d ' + directory + "'" + readentry.replace('/', '', 1) + "'" + '.gpg') + print() + except KeyboardInterrupt: + print('\n\nSelection cancelled.\n') + exit() # read shortcut @@ -256,63 +251,85 @@ if argument.startswith('/'): # add if argument == 'add': - print() - print('USAGE: rpass add [FLAG]') + print('\nUSAGE: rpass add [FLAG]') print('Flags:') print('add:') print(' password/-p add a password entry') print(' note/-n add a note entry') - print(' folder/-f add a new folder for entries') - print() + print(' folder/-f add a new folder for entries\n') if argument == 'add note' or argument == 'add -n': - clear() - entryname = str(input('Name of note: ')) - notes = str(input('Contents of note: ')) + try: + clear() + entryname = str(input('Name of note: ')) + notes = str(input('Contents of note: ')) + except KeyboardInterrupt: + entryname, notes = (0, 0) + print('\n\nEntry add cancelled.\n') + exit() shmfolder, shmentry = shmgen() - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') - with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: - f.writelines('\n\n\n' + notes + '\n\n') - encryptfolder() - term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + try: + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') + with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: + f.writelines('\n\n\n' + notes + '\n\n') + encryptfolder() + term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + else: + with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: + f.writelines('\n\n\n' + notes + '\n\n') + encrypt() + term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") else: with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: f.writelines('\n\n\n' + notes + '\n\n') encrypt() - term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") - else: - with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: - f.writelines('\n\n\n' + notes + '\n\n') - encrypt() - term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The folder you requested to access does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() if argument == 'add password' or argument == 'add -p': - clear() - entryname = str(input('Name of service: ')) - username = str(input('Username: ')) - password = str(input('Password: ')) - url = str(input('URL: ')) - notes = str(input('Additional notes: ')) + try: + clear() + entryname = str(input('Name of service: ')) + username = str(input('Username: ')) + password = str(input('Password: ')) + url = str(input('URL: ')) + notes = str(input('Additional notes: ')) + except KeyboardInterrupt: + entryname, username, password, url, notes = (0, 0, 0, 0, 0) + print('\n\nEntry add cancelled.\n') + exit() shmfolder, shmentry = shmgen() - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') - with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: - f.writelines(username + '\n' + password + '\n' + url + '\n' + notes + '\n\n') - encryptfolder() - term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + try: + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') + with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: + f.writelines(username + '\n' + password + '\n' + url + '\n' + notes + '\n\n') + encryptfolder() + term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + else: + with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: + f.writelines(username + '\n' + password + '\n' + url + '\n' + notes + '\n\n') + encrypt() + term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") else: with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: f.writelines(username + '\n' + password + '\n' + url + '\n' + notes + '\n\n') encrypt() - term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") - else: - with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: - f.writelines(username + '\n' + password + '\n' + url + '\n' + notes + '\n\n') - encrypt() - term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The folder you requested to access does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() if argument == 'add folder' or argument == 'add -f': newfolder = str(input('Name of new folder: ')) @@ -321,311 +338,461 @@ if argument == 'add folder' or argument == 'add -f': # edit if argument == 'edit': - print() - print('USAGE: rpass edit [FLAG]') + print('\nUSAGE: rpass edit [FLAG]') print('Flags:') print('edit:') print(' rename/relocate/-r rename or relocate an entry') print(' username/-u change the username of an entry') print(' password/-p change the password of an entry') print(' url/-l change the url attached to an entry') - print(' note/-n change the note attached to an entry') - print() + print(' note/-n change the note attached to an entry\n') if argument == 'edit rename' or argument == 'edit relocate' or argument == 'edit -r': - clear() - term('cd ~/.rpass-store; ls -1 *') - print() - entryname = str(input('What file would you like to edit? ')) - newname = str(input('New Name: ')) - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') - move(directory + folder + '/' + folderentry + '.gpg', directory + '/' + newname + '.gpg') + try: + clear() + term('cd ' + directory + '; ls -1 *') + print() + entryname = str(input('What file would you like to edit? ')) + newname = str(input('New Name: ')) + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') + move(directory + folder + '/' + folderentry + '.gpg', directory + '/' + newname + '.gpg') + else: + move(directory + entryname.replace('/', '', 1) + '.gpg', + directory + newname.replace('/', '', 1) + '.gpg') else: - move(directory + entryname.replace('/', '', 1) + '.gpg', directory + newname.replace('/', '', 1) + '.gpg') - else: - move(directory + entryname + '.gpg', directory + newname + '.gpg') + move(directory + entryname + '.gpg', directory + newname + '.gpg') + except KeyboardInterrupt: + print('\n\nEdit cancelled.\n') + exit() + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + exit() if argument == 'edit username' or argument == 'edit -u': - clear() - term('cd ~/.rpass-store; ls -1 *') - print() - entryname = str(input('What file would you like to edit? ')) - username = str(input('New Username: ')) + try: + clear() + term('cd ' + directory + '; ls -1 *') + print() + entryname = str(input('What file would you like to edit? ')) + username = str(input('New Username: ')) + except KeyboardInterrupt: + entryname, username = (0, 0) + print('\n\nEdit cancelled.\n') + exit() shmfolder, shmentry = shmgen() - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - folder + '/' + folderentry + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 0, username + '\n') - remove(directory + folder + '/' + folderentry + '.gpg') - encryptfolder() - term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + try: + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + folder + '/' + folderentry + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 0, username + '\n') + remove(directory + folder + '/' + folderentry + '.gpg') + encryptfolder() + term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + else: + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + entryname.replace('/', '', 1) + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 0, username + '\n') + remove(directory + entryname.replace('/', '', 1) + '.gpg') + encrypt() + term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - entryname.replace('/', '', 1) + '.gpg') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 0, username + '\n') - remove(directory + entryname.replace('/', '', 1) + '.gpg') + remove(directory + entryname + '.gpg') encrypt() - term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") - else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 0, username + '\n') - remove(directory + entryname + '.gpg') - encrypt() - term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() if argument == 'edit password' or argument == 'edit -p': - clear() - term('cd ~/.rpass-store; ls -1 *') - print() - entryname = str(input('What file would you like to edit? ')) - password = str(input('New Password: ')) + try: + clear() + term('cd ' + directory + '; ls -1 *') + print() + entryname = str(input('What file would you like to edit? ')) + password = str(input('New Password: ')) + except KeyboardInterrupt: + entryname, password = (0, 0) + print('\n\nEdit cancelled.\n') + exit() shmfolder, shmentry = shmgen() - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - folder + '/' + folderentry + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, password + '\n') - remove(directory + folder + '/' + folderentry + '.gpg') - encryptfolder() - term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + try: + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + folder + '/' + folderentry + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, password + '\n') + remove(directory + folder + '/' + folderentry + '.gpg') + encryptfolder() + term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + else: + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + entryname.replace('/', '', 1) + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, password + '\n') + remove(directory + entryname.replace('/', '', 1) + '.gpg') + encrypt() + term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - entryname.replace('/', '', 1) + '.gpg') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, password + '\n') - remove(directory + entryname.replace('/', '', 1) + '.gpg') + remove(directory + entryname + '.gpg') encrypt() - term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") - else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, password + '\n') - remove(directory + entryname + '.gpg') - encrypt() - term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() if argument == 'edit url' or argument == 'edit -l': - clear() - term('cd ~/.rpass-store; ls -1 *') - print() - entryname = str(input('What file would you like to edit? ')) - url = str(input('New URL: ')) + try: + clear() + term('cd ' + directory + '; ls -1 *') + print() + entryname = str(input('What file would you like to edit? ')) + url = str(input('New URL: ')) + except KeyboardInterrupt: + entryname, url = (0, 0) + print('\n\nEdit cancelled.\n') + exit() shmfolder, shmentry = shmgen() - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - folder + '/' + folderentry + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 2, url + '\n') - remove(directory + folder + '/' + folderentry + '.gpg') - encryptfolder() - term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + try: + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + folder + '/' + folderentry + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 2, url + '\n') + remove(directory + folder + '/' + folderentry + '.gpg') + encryptfolder() + term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + else: + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + entryname.replace('/', '', 1) + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 2, url + '\n') + remove(directory + entryname.replace('/', '', 1) + '.gpg') + encrypt() + term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - entryname.replace('/', '', 1) + '.gpg') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 2, url + '\n') - remove(directory + entryname.replace('/', '', 1) + '.gpg') + remove(directory + entryname + '.gpg') encrypt() - term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") - else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 2, url + '\n') - remove(directory + entryname + '.gpg') - encrypt() - term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() if argument == 'edit note' or argument == 'edit -n': - clear() - term('cd ~/.rpass-store; ls -1 *') - print() - entryname = str(input('What file would you like to edit? ')) - notes = str(input('New Note: ')) + try: + clear() + term('cd ' + directory + '; ls -1 *') + print() + entryname = str(input('What file would you like to edit? ')) + notes = str(input('New Note: ')) + except KeyboardInterrupt: + entryname, notes = (0, 0) + print('\n\nEdit cancelled.\n') + exit() shmfolder, shmentry = shmgen() - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - folder + '/' + folderentry + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 3, notes + '\n') - remove(directory + folder + '/' + folderentry + '.gpg') - encryptfolder() - term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + try: + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + folder + '/' + folderentry + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 3, notes + '\n') + remove(directory + folder + '/' + folderentry + '.gpg') + encryptfolder() + term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + else: + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + entryname.replace('/', '', 1) + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 3, notes + '\n') + remove(directory + entryname.replace('/', '', 1) + '.gpg') + encrypt() + term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - entryname.replace('/', '', 1) + '.gpg') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 3, notes + '\n') - remove(directory + entryname.replace('/', '', 1) + '.gpg') + remove(directory + entryname + '.gpg') encrypt() - term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") - else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 3, notes + '\n') - remove(directory + entryname + '.gpg') - encrypt() - term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() # copy if argument == 'copy': - print() - print('USAGE: rpass copy [FLAG]') + print('\nUSAGE: rpass copy [FLAG]') print('Flags:') print('copy:') print(' username/-u copy the username of an entry to your clipboard') print(' password/-p copy the password of an entry to your clipboard') print(' url/-l copy the URL of an entry to your clipboard') - print(' note/-n copy the note of an entry to your clipboard') - print() + print(' note/-n copy the note of an entry to your clipboard\n') if argument == 'copy username' or argument == 'copy -u': - print() - term('cd ~/.rpass-store; ls -1 *') - print() - readentry = str(input('Entry to copy: ')) + try: + print() + term('cd ' + directory + '; ls -1 *') + print() + readentry = str(input('Entry to copy: ')) + except KeyboardInterrupt: + readentry = 0 + print('\n\nCopy cancelled.\n') + exit() shmfolder, shmentry = shmgen() - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + readentry + '.gpg') - copyline = open('/dev/shm/' + shmfolder + '/' + shmentry, 'r').readlines() - if environ.get('WAYLAND_DISPLAY') == 'wayland-0': - term('wl-copy ' + "'" + copyline[0].replace('\n', '') + "'") - else: - term('echo -n ' + "'" + copyline[0].replace('\n', '') + "'" + ' | xclip -sel c') - rmtree('/dev/shm/' + shmfolder) + try: + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + readentry + '.gpg') + copyline = open('/dev/shm/' + shmfolder + '/' + shmentry, 'r').readlines() + if environ.get('WAYLAND_DISPLAY') == 'wayland-0': + term('wl-copy ' + "'" + copyline[0].replace('\n', '') + "'") + else: + term('echo -n ' + "'" + copyline[0].replace('\n', '') + "'" + ' | xclip -sel c') + rmtree('/dev/shm/' + shmfolder) + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() if argument == 'copy password' or argument == 'copy -p': - print() - term('cd ~/.rpass-store; ls -1 *') - print() - readentry = str(input('Entry to copy: ')) + try: + print() + term('cd ' + directory + '; ls -1 *') + print() + readentry = str(input('Entry to copy: ')) + except KeyboardInterrupt: + readentry = 0 + print('\n\nCopy cancelled.\n') + exit() shmfolder, shmentry = shmgen() - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + readentry + '.gpg') - copyline = open('/dev/shm/' + shmfolder + '/' + shmentry, 'r').readlines() - if environ.get('WAYLAND_DISPLAY') == 'wayland-0': - term('wl-copy ' + "'" + copyline[1].replace('\n', '') + "'") - else: - term('echo -n ' + "'" + copyline[1].replace('\n', '') + "'" + ' | xclip -sel c') - rmtree('/dev/shm/' + shmfolder) + try: + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + readentry + '.gpg') + copyline = open('/dev/shm/' + shmfolder + '/' + shmentry, 'r').readlines() + if environ.get('WAYLAND_DISPLAY') == 'wayland-0': + term('wl-copy ' + "'" + copyline[1].replace('\n', '') + "'") + else: + term('echo -n ' + "'" + copyline[1].replace('\n', '') + "'" + ' | xclip -sel c') + rmtree('/dev/shm/' + shmfolder) + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() if argument == 'copy url' or argument == 'copy -l': - print() - term('cd ~/.rpass-store; ls -1 *') - print() - readentry = str(input('Entry to copy: ')) + try: + print() + term('cd ' + directory + '; ls -1 *') + print() + readentry = str(input('Entry to copy: ')) + except KeyboardInterrupt: + readentry = 0 + print('\n\nCopy cancelled.\n') + exit() shmfolder, shmentry = shmgen() - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + readentry + '.gpg') - copyline = open('/dev/shm/' + shmfolder + '/' + shmentry, 'r').readlines() - if environ.get('WAYLAND_DISPLAY') == 'wayland-0': - term('wl-copy ' + "'" + copyline[2].replace('\n', '') + "'") - else: - term('echo -n ' + "'" + copyline[2].replace('\n', '') + "'" + ' | xclip -sel c') - rmtree('/dev/shm/' + shmfolder) + try: + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + readentry + '.gpg') + copyline = open('/dev/shm/' + shmfolder + '/' + shmentry, 'r').readlines() + if environ.get('WAYLAND_DISPLAY') == 'wayland-0': + term('wl-copy ' + "'" + copyline[2].replace('\n', '') + "'") + else: + term('echo -n ' + "'" + copyline[2].replace('\n', '') + "'" + ' | xclip -sel c') + rmtree('/dev/shm/' + shmfolder) + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() if argument == 'copy note' or argument == 'copy -n': - print() - term('cd ~/.rpass-store; ls -1 *') - print() - readentry = str(input('Entry to copy: ')) + try: + print() + term('cd ' + directory + '; ls -1 *') + print() + readentry = str(input('Entry to copy: ')) + except KeyboardInterrupt: + readentry = 0 + print('\n\nCopy cancelled.\n') + exit() shmfolder, shmentry = shmgen() - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + readentry + '.gpg') - copyline = open('/dev/shm/' + shmfolder + '/' + shmentry, 'r').readlines() - if environ.get('WAYLAND_DISPLAY') == 'wayland-0': - term('wl-copy ' + "'" + copyline[3].replace('\n', '') + "'") - else: - term('echo -n ' + "'" + copyline[3].replace('\n', '') + "'" + ' | xclip -sel c') - rmtree('/dev/shm/' + shmfolder) + try: + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + readentry + '.gpg') + copyline = open('/dev/shm/' + shmfolder + '/' + shmentry, 'r').readlines() + if environ.get('WAYLAND_DISPLAY') == 'wayland-0': + term('wl-copy ' + "'" + copyline[3].replace('\n', '') + "'") + else: + term('echo -n ' + "'" + copyline[3].replace('\n', '') + "'" + ' | xclip -sel c') + rmtree('/dev/shm/' + shmfolder) + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() # gen if argument == 'gen': - clear() - entryname = str(input('Name of service: ')) - username = str(input('Username: ')) - passlength = int(input('How many characters should be in the password? ')) - passtype = str(input('Should the password be simple (for compatibility) or complex (for security)? (s/C) ')) - if passtype != 's': - passtype = string.ascii_letters + string.digits + string.punctuation - if passtype == 's': - passtype = string.ascii_letters + string.digits - passgen = ''.join(random.SystemRandom().choice(passtype) for _ in range(passlength)) - url = str(input('URL: ')) - notes = str(input('Additional notes: ')) + try: + clear() + entryname = str(input('Name of service: ')) + username = str(input('Username: ')) + passlength = int(input('How many characters should be in the password? ')) + passtype = str(input('Should the password be simple (for compatibility) or complex (for security)? (s/C) ')) + if passtype != 's': + passtype = string.ascii_letters + string.digits + string.punctuation + if passtype == 's': + passtype = string.ascii_letters + string.digits + passgen = ''.join(random.SystemRandom().choice(passtype) for _ in range(passlength)) + url = str(input('URL: ')) + notes = str(input('Additional notes: ')) + except KeyboardInterrupt: + entryname, username, passgen, url, notes = (0, 0, 0, 0, 0) + print('\n\nEntry generation cancelled.\n') + exit() shmfolder, shmentry = shmgen() - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') - with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: - f.writelines(username + '\n' + passgen + '\n' + url + '\n' + notes + '\n\n') - encryptfolder() - term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + try: + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') + with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: + f.writelines(username + '\n' + passgen + '\n' + url + '\n' + notes + '\n\n') + encryptfolder() + term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + else: + with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: + f.writelines(username + '\n' + passgen + '\n' + url + '\n' + notes + '\n\n') + encrypt() + term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") else: with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: f.writelines(username + '\n' + passgen + '\n' + url + '\n' + notes + '\n\n') encrypt() - term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") - else: - with open('/dev/shm/' + shmfolder + '/' + shmentry, 'w') as f: - f.writelines(username + '\n' + passgen + '\n' + url + '\n' + notes + '\n\n') - encrypt() - term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The folder you requested to access does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() if argument == 'gen update' or argument == 'gen -u': - clear() - term('cd ~/.rpass-store; ls -1 *') - print() - entryname = str(input('Which password would you like to re-generate? ')) - passlength = int(input('How many characters should be in the password? ')) - passtype = str(input('Should the password be simple (for compatibility) or complex (for security)? (s/C) ')) + try: + clear() + term('cd ' + directory + '; ls -1 *') + print() + entryname = str(input('Which password would you like to re-generate? ')) + passlength = int(input('How many characters should be in the password? ')) + passtype = str(input('Should the password be simple (for compatibility) or complex (for security)? (s/C) ')) + except KeyboardInterrupt: + entryname, passlength, passtype = (0, 0, 0) + print('\n\nEntry generation cancelled.\n') + exit() shmfolder, shmentry = shmgen() - if passtype != 's': - passtype = string.ascii_letters + string.digits + string.punctuation - if passtype == 's': - passtype = string.ascii_letters + string.digits - passgen = ''.join(random.SystemRandom().choice(passtype) for _ in range(passlength)) - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - folder + '/' + folderentry + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, passgen + '\n') - remove(directory + folder + '/' + folderentry.replace('/', '', 1) + '.gpg') - encryptfolder() - term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + try: + if passtype != 's': + passtype = string.ascii_letters + string.digits + string.punctuation + if passtype == 's': + passtype = string.ascii_letters + string.digits + passgen = ''.join(random.SystemRandom().choice(passtype) for _ in range(passlength)) + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + folder, sep, folderentry = entryname.replace('/', '', 1).partition('/') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + folder + '/' + folderentry + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, passgen + '\n') + remove(directory + folder + '/' + folderentry.replace('/', '', 1) + '.gpg') + encryptfolder() + term('gpg -d ' + directory + folder + '/' + "'" + folderentry + '.gpg' + "'") + else: + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + + entryname.replace('/', '', 1) + '.gpg') + replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, passgen + '\n') + remove(directory + entryname.replace('/', '', 1) + '.gpg') + encrypt() + term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + - entryname.replace('/', '', 1) + '.gpg') + term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, passgen + '\n') - remove(directory + entryname.replace('/', '', 1) + '.gpg') + remove(directory + entryname + '.gpg') encrypt() - term('gpg -d ' + directory + "'" + entryname.replace('/', '', 1) + '.gpg' + "'") - else: - term('gpg -d --output /dev/shm/' + shmfolder + '/' + shmentry + ' ' + directory + entryname + '.gpg') - replace_line('/dev/shm/' + shmfolder + '/' + shmentry, 1, passgen + '\n') - remove(directory + entryname + '.gpg') - encrypt() - term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + term('gpg -d ' + directory + "'" + entryname + '.gpg' + "'") + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to edit does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + rmtree('/dev/shm/' + shmfolder) + exit() # remove if argument == 'remove' or argument == '-rm': clear() - term('cd ~/.rpass-store; ls -1 *') - print() - entryname = str(input('What would you like to delete? ')) - if entryname.startswith('/'): - if entryname.replace('/', '', 1).__contains__('/'): - term('ssh -p ' + port + '' + usernamessh + '@' + ip + ' rm -rf ' + "'" + directoryssh + "'" + entryname - .replace('/', '', 1) + '.gpg') - remove(directory + entryname.replace('/', '', 1) + '.gpg') + term('cd ' + directory + '; ls -1 *') + print() + try: + entryname = str(input('What would you like to delete? ')) + if entryname.startswith('/'): + if entryname.replace('/', '', 1).__contains__('/'): + if devicetype == 'c' or devicetype == 'C': + term('ssh -p ' + port + '' + usernamessh + '@' + ip + ' rm -rf ' + "'" + directoryssh + "'" + + entryname.replace('/', '', 1) + '.gpg') + remove(directory + entryname.replace('/', '', 1) + '.gpg') + else: + if devicetype == 'c' or devicetype == 'C': + term('ssh -p ' + port + '' + usernamessh + '@' + ip + ' rm -rf ' + "'" + directoryssh + "'" + + entryname.replace('/', '', 1)) + rmtree(directory + entryname.replace('/', '', 1)) else: - term('ssh -p ' + port + '' + usernamessh + '@' + ip + ' rm -rf ' + "'" + directoryssh + "'" + entryname - .replace('/', '', 1)) - rmtree(directory + entryname.replace('/', '', 1)) - else: - term('ssh -p ' + port + ' ' + usernamessh + '@' + ip + ' rm -rf ' + "'" + directoryssh + "'" + entryname + - '.gpg') - remove(directory + entryname + '.gpg') + if devicetype == 'c' or devicetype == 'C': + term('ssh -p ' + port + ' ' + usernamessh + '@' + ip + ' rm -rf ' + "'" + directoryssh + "'" + + entryname + '.gpg') + remove(directory + entryname + '.gpg') + except KeyboardInterrupt: + print('\n\nDeletion cancelled.\n') + exit() + except FileNotFoundError: + print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print('The file you requested to delete does not exist!') + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') + exit() + +if argument.__contains__('add') or argument.__contains__('-rm') or argument.__contains__('remove') or argument.\ + __contains__('edit') or argument.__contains__('gen') or argument.__contains__('version') or argument.\ + __contains__('-v') or argument.__contains__('config') or argument.__contains__('copy') or argument.\ + __contains__('show') or argument.__contains__('/') or argument == 'sync' or argument == '-s' or argument == '' \ + or argument == 'help' or argument == '--help' or argument == '-h': + null = 'null' +else: + print('\n!!!!!!!!!!!!!!!') + print('Argument error!') + print('!!!!!!!!!!!!!!!') + print("\nUse 'help', '--help', or '-h' to see a list of commands.\n") # permissions - applied pre-sync to ensure permissions are correct before upload @@ -633,10 +800,11 @@ term('find ' + directory + ' -type d -exec chmod -R 700 {} +') term('find ' + directory + ' -type f -exec chmod -R 600 {} +') # rsync - ran at end of program to ensure all files are properly synced - -if argument.__contains__('add') or argument.__contains__('-rm') or argument.__contains__('remove') or argument. \ - __contains__('edit') or argument.__contains__('gen') or argument == 'sync' or argument == '-s': - term('rsync -v -H -r -l -t -p -e ' + '"ssh -i ~/.ssh/rpass -p ' + port + '" ' + directory + ' ' + usernamessh - + '@' + ip + ':' + directoryssh) - term('rsync -v -H -r -l -t -p --delete -e ' + '"ssh -i ~/.ssh/rpass -p ' + port + '" ' + usernamessh - + '@' + ip + ':' + directoryssh + ' ' + directory) +if devicetype == 'c' or devicetype == 'C': + if argument.__contains__('add') or argument.__contains__('-rm') or argument.__contains__('remove') or argument. \ + __contains__('edit') or argument.__contains__('gen') or argument == 'sync' or argument == '-s': + print('Syncing entries with other device(s)...\n') + term('rsync -v -H -r -l -t -p -e ' + '"ssh -i ~/.ssh/rpass -p ' + port + '" ' + directory + ' ' + usernamessh + + '@' + ip + ':' + directoryssh) + term('rsync -v -H -r -l -t -p --delete -e ' + '"ssh -i ~/.ssh/rpass -p ' + port + '" ' + usernamessh + + '@' + ip + ':' + directoryssh + ' ' + directory) diff --git a/usr/share/doc/rpass/changelog b/usr/share/doc/rpass/changelog index 8635fdf..a72103c 100755 --- a/usr/share/doc/rpass/changelog +++ b/usr/share/doc/rpass/changelog @@ -1,6 +1,6 @@ <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> -rpass-2021.09.14.pr4 +rpass-2021.09.15.pr4 The Housekeeping Update (Pt. 1) - Fourth public release of rpass @@ -10,36 +10,36 @@ making any major changes in the future. New features: - added clipboard support for copying entry information -**overhaul error messages using exceptions -**add exceptions for unknown arguments -**make clean, colorful file list by exporting to document and removing extensions -**make a manpage -**multi-line notes? +- many common errors are now handled with proper exceptions +- offline support (sync no longer needs to be configured for rpass to function) Changes: - fixed gpg decryption warnings - added version info argument -- re-ordered config wizard for better rsync support -- optimized code for random string generation in /dev/shm +- re-ordered config wizard to make more sense - entry deletion can now be done client-side - removed rsyncup/rsyncdown/username/ip/port/directoryssh files, - ^ replaced with one file that holds usernamessh, ip, port, and directoryssh -**optimize code for when there is no folder but there is a slash) -**properly comment the code -**validate for Python 3.10 -**do a better job at clearing /dev/shm + ^ replaced with one file that holds usernamessh, ip, port, directoryssh, and devcetype +- files should no longer be left in /dev/shm when an error is encountered +- fixed issues relating to using a non-default entry directory +- lots of optimizations have been made to reduce the size of rpass -Planned for next update (The Secret Update): +Planned for next update (The Housekeeping Update Pt. 2): -- allow to function as alternative to gnome keyring (libsecret integration) +- a clean, colorful entry list w/o file extensions +- manpage +- multi-line notes +- commented the code +- ability to pass entries as arguments for more functions +- improve exceptions for unknown arguments Planned, no timeline: -- create separate gui frontend targetting mobile devices (first linux phones, maybe android at a later date - official iOS client not likely) +- possible libsecret integration +- create separate gui frontend targetting mobile devices (first Linux phones, maybe Android at a later date - official iOS client not likely) ^ the gui will also function on desktop linux -- make platform agnostic (add windows support and package for more Linux distributions) -- ability to pass entries as arguments for more functions +- make platform agnostic (add Windows support and package for more Linux distributions) - auto-completion on tab (currently unsure of best way to make this work) <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> diff --git a/var/lib/rpass/rpass-ssh b/var/lib/rpass/rpass-ssh deleted file mode 100644 index e69de29..0000000 diff --git a/var/lib/rpass/rpassgpg b/var/lib/rpass/rpassgpg deleted file mode 100644 index e69de29..0000000