Compare commits

...
44 Commits
Author SHA1 Message Date
RandyTheSilly 928aacc64a No longer package Fedora with the "All" option (to ensure Fedora is only packaged from itself)
Former-commit-id: 84a32263eb6ceb32063ba0c3fd6ecc49c59fc579 [formerly 90454645e0]
Former-commit-id: 8e57ca2e811b3cbf73c9356c103ae189022f9a9f
2022-06-20 03:49:51 -04:00
RandyTheSilly 094bdcb418 Updated documentation
Former-commit-id: 49716c1645645bdc47992c7d480f51a81e457e0e [formerly c0ac590e4b]
Former-commit-id: d0d798a715d10136bfc9c67352a2e8893ddfbff1
2022-06-20 03:45:43 -04:00
RandyTheSilly 419ff51e75 Properly handle exception for non-integer input with pass_gen()
Former-commit-id: b2c4bd2cd8cf7db4516f47a48bde46610d2e9f5c [formerly 964561b33b]
Former-commit-id: c92d23fa9ee173e5e0540ecbb060b1edf8ec05c9
2022-06-20 03:35:19 -04:00
RandyTheSilly 2111a0454e Optimized gen() function
Former-commit-id: 3706f28b1e9a0ccf59dd75076692a30534fe017c [formerly 6398ef8ec0]
Former-commit-id: 35419b0570ca452d27e0f8cae322bec552e1023d
2022-06-20 03:23:36 -04:00
RandyTheSilly 5d902f0324 Fixed error when generating a new password entry with no additional arguments
Former-commit-id: 642e7756a42374eac08df6ce1ec2ac37a803a2ce [formerly 45ee9ff40b]
Former-commit-id: b5e1a2cca9be722ae40e5a8b6b2431251344daac
2022-06-20 03:15:08 -04:00
RandyTheSilly 505ffdb489 Fixed accidental overwriting when creating a new file of a name that is already present + some fixes for renaming and generating
Former-commit-id: 947ab5d1ac6dc5b07836bc075d202b32f563ab6c [formerly a06fc38968]
Former-commit-id: 97c3bda15e6e67e8f5503aa21ac69e54c27ae42c
2022-06-20 03:08:08 -04:00
RandyTheSilly 5cab1ad091 Fix FreeBSD errors on entry creation/editing due to attempting to access a directory with limited permissions
Former-commit-id: d0ec9fcc1d155c11c4c4cee86ba13815ccf06d2b [formerly 1860edaccf]
Former-commit-id: e94a9e94804fccea66d9f57673c26ac54dd0e13d
2022-06-20 02:11:33 -04:00
RandyTheSilly 2e2404636b Corrected installed size for Debian/Termux packages
Former-commit-id: 6b15b2962add508a3e52e4301080143188641a7c [formerly abe9fed749]
Former-commit-id: 76bbde9f50cbf2bb662d93c537dee25ad6b03c64
2022-06-20 02:02:07 -04:00
RandyTheSilly 6cb5bd405f Update README.md
Former-commit-id: 38d003983687f031ef2dc50122db52429d0cd340 [formerly 71662a53f1]
Former-commit-id: cb658bef3fdf54ed6dfb546468368113a4660518
2022-06-20 01:12:47 -04:00
RandyTheSilly c93965c9a5 Clarify FreeBSD support in version screen
Former-commit-id: 92ef1fe11f9c5818e7356f475b93ade6af37e4b2 [formerly 99282ea5b0]
Former-commit-id: d072d2719fc308239efde87f0547548e568ccd1c
2022-06-20 00:31:08 -04:00
RandyTheSilly d685e07d32 Clarify that the Fedora package must be built using Fedora
Former-commit-id: 872539a685e693ad39e98dc7147fb03b14b03799 [formerly 4b77990d97]
Former-commit-id: fb405f8b9845c1b14def2e4be7a865e158937042
2022-06-20 00:26:21 -04:00
RandyTheSilly 192f58fef5 Replace claims of Red Hat support with Fedora, as testing is not done with other Red Hat distributions
Former-commit-id: 8b8a719d2ab61fb3071d7977876edb406a6de322 [formerly afe05cf76f]
Former-commit-id: d5e6f980a9f354d2202ae5c9cfa275eca3eb337d
2022-06-20 00:16:06 -04:00
RandyTheSilly 106f22f757 Cleaned up ascii art in banner
Former-commit-id: 3738bcb955c614a67f95c459888d8f3dfdd20444 [formerly f2d704a447]
Former-commit-id: f10b328ca54dc3114f3c1611a59da6bb52247a24
2022-06-19 23:28:46 -04:00
RandyTheSilly ae414dadda Added banner to README.md
Former-commit-id: 02625dc2573dc43cceab4a5d8aba597f64f39039 [formerly 3e8ab76db7]
Former-commit-id: 1c20fe718096e7b8106b42c4ebe687d77c004582
2022-06-19 23:11:56 -04:00
RandyTheSilly c9e99732a2 Replaced 100h mascot with banner
Former-commit-id: 7334c3e7b066816a68858f051781a4c80b02b99c [formerly be0c226e15]
Former-commit-id: bad996992a2b239424cffd8bd1649d638082e229
2022-06-19 23:06:36 -04:00
RandyTheSilly fc37368447 Replaced 400h mascot image with 100h mascot image
Former-commit-id: b6a210e20f3c04806775cabd9abde4fe9a9506aa [formerly 61525bd81e]
Former-commit-id: 98835f143f3857377a8df2899d0123e5e8053fdd
2022-06-19 22:21:01 -04:00
RandyTheSilly ca2bc98735 Added 400 pixel tall version of sshyp mascot image
Former-commit-id: 157fdf477353d9134c8a80efbcfc1fd769c0c484 [formerly 21205f48dd]
Former-commit-id: 4fc37ca74a4c4ac1cc8f11edd1e1595c9b0e6253
2022-06-19 22:19:20 -04:00
RandyTheSilly f44391612d Added full-resolution mascot image
Former-commit-id: 86c57c8f87
2022-06-19 22:12:44 -04:00
RandyTheSilly 8c0e9eb6df Update README.md 2022-06-17 03:19:21 -04:00
RandyTheSilly c03e818560 Update documentation 2022-06-17 03:16:01 -04:00
RandyTheSilly 0b653000ef Increased visual density of entry list 2022-06-17 02:41:50 -04:00
RandyTheSilly 9f89dce42b Update rename function to new entry name fetcher 2022-06-17 02:33:26 -04:00
RandyTheSilly e7b2e19039 Updated input text for adding an entry 2022-06-17 02:24:53 -04:00
RandyTheSilly 80b6b4abd2 Restored custom input prompts, fixed "add folder" not using new entry name fetcher, made all input prompts serve entry list 2022-06-17 02:18:23 -04:00
RandyTheSilly 758e9f331c Added entry name fetching function to get user input with a cleaner method 2022-06-17 01:50:06 -04:00
RandyTheSilly ba14c0e74b Optimized argument parsing 2022-06-16 17:11:02 -04:00
RandyTheSilly 1991672618 Initial FreeBSD packaging support 2022-06-16 16:11:24 -04:00
RandyTheSilly 9b600dabbf Decrypt lock file to /dev/null 2022-06-12 03:23:22 -04:00
RandyTheSilly e42641079d Added error message for failed decryption 2022-06-12 02:40:24 -04:00
RandyTheSilly 7c6cbaec35 Fixes for Red Hat packaging 2022-06-11 21:42:23 -04:00
RandyTheSilly cb441933db Initial Red Hat packaging support 2022-06-11 20:48:27 -04:00
RandyTheSilly dad1a34575 Added a check to ensure ssh and syncing support are properly configured (also disabled syncing support if not properly configured, acting as a form of offline mode) 2022-06-05 21:27:02 -04:00
RandyTheSilly 3a30812de5 Properly handled exception for unfinished configuration files 2022-05-30 16:51:47 -04:00
RandyTheSilly e1930f9457 Various visual consistency updates 2022-05-30 16:48:18 -04:00
RandyTheSilly 05df3dd903 Updated missing config files message to be in-line with new error message styling 2022-05-30 15:45:07 -04:00
RandyTheSilly 5c1195f42d Updated password length limit message to be in-line with new error message styling 2022-05-30 15:40:10 -04:00
RandyTheSilly 30aa3e2438 Further improvements to visual consistency of errors 2022-05-30 15:33:37 -04:00
RandyTheSilly a8ea1eb444 Fix for occasional IndexError exceptions with new argument system 2022-05-30 15:10:47 -04:00
RandyTheSilly 8e053f25b8 More styling consistency changes 2022-05-30 14:48:30 -04:00
RandyTheSilly a175a270e0 Updated entry reader with more consistent color styling 2022-05-30 14:35:43 -04:00
RandyTheSilly d116582144 Improved argument system to more accurately handle incorrect user inputs 2022-05-30 02:38:18 -04:00
RandyTheSilly f760b5420c Reduced visual complexity of help screens 2022-05-26 05:32:46 -04:00
RandyTheSilly 6498a076f2 Overhauled version screen w/ascii art 2022-05-26 05:05:25 -04:00
RandyTheSilly f4a0c52ca8 Update documentation 2022-05-23 02:17:42 -04:00
9 changed files with 578 additions and 439 deletions
+20 -25
View File
@@ -1,12 +1,14 @@
# sshyp ![sshyp](https://github.com/rwinkhart/sshyp/blob/main/extra/sshyp-linux-banner.png)
A very simple self-hosted, synchronized password manager for UNIX systems (currently Haiku/Linux). Alternative to (and compatible with) pass/password-store.
Compatible with entries created by pass/password-store. sshyp is a very simple self-hosted, synchronized password manager for UNIX(-like) systems (currently Haiku/FreeBSD/Linux).
The only password-store compatible CLI password manager available for Haiku. sshyp is compatible with entries created by pass/password-store, as its original goal was to be like pass/password-store, but far more user-friendly to synchronize with a self-hosted server.
"sshyp" stands for "sshync passwords", or "ssh sync passwords". sshyp is (as of writing) the only password-store compatible CLI password manager available for Haiku.
"sshync" is the custom syncing backend (based on sftp) used by "sshyp".
sshyp makes use of a custom sftp wrapper, called sshync (ssh+sync), to reliably sync user entries with a local or remote server.
The name "sshyp" is a combination of its syncing library, "sshync", and "passwords".
# WARNING # WARNING
It is your responsibility to assess the security and stability of "sshyp" before using it and ensure it meets your needs. It is your responsibility to assess the security and stability of "sshyp" before using it and ensure it meets your needs.
@@ -22,31 +24,23 @@ What sshyp can do:
- generate new, secure passwords to the user's choice in length and complexity - generate new, secure passwords to the user's choice in length and complexity
- securely sync said passwords and notes seamlessly between devices - securely sync said passwords and notes seamlessly between devices
- everything above with entries created by pass/password-store! - everything above with entries created by pass/password-store!
- everything above on Haiku, Linux, and Termux (an Android terminal emulator)! - everything above on Haiku, FreeBSD, Linux, and Termux (an Android terminal emulator)!
What sshyp will likely do: What sshyp will likely do:
- (planned v1.1.0) 2FA/MFA management (was previously not on the roadmap, but could be beneficial in reducing phone usage) - (planned v1.1.0) 2FA/MFA management (beneficial for reducing phone usage)
- (planned v1.2.0) everything it already does, but also in a GUI for Linux/Haiku - (planned v1.2.0) everything it already does, but also in a GUI for Linux/Haiku
What sshyp definitely won't do: What sshyp definitely won't do:
- Non-UNIX support, e.g. Windows (I'd be happy to link to third-party ports, if someone were to make them) - Non-UNIX(-like) support, e.g. Windows (I'd be happy to link to third-party ports, if someone were to make them)
# Installation # Installation
Arch Linux (all ISAs) Please see the [installation guide](https://github.com/rwinkhart/sshyp/wiki/Installation) in the sshyp wiki for directions specific to your distribution/OS.
sshyp releases are available in the Arch User Repository as 'sshyp'. Pre-built packages exist for Haiku, FreeBSD, Arch Linux, Debian/Ubuntu Linux, Fedora Linux, and Termux. These can be downloaded from the releases page.
Install with your preferred AUR helper or use: Requests for additional distribution/OS support can be filed as issues.
```
git clone https://aur.archlinux.org/sshyp.git
cd sshyp
makepkg -si
```
Pre-built packages exist for Haiku, Arch Linux, Debian Linux, and Termux. These can be downloaded from the releases page.
# Building # Building
Since sshyp is written entirely in Python, it doesn't need to be compiled. It does, however, need to be packaged for installation. Since sshyp is written entirely in Python, it doesn't need to be compiled. It does, however, need to be packaged for installation.
@@ -59,11 +53,13 @@ cd sshyp
./package.sh ./package.sh
``` ```
The packaging script has been tested on Arch Linux with dpkg as a dependency for Debian and Termux packaging. The packaging script has been tested on Arch Linux with "dpkg" as a dependency for Debian/Ubuntu and Termux packaging and "freebsd-pkg" as a dependency for FreeBSD packaging.
Haiku and Fedora packaging must be done on their own respective distributions.
The AUR version and the packages attatched to the release tags were already packaged using this script. The AUR version and the packages attatched to the release tags were already packaged using this script.
Currently, the script can create packages for Haiku, Arch Linux (PKGBUILD), Debian Linux, Termux, and generic. Packaging for other systems coming soon. Currently, the script can create packages for Haiku, FreeBSD, Arch Linux (PKGBUILD), Debian/Ubuntu Linux, Fedora Linux, Termux, and generic.
# Usage # Usage
Upon initial installation (on both the server and client devices), be sure to run: Upon initial installation (on both the server and client devices), be sure to run:
@@ -72,8 +68,7 @@ Upon initial installation (on both the server and client devices), be sure to ru
sshyp tweak sshyp tweak
``` ```
This command will allow you to configure the settings necessary for sshyp to function. This command will allow you to configure the settings necessary for sshyp to function. To ensure configuration compatibility, it is a good idea to run 'sshyp tweak' after each major update.
To ensure configuration compatibility, it is a good idea to run 'sshyp tweak' after each major update.
Please note that decrypting and reading entries is disabled on server devices for security reasons. Only devices configured as clients can use the gpg key to decrypt entries. Please note that decrypting and reading entries is disabled on server devices for security reasons. Only devices configured as clients can use the gpg key to decrypt entries.
@@ -93,7 +88,7 @@ man sshyp
Short-term Goals: Short-term Goals:
- 2FA/MFA management - 2FA/MFA management
- create minimal GUI apps (Linux x86_64, Linux aarch64) - create minimal GUI apps (Linux x86_64, Linux aarch64, Haiku x86_64)
- various optimizations/bug fixes - various optimizations/bug fixes
Long-term Goals: Long-term Goals:
+1 -1
View File
@@ -61,7 +61,7 @@ def get_profile(_profile_dir):
try: try:
_profile_data = open(_profile_dir).readlines() _profile_data = open(_profile_dir).readlines()
except (FileNotFoundError, IndexError): except (FileNotFoundError, IndexError):
print('\nEither the profile does not exist, or it is corrupted.\n') print('\n\u001b[38;5;9merror: the profile does not exist or is corrupted.\u001b[0m\n')
_profile_data = None _profile_data = None
s_exit(1) s_exit(1)
# extract data from profile # extract data from profile
+272 -245
View File
@@ -8,7 +8,7 @@ import random
from shutil import get_terminal_size, move, rmtree from shutil import get_terminal_size, move, rmtree
import sshync import sshync
import string import string
from subprocess import Popen from subprocess import Popen, PIPE, STDOUT
from sys import argv, exit as s_exit from sys import argv, exit as s_exit
from textwrap import fill from textwrap import fill
@@ -38,7 +38,7 @@ def entry_list_gen(): # generates and prints a list of all folders and entries
for _root, _directories, _files in walk(path.expanduser('~/.password-pasture')): for _root, _directories, _files in walk(path.expanduser('~/.password-pasture')):
for _dir in sorted(_directories): for _dir in sorted(_directories):
_inner_dir = f"{_root.replace(path.expanduser('~/.password-pasture'), '')}/{_dir}" _inner_dir = f"{_root.replace(path.expanduser('~/.password-pasture'), '')}/{_dir}"
print(f"\n\u001b[38;5;15;48;5;238m{_inner_dir}/\u001b[0m") print(f"\u001b[38;5;15;48;5;238m{_inner_dir}/\u001b[0m")
_entry_list, _color_alternator = [], 1 _entry_list, _color_alternator = [], 1
for _s_root, _s_directories, _s_files in walk(path.expanduser(f"~/.password-pasture{_inner_dir}")): for _s_root, _s_directories, _s_files in walk(path.expanduser(f"~/.password-pasture{_inner_dir}")):
for _entry in sorted(_s_files): for _entry in sorted(_s_files):
@@ -56,7 +56,7 @@ def entry_list_gen(): # generates and prints a list of all folders and entries
try: try:
print(fill(' '.join(_entry_list), width=_width) + '\n') print(fill(' '.join(_entry_list), width=_width) + '\n')
except ValueError: except ValueError:
print('\u001b[38;5;208m-empty directory!-\u001b[0m\n') print('\u001b[38;5;9m-empty directory-\u001b[0m\n')
def entry_reader(_decrypted_entry): def entry_reader(_decrypted_entry):
@@ -65,14 +65,14 @@ def entry_reader(_decrypted_entry):
for _num in range(len(_entry_lines)): for _num in range(len(_entry_lines)):
try: try:
if _num == 0 and _entry_lines[1] != '\n': if _num == 0 and _entry_lines[1] != '\n':
print(f"\u001b[38;5;0;48;5;15mUsername:\u001b[0m\n{_entry_lines[1]}") print(f"\u001b[38;5;15;48;5;238musername:\u001b[0m\n{_entry_lines[1]}")
elif _num == 1 and _entry_lines[0] != '\n': elif _num == 1 and _entry_lines[0] != '\n':
print(f"\u001b[38;5;0;48;5;15mPassword:\u001b[0m\n{_entry_lines[0]}") print(f"\u001b[38;5;15;48;5;238mpassword:\u001b[0m\n{_entry_lines[0]}")
elif _num == 2 and _entry_lines[2] != '\n': elif _num == 2 and _entry_lines[2] != '\n':
print(f"\u001b[38;5;0;48;5;15mURL:\u001b[0m\n{_entry_lines[_num]}") print(f"\u001b[38;5;15;48;5;238murl:\u001b[0m\n{_entry_lines[_num]}")
elif _num >= 3 and _entry_lines[_num] != '\n' and _notes_flag != 1: elif _num >= 3 and _entry_lines[_num] != '\n' and _notes_flag != 1:
_notes_flag = 1 _notes_flag = 1
print('\u001b[38;5;0;48;5;15mNotes:\u001b[0m\n' + _entry_lines[_num].replace('\n', '')) print('\u001b[38;5;15;48;5;238mnotes:\u001b[0m\n' + _entry_lines[_num].replace('\n', ''))
elif _num >= 3 and _notes_flag == 1: elif _num >= 3 and _notes_flag == 1:
print(_entry_lines[_num].replace('\n', '')) print(_entry_lines[_num].replace('\n', ''))
if _notes_flag == 1: if _notes_flag == 1:
@@ -82,7 +82,7 @@ def entry_reader(_decrypted_entry):
print() print()
except IndexError: except IndexError:
if _num == 0: if _num == 0:
print(f"\u001b[38;5;0;48;5;15mPassword:\u001b[0m\n{_entry_lines[0]}") print(f"\u001b[38;5;15;48;5;238mpassword:\u001b[0m\n{_entry_lines[0]}")
def replace_line(file_name, line_num, text): # replaces text in a given line with different text def replace_line(file_name, line_num, text): # replaces text in a given line with different text
@@ -91,6 +91,22 @@ def replace_line(file_name, line_num, text): # replaces text in a given line wi
open(file_name, 'w').writelines(_lines) open(file_name, 'w').writelines(_lines)
def entry_name_fetch(_entry_name_location):
if type(_entry_name_location) == str:
entry_list_gen()
_entry_name = str(input(_entry_name_location))
elif _entry_name_location == 0:
_entry_name = argument
else:
_entry_name_split = argument.split(' ')
del _entry_name_split[:_entry_name_location]
_entry_name = ' '.join(_entry_name_split)
if _entry_name.startswith('/'):
return _entry_name.replace('/', '', 1)
else:
return _entry_name
def shm_gen(): # generates a random temporary folder 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) _shm_folder_gen = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits)
for _ in range(random.randint(10, 30))) for _ in range(random.randint(10, 30)))
@@ -114,11 +130,16 @@ def pass_gen():
if __special < __min_special: if __special < __min_special:
__gen = _pass_gen_function(__complexity, __length) __gen = _pass_gen_function(__complexity, __length)
return __gen return __gen
_length = int(input('How many characters should be in the password? ')) try:
_length = int(input('password length: '))
except ValueError:
print(f"\n\u001b[38;5;9merror: a non-integer value was input for password length\u001b[0m\n")
_gen = pass_gen()
return _gen
if _length > 840: if _length > 840:
_length = 840 _length = 840
print('\n\u001b[38;5;208mPassword length has been limited to the maximum of 840 characters.\u001b[0m\n') print('\n\u001b[38;5;9mpassword length has been limited to the maximum of 840 characters\u001b[0m\n')
_complexity = str(input('Should the password be simple (for compatibility) or complex (for security)? (s/C) ')) _complexity = str(input('password complexity - simple (for compatibility) or complex (for security)? (s/C) '))
_gen = _pass_gen_function(_complexity, _length) _gen = _pass_gen_function(_complexity, _length)
return _gen return _gen
@@ -129,6 +150,18 @@ def encrypt(_shm_folder, _shm_entry, _location):
rmtree(f"{tmp_dir}{_shm_folder}") rmtree(f"{tmp_dir}{_shm_folder}")
def decrypt(_entry_dir, _shm_folder, _shm_entry):
if _shm_folder == 0 and _shm_entry == 0:
_command = f"{gpg} -qd --output /dev/null {path.expanduser('~/.config/sshyp/lock.gpg')}"
else:
_command = f"{gpg} -qd --output {tmp_dir}{_shm_folder}/{_shm_entry} {_entry_dir}.gpg"
_output = Popen(_command, shell=True, stdout=PIPE, stderr=STDOUT, close_fds=True)
_block = _output.communicate()[0].strip()
if _output.returncode == 2:
print(f"\n\u001b[38;5;9merror: could not decrypt - ensure the correct gpg key is present\u001b[0m\n")
s_exit(1)
def edit_note(_shm_folder, _shm_entry): def edit_note(_shm_folder, _shm_entry):
lines = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}").readlines() 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}", 'w').writelines(lines[0:3])
@@ -138,6 +171,21 @@ def edit_note(_shm_folder, _shm_entry):
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'a').write(edit_notes) open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'a').write(edit_notes)
def copy_name_check(_port, _username_ssh, _ip, _client_device_name):
_command = f"ssh -o ConnectTimeout=3 -i '{path.expanduser('~/.ssh/sshyp')}' -p {_port} {_username_ssh}@{_ip} " \
f"\"touch '/home/{_username_ssh}/.config/sshyp/devices/{_client_device_name}'\""
_output = Popen(_command, shell=True, stdout=PIPE, stderr=STDOUT, close_fds=True)
_block = _output.communicate()[0].strip()
if _output.returncode != 0:
print('\n\u001b[38;5;9mwarning: ssh connection could not be made - ensure the public key (~/.ssh/sshyp.pub) is '
'registered on the remote server and that the entered ip, port, and username are correct\n\nsyncing '
'functionality will be disabled until this is addressed\u001b[0m\n')
open(path.expanduser('~/.config/sshyp/ssh-error'), 'w').write('1')
return 1
else:
open(path.expanduser('~/.config/sshyp/ssh-error'), 'w').write('0')
return 0
# argument-specific functions # argument-specific functions
@@ -146,18 +194,18 @@ def tweak(): # runs configuration wizard
Path(path.expanduser('~/.password-pasture')).mkdir(0o700, parents=True, exist_ok=True) Path(path.expanduser('~/.password-pasture')).mkdir(0o700, parents=True, exist_ok=True)
Path(path.expanduser('~/.config/sshyp/devices')).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 not Path(f"{path.expanduser('~/.config/sshyp/tmp')}").exists():
if uname()[0] == 'Haiku': if uname()[0] == 'Haiku' or uname()[0] == 'FreeBSD':
system(f"ln -s /tmp {path.expanduser('~/.config/sshyp/tmp')}") system(f"ln -s /tmp {path.expanduser('~/.config/sshyp/tmp')}")
elif Path("/data/data/com.termux").exists(): elif Path("/data/data/com.termux").exists():
system(f"ln -s '/data/data/com.termux/files/usr/tmp' {path.expanduser('~/.config/sshyp/tmp')}") system(f"ln -s '/data/data/com.termux/files/usr/tmp' {path.expanduser('~/.config/sshyp/tmp')}")
else: else:
system(f"ln -s /dev/shm {path.expanduser('~/.config/sshyp/tmp')}") system(f"ln -s /dev/shm {path.expanduser('~/.config/sshyp/tmp')}")
# device type configuration # device type configuration
_device_type = input('\nIs this installation for a client or for a server? (C/s) ') _device_type = input('\nclient or server installation? (C/s) ')
if _device_type.lower() == 's': if _device_type.lower() == 's':
open(path.expanduser('~/.config/sshyp/sshyp-device'), 'w').write(_device_type) open(path.expanduser('~/.config/sshyp/sshyp-device'), 'w').write(_device_type)
Path(path.expanduser('~/.config/sshyp/deleted')).mkdir(0o700, parents=True, exist_ok=True) Path(path.expanduser('~/.config/sshyp/deleted')).mkdir(0o700, parents=True, exist_ok=True)
print('\nMake sure the ssh service is running and properly configured.\n\nConfiguration complete!\n') print('\nmake sure the ssh service is running and properly configured\n\nconfiguration complete\n')
s_exit(0) s_exit(0)
else: else:
# device type configuration # device type configuration
@@ -165,12 +213,12 @@ def tweak(): # runs configuration wizard
open(path.expanduser('~/.config/sshyp/sshyp-device'), 'w').write(_device_type) open(path.expanduser('~/.config/sshyp/sshyp-device'), 'w').write(_device_type)
# gpg configuration # gpg configuration
_gpg_id = input('\nsshyp requires the use of a unique gpg key. Do you already have one that you are ' _gpg_id = input('\nsshyp requires the use of a unique gpg key - do you already have one that you are '
'willing to use? (y/N)') 'willing to use? (y/N) ')
if _gpg_id.lower() != 'y': if _gpg_id.lower() != 'y':
print('\nA unique gpg key has been generated for you.') print('\na unique gpg key has been generated for you.')
system(f"{gpg} --full-generate-key") system(f"{gpg} --full-generate-key")
_gpg_id = str(input('\nPlease input the ID of your gpg key: ')) _gpg_id = str(input('\nplease input the id of your gpg key: '))
open(path.expanduser('~/.config/sshyp/sshyp-gpg'), 'w').write(_gpg_id + '\n') open(path.expanduser('~/.config/sshyp/sshyp-gpg'), 'w').write(_gpg_id + '\n')
# lock file generation # lock file generation
@@ -179,24 +227,23 @@ def tweak(): # runs configuration wizard
remove(f"{path.expanduser('~/.config/sshyp')}/lock") remove(f"{path.expanduser('~/.config/sshyp')}/lock")
# ssh key configuration # ssh key configuration
_ssh_gen = (input('\nMake sure the ssh service on the remote server is running and properly configured.' _ssh_gen = (input('\nmake sure the ssh service on the remote server is running and properly configured'
'\n\nSync support requires a unique ssh key. Would you like to have this automatically ' '\n\nsync support requires a unique ssh key - would you like to have this automatically '
'generated? (Y/n) ')) 'generated? (Y/n) '))
if _ssh_gen.lower() != 'n': if _ssh_gen.lower() != 'n':
if uname()[0] == 'Haiku': if uname()[0] == 'Haiku':
Path(f"{path.expanduser('~')}/.ssh").mkdir(0o700, exist_ok=True) Path(f"{path.expanduser('~')}/.ssh").mkdir(0o700, exist_ok=True)
system('ssh-keygen -t ed25519 -f ~/.ssh/sshyp') system('ssh-keygen -t ed25519 -f ~/.ssh/sshyp')
else: else:
print(f"\nEnsure that the key file you are using is located at {path.expanduser('~/.ssh/sshyp')}") print(f"\nensure that the key file you are using is located at {path.expanduser('~/.ssh/sshyp')}")
# ssh ip+port configuration # ssh ip+port configuration
print('\nExample input: 10.10.10.10:9999\n') _ip_port = str(input('\nexample input: 10.10.10.10:9999\n\nip and ssh port of the remote server: '))
_ip_port = str(input('What is the IP and ssh port of the remote server? '))
_ip, _sep, _port = _ip_port.partition(':') _ip, _sep, _port = _ip_port.partition(':')
# ssh user configuration # ssh user configuration
_username_ssh = str(input('\nWhat is the username of the remote server? ')) _username_ssh = str(input('\nusername of the remote server: '))
print(f"\nEntry directory: /home/{_username_ssh}/.password-pasture/") print(f"\nentry directory: /home/{_username_ssh}/.password-pasture/")
# sshync profile generation # sshync profile generation
sshync.make_profile(path.expanduser('~/.config/sshyp/sshyp.sshync'), sshync.make_profile(path.expanduser('~/.config/sshyp/sshyp.sshync'),
@@ -206,23 +253,22 @@ def tweak(): # runs configuration wizard
# device name configuration # device name configuration
for _name in listdir(path.expanduser('~/.config/sshyp/devices')): # remove existing device name for _name in listdir(path.expanduser('~/.config/sshyp/devices')): # remove existing device name
remove(f"{path.expanduser('~/.config/sshyp/devices/')}{_name}") remove(f"{path.expanduser('~/.config/sshyp/devices/')}{_name}")
print('\nIMPORTANT: This name MUST be unique amongst your client devices. ' print('\n\u001b[4;1mimportant:\u001b[0m This name \u001b[4;1mmust\u001b[0m be unique amongst your client '
'\nThis is used to keep track of which devices have up-to-date databases.\n') 'devices\n\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? ')) _client_device_name = str(input('device name: '))
open(f"{path.expanduser('~/.config/sshyp/devices/')}{_client_device_name}", 'w') open(f"{path.expanduser('~/.config/sshyp/devices/')}{_client_device_name}", 'w')
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {_port} {_username_ssh}@{_ip} " copy_name_check(_port, _username_ssh, _ip, _client_device_name)
f"\"touch '/home/{_username_ssh}/.config/sshyp/devices/{_client_device_name}'\"")
print('\nConfiguration complete!\n') print('\nconfiguration complete\n')
def print_info(): # prints help text based on argument def print_info(): # prints help text based on argument
if argument == 'help' or argument == '--help' or argument == '-h': if argument_list[0] == 'help' or argument_list[0] == '--help' or argument_list[0] == '-h':
print('\n\u001b[38;5;0;48;5;15msshyp Copyright (C) 2021-2022 Randall Winkhart\u001b[0m\n') print('\n\u001b[1msshyp copyright (c) 2021-2022 randall winkhart\u001b[0m\n')
print("This is free software, and you are welcome to redistribute it under certain conditions;\nthis program " print("this is free software, and you are welcome to redistribute it under certain conditions;\nthis program "
"comes with ABSOLUTELY NO WARRANTY;\ntype `sshyp license' for details.") "comes with absolutely no warranty;\ntype `sshyp license' for details")
print('\n\u001b[38;5;15;48;5;238mUSAGE: sshyp [OPTION [FLAG] [<entry name>]] | [/<entry name>]\u001b[0m\n') print('\n\u001b[1musage:\u001b[0m sshyp [option [flag] [<entry name>]] | [/<entry name>]\n')
print('\u001b[38;5;0;48;5;15mOptions:\u001b[0m') print('\u001b[1moptions:\u001b[0m')
print('help/--help/-h bring up this menu') print('help/--help/-h bring up this menu')
print('version/-v display sshyp version info') print('version/-v display sshyp version info')
print('tweak configure sshyp') print('tweak configure sshyp')
@@ -232,98 +278,104 @@ def print_info(): # prints help text based on argument
print('copy copy details of an entry to your clipboard') print('copy copy details of an entry to your clipboard')
print('shear/-rm delete an existing entry') print('shear/-rm delete an existing entry')
print('sync/-s manually sync the entry directory via sshync\n') print('sync/-s manually sync the entry directory via sshync\n')
print('\u001b[38;5;0;48;5;15mFlags:\u001b[0m') print('\u001b[1mflags:\u001b[0m')
print('\u001b[38;5;15;48;5;238madd:\u001b[0m') print('add:')
print(' password/-p add a password entry') print(' password/-p add a password entry')
print(' note/-n add a note entry') print(' note/-n add a note entry')
print(' folder/-f add a new folder for entries') print(' folder/-f add a new folder for entries')
print('\u001b[38;5;15;48;5;238medit:\u001b[0m') print('edit:')
print(' rename/relocate/-r rename or relocate an entry') print(' rename/relocate/-r rename or relocate an entry')
print(' username/-u change the username of an entry') print(' username/-u change the username of an entry')
print(' password/-p change the password of an entry') print(' password/-p change the password of an entry')
print(' note/-n change the note attached to an entry') print(' note/-n change the note attached to an entry')
print(' url/-l change the url attached to an entry') print(' url/-l change the url attached to an entry')
print('\u001b[38;5;15;48;5;238mcopy:\u001b[0m') print('copy:')
print(' username/-u copy the username of an entry to your clipboard') 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(' password/-p copy the password of an entry to your clipboard')
print(' url/-l copy the URL 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(' note/-n copy the note of an entry to your clipboard')
print('\u001b[38;5;15;48;5;238mgen:\u001b[0m') print('gen:')
print(' update/-u generate a password for an existing entry\n') print(' update/-u generate a password for an existing entry\n')
print("\u001b[38;5;0;48;5;15mTip:\u001b[0m You can quickly read an entry with 'sshyp /<entry name>'!") print("\u001b[1mtip:\u001b[0m you can quickly read an entry with 'sshyp /<entry name>'")
elif argument == 'version' or argument == '-v': elif argument_list[0] == 'version' or argument_list[0] == '-v':
print('\n\u001b[38;5;0;48;5;15m////////////////////////////////////////////////////////\u001b[0m') print('\nsshyp is a simple, self-hosted, sftp-synchronized password manager\nfor unix(-like) systems (haiku/'
print('\u001b[38;5;0;48;5;15m/\u001b[38;5;15;48;5;238m ' 'freebsd/linux/termux)\n\nsshyp is a viable alternative to (and compatible with) pass/password-store\n')
'\u001b[38;5;0;48;5;15m/\u001b[0m') print(" .. \u001b[38;5;9m♥♥ ♥♥\u001b[0m ..\n .''.''/()\\ \u001b[38;5;13m"
print('\u001b[38;5;0;48;5;15m/\u001b[38;5;15;48;5;238m \u001b[38;5;0;48;5;15msshyp Copyright (C) 2021-2022 ' "♥♥♥♥♥♥♥\u001b[0m /()\\''.''.\n * : \u001b[38;5;9m♥♥♥♥♥\u001b[0m : *"
'Randall Winkhart\u001b[38;5;15;48;5;238m \u001b[38;5;0;48;5;15m/\u001b[0m') "\n `..'..' \u001b[38;5;13m♥♥♥\u001b[0m `..'..'\n // \\\\ "
print('\u001b[38;5;0;48;5;15m/\u001b[38;5;15;48;5;238m ' "\u001b[38;5;9m♥\u001b[0m // \\\\")
'\u001b[38;5;0;48;5;15m/\u001b[0m') print('\u001b[38;5;7;48;5;8m<><><><><><><><><><><><><><><><><><><><><><><><><><><><>\u001b[0m')
print('\u001b[38;5;0;48;5;15m/\u001b[38;5;15;48;5;238m \u001b[38;5;0;48;5;15mVersion 1.0.0' print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m '
'\u001b[38;5;15;48;5;238m \u001b[38;5;0;48;5;15m/\u001b[0m') '\u001b[38;5;7;48;5;8m/\u001b[0m')
print('\u001b[38;5;0;48;5;15m/\u001b[38;5;15;48;5;238m \u001b[38;5;0;48;5;15mThe Polished Trotters ' print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m \u001b[38;5;15;48;5;8msshyp copyright (c) 2021-2022 '
'Update\u001b[38;5;15;48;5;238m \u001b[38;5;0;48;5;15m/\u001b[0m') 'randall winkhart\u001b[38;5;15;48;5;15m \u001b[38;5;7;48;5;8m/\u001b[0m')
print('\u001b[38;5;0;48;5;15m/\u001b[38;5;15;48;5;238m ' print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m '
'\u001b[38;5;0;48;5;15m/\u001b[0m') '\u001b[38;5;7;48;5;8m/\u001b[0m')
print('\u001b[38;5;0;48;5;15m////////////////////////////////////////////////////////\u001b[0m\n') print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m \u001b[38;5;15;48;5;8mversion 1.0.0'
elif argument == 'license': '\u001b[38;5;15;48;5;15m \u001b[38;5;7;48;5;8m/\u001b[0m')
print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m \u001b[38;5;15;48;5;8mthe polished trotters '
'update\u001b[38;5;15;48;5;15m \u001b[38;5;7;48;5;8m/\u001b[0m')
print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m '
'\u001b[38;5;7;48;5;8m/\u001b[0m')
print('\u001b[38;5;7;48;5;8m<><><><><><><><><><><><><><><><><><><><><><><><><><><><>\u001b[0m\n')
print('see https://github.com/rwinkhart/sshyp for more information\n')
elif argument_list[0] == 'license':
print('\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU ' print('\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU '
'General\nPublic License as published by the Free Software Foundation, either version 3 of the License,' 'General\nPublic License as published by the Free Software Foundation, either version 3 of the License,'
'\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be ' '\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be '
'useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A' 'useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A'
' PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.' ' PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.'
'\n\nhttps://opensource.org/licenses/GPL-3.0\n') '\n\nhttps://opensource.org/licenses/GPL-3.0\n')
elif argument == 'add': elif argument_list[0] == 'add':
print('\n\u001b[38;5;15;48;5;238mUSAGE: sshyp add {FLAG {<entry name>}}\u001b[0m\n') print('\n\u001b[1musage:\u001b[0m sshyp add [flag [<entry name>]]\u001b[0m\n')
print('\u001b[38;5;0;48;5;15mFlags:\u001b[0m') print('\u001b[1mflags:\u001b[0m')
print('\u001b[38;5;15;48;5;238madd:\u001b[0m') print('add:')
print(' password/-p add a password entry') print(' password/-p add a password entry')
print(' note/-n add a note entry') print(' note/-n add a note entry')
print(' folder/-f add a new folder for entries\n') print(' folder/-f add a new folder for entries\n')
elif argument == 'edit': elif argument_list[0] == 'edit':
print('\n\u001b[38;5;15;48;5;238mUSAGE: sshyp edit {FLAG {<entry name>}}\u001b[0m\n') print('\n\u001b[1musage:\u001b[0m sshyp edit [flag [<entry name>]]\u001b[0m\n')
print('\u001b[38;5;0;48;5;15mFlags:\u001b[0m') print('\u001b[1mflags:\u001b[0m')
print('\u001b[38;5;15;48;5;238medit:\u001b[0m') print('edit:')
print(' rename/relocate/-r rename or relocate an entry') print(' rename/relocate/-r rename or relocate an entry')
print(' username/-u change the username of an entry') print(' username/-u change the username of an entry')
print(' password/-p change the password of an entry') print(' password/-p change the password of an entry')
print(' url/-l change the url attached to an entry') print(' url/-l change the url attached to an entry')
print(' note/-n change the note attached to an entry\n') print(' note/-n change the note attached to an entry\n')
elif argument == 'copy': elif argument_list[0] == 'copy':
print('\n\u001b[38;5;15;48;5;238mUSAGE: sshyp copy {FLAG {<entry name>}}\u001b[0m\n') print('\n\u001b[1musage:\u001b[0m sshyp copy [flag [<entry name>]]\u001b[0m\n')
print('\u001b[38;5;0;48;5;15mFlags:\u001b[0m') print('\u001b[1mflags:\u001b[0m')
print('\u001b[38;5;15;48;5;238mcopy:\u001b[0m') print('copy:')
print(' username/-u copy the username of an entry to your clipboard') 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(' password/-p copy the password of an entry to your clipboard')
print(' url/-l copy the URL 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\n') print(' note/-n copy the note of an entry to your clipboard\n')
def no_arg(): # displays a list of entries and gives an option to select one for viewing 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'.") print("\nfor a list of usable commands, run 'sshyp help'")
entry_list_gen() _entry_name = entry_name_fetch('entry to read: ')
_read_entry = str(input('Entry to read: ')) if not Path(f"{directory}{_entry_name}.gpg").exists():
if not Path(f"{directory}{_read_entry}.gpg").exists(): print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
print(f"\n\u001b[38;5;1mError: entry ({_read_entry}) does not exist\u001b[0m\n")
s_exit(1) s_exit(1)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
system(f"{gpg} -qd --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_read_entry}.gpg'") decrypt(directory + _entry_name, _shm_folder, _shm_entry)
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}") entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
rmtree(f"{tmp_dir}{_shm_folder}") 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}{argument.replace('/', '', 1)}.gpg").exists(): if not Path(f"{directory}{argument.replace('/', '', 1)}.gpg").exists():
print(f"\n\u001b[38;5;1mError: entry ({argument.replace('/', '', 1)}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry ({argument.replace('/', '', 1)}) does not exist\u001b[0m\n")
s_exit(1) s_exit(1)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
system(f"{gpg} -qd --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{argument.replace('/', '', 1)}.gpg'") decrypt(directory + argument.replace('/', '', 1), _shm_folder, _shm_entry)
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}") entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
rmtree(f"{tmp_dir}{_shm_folder}") rmtree(f"{tmp_dir}{_shm_folder}")
def sync(): # calls sshync to sync changes to the user's server def sync(): # calls sshync to sync changes to the user's server
print('\nSyncing entries with the server device...\n') print('\nsyncing entries with the server device...\n')
# check for deletions # check for deletions
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c " system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c "
f"'import sshypRemote; sshypRemote.deletion_check(\"'\"{client_device_name}\"'\")'\"") f"'import sshypRemote; sshypRemote.deletion_check(\"'\"{client_device_name}\"'\")'\"")
@@ -332,7 +384,7 @@ def sync(): # calls sshync to sync changes to the user's server
try: try:
_deletion_database = open(path.expanduser('~/.config/sshyp/deletion_database')).readlines() _deletion_database = open(path.expanduser('~/.config/sshyp/deletion_database')).readlines()
except (FileNotFoundError, IndexError): except (FileNotFoundError, IndexError):
print('\n\u001b[38;5;1mError: the deletion database does not exist or is corrupted.\u001b[0m\n') print('\n\u001b[38;5;9merror: the deletion database does not exist or is corrupted\u001b[0m\n')
_deletion_database = None _deletion_database = None
s_exit(1) s_exit(1)
for _file in _deletion_database: for _file in _deletion_database:
@@ -343,7 +395,7 @@ def sync(): # calls sshync to sync changes to the user's server
rmtree(f"{path.expanduser('~/.password-pasture/')}{_file[:-1]}") rmtree(f"{path.expanduser('~/.password-pasture/')}{_file[:-1]}")
except FileNotFoundError: except FileNotFoundError:
if silent_sync != 1: if silent_sync != 1:
print('Folder does not exist locally.') print('folder does not exist locally.')
else: else:
try: try:
if silent_sync != 1: if silent_sync != 1:
@@ -351,7 +403,7 @@ def sync(): # calls sshync to sync changes to the user's server
remove(f"{path.expanduser('~/.password-pasture/')}{_file[:-1]}.gpg") remove(f"{path.expanduser('~/.password-pasture/')}{_file[:-1]}.gpg")
except (FileNotFoundError, IsADirectoryError): except (FileNotFoundError, IsADirectoryError):
if silent_sync != 1: if silent_sync != 1:
print('File does not exist locally.') print('file does not exist locally.')
# check for new folders # check for new folders
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c " system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c "
f"'import sshypRemote; sshypRemote.folder_check()'\"") f"'import sshypRemote; sshypRemote.folder_check()'\"")
@@ -360,7 +412,7 @@ def sync(): # calls sshync to sync changes to the user's server
try: try:
_folder_database = open(path.expanduser('~/.config/sshyp/folder_database')).readlines() _folder_database = open(path.expanduser('~/.config/sshyp/folder_database')).readlines()
except (FileNotFoundError, IndexError): except (FileNotFoundError, IndexError):
print('\n\u001b[38;5;1mError: the folder database does not exist or is corrupted.\u001b[0m\n') print('\n\u001b[38;5;9merror: the folder database does not exist or is corrupted\u001b[0m\n')
_folder_database = None _folder_database = None
s_exit(1) s_exit(1)
for _folder in _folder_database: for _folder in _folder_database:
@@ -378,24 +430,23 @@ def sync(): # calls sshync to sync changes to the user's server
def add_entry(): # adds a new entry def add_entry(): # adds a new entry
_shm_folder, _shm_entry = None, None # sets base-line values to avoid errors _shm_folder, _shm_entry = None, None # sets base-line values to avoid errors
if argument == 'add note' or argument == 'add -n' or argument == 'add password' or argument == 'add -p': if len(argument_list) < 3:
_entry_name = str(input('\nName of entry: ')) _entry_name = entry_name_fetch('name of new entry: ')
else: else:
_entry_name = argument.split(' ') _entry_name = entry_name_fetch(2)
del _entry_name[:2] if Path(f"{directory}{_entry_name}.gpg").is_file():
_entry_name = ' '.join(_entry_name) print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) already exists\u001b[0m\n")
if _entry_name.startswith('/'): s_exit(1)
_entry_name = _entry_name.replace('/', '', 1) if argument_list[1] == 'note' or argument_list[1] == '-n':
if argument.startswith('add note') or argument.startswith('add -n'):
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n") system(f"nano {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()
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines('\n\n\n' + _notes) open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines('\n\n\n' + _notes)
elif argument.startswith('add password') or argument.startswith('add -p'): elif argument_list[1] == 'password' or argument_list[1] == '-p':
_username = str(input('Username: ')) _username = str(input('username: '))
_password = str(input('Password: ')) _password = str(input('password: '))
_url = str(input('URL: ')) _url = str(input('url: '))
_add_note = input('Add a note to this entry? (y/N) ') _add_note = input('add a note to this entry? (y/N) ')
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
if _add_note.lower() == 'y': if _add_note.lower() == 'y':
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n") system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
@@ -404,39 +455,34 @@ def add_entry(): # adds a new entry
_notes = '' _notes = ''
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_password + '\n' + _username + '\n' + _url + open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_password + '\n' + _username + '\n' + _url +
'\n' + _notes) '\n' + _notes)
print('\nEntry preview:') print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}") entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
encrypt(_shm_folder, _shm_entry, _entry_name) encrypt(_shm_folder, _shm_entry, _entry_name)
def add_folder(): # creates a new folder def add_folder(): # creates a new folder
if argument == 'add folder' or argument == 'add -f': if len(argument_list) < 3:
_folder_name = str(input('Name of new folder: ')) _entry_name = entry_name_fetch('name of new folder: ')
else: else:
_folder_name = argument.split(' ') _entry_name = entry_name_fetch(2)
del _folder_name[:2] Path(directory + _entry_name).mkdir(0o700)
_folder_name = ' '.join(_folder_name)
if _folder_name.startswith('/'):
_folder_name = _folder_name.replace('/', '', 1)
Path(directory + _folder_name).mkdir(0o700)
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"mkdir -p '{directory_ssh}" system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"mkdir -p '{directory_ssh}"
f"{_folder_name}'\"") f"{_entry_name}'\"")
def rename(): # renames an entry or folder def rename(): # renames an entry or folder
if argument == 'edit rename' or argument == 'edit relocate' or argument == 'edit -r': if argument == 'edit rename' or argument == 'edit relocate' or argument == 'edit -r':
entry_list_gen() _entry_name = entry_name_fetch('entry/folder to rename/relocate: ')
_entry_name = str(input('What would you like to rename/relocate? '))
else: else:
_entry_name = argument.split(' ') _entry_name = entry_name_fetch(2)
del _entry_name[:2] if not Path(f"{directory}{_entry_name}.gpg").is_file() and not Path(f"{directory}{_entry_name}").is_dir():
_entry_name = ' '.join(_entry_name) print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
if not Path(f"{directory}{_entry_name}.gpg").exists(): s_exit(1)
print(f"\n\u001b[38;5;1mError: entry ({_entry_name}) does not exist\u001b[0m\n") _new_name = str(input('new name: '))
print(f"{directory}{_new_name}")
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")
s_exit(1) s_exit(1)
_new_name = str(input('New Name: '))
if _entry_name.startswith('/'):
_entry_name = _entry_name.replace('/', '', 1)
if _entry_name.endswith('/'): if _entry_name.endswith('/'):
move(f"{directory}{_entry_name}", f"{directory}{_new_name}") move(f"{directory}{_entry_name}", f"{directory}{_new_name}")
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"mkdir -p '{directory_ssh}" system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"mkdir -p '{directory_ssh}"
@@ -449,21 +495,15 @@ 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 = None, None # sets base-line values to avoid errors _shm_folder, _shm_entry = None, None # sets base-line values to avoid errors
if argument == 'edit username' or argument == 'edit -u' or argument == 'edit password' or argument == 'edit -p' or \ if len(argument_list) < 3:
argument == 'edit url' or argument == 'edit -l' or argument == 'edit note' or argument == 'edit -n': _entry_name = entry_name_fetch('entry to edit: ')
entry_list_gen()
_entry_name = str(input('What file would you like to edit? '))
else: else:
_entry_name = argument.split(' ') _entry_name = entry_name_fetch(2)
del _entry_name[:2]
_entry_name = ' '.join(_entry_name)
if _entry_name.startswith('/'):
_entry_name = _entry_name.replace('/', '', 1)
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;1mError: 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(1) s_exit(1)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
system(f"{gpg} -qd --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'") decrypt(directory + _entry_name, _shm_folder, _shm_entry)
# compatibility check for GNU pass entries (ensuring they have at least four lines) # compatibility check for GNU pass entries (ensuring they have at least four lines)
_lines = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines() _lines = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines()
@@ -472,19 +512,19 @@ def edit(): # edits the contents of an entry
_lines.append('\n') _lines.append('\n')
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_lines) open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_lines)
if argument.startswith('edit username') or argument.startswith('edit -u'): if argument_list[1] == 'username' or argument_list[1] == '-u':
_detail = str(input('New Username: ')) _detail = str(input('new username: '))
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 1, _detail + '\n') replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 1, _detail + '\n')
elif argument.startswith('edit password') or argument.startswith('edit -p'): elif argument_list[1] == 'password' or argument_list[1] == '-p':
_detail = str(input('New Password: ')) _detail = str(input('new password: '))
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 0, _detail + '\n') replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 0, _detail + '\n')
elif argument.startswith('edit url') or argument.startswith('edit -l'): elif argument_list[1] == 'url' or argument_list[1] == '-l':
_detail = str(input('New URL: ')) _detail = str(input('new url: '))
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 2, _detail + '\n') replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 2, _detail + '\n')
elif argument.startswith('edit note') or argument.startswith('edit -n'): elif argument_list[1] == 'note' or argument_list[1] == '-n':
edit_note(_shm_folder, _shm_entry) edit_note(_shm_folder, _shm_entry)
remove(f"{directory}{_entry_name}.gpg") remove(f"{directory}{_entry_name}.gpg")
print('\nEntry preview:') print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}") entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
encrypt(_shm_folder, _shm_entry, _entry_name) encrypt(_shm_folder, _shm_entry, _entry_name)
@@ -492,31 +532,22 @@ 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 # sets base-line values to avoid errors _username, _url, _notes = None, None, None # sets base-line values to avoid errors
if argument == 'gen update' or argument == 'gen -u' or argument == 'gen': if argument == 'gen update' or argument == 'gen -u' or argument == 'gen':
if argument == 'gen update' or argument == 'gen -u': _entry_name = entry_name_fetch('name of entry: ')
entry_list_gen() elif argument_list[1] == 'update' or argument_list[1] == '-u':
else: _entry_name = entry_name_fetch(2)
print()
_entry_name = str(input('Name of service: '))
elif argument.startswith('gen update') or argument.startswith('gen -u'):
_entry_name = argument.split(' ')
del _entry_name[:2]
_entry_name = ' '.join(_entry_name)
else:
_entry_name = argument.split(' ')
del _entry_name[:1]
_entry_name = ' '.join(_entry_name)
if _entry_name.startswith('/'):
_entry_name = _entry_name.replace('/', '', 1)
if argument.startswith('gen update') or argument.startswith('gen -u'):
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;1mError: 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(1) s_exit(1)
else: else:
_username = str(input('Username: ')) _entry_name = entry_name_fetch(1)
_password = pass_gen() if len(argument_list) == 1 or (not argument_list[1] == 'update' and not argument_list[1] == '-u'):
if not argument.startswith('gen update') and not argument.startswith('gen -u'): if Path(f"{directory}{_entry_name}.gpg").is_file():
_url = str(input('URL: ')) print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) already exists\u001b[0m\n")
_add_note = input('Add a note to this entry? (y/N) ') s_exit(1)
_username = str(input('username: '))
_password = pass_gen()
_url = str(input('url: '))
_add_note = input('add a note to this entry? (y/N) ')
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
if _add_note.lower() == 'y': if _add_note.lower() == 'y':
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n") system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
@@ -525,72 +556,69 @@ def gen(): # generates a password for a new or an existing entry
_notes = '' _notes = ''
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_password + '\n' + _username + '\n' + _url + '\n' open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_password + '\n' + _username + '\n' + _url + '\n'
+ _notes) + _notes)
print('\nEntry preview:') print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}") entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
encrypt(_shm_folder, _shm_entry, _entry_name) encrypt(_shm_folder, _shm_entry, _entry_name)
else: else:
_password = pass_gen()
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
system(f"{gpg} -qd --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_entry_name}.gpg'") decrypt(directory + _entry_name, _shm_folder, _shm_entry)
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 0, _password + '\n') replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 0, _password + '\n')
remove(f"{directory}{_entry_name}.gpg") remove(f"{directory}{_entry_name}.gpg")
print('\nEntry preview:') print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}") entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
encrypt(_shm_folder, _shm_entry, _entry_name) encrypt(_shm_folder, _shm_entry, _entry_name)
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
if argument == 'copy username' or argument == 'copy -u' or argument == 'copy password' or argument == 'copy -p' \ if len(argument_list) < 3:
or argument == 'copy url' or argument == 'copy -l' or argument == 'copy note' or argument == 'copy -n': _entry_name = entry_name_fetch('entry to copy: ')
entry_list_gen()
_read_entry = str(input('Entry to copy: '))
else: else:
_read_entry = argument.split(' ') _entry_name = entry_name_fetch(2)
del _read_entry[:2] if not Path(f"{directory}{_entry_name}.gpg").is_file():
_read_entry = ' '.join(_read_entry) print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
if not Path(f"{directory}{_read_entry}.gpg").is_file():
print(f"\n\u001b[38;5;1mError: entry ({_read_entry}) does not exist\u001b[0m\n")
s_exit(1) s_exit(1)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
system(f"{gpg} -qd --output {tmp_dir}{_shm_folder}/{_shm_entry} '{directory}{_read_entry}.gpg'") decrypt(directory + _entry_name, _shm_folder, _shm_entry)
_copy_line = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines() _copy_line = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines()
if uname()[0] == 'Haiku': # Haiku clipboard detection if uname()[0] == 'Haiku': # Haiku clipboard detection
if argument.startswith('copy username') or argument.startswith('copy -u'): if argument_list[1] == 'username' or argument_list[1] == '-u':
system('clipboard -c ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'") system('clipboard -c ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'")
elif argument.startswith('copy password') or argument.startswith('copy -p'): elif argument_list[1] == 'password' or argument_list[1] == '-p':
system('clipboard -c ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'") system('clipboard -c ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'")
elif argument.startswith('copy url') or argument.startswith('copy -l'): elif argument_list[1] == 'url' or argument_list[1] == '-l':
system('clipboard -c ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'") system('clipboard -c ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'")
elif argument.startswith('copy note') or argument.startswith('copy -n'): elif argument_list[1] == 'note' or argument_list[1] == '-n':
system('clipboard -c ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'") system('clipboard -c ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'")
Popen('sleep 30; clipboard -r', shell=True) Popen('sleep 30; clipboard -r', shell=True)
elif Path("/data/data/com.termux").exists(): # Termux (Android) clipboard detection elif Path("/data/data/com.termux").exists(): # Termux (Android) clipboard detection
if argument.startswith('copy username') or argument.startswith('copy -u'): if argument_list[1] == 'username' or argument_list[1] == '-u':
system('termux-clipboard-set ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'") system('termux-clipboard-set ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'")
elif argument.startswith('copy password') or argument.startswith('copy -p'): elif argument_list[1] == 'password' or argument_list[1] == '-p':
system('termux-clipboard-set ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'") system('termux-clipboard-set ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'")
elif argument.startswith('copy url') or argument.startswith('copy -l'): elif argument_list[1] == 'url' or argument_list[1] == '-l':
system('termux-clipboard-set ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'") system('termux-clipboard-set ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'")
elif argument.startswith('copy note') or argument.startswith('copy -n'): elif argument_list[1] == 'note' or argument_list[1] == '-n':
system('termux-clipboard-set ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'") system('termux-clipboard-set ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'")
Popen("sleep 30; termux-clipboard-set ''", shell=True) Popen("sleep 30; termux-clipboard-set ''", shell=True)
elif environ.get('WAYLAND_DISPLAY') == 'wayland-0': # Wayland clipboard detection elif environ.get('WAYLAND_DISPLAY') == 'wayland-0': # Wayland clipboard detection
if argument.startswith('copy username') or argument.startswith('copy -u'): if argument_list[1] == 'username' or argument_list[1] == '-u':
system('wl-copy ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'") system('wl-copy ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'")
elif argument.startswith('copy password') or argument.startswith('copy -p'): elif argument_list[1] == 'password' or argument_list[1] == '-p':
system('wl-copy ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'") system('wl-copy ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'")
elif argument.startswith('copy url') or argument.startswith('copy -l'): elif argument_list[1] == 'url' or argument_list[1] == '-l':
system('wl-copy ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'") system('wl-copy ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'")
elif argument.startswith('copy note') or argument.startswith('copy -n'): elif argument_list[1] == 'note' or argument_list[1] == '-n':
system('wl-copy ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'") system('wl-copy ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'")
Popen('sleep 30; wl-copy -c', shell=True) Popen('sleep 30; wl-copy -c', shell=True)
else: # X11 clipboard detection else: # X11 clipboard detection
if argument.startswith('copy username') or argument.startswith('copy -u'): if argument_list[1] == 'username' or argument_list[1] == '-u':
system('echo -n ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c') system('echo -n ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
elif argument.startswith('copy password') or argument.startswith('copy -p'): elif argument_list[1] == 'password' or argument_list[1] == '-p':
system('echo -n ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c') system('echo -n ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
elif argument.startswith('copy url') or argument.startswith('copy -l'): elif argument_list[1] == 'url' or argument_list[1] == '-l':
system('echo -n ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c') system('echo -n ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
elif argument.startswith('copy note') or argument.startswith('copy -n'): elif argument_list[1] == 'note' or argument_list[1] == '-n':
system('echo -n ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c') system('echo -n ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
Popen("sleep 30; echo -n '' | xclip -sel c", shell=True) Popen("sleep 30; echo -n '' | xclip -sel c", shell=True)
rmtree(f"{tmp_dir}{_shm_folder}") rmtree(f"{tmp_dir}{_shm_folder}")
@@ -598,28 +626,17 @@ 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 argument == 'shear' or argument == '-rm': if argument == 'shear' or argument == '-rm':
entry_list_gen() _entry_name = entry_name_fetch('entry/folder to shear: ')
_entry_name = str(input('What would you like to delete? '))
else: else:
_entry_name = argument.split(' ') _entry_name = entry_name_fetch(1)
del _entry_name[:1] decrypt(path.expanduser('~/.config/sshyp/lock.gpg'), 0, 0)
_entry_name = ' '.join(_entry_name)
if _entry_name.startswith('/'):
_entry_name = _entry_name.replace('/', '', 1)
try:
system(f"{gpg} -qd --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(1)
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c " system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c "
f"'import sshypRemote; sshypRemote.delete(\"'\"{_entry_name}\"'\")'\"") f"'import sshypRemote; sshypRemote.delete(\"'\"{_entry_name}\"'\")'\"")
if __name__ == "__main__": if __name__ == "__main__":
try: try:
silent_sync = 0 silent_sync, ssh_error = 0, 0
# retrieve typed argument # retrieve typed argument
argument_list, argument = argv, '' argument_list, argument = argv, ''
del argument_list[0] del argument_list[0]
@@ -638,7 +655,6 @@ if __name__ == "__main__":
try: try:
device_type = open(path.expanduser('~/.config/sshyp/sshyp-device')).read().strip() device_type = open(path.expanduser('~/.config/sshyp/sshyp-device')).read().strip()
if device_type == 'c': if device_type == 'c':
gpg_id = open(path.expanduser('~/.config/sshyp/sshyp-gpg')).read().strip()
ssh_info = sshync.get_profile(path.expanduser('~/.config/sshyp/sshyp.sshync')) ssh_info = sshync.get_profile(path.expanduser('~/.config/sshyp/sshyp.sshync'))
username_ssh = ssh_info[0].replace('\n', '') username_ssh = ssh_info[0].replace('\n', '')
ip = ssh_info[1].replace('\n', '') ip = ssh_info[1].replace('\n', '')
@@ -646,64 +662,75 @@ if __name__ == "__main__":
directory = str(ssh_info[3].replace('\n', '')) directory = str(ssh_info[3].replace('\n', ''))
directory_ssh = '/home/' + username_ssh + '/.password-pasture/' directory_ssh = '/home/' + username_ssh + '/.password-pasture/'
client_device_name = listdir(path.expanduser('~/.config/sshyp/devices'))[0] client_device_name = listdir(path.expanduser('~/.config/sshyp/devices'))[0]
except FileNotFoundError: gpg_id = open(path.expanduser('~/.config/sshyp/sshyp-gpg')).read().strip()
ssh_error = int(open(path.expanduser('~/.config/sshyp/ssh-error')).read().strip())
if ssh_error != 0:
ssh_error = copy_name_check(port, username_ssh, ip, client_device_name)
except (FileNotFoundError, IndexError):
if device_type.lower() != 's': if device_type.lower() != 's':
print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
print("Not all necessary configuration files are present. Please run 'sshyp tweak'!") print("not all necessary configuration files are present - please run 'sshyp tweak'")
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n')
s_exit(1) s_exit(1)
else: else:
tweak() tweak()
s_exit(0) s_exit(0)
# run function based on argument # run function based on arguments
error = 0 # create an error flag to determine if syncing should occur at end
if argument.startswith('/'): if argument.startswith('/'):
read_shortcut() read_shortcut()
elif argument == '': elif argument == '':
no_arg() no_arg()
elif argument == 'help' or argument == '--help' or argument == '-h' or argument == 'license' or argument \ elif argument == 'help' or argument == '--help' or argument == '-h' or argument == 'license' or argument \
== 'version' or argument == '-v' or argument == 'add' or argument == 'edit' or argument == 'copy': == 'version' or argument == '-v':
print_info() print_info()
elif argument.startswith('add note') or argument.startswith('add -n') or argument.startswith('add password') \ elif argument_list[0] == 'add':
or argument.startswith('add -p'): if len(argument_list) == 1:
add_entry() print_info()
elif argument.startswith('add folder') or argument.startswith('add -f'): elif argument_list[1] == 'note' or argument_list[1] == '-n' or argument_list[1] == 'password' or \
add_folder() argument_list[1] == '-p':
elif argument.startswith('edit rename') or argument.startswith('edit relocate') or argument.startswith( add_entry()
'edit -r'): elif argument_list[1] == 'folder' or argument_list[1] == '-f':
silent_sync = 1 add_folder()
rename() else:
elif argument.startswith('edit username') or argument.startswith('edit -u') or argument.startswith( print_info()
'edit password') \ s_exit(0)
or argument.startswith('edit -p') or argument.startswith('edit url') or argument.startswith( elif argument_list[0] == 'edit':
'edit -l') or \ if len(argument_list) == 1:
argument.startswith('edit note') or argument.startswith('edit -n'): print_info()
edit() elif argument_list[1] == 'rename' or argument_list[1] == 'relocate' or argument_list[1] == '-r':
elif argument.startswith('gen'): silent_sync = 1
rename()
elif argument_list[1] == 'username' or argument_list[1] == '-u' or argument_list[1] == 'password' or \
argument_list[1] == '-p' or argument_list[1] == 'url' or argument_list[1] == '-l' or \
argument_list[1] == 'note' or argument_list[1] == '-n':
edit()
else:
print_info()
s_exit(0)
elif argument_list[0] == 'gen':
gen() gen()
elif argument.startswith('copy username') or argument.startswith('copy -u') or argument.startswith( elif argument_list[0] == 'copy':
'copy password') \ if len(argument_list) == 1:
or argument.startswith('copy -p') or argument.startswith('copy url') or argument.startswith('copy -l') \ print_info()
or argument.startswith('copy note') or argument.startswith('copy -n'): elif argument_list[1] == 'username' or argument_list[1] == '-u' or argument_list[1] == 'password' or \
copy_data() argument_list[1] == '-p' or argument_list[1] == 'url' or argument_list[1] == '-l' or \
elif argument.startswith('shear') or argument.startswith('-rm'): argument_list[1] == 'note' or argument_list[1] == '-n':
copy_data()
else:
print_info()
elif argument_list[0] == 'shear' or argument_list[0] == '-rm':
remove_data() remove_data()
elif argument == 'sync' or argument == '-s': elif argument_list[0] != 'sync' and argument_list[0] != '-s':
sync() print(f"\n\u001b[38;5;9merror: invalid argument - run 'sshyp help' to list usable commands\u001b[0m\n")
else:
error = 1 # set error flag to 1 to stop syncing
print("\nArgument error! Please run 'sshyp help' for a list of usable commands.\n")
s_exit(1) s_exit(1)
# sync at end of program if any changes were made # sync if any changes were made
if argument != '' and argument != 'help' and argument != '--help' and argument != '-h' and argument != \ if len(argument_list) > 0 and ssh_error == 0 and \
'license' and argument != 'add' and argument != 'sync' and argument != 'edit' and not argument\ ((argument_list[0] == 'sync' or argument_list[0] == '-s' or argument_list[0] == 'gen' or
.startswith('copy username') and not argument.startswith('copy -u') and not argument\ argument_list[0] == 'shear' or argument_list[0] == '-rm') or ((argument_list[0] == 'add'
.startswith('copy password') and not argument.startswith('copy -p') and not argument\ or argument_list[0] == 'edit')
.startswith('copy url') and not argument.startswith('copy -l') and not argument.startswith('copy note')\ and len(argument_list) > 1)):
and not argument.startswith('copy -n') and argument != 'copy' and argument != 'version' and argument \
!= '-v' and error == 0 and argument.startswith('/') is False:
sync() sync()
s_exit(0) s_exit(0)
+2 -2
View File
@@ -14,12 +14,12 @@ def delete(_file_path):
try: try:
rmtree(f"{expanduser('~/.password-pasture/')}{_file_path}") rmtree(f"{expanduser('~/.password-pasture/')}{_file_path}")
except FileNotFoundError: except FileNotFoundError:
print('Folder does not exist remotely.') print('folder does not exist remotely')
else: else:
try: try:
remove(f"{expanduser('~/.password-pasture/')}{_file_path}.gpg") remove(f"{expanduser('~/.password-pasture/')}{_file_path}.gpg")
except FileNotFoundError: except FileNotFoundError:
print('File does not exist remotely.') print('file does not exist remotely')
for _device_name in listdir(expanduser('~/.config/sshyp/devices')): for _device_name in listdir(expanduser('~/.config/sshyp/devices')):
open(f"{expanduser('~/.config/sshyp/deleted/')}{_file_path.replace('/', '@')}^&*{_device_name}", 'w') open(f"{expanduser('~/.config/sshyp/deleted/')}{_file_path.replace('/', '@')}^&*{_device_name}", 'w')
+171 -135
View File
@@ -1,3 +1,41 @@
sshyp v1.0.0
The Polished Trotters Update
This release brings 'sshyp' in line with the original goals of the project.
As such, it is being crowned "v1.0.0", and is considered a stable base for future expansions.
Features:
- sshyp has been modified to run on Haiku, an open-source re-implementation of BeOS
^ new package formats have been added for Haiku, FreeBSD, and Fedora Linux
- the entry format has been changed to support entries created in pass/password-store
^ this change requires existing entry libraries to be converted - see the sshyp v1.0.0 release page on GitHub for a conversion script
- majorly overhauled visual experience for sshyp
^ this includes a new entry list, a new entry readout, colored output, ascii art, and more!
- entries can now optionally be passed as arguments, directly
^ as opposed to the user being prompted for an entry name after running a command
Changes:
- corrected outdated licensing and copyright information
- 'if __name__=="__main__":' convention is now used
- help screens have been overhauled
- improved password generator to guarantee more secure results
- fixed errors when trying to sync with a multi-word entry on the server
- sshync now uses 'scp' (via the sftp protocol), rather than 'sftp'
- rename function now properly allows for renaming folders
- renaming an entry/folder will now properly delete the old entry/folder from the server
- entry previews at the time of entry creation/editing no longer require entering the gpg password more times than necessary
- entries will no longer be overwritten if attempting to create a new entry that uses an already existing name
- the clipboard now automatically clears after 30 seconds
- sshyp server no longer needs to create copies of its libraries in ~/
- added more and improved existing exceptions
- the lock file is now decrypted to /dev/null
- ...and lots of minor (under the hood) changes!
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2022.02.16.fr4.7 sshyp 2022.02.16.fr4.7
The High-Tech Shears Update - Patch 7 The High-Tech Shears Update - Patch 7
@@ -17,28 +55,28 @@ Changes:
Planned for next major update (fr5, The sshyp Doing a Split Update): Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): Planned for next, next major update (fr6, The Farmer Shearing the sshyp Update):
** imporove password generator to guarantee more secure results - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -59,29 +97,29 @@ Changes:
Planned for next major update (fr5, The sshyp Doing a Split Update): Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -102,29 +140,29 @@ Changes:
Planned for next major update (fr5, The sshyp Doing a Split Update): Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -149,29 +187,29 @@ Changes:
Planned for next major update (fr5, The sshyp Doing a Split Update): Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -192,29 +230,29 @@ Changes:
Planned for next major update (fr5, The sshyp Doing a Split Update): Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -236,29 +274,29 @@ Changes:
Planned for next major update (fr5, The sshyp Doing a Split Update): Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -280,29 +318,29 @@ Changes:
Planned for next major update (fr5, The sshyp Doing a Split Update): Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -331,29 +369,29 @@ Changes:
Planned for next major update (fr5, The sshyp Doing a Split Update): Planned for next major update (fr5, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -374,30 +412,30 @@ Changes:
Planned for next major update (fr4, The sshyp Doing a Split Update): Planned for next major update (fr4, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): Planned for next, next major update (fr5, The Farmer Shearing the sshyp Update):
** allow for multi-client deletion... somehow (in sshync) - 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -418,39 +456,39 @@ Changes:
Additions planned for minor releases: Additions planned for minor releases:
** updated the manpage with more information regarding how sshyp works and how to set it up - 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 - ensured that it is now impossible for ghosts of entires to remain in /dev/shm
** reduced total lines of code with small optimizations - reduced total lines of code with small optimizations
&& &&
Planned for next major update (fr4, The sshyp Doing a Split Update): Planned for next major update (fr4, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): Planned for next, next major update (fr5, The Farmer Shearing the sshyp Update):
** allow for multi-client deletion... somehow (in sshync) - 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -468,39 +506,39 @@ Changes:
Additions planned for minor releases: Additions planned for minor releases:
** updated the manpage with more information regarding how sshyp works and how to set it up - 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 - ensured that it is now impossible for ghosts of entires to remain in /dev/shm
** reduced total lines of code with small optimizations - reduced total lines of code with small optimizations
&& &&
Planned for next major update (fr4, The sshyp Doing a Split Update): Planned for next major update (fr4, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): Planned for next, next major update (fr5, The Farmer Shearing the sshyp Update):
** allow for multi-client deletion... somehow (in sshync) - 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -519,39 +557,39 @@ Changes:
Additions planned for minor releases: Additions planned for minor releases:
** updated the manpage with more information regarding how sshyp works and how to set it up - 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 - ensured that it is now impossible for ghosts of entires to remain in /dev/shm
** reduced total lines of code with small optimizations - reduced total lines of code with small optimizations
&& &&
Planned for next major update (fr4, The sshyp Doing a Split Update): Planned for next major update (fr4, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): Planned for next, next major update (fr5, The Farmer Shearing the sshyp Update):
** allow for multi-client deletion... somehow (in sshync) - 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -574,39 +612,39 @@ Changes:
Additions planned for minor releases: Additions planned for minor releases:
** updated the manpage with more information regarding how sshyp works and how to set it up - 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 - ensured that it is now impossible for ghosts of entires to remain in /dev/shm
** reduced total lines of code with small optimizations - reduced total lines of code with small optimizations
&& &&
Planned for next major update (fr4, The sshyp Doing a Split Update): Planned for next major update (fr4, The sshyp Doing a Split Update):
sshyp: sshyp:
** sshyp has recieved a major visual overhaul - sshyp has recieved a major visual overhaul
^ this includes the new file list and thematic text art ^ this includes the new file list and thematic text art
sshync: sshync:
** sshync has been split into a separate package and now has standalone functionality as a backup/syncing utility - 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 ^ 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): Planned for next, next major update (fr5, The Farmer Shearing the sshyp Update):
** allow for multi-client deletion... somehow (in sshync) - 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) - 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 - imporove password generator to guarantee more secure results
** enforce permissions on the server-side - enforce permissions on the server-side
** allow for copying entire notes (not just first line) - allow for copying entire notes (not just first line)
** ability to pass entries as arguments for more functions - ability to pass entries as arguments for more functions
&& &&
Backlog: Backlog:
** create separate gui frontend targetting mobile and desktop Linux - create separate gui frontend targetting mobile and desktop Linux
** auto-completion on tab (currently unsure of best way to make this work) - auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -1121,5 +1159,3 @@ What is currently functional:
- sort notes and passwords into folders - sort notes and passwords into folders
- gpg encryption - gpg encryption
- edit password/note entries - edit password/note entries
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
+4 -4
View File
@@ -1,6 +1,6 @@
.TH sshyp 1 "22 May 2022" "v1.0.0" "sshyp man page" .TH sshyp 1 "20 June 2022" "v1.0.0" "sshyp man page"
.SH NAME .SH NAME
sshyp \- A very simple self-hosted, synchronized password manager for UNIX systems. Alternative to (and compatible with) pass/password-store. sshyp \- A very simple self-hosted, synchronized password manager for UNIX(-like) systems. Alternative to (and compatible with) pass/password-store.
.SH SYNOPSIS .SH SYNOPSIS
sshyp [OPTION] [[FLAG]] [/<entry name>] sshyp [OPTION] [[FLAG]] [/<entry name>]
.SH DESCRIPTION .SH DESCRIPTION
@@ -73,7 +73,7 @@ sshyp operates on a client-server model, and thus requires you to have access to
The sshyp package includes modes for operating on both client and server devices, so only one package is necessary. The sshyp package includes modes for operating on both client and server devices, so only one package is necessary.
Server setup: Server setup:
Configure an openssh server (if sshyp was installed from the Debian package, the ssh server was not installed as a dependency and needs to be installed manually) Configure an OpenSSH server (if sshyp was installed from the Debian package, the ssh server was not installed as a dependency and needs to be installed manually)
Allow remote access to the SSH server w/public key authentication (disabling password-only authentication recommended) Allow remote access to the SSH server w/public key authentication (disabling password-only authentication recommended)
Install sshyp Install sshyp
Run "sshyp tweak" and set the device type as server Run "sshyp tweak" and set the device type as server
@@ -82,7 +82,7 @@ Server setup:
Client setup: Client setup:
Install sshyp Install sshyp
Run "sshyp tweak" and follow the prompts Run "sshyp tweak" and follow the prompts
Copy the generated public SSH key to the server using preferred method (manually adding to authorized_keys, ssh-copy-id, etc.) Copy the generated public SSH key (located at ~/.ssh/sshyp.pub) to the server using preferred method (manually adding to authorized_keys, ssh-copy-id, etc.)
If you already have entries on the server, sync them using "sshyp sync" If you already have entries on the server, sync them using "sshyp sync"
Done! Done!
@@ -0,0 +1 @@
af6236472791614ed41bf13318a2d1c41228855c
+100 -23
View File
@@ -1,14 +1,14 @@
#!/bin/bash #!/bin/bash
# This script packages sshyp (from source) for various UNIX environments. # This script packages sshyp (from source) for various UNIX(-like) environments.
# Dependencies (Arch Linux): dpkg (packaging for Debian/Termux), freebsd-pkg (packaging for FreeBSD)
# Dependencies (Fedora) (can only package for self): rpmdevtools
# NOTE It is recommended to instead use the latest officially packaged and tagged release. # NOTE It is recommended to instead use the latest officially packaged and tagged release.
# NOTE If using Arch, it is recommended to install from the AUR or from the PKGBUILD attatched to the latest official release.
echo -e '\nOptions (please enter the number only):' echo -e '\nOptions (please enter the number only):'
echo -e '\nDistribution Packages:\n\n1. Haiku\n2. Debian\n3. Termux\n4. Generic (used for PKGBUILD/APKBUILD)' echo -e '\nPackage Formats:\n\n1. Haiku\n2. Debian&Ubuntu Linux\n3. Fedora Linux\n4. FreeBSD\n5. Termux\n6. Generic (used for PKGBUILD/APKBUILD)'
echo -e '\nBuild Scripts:\n\n5. Alpine Linux (APKBUILD)\n6. Arch Linux (PKGBUILD, also builds local generic package)' echo -e '\nBuild Scripts:\n\n7. Arch Linux (PKGBUILD)'
echo -e '\nOther:\n\n7. All (generates all distribution packages (excluding Haiku, as this must be done on Haiku) and build scripts)\n' echo -e '\nOther:\n\n8. All (generates all distribution packages (excluding Haiku and Fedora, as these must be packaged on their respective distributions) and build scripts)\n'
read -n 1 -r -p "Distribution: " distro read -n 1 -r -p "Distribution: " distro
echo -e '\n\nThe value entered in this field will only affect the version reported to the package manager. The latest source is used regardless.\n' echo -e '\n\nThe value entered in this field will only affect the version reported to the package manager. The latest source is used regardless.\n'
@@ -17,7 +17,7 @@ read -r -p "Version number: " version
echo -e '\nThe value entered in this field will only affect the revision number for build scripts.\n' echo -e '\nThe value entered in this field will only affect the revision number for build scripts.\n'
read -r -p "Revision number: " revision read -r -p "Revision number: " revision
if [ "$distro" == "5" ] || [ "$distro" == "6" ] || [ "$distro" == "7" ]; then if [ "$distro" == "7" ] || [ "$distro" == "8" ]; then
echo -e '\nOptions (please enter the number only):' echo -e '\nOptions (please enter the number only):'
echo -e '\n1. GitHub Release Tag\n2. Local\n' echo -e '\n1. GitHub Release Tag\n2. Local\n'
read -r -p "Source (for build scripts): " source read -r -p "Source (for build scripts): " source
@@ -33,8 +33,7 @@ mkdir -p packages
if [ "$distro" == "1" ]; then if [ "$distro" == "1" ]; then
echo -e '\nPackaging for Haiku...\n' echo -e '\nPackaging for Haiku...\n'
mkdir -p packages/haikutemp/documentation/man/man1 mkdir -p packages/haikutemp/documentation/{man/man1,packages/sshyp}
mkdir -p packages/haikutemp/documentation/packages/sshyp
echo "name sshyp echo "name sshyp
version "$version"-"$revision" version "$version"-"$revision"
architecture any architecture any
@@ -76,10 +75,9 @@ urls {
echo -e "\nHaiku packaging complete.\n" echo -e "\nHaiku packaging complete.\n"
fi fi
if [ "$distro" == "2" ] || [ "$distro" == "7" ]; then if [ "$distro" == "2" ] || [ "$distro" == "8" ]; then
echo -e '\nPackaging for Debian...\n' echo -e '\nPackaging for Debian...\n'
mkdir -p packages/debiantemp/sshyp_"$version"-"$revision"_all/{DEBIAN,usr} mkdir -p packages/debiantemp/sshyp_"$version"-"$revision"_all/{DEBIAN,usr/share/man/man1}
mkdir -p packages/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/man/man1
echo "Package: sshyp echo "Package: sshyp
Version: $version Version: $version
Section: utils Section: utils
@@ -88,7 +86,7 @@ Maintainer: Randall Winkhart <idgr at tutanota dot com>
Description: A light-weight, self-hosted, synchronized password manager Description: A light-weight, self-hosted, synchronized password manager
Depends: python3, gnupg, openssh-client, nano, xclip, wl-clipboard Depends: python3, gnupg, openssh-client, nano, xclip, wl-clipboard
Priority: optional Priority: optional
Installed-Size: 35 Installed-Size: 185
" > packages/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control " > packages/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control
cp -r bin packages/debiantemp/sshyp_"$version"-"$revision"_all/usr/ cp -r bin packages/debiantemp/sshyp_"$version"-"$revision"_all/usr/
cp -r share packages/debiantemp/sshyp_"$version"-"$revision"_all/usr/ cp -r share packages/debiantemp/sshyp_"$version"-"$revision"_all/usr/
@@ -100,7 +98,7 @@ Installed-Size: 35
echo -e "\nDebian packaging complete.\n" echo -e "\nDebian packaging complete.\n"
fi fi
if [ "$distro" == "3" ] || [ "$distro" == "7" ]; then if [ "$distro" == "5" ] || [ "$distro" == "8" ]; then
echo -e '\nPackaging for Termux...\n' echo -e '\nPackaging for Termux...\n'
mkdir -p packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/{data,DEBIAN} mkdir -p packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/{data,DEBIAN}
mkdir -p packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1 mkdir -p packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1
@@ -112,7 +110,7 @@ Maintainer: Randall Winkhart <idgr at tutanota dot com>
Description: A light-weight, self-hosted, synchronized password manager Description: A light-weight, self-hosted, synchronized password manager
Depends: python, gnupg, openssh, nano, termux-api, termux-am Depends: python, gnupg, openssh, nano, termux-api, termux-am
Priority: optional Priority: optional
Installed-Size: 35 Installed-Size: 185
" > packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/DEBIAN/control " > packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/DEBIAN/control
cp -r bin packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/ cp -r bin packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/
cp -r share packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/ cp -r share packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/
@@ -124,12 +122,11 @@ Installed-Size: 35
echo -e "\nTermux packaging complete.\n" echo -e "\nTermux packaging complete.\n"
fi fi
if [ "$distro" == "4" ] || [ "$distro" == "6" ] || [ "$distro" == "7" ]; then if [ "$distro" == "3" ] || [ "$distro" == "4" ] || [ "$distro" == "6" ] || [ "$distro" == "7" ] || [ "$distro" == "8" ]; then
echo -e '\nPackaging as generic...\n' echo -e '\nPackaging as generic...\n'
mkdir -p packages/archtemp/usr mkdir -p packages/archtemp/usr/share/man/man1
cp -r bin packages/archtemp/usr/ cp -r bin packages/archtemp/usr/
cp -r share packages/archtemp/usr/ cp -r share packages/archtemp/usr/
mkdir -p packages/archtemp/usr/share/man/man1
cp extra/manpage packages/archtemp/usr/share/man/man1/sshyp.1 cp extra/manpage packages/archtemp/usr/share/man/man1/sshyp.1
gzip packages/archtemp/usr/share/man/man1/sshyp.1 gzip packages/archtemp/usr/share/man/man1/sshyp.1
tar -C packages/archtemp -cvf packages/sshyp-"$version".tar.xz usr/ tar -C packages/archtemp -cvf packages/sshyp-"$version".tar.xz usr/
@@ -139,7 +136,91 @@ if [ "$distro" == "4" ] || [ "$distro" == "6" ] || [ "$distro" == "7" ]; then
echo -e "\nGeneric packaging complete.\n" echo -e "\nGeneric packaging complete.\n"
fi fi
if [ "$distro" == "6" ] || [ "$distro" == "7" ]; then if [ "$distro" == "3" ]; then
echo -e '\nPackaging for Fedora...\n'
rm -rf ~/rpmbuild
rpmdev-setuptree
cp packages/sshyp-"$version".tar.xz ~/rpmbuild/SOURCES
echo "Name: sshyp
Version: "$version"
Release: "$revision"
Summary: A light-weight, self-hosted, synchronized password manager
BuildArch: noarch
License: GPL3
URL: https://github.com/rwinkhart/sshyp
Source0: sshyp-"$version".tar.xz
Requires: python gnupg openssh nano wl-clipboard
%description
sshyp is a password-store compatible CLI password manager available for UNIX(-like) systems - its primary goal is to make syncing passwords and notes across devices as easy as possible via CLI.
%install
tar xf %{_sourcedir}/sshyp-"$version".tar.xz -C %{_sourcedir}
cp -r %{_sourcedir}/usr %{buildroot}
%files
/usr/bin/sshyp
/usr/bin/sshync.py
/usr/bin/sshypRemote.py
%license /usr/share/licenses/sshyp/license
%doc /usr/share/doc/sshyp/changelog
%doc /usr/share/man/man1/sshyp.1.gz
" > ~/rpmbuild/SPECS/sshyp.spec
rpmbuild -bb ~/rpmbuild/SPECS/sshyp.spec
mv ~/rpmbuild/RPMS/noarch/* packages/
rm -rf ~/rpmbuild
echo -e "\nFedora packaging complete.\n"
fi
if [ "$distro" == "4" ] || [ "$distro" == "8" ]; then
echo -e '\nPackaging for FreeBSD...\n'
mkdir -p packages/FreeBSDtemp/bin
tar xf packages/sshyp-"$version".tar.xz -C packages/FreeBSDtemp
ln -s /usr/local/bin/python3 packages/FreeBSDtemp/bin/python3
echo "name: sshyp
version: \""$version"\"
abi = \"FreeBSD:13:*\";
arch = \"freebsd:13:*\";
origin: security/sshyp
comment: \"a password manager\"
desc: \"a light-weight, self-hosted, synchronized password manager\"
maintainer: <idgr at tutanota dot com>
www: https://github.com/rwinkhart/sshyp
prefix: /
\"deps\" : {
\"python\" : {
\"origin\" : \"lang/python\"
},
\"gnupg\" : {
\"origin\" : \"security/gnupg\"
},
\"nano\" : {
\"origin\" : \"editors/nano\"
},
\"xclip\" : {
\"origin\" : \"x11/xclip\"
},
\"wl-clipboard\" : {
\"origin\" : \"x11/wl-clipboard\"
},
},
" > packages/FreeBSDtemp/+MANIFEST
echo "/bin/python3
/usr/bin/sshync.py
/usr/bin/sshyp
/usr/bin/sshypRemote.py
/usr/share/doc/sshyp/changelog
/usr/share/licenses/sshyp/license
/usr/share/man/man1/sshyp.1.gz
" > packages/FreeBSDtemp/plist
pkg create -m packages/FreeBSDtemp/ -r packages/FreeBSDtemp/ -p packages/FreeBSDtemp/plist -o packages/
rm -rf packages/FreeBSDtemp
echo -e "\nFreeBSD packaging complete.\n"
fi
if [ "$distro" == "7" ] || [ "$distro" == "8" ]; then
echo -e '\nGenerating PKGBUILD...' echo -e '\nGenerating PKGBUILD...'
echo "# Maintainer: Randall Winkhart <idgr at tutanota dot com> echo "# Maintainer: Randall Winkhart <idgr at tutanota dot com>
@@ -163,7 +244,3 @@ package() {
" > packages/PKGBUILD " > packages/PKGBUILD
echo -e "\nPKGBUILD generated.\n" echo -e "\nPKGBUILD generated.\n"
fi fi
if [ "$distro" == "4" ]; then
echo -e '\nThis packaging format is not yet supported, but will be in the near future!\n'
fi
+7 -4
View File
@@ -8,26 +8,30 @@ As such, it is being crowned "v1.0.0", and is considered a stable base for futur
Features: Features:
- sshyp has been modified to run on Haiku, an open-source re-implementation of BeOS - sshyp has been modified to run on Haiku, an open-source re-implementation of BeOS
^ new package formats have been added for Haiku, FreeBSD, and Fedora Linux
- the entry format has been changed to support entries created in pass/password-store - the entry format has been changed to support entries created in pass/password-store
^ this change requires existing entry libraries to be converted - see the sshyp v1.0.0 release page on GitHub for a conversion script ^ this change requires existing entry libraries to be converted - see the sshyp v1.0.0 release page on GitHub for a conversion script
- majorly overhauled visual experience for sshyp - majorly overhauled visual experience for sshyp
^ this includes a new entry list, a new entry readout, coloured output, and more! ^ this includes a new entry list, a new entry readout, colored output, ascii art, and more!
- entries can now optionally be passed as arguments, directly - entries can now optionally be passed as arguments, directly
^ as opposed to the user being prompted for an entry name after running a command ^ as opposed to the user being prompted for an entry name after running a command
Changes: Changes:
- corrected outdated liscensing and copyright information - corrected outdated licensing and copyright information
- 'if __name__=="__main__":' convention is now used - 'if __name__=="__main__":' convention is now used
- help screens have been overhauled - help screens have been overhauled
- improved password generator to guarantee more secure results - improved password generator to guarantee more secure results
- fixed errors when trying to sync with a multi-word entry on the server - fixed errors when trying to sync with a multi-word entry on the server
- sshync now uses 'scp' (via the sftp protocal), rather than 'sftp' - sshync now uses 'scp' (via the sftp protocol), rather than 'sftp'
- rename function now properly allows for renaming folders - rename function now properly allows for renaming folders
- renaming an entry/folder will now properly delete the old entry/folder from the server - renaming an entry/folder will now properly delete the old entry/folder from the server
- entry previews at the time of entry creation/editing no longer require entering the gpg password more times than necessary - entry previews at the time of entry creation/editing no longer require entering the gpg password more times than necessary
- entries will no longer be overwritten if attempting to create a new entry that uses an already existing name
- the clipboard now automatically clears after 30 seconds - the clipboard now automatically clears after 30 seconds
- sshyp server no longer needs to create copies of its libraries in ~/ - sshyp server no longer needs to create copies of its libraries in ~/
- added more and improved existing exceptions
- the lock file is now decrypted to /dev/null
- ...and lots of minor (under the hood) changes! - ...and lots of minor (under the hood) changes!
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
@@ -37,6 +41,5 @@ https://raw.githubusercontent.com/rwinkhart/sshyp/main/extra/changelog-total
Legend: Legend:
** = feature/change not yet finished/implemented
- = feature/change implemented and pushed upstream - = feature/change implemented and pushed upstream
^ = note regarding the above feature/change ^ = note regarding the above feature/change