mirror of
https://github.com/rwinkhart/sshyp.git
synced 2026-09-03 07:37:16 -04:00
Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
85c59b302d | ||
|
|
954dd30361 | ||
|
|
65d1885311 | ||
|
|
5a7b45c3ac | ||
|
|
e5638255a8 | ||
|
|
2e32911470 | ||
|
|
4973d18034 | ||
|
|
6e13a6ebb3 | ||
|
|
dfbdc16079 | ||
|
|
3c4bf0115f | ||
|
|
762211bae0 | ||
|
|
d9adcac8ec |
@@ -42,7 +42,7 @@ cd sshyp
|
||||
makepkg -si
|
||||
```
|
||||
|
||||
Packaging for other distributions coming soon.
|
||||
Pre-built packages exist for Arch, Debian, and Termux. These can be downloaded from the releases page.
|
||||
|
||||
# Building
|
||||
Since sshyp is written entirely in Python, it doesn't need to be compiled. It does, however, need to be packaged for installation.
|
||||
|
||||
+5
-11
@@ -1,10 +1,10 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
# sshync 2022.01.16.unreleased10
|
||||
# sshync 2022.01.16.unreleased12
|
||||
|
||||
# external modules
|
||||
|
||||
from os import system, remove, mkdir, walk
|
||||
from os import path, system, walk
|
||||
from os.path import getmtime, join, expanduser
|
||||
from sys import exit as s_exit
|
||||
from pathlib import Path
|
||||
@@ -14,16 +14,10 @@ from pathlib import Path
|
||||
|
||||
def get_titles_mods(_directory, _destination, _user_data):
|
||||
_title_list, _mod_list = [], []
|
||||
Path(path.expanduser('~/.config/sshync')).mkdir(0o700, parents=True, exist_ok=True) # create config directory
|
||||
# local fetching
|
||||
if _destination == 'l':
|
||||
if Path(expanduser('~/.config/sshync/database')).is_file():
|
||||
remove(expanduser('~/.config/sshync/database'))
|
||||
else:
|
||||
try:
|
||||
mkdir(expanduser('~/.config/sshync'), 0o700)
|
||||
except FileExistsError:
|
||||
pass
|
||||
system('touch ~/.config/sshync/database')
|
||||
open(expanduser('~/.config/sshync/database'), 'w').write('') # blanks out database file
|
||||
for _root, _directories, _files in walk(_directory):
|
||||
for _filename in _files:
|
||||
_title_list.append(join(_root.replace(_directory, '', 1), _filename))
|
||||
@@ -39,7 +33,7 @@ def get_titles_mods(_directory, _destination, _user_data):
|
||||
f"; sshync.get_titles_mods(\"'\"{_user_data[4]}\"'\", \"'\"l\"'\", \"'\"{_user_data}\"'\")'\"")
|
||||
system(f"sftp -P {_user_data[2]} {_user_data[0]}@{_user_data[1]}:"
|
||||
f"'{expanduser(f'/home/{_user_data[0]}/.config/sshync/database')}' "
|
||||
f"'{expanduser('~/.config/sshync/database')}'")
|
||||
f"'{expanduser('~/.config/sshync/')}'")
|
||||
_titles, _sep, _mods = ' '.join(open(expanduser('~/.config/sshync/database')).readlines()).replace('\n', '')\
|
||||
.partition('^&*')
|
||||
_title_list, _mod_list = _titles.split(' ')[:-1], _mods.split(' ')[1:]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
# external modules
|
||||
|
||||
from os import environ, mkdir, remove, system, path
|
||||
from os import environ, remove, system, path
|
||||
from shutil import copy, move, rmtree
|
||||
from sys import argv, exit as s_exit
|
||||
from pathlib import Path
|
||||
@@ -19,28 +19,28 @@ def replace_line(file_name, line_num, text): # replaces text in a given line wi
|
||||
open(file_name, 'w').writelines(_lines)
|
||||
|
||||
|
||||
def shm_gen(): # generates random folder in /dev/shm for security and returns random names for the folder and temp file
|
||||
def shm_gen(): # generates a random temporary folder for security and returns random names for the folder and temp file
|
||||
_shm_folder_gen = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits)
|
||||
for _ in range(random.randint(10, 30)))
|
||||
_shm_entry_gen = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits)
|
||||
for _ in range(random.randint(10, 30)))
|
||||
mkdir(f"/dev/shm/{_shm_folder_gen}", 0o700)
|
||||
Path(tmp_dir + _shm_folder_gen).mkdir(0o700)
|
||||
return _shm_folder_gen, _shm_entry_gen
|
||||
|
||||
|
||||
def encrypt(_shm_folder, _shm_entry, _location):
|
||||
system(f"gpg -r {str(gpg_id)} -e '/dev/shm/{_shm_folder}/{_shm_entry}'")
|
||||
move(f"/dev/shm/{_shm_folder}/{_shm_entry}.gpg", f"{directory}{_location}.gpg")
|
||||
rmtree(f"/dev/shm/{_shm_folder}")
|
||||
system(f"gpg -r {str(gpg_id)} -e '{tmp_dir}{_shm_folder}/{_shm_entry}'")
|
||||
move(f"{tmp_dir}{_shm_folder}/{_shm_entry}.gpg", f"{directory}{_location}.gpg")
|
||||
rmtree(f"{tmp_dir}{_shm_folder}")
|
||||
|
||||
|
||||
def edit_note(_shm_folder, _shm_entry):
|
||||
lines = open(f"/dev/shm/{_shm_folder}/{_shm_entry}").readlines()
|
||||
open(f"/dev/shm/{_shm_folder}/{_shm_entry}", 'w').writelines(lines[0:3])
|
||||
open(f"/dev/shm/{_shm_folder}/{_shm_entry}-n", 'w').writelines(lines[4:-2])
|
||||
system(f"nano /dev/shm/{_shm_folder}/{_shm_entry}-n")
|
||||
edit_notes = open(f"/dev/shm/{_shm_folder}/{_shm_entry}-n").read()
|
||||
open(f"/dev/shm/{_shm_folder}/{_shm_entry}", 'a').write('\n' + edit_notes + '\n\n')
|
||||
lines = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}").readlines()
|
||||
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(lines[0:3])
|
||||
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'w').writelines(lines[4:-2])
|
||||
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
|
||||
edit_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n").read()
|
||||
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'a').write('\n' + edit_notes + '\n\n')
|
||||
|
||||
|
||||
# argument-specific functions
|
||||
@@ -48,15 +48,13 @@ def edit_note(_shm_folder, _shm_entry):
|
||||
|
||||
def tweak(): # runs configuration wizard
|
||||
# storage/config directory creation
|
||||
try:
|
||||
mkdir(path.expanduser('~/.password-pasture'), 0o700)
|
||||
except FileExistsError:
|
||||
pass
|
||||
try:
|
||||
mkdir(path.expanduser('~/.config/sshyp'), 0o700)
|
||||
except FileExistsError:
|
||||
pass
|
||||
|
||||
Path(path.expanduser('~/.password-pasture')).mkdir(0o700, parents=True, exist_ok=True)
|
||||
Path(path.expanduser('~/.config/sshyp')).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')}")
|
||||
else:
|
||||
system(f"ln -s /dev/shm {path.expanduser('~/.config/sshyp/tmp')}")
|
||||
# device type configuration
|
||||
_device_type = input('\nIs this installation for a client or for a server? (C/s) ')
|
||||
if _device_type.lower() == 's':
|
||||
@@ -79,10 +77,7 @@ def tweak(): # runs configuration wizard
|
||||
open(path.expanduser('~/.config/sshyp/sshyp-gpg'), 'w').write(_gpg_id + '\n')
|
||||
|
||||
# lock file generation
|
||||
try:
|
||||
open(path.expanduser('~/.config/sshyp/lock'), 'x').write('')
|
||||
except FileExistsError:
|
||||
pass
|
||||
open(path.expanduser('~/.config/sshyp/lock'), 'w')
|
||||
system(f"gpg -r {str(_gpg_id)} -e {path.expanduser('~/.config/sshyp/lock')}")
|
||||
remove(f"{path.expanduser('~/.config/sshyp')}/lock")
|
||||
|
||||
@@ -152,7 +147,7 @@ def print_info(): # prints help text based on argument
|
||||
print('/ /')
|
||||
print('/ sshyp Copyright (C) 2021 Randall Winkhart /')
|
||||
print('/ /')
|
||||
print('/ Version 2022.01.13.fr3.1 /')
|
||||
print('/ Version 2022.01.17.fr3.3 /')
|
||||
print('/ The Boxing Update /')
|
||||
print('/ /')
|
||||
print('////////////////////////////////////////////////////////\n')
|
||||
@@ -216,9 +211,9 @@ def add_entry(): # adds a new entry
|
||||
_entry_name = _entry_name.replace('/', '', 1)
|
||||
if argument == 'add note' or argument == 'add -n':
|
||||
_shm_folder, _shm_entry = shm_gen()
|
||||
system(f"nano /dev/shm/{_shm_folder}/{_shm_entry}-n")
|
||||
_notes = open(f"/dev/shm/{_shm_folder}/{_shm_entry}-n", 'r').read()
|
||||
open(f"/dev/shm/{_shm_folder}/{_shm_entry}", 'w').writelines('\n\n\n\n' + _notes + '\n\n')
|
||||
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
|
||||
_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read()
|
||||
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines('\n\n\n\n' + _notes + '\n\n')
|
||||
elif argument == 'add password' or argument == 'add -p':
|
||||
_username = str(input('Username: '))
|
||||
_password = str(input('Password: '))
|
||||
@@ -226,11 +221,11 @@ def add_entry(): # adds a new entry
|
||||
_add_note = input('Add a note to this entry? (y/N) ')
|
||||
_shm_folder, _shm_entry = shm_gen()
|
||||
if _add_note.lower() == 'y':
|
||||
system(f"nano /dev/shm/{_shm_folder}/{_shm_entry}-n")
|
||||
_notes = open(f"/dev/shm/{_shm_folder}/{_shm_entry}-n", 'r').read()
|
||||
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
|
||||
_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read()
|
||||
else:
|
||||
_notes = ''
|
||||
open(f"/dev/shm/{_shm_folder}/{_shm_entry}", 'w').writelines(_username + '\n' + _password + '\n' + _url + '\n\n'
|
||||
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_username + '\n' + _password + '\n' + _url + '\n\n'
|
||||
+ _notes + '\n\n')
|
||||
encrypt(_shm_folder, _shm_entry, _entry_name)
|
||||
system(f"gpg -d '{directory}{_entry_name}.gpg'")
|
||||
@@ -238,7 +233,7 @@ def add_entry(): # adds a new entry
|
||||
|
||||
def add_folder(): # creates a new folder
|
||||
_folder_name = str(input('Name of new folder: '))
|
||||
mkdir(directory + _folder_name, 0o700)
|
||||
Path(directory + _folder_name).mkdir(0o700)
|
||||
system(f"ssh -p {port} {username_ssh}@{ip} \"mkdir -p '{directory_ssh}{_folder_name}'\"")
|
||||
|
||||
|
||||
@@ -270,21 +265,21 @@ def edit(): # edits the contents of an entry
|
||||
if argument == 'edit username' or argument == 'edit -u':
|
||||
_detail = str(input('New Username: '))
|
||||
_shm_folder, _shm_entry = shm_gen()
|
||||
system(f"gpg -d --output /dev/shm/{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
replace_line(f"/dev/shm/{_shm_folder}/{_shm_entry}", 0, _detail + '\n')
|
||||
system(f"gpg -d --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 0, _detail + '\n')
|
||||
elif argument == 'edit password' or argument == 'edit -p':
|
||||
_detail = str(input('New Password: '))
|
||||
_shm_folder, _shm_entry = shm_gen()
|
||||
system(f"gpg -d --output /dev/shm/{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
replace_line(f"/dev/shm/{_shm_folder}/{_shm_entry}", 1, _detail + '\n')
|
||||
system(f"gpg -d --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 1, _detail + '\n')
|
||||
elif argument == 'edit url' or argument == 'edit -l':
|
||||
_detail = str(input('New URL: '))
|
||||
_shm_folder, _shm_entry = shm_gen()
|
||||
system(f"gpg -d --output /dev/shm/{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
replace_line(f"/dev/shm/{_shm_folder}/{_shm_entry}", 2, _detail + '\n')
|
||||
system(f"gpg -d --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 2, _detail + '\n')
|
||||
elif argument == 'edit note' or argument == 'edit -n':
|
||||
_shm_folder, _shm_entry = shm_gen()
|
||||
system(f"gpg -d --output /dev/shm/{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
system(f"gpg -d --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
edit_note(_shm_folder, _shm_entry)
|
||||
remove(f"{directory}{_entry_name}.gpg")
|
||||
encrypt(_shm_folder, _shm_entry, _entry_name)
|
||||
@@ -317,18 +312,18 @@ def gen(): # generates a password for a new or an existing entry
|
||||
_add_note = input('Add a note to this entry? (y/N) ')
|
||||
_shm_folder, _shm_entry = shm_gen()
|
||||
if _add_note.lower() == 'y':
|
||||
system(f"nano /dev/shm/{_shm_folder}/{_shm_entry}-n")
|
||||
_notes = open(f"/dev/shm/{_shm_folder}/{_shm_entry}-n", 'r').read()
|
||||
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
|
||||
_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read()
|
||||
else:
|
||||
_notes = ''
|
||||
open(f"/dev/shm/{_shm_folder}/{_shm_entry}", 'w').writelines(_username + '\n' + _pass_gen + '\n' + _url + '\n\n'
|
||||
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_username + '\n' + _pass_gen + '\n' + _url + '\n\n'
|
||||
+ _notes + '\n\n')
|
||||
encrypt(_shm_folder, _shm_entry, _entry_name)
|
||||
system(f"gpg -d '{directory}{_entry_name}.gpg'")
|
||||
else:
|
||||
_shm_folder, _shm_entry = shm_gen()
|
||||
system(f"gpg -d --output /dev/shm/{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
replace_line(f"/dev/shm/{_shm_folder}/{_shm_entry}", 1, _pass_gen + '\n')
|
||||
system(f"gpg -d --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'")
|
||||
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 1, _pass_gen + '\n')
|
||||
remove(f"{directory}{_entry_name}.gpg")
|
||||
encrypt(_shm_folder, _shm_entry, _entry_name)
|
||||
system(f"gpg -d '{directory}{_entry_name}.gpg'")
|
||||
@@ -342,9 +337,9 @@ def copy_data(): # copies a specified field of an entry to the clipboard
|
||||
print("\nThe file does not exist!\n")
|
||||
s_exit()
|
||||
_shm_folder, _shm_entry = shm_gen()
|
||||
system(f"gpg -d --output /dev/shm/{_shm_folder}/{_shm_entry} '{directory}{_read_entry}.gpg'")
|
||||
_copy_line = open(f"/dev/shm/{_shm_folder}/{_shm_entry}", 'r').readlines()
|
||||
if Path("/data/data/com.termux").is_file(): # checks for Termux, Wayland, or X
|
||||
system(f"gpg -d --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_read_entry}.gpg'")
|
||||
_copy_line = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines()
|
||||
if Path("/data/data/com.termux").exists(): # checks for Termux, Wayland, or X
|
||||
if argument == 'copy username' or argument == 'copy -u':
|
||||
system('termux-clipboard-set ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'")
|
||||
elif argument == 'copy password' or argument == 'copy -p':
|
||||
@@ -371,7 +366,7 @@ def copy_data(): # copies a specified field of an entry to the clipboard
|
||||
system('echo -n ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
|
||||
elif argument == 'copy note' or argument == 'copy -n':
|
||||
system('echo -n ' + "'" + _copy_line[4].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
|
||||
rmtree(f"/dev/shm/{_shm_folder}")
|
||||
rmtree(f"{tmp_dir}{_shm_folder}")
|
||||
|
||||
|
||||
def remove_data(): # deletes an entry or folder from both the client and the server
|
||||
@@ -381,9 +376,9 @@ def remove_data(): # deletes an entry or folder from both the client and the se
|
||||
if _entry_name.startswith('/'):
|
||||
_entry_name = _entry_name.replace('/', '', 1)
|
||||
try:
|
||||
system(f"gpg -d --output /dev/shm/sshyp.lock {path.expanduser('~/.config/sshyp/lock.gpg')}")
|
||||
_unlock = open('/dev/shm/sshyp.lock', 'r').readlines()
|
||||
remove('/dev/shm/sshyp.lock')
|
||||
system(f"gpg -d --output {tmp_dir}sshyp.lock {path.expanduser('~/.config/sshyp/lock.gpg')}")
|
||||
_unlock = open(f"{tmp_dir}sshyp.lock", 'r').readlines()
|
||||
remove(f"{tmp_dir}sshyp.lock")
|
||||
except FileNotFoundError:
|
||||
print('\nAccess denied.\n')
|
||||
s_exit()
|
||||
@@ -406,6 +401,7 @@ argument = argument[:-1]
|
||||
# import saved userdata
|
||||
if argument != 'tweak':
|
||||
device_type = ''
|
||||
tmp_dir = path.expanduser('~/.config/sshyp/tmp/')
|
||||
try:
|
||||
device_type = open(path.expanduser('~/.config/sshyp/sshyp-device')).read().strip()
|
||||
if device_type == 'c':
|
||||
|
||||
+104
-1
@@ -1,8 +1,111 @@
|
||||
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
|
||||
|
||||
sshyp 2022.01.17.fr3.3
|
||||
|
||||
The Boxing Update - Patch 3
|
||||
|
||||
This release is a hotfix for 2022.01.16.fr3.2. It fixes major bugs, especially with Termux.
|
||||
|
||||
Changes:
|
||||
|
||||
- the temporary directory for Termux is now sym-linked with its full path (no longer dangling)
|
||||
- the copy function can now properly detect if Termux is being used
|
||||
- ~/.config is created, if it does not already exist
|
||||
- "sshyp shear" now functions again, as a bug with the lock file has been fixed
|
||||
- sshync -should- now properly detect the database file on all platforms (was broken on Termux)
|
||||
- total lines of code have been slightly reduced with various small optimizations
|
||||
|
||||
Additions planned for minor releases:
|
||||
|
||||
** updated the manpage with more information regarding how sshyp works and how to set it up
|
||||
** ensured that it is now impossible for ghosts of entires to remain in /dev/shm
|
||||
** reduced total lines of code with small optimizations
|
||||
|
||||
&&
|
||||
|
||||
Planned for next major update (fr4, 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 (fr5, 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
|
||||
** 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.16.fr3.2
|
||||
|
||||
The Boxing Update - Patch 2
|
||||
|
||||
This release is a hotfix for 2022.01.16.fr3.1. It fixes major bugs, including one massively impacting Termux.
|
||||
|
||||
Changes:
|
||||
|
||||
- sshyp now uses a symlink to the temporary storage directory, allowing for easy implementation of different temporary directories on different platforms
|
||||
^ the first usage of this is enabling the use of temporary storage on Termux
|
||||
- sshync now properly auto-generates its config directory
|
||||
|
||||
Additions planned for minor releases:
|
||||
|
||||
** updated the manpage with more information regarding how sshyp works and how to set it up
|
||||
** ensured that it is now impossible for ghosts of entires to remain in /dev/shm
|
||||
** reduced total lines of code with small optimizations
|
||||
|
||||
&&
|
||||
|
||||
Planned for next major update (fr4, 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 (fr5, 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
|
||||
** 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.16.fr3.1
|
||||
|
||||
The Boxing Update
|
||||
The Boxing Update - Patch 1
|
||||
|
||||
This release is a hotfix for 2022.01.13.fr3. It fixes sshync/syncing support after the changes in the last release.
|
||||
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
sshyp 2022.01.16.fr3.1
|
||||
sshyp 2022.01.17.fr3.3
|
||||
|
||||
The Boxing Update
|
||||
The Boxing Update - Patch 3
|
||||
|
||||
This release is a hotfix for 2022.01.13.fr3. It fixes sshync/syncing support after the changes in the last release.
|
||||
This release is a hotfix for 2022.01.16.fr3.2. It fixes major bugs, especially with Termux.
|
||||
|
||||
Changes:
|
||||
|
||||
- sshync has been updated to work with the new config directory
|
||||
- sshync now uses its own directory to store the database file
|
||||
^ this is preperation for separating sshync into its own package
|
||||
- expanduser lines in sshyp have been simplified (no user-facing impact)
|
||||
- the temporary directory for Termux is now sym-linked with its full path (no longer dangling)
|
||||
- the copy function can now properly detect if Termux is being used
|
||||
- ~/.config is created, if it does not already exist
|
||||
- "sshyp shear" now functions again, as a bug with the lock file has been fixed
|
||||
- sshync -should- now properly detect the database file on all platforms (was broken on Termux)
|
||||
- total lines of code have been slightly reduced with various small optimizations
|
||||
|
||||
Additions planned for minor releases:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user