Compare commits

...
5 changed files with 195 additions and 28 deletions
+45 -15
View File
@@ -2,7 +2,7 @@
# external modules
from os import environ, remove, system, path
from os import environ, listdir, path, remove, system
from shutil import copy, move, rmtree
from sys import argv, exit as s_exit
from pathlib import Path
@@ -49,7 +49,7 @@ def edit_note(_shm_folder, _shm_entry):
def tweak(): # runs configuration wizard
# storage/config directory creation
Path(path.expanduser('~/.password-pasture')).mkdir(0o700, parents=True, exist_ok=True)
Path(path.expanduser('~/.config/sshyp')).mkdir(0o700, parents=True, exist_ok=True)
Path(path.expanduser('~/.config/sshyp/devices')).mkdir(0o700, parents=True, exist_ok=True)
if not Path(f"{path.expanduser('~/.config/sshyp/tmp')}").exists():
if Path("/data/data/com.termux").exists():
system(f"ln -s '/data/data/com.termux/files/usr/tmp' {path.expanduser('~/.config/sshyp/tmp')}")
@@ -59,7 +59,9 @@ def tweak(): # runs configuration wizard
_device_type = input('\nIs this installation for a client or for a server? (C/s) ')
if _device_type.lower() == 's':
open(path.expanduser('~/.config/sshyp/sshyp-device'), 'w').write(_device_type)
Path(path.expanduser('~/.config/sshyp/deleted')).mkdir(0o700, parents=True, exist_ok=True)
copy('/usr/bin/sshync.py', path.expanduser('~/'))
copy('/usr/bin/sshyp-shear.py', path.expanduser('~/shear.py'))
print('\nMake sure the ssh service is running and properly configured.\n\nConfiguration complete!\n')
s_exit()
else:
@@ -103,6 +105,15 @@ def tweak(): # runs configuration wizard
sshync.make_profile(path.expanduser('~/.config/sshyp/sshyp.sshync'),
path.expanduser('~/.password-pasture/'), f"/home/{_username_ssh}/.password-pasture/",
path.expanduser('~/.ssh/sshyp'), _ip, _port, _username_ssh)
# device name configuration
print('\nIMPORTANT: This name MUST be unique amongst your client devices. '
'\nThis is used to keep track of which devices have up-to-date databases.\n')
_client_device_name = str(input('What would you like to name this device? '))
open(f"{path.expanduser('~/.config/sshyp/devices/')}{_client_device_name}", 'w')
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {_port} {_username_ssh}@{_ip} "
f"\"touch '/home/{_username_ssh}/.config/sshyp/devices/{_client_device_name}'\"")
print('\nConfiguration complete!\n')
@@ -147,8 +158,8 @@ def print_info(): # prints help text based on argument
print('/ /')
print('/ sshyp Copyright (C) 2021-2022 Randall Winkhart /')
print('/ /')
print('/ Version 2022.01.26.fr3.4 /')
print('/ The Boxing Update /')
print('/ Version 2022.02.16.fr4.1 /')
print('/ The High-Tech Shears Update /')
print('/ /')
print('////////////////////////////////////////////////////////\n')
elif argument == 'license':
@@ -198,6 +209,28 @@ def read_shortcut(): # shortcut to quickly read an entry
def sync(): # calls sshync to sync changes to the user's server
print('\nSyncing entries with the server device...\n')
# check for deletions
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"python -c 'import shear"
f"; shear.check(\"'\"{client_device_name}\"'\")'\"")
system(f"sftp -p -q -i '{path.expanduser('~/.ssh/sshyp')}' -P {port} {username_ssh}@{ip}:"
f"'/home/{username_ssh}/.config/sshyp/deletion_database' {path.expanduser('~/.config/sshyp/')}")
try:
_deletion_database = open(path.expanduser('~/.config/sshyp/deletion_database')).readlines()
except (FileNotFoundError, IndexError):
print('\nThe deletion database does not exist or is corrupted.\n')
_deletion_database = None
s_exit()
for _file in _deletion_database:
if _file.endswith('/'):
try:
rmtree(f"{path.expanduser('~/.password-pasture/')}{_file[:-1]}")
except FileNotFoundError:
print('Folder does not exist locally.\n')
else:
try:
remove(f"{path.expanduser('~/.password-pasture/')}{_file[:-1]}")
except FileNotFoundError:
print('File does not exist locally.\n')
# set permissions before uploading
system('find ' + directory + ' -type d -exec chmod -R 700 {} +')
system('find ' + directory + ' -type f -exec chmod -R 600 {} +')
@@ -234,7 +267,8 @@ def add_entry(): # adds a new entry
def add_folder(): # creates a new folder
_folder_name = str(input('Name of new folder: '))
Path(directory + _folder_name).mkdir(0o700)
system(f"ssh -p {port} {username_ssh}@{ip} \"mkdir -p '{directory_ssh}{_folder_name}'\"")
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"mkdir -p '{directory_ssh}"
f"{_folder_name}'\"")
def rename(): # renames an entry or folder TODO delete original from server to prevent re-downloading
@@ -369,7 +403,7 @@ def copy_data(): # copies a specified field of an entry to the clipboard
rmtree(f"{tmp_dir}{_shm_folder}")
def remove_data(): # deletes an entry or folder from both the client and the server
def remove_data(): # deletes an entry from the server and flags it for local deletion on sync
print()
system(f"cd {directory}; ls -1 *") # TODO replace with new list
_entry_name = str(input('\nWhat would you like to delete? '))
@@ -382,13 +416,8 @@ def remove_data(): # deletes an entry or folder from both the client and the se
except FileNotFoundError:
print('\nAccess denied.\n')
s_exit()
if device_type == 'c':
system(f"ssh -p {port} {username_ssh}@{ip} \"rm -rf '{directory_ssh}{_entry_name}.gpg'\"")
try:
remove(f"{directory}{_entry_name}.gpg")
except FileNotFoundError:
print("\nThe file does not exist!\n")
s_exit()
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"python -c 'import shear"
f"; shear.delete(\"'\"{_entry_name}\"'\")'\"")
# program start sequence
@@ -416,6 +445,7 @@ if argument != 'tweak':
port = ssh_info[2].replace('\n', '')
directory = str(ssh_info[3].replace('\n', ''))
directory_ssh = '/home/' + username_ssh + '/.password-pasture/'
client_device_name = listdir(path.expanduser('~/.config/sshyp/devices'))[0]
except FileNotFoundError:
if device_type.lower() != 's':
print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
@@ -498,7 +528,7 @@ else:
if argument != '' and argument != 'help' and argument != '--help' and argument != '-h' and argument != 'license' and \
argument != 'add' and argument != 'sync' and argument != 'edit' and argument != 'copy username' and argument \
!= 'copy -u' and argument != 'copy password' and argument != 'copy -p' and argument != 'copy url' and argument \
!= 'copy -l' and argument != 'copy note' and argument != 'copy -n' and argument != 'copy' and argument != \
'shear' and argument != '-rm' and argument != 'version' and argument != '-v' and error == 0 and \
!= 'copy -l' and argument != 'copy note' and argument != 'copy -n' and argument != 'copy' and argument \
!= 'version' and argument != '-v' and error == 0 and \
argument.startswith('/') is False:
sync()
+37
View File
@@ -0,0 +1,37 @@
#!/usr/bin/python3
# external modules
from os import remove, listdir
from os.path import expanduser
from shutil import rmtree
# utility functions
def delete(_file_path):
if _file_path.endswith('/'):
try:
rmtree(f"{expanduser('~/.password-pasture/')}{_file_path}")
except FileNotFoundError:
print('\nFolder does not exist remotely.')
else:
try:
remove(f"{expanduser('~/.password-pasture/')}{_file_path}.gpg")
except FileNotFoundError:
print('\nFile does not exist remotely.\n')
for _device_name in listdir(expanduser('~/.config/sshyp/devices')):
open(f"{expanduser('~/.config/sshyp/deleted/')}{_file_path.replace('/', '@')}^&*{_device_name}", 'w')
def check(_client_device_name):
open(expanduser('~/.config/sshyp/deletion_database'), 'w').write('')
for _file in listdir(expanduser('~/.config/sshyp/deleted')):
_file_path = _file.replace('@', '/').split('^&*')[0]
_device = _file.split('^&*')[1]
if _device == _client_device_name:
try:
remove(f"{expanduser('~/.config/sshyp/deleted/')}{_file}")
except FileNotFoundError:
pass
open(expanduser('~/.config/sshyp/deletion_database'), 'a').write(_file_path + '\n')
+95
View File
@@ -1,3 +1,98 @@
sshyp 2022.02.16.fr4.1
The High-Tech Shears Update - Patch 1
This release addresses a bug with local folder deletion.
Note: Upgrading to releases in the fr4 series requires the configuration ("sshyp tweak") to be re-done, as a device name now must be set (for multi-client deletion).
Changes:
- fixed an issue where folders could not be deleted locally
- optimized deletion flags
&&
Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp:
** sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art
sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility
^ more details will be available in the sshync repo, once it is created
&&
Planned for next, next major update (fr6, The Farmer Shearing the sshyp Update):
** when syncing, a check is made to see if any folders are not on all devices - if the check comes back true, it is corrected (in sshyp)
** imporove password generator to guarantee more secure results
** enforce permissions on the server-side
** allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions
&&
Backlog:
** create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2022.02.16.fr4
The High-Tech Shears Update
This release adds in a major feature: multi-client deletion (details below)
Note: This release requires the configuration ("sshyp tweak") to be re-done, as a device name now must be set (for multi-client deletion).
Features:
- added multi-client deletion
^ this means that when an entry is deleted from one client (and thus the server), if another client that has a copy of the deleted entry tries to sync, instead of re-uploading the deleted entry, it will now also have its entry deleted.
^ the current implementation requires a new Python script in addition to sshyp and sshync
Changes:
- fixed an issue where sshyp would use the wrong SSH key when trying to delete entries from or create folders on the server
^ this is a fix that was recently applied to sshync - turns out I made the same mistake in sshyp
- deleting folders should now work properly with "sshyp shear" if the directory is entered with a following "/"
&&
Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp:
** sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art
sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility
^ more details will be available in the sshync repo, once it is created
&&
Planned for next, next major update (fr6, The Farmer Shearing the sshyp Update):
** when syncing, a check is made to see if any folders are not on all devices - if the check comes back true, it is corrected (in sshyp)
** imporove password generator to guarantee more secure results
** enforce permissions on the server-side
** allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions
&&
Backlog:
** create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2022.01.26.fr3.4
The Boxing Update - Patch 4
+9 -4
View File
@@ -1,4 +1,4 @@
.TH sshyp 1 "26 January 2022" "2022.01.26.fr3.4" "sshyp man page"
.TH sshyp 1 "16 February 2022" "2022.02.16.fr4.1" "sshyp man page"
.SH NAME
sshyp \- A very simple self-hosted, synchronized password manager. Alternative to GNU pass.
.SH SYNOPSIS
@@ -34,6 +34,10 @@ Creating a note-only entry:
Syncing entries with the server:
sshyp sync
Removing an existing folder saved as ~/.password-pasture/social:
sshyp shear
*when prompted for what to delete, since you are deleting a folder, be sure to enter your choice with a following "/", e.g. "social/" or "/social/"
.SH OPTIONS
In order to quickly read an existing entry, just run "sshyp </entry name>".
@@ -69,11 +73,12 @@ gen:
.SH LIMITATIONS
The following limitations will be corrected in future updates:
Currently, if multiple clients are connected to a single server and a client deletes an entry, the entry is correctly deleted from the client and the server, but since the entry still exists on the other client, the next time it syncs the file will be re-uploaded. This will be fixed in an upcoming release of the syncing backend, sshync.
Currently, folders (for sorting) are not replicated onto new clients (they need to be manually created before syncing).
Currently, folders (for sorting) are not replicated onto new clients (they need to be manually created before syncing).
Currently, the entry list displays each entry with the file extension ".gpg" visible (which you do not type when reading, modifying, or creating an entry). This will be corrected when the new entry list is added.
Currently, the entry list displays each entry with the file extension ".gpg" visible (which you do not type when reading, modifying, or creating an entry). This will be corrected when the new entry list is added.
The following characters/character sequences are not supported in entry/folder titles:
@ ^&*
.SH SETUP
sshyp operates on a client-server model, and thus requires you to have access to your own server (whether it be a physical home server or a cloud rental) with remote access via SSH.
+9 -9
View File
@@ -1,18 +1,19 @@
sshyp 2022.01.26.fr3.4
sshyp 2022.02.16.fr4.1
The Boxing Update - Patch 4
The High-Tech Shears Update - Patch 1
This release is a hotfix for 2022.01.17.fr3.3. It fixes a major bug with sshync.
This release addresses a bug with local folder deletion.
Note: Upgrading to releases in the fr4 series requires the configuration ("sshyp tweak") to be re-done, as a device name now must be set (for multi-client deletion).
Changes:
- sshync now correctly uses the auto-generated SSH key in all operations
- an exception has been added for attempting to delete/shear a file that does not exist
- the manpage has been updated and now includes setup instructions
- fixed an issue where folders could not be deleted locally
- optimized deletion flags
&&
Planned for next major update (fr4, The sshyp Doing a Split Update):
Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp:
** sshyp has recieved a major visual overhaul
@@ -24,9 +25,8 @@ sshync:
&&
Planned for next, next major update (fr5, The Farmer Shearing the sshyp Update):
Planned for next, next major update (fr6, The Farmer Shearing the sshyp Update):
** allow for multi-client deletion... somehow (in sshync)
** when syncing, a check is made to see if any folders are not on all devices - if the check comes back true, it is corrected (in sshyp)
** imporove password generator to guarantee more secure results
** enforce permissions on the server-side