Compare commits

..
541 Commits
Author SHA1 Message Date
RandyTheSilly 0bcf5fc0d1 Update documentation for release v1.5.3 2024-01-08 22:16:48 -05:00
RandyTheSilly ec3ee297b8 Remove unnecessary empty variable declarations (these were only included to silence PyCharm warnings) 2024-01-08 22:00:05 -05:00
RandyTheSilly 5f5ede7349 Fix notes sometimes being appended incorrectly when editing incomplete entries 2024-01-08 21:32:01 -05:00
RandyTheSilly cc3fa30865 Add CHOWN.py port-job to package.sh 2024-01-08 20:15:33 -05:00
RandyTheSilly 3613d3dd0c Fix installed extension ownership on FreeBSD 2024-01-08 20:11:26 -05:00
RandyTheSilly 249269a3e3 Address flake8 suggestions 2024-01-08 19:39:44 -05:00
RandyTheSilly c441802058 Fix root-level entries being displayed incorrectly in the entry list 2024-01-08 10:51:59 -05:00
RandyTheSilly 5439c899f7 Update documentation for release v1.5.2 - again 2024-01-07 20:51:41 -05:00
RandyTheSilly 0990bae310 Fix notes starting with blank lines differing in entry readout VS entry preview 2024-01-07 20:20:27 -05:00
RandyTheSilly ae21489c75 Optimize multi-line note readout 2024-01-07 20:00:57 -05:00
RandyTheSilly 5717133168 Do not connect to server from "sshyp init" menu, as the user may not yet have copied their ssh pubkey to the server 2024-01-07 19:42:44 -05:00
RandyTheSilly 07c0dee0a4 Fix quick-unlock: newly generated quick-unlock pins have not been valid since v1.5.0 - this is now fixed - re-generate your quick-unlock pin if it was created after v1.5.0 2024-01-07 19:08:02 -05:00
RandyTheSilly c85640804a Make quick-unlock pin-length configuration helptext more clear 2024-01-07 18:00:11 -05:00
RandyTheSilly 8ec2b31c23 Recommend using ssh keyfile without a password 2024-01-07 17:48:14 -05:00
RandyTheSilly 50189dd526 Warn against removing active device IDs 2024-01-07 17:14:36 -05:00
RandyTheSilly f13404e76f Apply consistent code formatting, especially regarding additive and multiplicative operators 2024-01-07 17:05:18 -05:00
RandyTheSilly 5d00f83df0 Remove trailing spaces upon commit 2024-01-07 16:44:39 -05:00
RandyTheSilly 5ce28e1138 Replace misuses of ".extend()" 2024-01-07 16:33:45 -05:00
RandyTheSilly 2f7b548360 Keep the user in device ID add/remove menus until they select "BACK", optimize menu logic 2024-01-07 16:25:43 -05:00
RandyTheSilly 6789e3e3de Improve method of serving whitelist contents to clients 2024-01-04 14:08:02 -05:00
RandyTheSilly a345f4181c Fix multi-word device IDs being unable to verify via quick-unlock 2024-01-04 13:56:26 -05:00
RandyTheSilly 08c6f1aeef Attempt to remove old device ID registration/whitelist entry from server when changing client device ID - bumps minimum supported Python version to 3.8 2024-01-04 13:41:35 -05:00
RandyTheSilly 3bb2f194d4 Standardize language (vars): _proceed/_sure -> _sure 2024-01-04 03:31:48 -05:00
RandyTheSilly 52727e8eea Extend 18d03279b9 to server tweak menu 2024-01-04 03:23:06 -05:00
RandyTheSilly cd560d6f8f Fix incorrect order of parameters when calling copy_id_check() from dev_id_config(), fixed inconsistency between order of parameters that caused the readability issue leading to the typo 2024-01-04 03:06:02 -05:00
RandyTheSilly 18d03279b9 Standardize language: device name/id -> device id, syncing -> synchronization/synchronizing 2024-01-03 22:56:13 -05:00
RandyTheSilly d4f1831486 Add a warning before changing an existing device id 2024-01-03 22:14:39 -05:00
RandyTheSilly 0ecb842480 Add "BACK" button in optional SSH configuration 2024-01-03 14:58:29 -05:00
RandyTheSilly 45be25e6bd Rename all back/cancel buttons to "BACK" 2024-01-03 14:43:14 -05:00
RandyTheSilly acf46b6227 Move registered_remover() to be covered by RMSERVER port-job 2024-01-03 14:32:46 -05:00
RandyTheSilly 3418bf6170 Replace unnecessary use of pop() 2024-01-03 14:20:15 -05:00
RandyTheSilly dbf3b35237 Add option to remove registered devices in server tweak menu 2024-01-03 14:10:09 -05:00
RandyTheSilly c48edfc624 Add 2024 to copyright duration, split changelog archive for 2024 2024-01-02 14:14:10 -05:00
RandyTheSilly b2eb63cbe6 Update documentation for release v1.5.2 2023-12-11 14:37:01 -05:00
RandyTheSilly 43f8306932 Add processing warnings during gpg key generation 2023-12-11 13:56:56 -05:00
RandyTheSilly e044122d48 Allow displaying partial options in curses menus in smaller terminals 2023-12-11 13:09:21 -05:00
RandyTheSilly 0e45a21a58 Re-implement "additional configuration options" header after init menu 2023-12-11 12:54:01 -05:00
RandyTheSilly a119544fbf Re-implement empty directory notification in entry list 2023-12-11 12:40:10 -05:00
RandyTheSilly 23e51ae133 Improve text wrapping for entry list - list now uses full width of terminal and can be displayed in smaller terminals without crashing 2023-12-11 02:58:04 -05:00
RandyTheSilly 27cf610a1f Fix crash when terminal is not tall enough to display curses radio pretext 2023-12-10 21:49:40 -05:00
RandyTheSilly 2edb1b9b53 Remove "/example/" heading format from extension downloader (this format is reserved entry paths) 2023-12-10 20:10:08 -05:00
RandyTheSilly 675e05c14f Improve text wrapping for curses radio pretext 2023-12-10 19:03:14 -05:00
RandyTheSilly 937b1357f5 Improve entry reader and entry list readability in light terminals 2023-12-10 15:28:57 -05:00
RandyTheSilly c3f8178db4 Fix needless function recursion when calling the global menu from the init menu (fixes errors on Alpine Linux 3.19) 2023-12-09 01:30:19 -05:00
RandyTheSilly 75cf927343 Properly handle error for missing pinentry program/configuration 2023-12-08 20:55:45 -05:00
RandyTheSilly 5a34cfbc8b Bump version to 1.5.2
Former-commit-id: 4344a965a805f5c92a707ed7ad37048f8eda93b6
Former-commit-id: 42325bca647366a6593272694daff9f9af390f10
2023-12-08 19:03:30 -05:00
RandyTheSilly c0d5d3b79f Address 7e1961e0ec [formerly c1521a73d443c173cd2b23f18f71f99fc54b0eb6] [formerly ef5415a793eaf8088f857331872181b40ef4d78f] in port-job
Former-commit-id: fe1d754b62dca302700dd8ab05f01a31117a9d0f
Former-commit-id: 223d95ecba109bad3c0724793c29574600f5bffe
2023-11-27 16:15:25 -05:00
RandyTheSilly d45f4264df Improve license information readability
Former-commit-id: c6c1f1b32544cd43e338c92fed8f8a168690be13
Former-commit-id: 7545104ced2e65a78734184261e104a34b4ec63b
2023-11-22 14:40:58 -05:00
RandyTheSilly dbae72b926 More clearly present extension information in the install screen
Former-commit-id: d75086ed21f45966b6c2b0074aea6e288d1ce650
Former-commit-id: fcf66ffac17cfc97868b0dc6dd4f4c4077f90fd3
2023-10-26 20:30:49 -04:00
RandyTheSilly da4a4d272d Add support for multi-line extension usage information
Former-commit-id: f3dfe5815a3ffcf453b430f12b63235a88469b3f
Former-commit-id: 9c3fec49417dfca2c1494f3edacd123b25dbe27a
2023-10-26 19:11:52 -04:00
RandyTheSilly 7e1961e0ec Fix empty clipboard warnings being shown to the user on Wayland if the same entry field is copied multiple times within 30 seconds
Former-commit-id: ef5415a793eaf8088f857331872181b40ef4d78f
Former-commit-id: c1521a73d443c173cd2b23f18f71f99fc54b0eb6
2023-10-26 18:32:47 -04:00
RandyTheSilly f80fd2b6e2 Fix quotes being copied when clearing Termux clipboard
Former-commit-id: 028b6bdcf891aa017f1d21b6b083591322695b69
Former-commit-id: 9ef4a8e58fc44068efdfab43b6f33e4de76d8efe
2023-10-26 17:48:12 -04:00
RandyTheSilly 787a2bbfc4 Fix extension removal on Busybox environments (Alpine)
Former-commit-id: 47909194ae390b1ace732f19da7a5a72592824c8
Former-commit-id: 165ea2af5edfc99d1094a4aeb1a341ac815d3af8
2023-10-25 21:16:17 -04:00
RandyTheSilly e7f0618142 Fix Fedora and FreeBSD packaging excluding clipclear.py (official v1.5.1 packages are unaffected by this)
Former-commit-id: d8d0d5a4cd14e3aac159ebd9755c82c3f0e058e2
Former-commit-id: 7bc639d5628c27988f88cb691345eb8680c07266
2023-10-24 11:50:26 -04:00
RandyTheSilly 1f5a2c8f3c Update documentation for release v1.5.1
Former-commit-id: d9721cfcc36cc53f2719f0c57c3c5c58578e3eb1
Former-commit-id: 9e3bba69e4d4e8d074b3882b56f2221aa7edd6ad
2023-10-23 23:19:03 -04:00
RandyTheSilly 386044d081 Fix colons and backslashes in gpg key names being interpreted as their hexadecimal equivalents
Former-commit-id: 98a19896d872423ff771e4b7bb5014397b63e889
Former-commit-id: 940178d578742aa457b985df4d7b231324aba0d9
2023-10-23 22:32:56 -04:00
RandyTheSilly c651c41a41 Disable ConfigParser interpolation to allow for "%" to be stored in configuration files
Former-commit-id: 4ac84f3ceef3407bd9e8e2c2f2191f7ea2ee2a55
Former-commit-id: 2fb4bf9d2630520702e99fa0913a3db5e1a0d0bb
2023-10-23 21:08:01 -04:00
RandyTheSilly 7cb245edde Fix CLIPCLEAR port-job for generic Linux (Wayland/X11)
Former-commit-id: 3690a41cbfce5eff13388fa7c9fe9f39d6e36865
Former-commit-id: a9a991dc141d1eb7d7973f8ecb08188dda27953b
2023-10-23 20:37:41 -04:00
RandyTheSilly edf31f9a7c Add port-job for making clipclear.py platform-specific
Former-commit-id: 6aafd4dfcddefc31bf61d3018b63ef48c156d8a8
Former-commit-id: c016e6872d71bc4bb347d85cf964dd9e7b7fe149
2023-10-23 13:51:11 -04:00
RandyTheSilly 362b1aa025 Remove unused variable from RMEXTMAN.py
Former-commit-id: ea907d093c1ffdccffc9db55f573d08650cfb7e2
Former-commit-id: e2178912cec4b4327c576af625fe8d1e6e498665
2023-10-23 13:05:46 -04:00
RandyTheSilly 5633520d82 Fix clipboard clearing on non-Wayland platforms; drop dos2unix as a WSL dependency; suggest openssh-server on Debian and Fedora
Former-commit-id: 046786460edc669fa9b962314953164c1cce078e
Former-commit-id: d9f0eeb57d73a0255c9dc713533d08d30413bf90
2023-10-23 10:35:59 -04:00
RandyTheSilly a487bd561a Fix clipboard contents sometimes failing to clear
Former-commit-id: 8ecbbb6199864fda973e47605a10d737318f3993
Former-commit-id: eb625eded3f9518967ee9fa06201311e8571e394
2023-10-20 00:32:29 -04:00
RandyTheSilly cbc0538e82 Call printf with %b to avoid interpreting directives
Former-commit-id: f1e812634d538b8e8c412b0c3aa1c43aab1c4f1b
Former-commit-id: f95072b8742e752be18dc3fe9cba17c8e82eb41b
2023-10-19 20:52:35 -04:00
RandyTheSilly 5c589de4f2 Switch to v1.5.1 extension pointer
Former-commit-id: 3997d7c4f7a05a8992b93a9b8d73c3d44e4c6026
Former-commit-id: 2a56f062345d177023c9a6f1f5ed5415450a9155
2023-10-19 18:47:06 -04:00
RandyTheSilly 44392467e5 Require identity to be passed to whitelist_verify() (for extension support with custom SSH keys)
Former-commit-id: 9db42722585f1fb707d5144e828cefddfcbf5137
Former-commit-id: 1e79c49459b49eb422788eba315a6d9c6e09f9a1
2023-10-18 15:14:20 -04:00
RandyTheSilly 18aacf648b Add pop-up explaining optional configuration menu
Former-commit-id: ed0d42781420080646ec6051e9f9c56ba8eaba99
Former-commit-id: 48b7d5de29ee9ad88b0aec222954769473ddda8a
2023-10-17 00:52:54 -04:00
RandyTheSilly ac621a8a73 Add "TROUBLESHOOTING" section to man page
Former-commit-id: 352412410256035906c586975b9cc5460f6b19be
Former-commit-id: 2d1092037448f1d2aaf9c137b751efcbe984995e
2023-10-17 00:40:06 -04:00
RandyTheSilly 98f76ac1ab Exclude "known_hosts.old" in ssh key listing
Former-commit-id: fc088270e9865b35ae4b10f020fec916e5093a8a
Former-commit-id: 8988481a7d3f37636dfa534312890760cd24ca81
2023-10-16 23:51:20 -04:00
RandyTheSilly bdff85f024 Fix copy_id_check resulting in errors when called from another module
Former-commit-id: 31bb5415499ca5f06413eba61eaafd284d2d5da1
Former-commit-id: 9cd0e6852e09874a1a06c8cde22e539f1cb58345
2023-10-16 23:46:19 -04:00
RandyTheSilly 2bcabe8597 Update README.md to specify Python 3.12 support
Former-commit-id: cfc8548cfb03f839d3cec89be68f839e8863de89
Former-commit-id: 1c0495fb2421d5f1b035a468fa15175b2a031e43
2023-10-02 20:05:10 -04:00
RandyTheSilly 7259a8732c (MacOS) Port new clipboard behavior to MacOS
Former-commit-id: bd887c5ee6a75130b8c994034708ae7893764251
Former-commit-id: e1621ed1a986f731c8217d741fd84a42196cb4e9
2023-09-26 20:29:51 -04:00
RandyTheSilly 20cdc27b88 (Haiku) Port new clipboard behavior to Haiku
Former-commit-id: 3a40559cf39475a0291187a4853c1e5f335b96f0
Former-commit-id: 95bfec78129d9d22afb16a33775df8d3abb24fa1
2023-09-26 19:51:05 -04:00
RandyTheSilly 2f6bdb8d2e (Termux) Port new clipboard clear behavior to Termux
Former-commit-id: bdda7fae8c2305e1f64c468d45c205d12645f669
Former-commit-id: e6fea38cc85a03b8970f0cdf61390825cc048c20
2023-09-26 19:32:56 -04:00
RandyTheSilly eb4fae3e9e Fixed new clipboard clear behavior on FreeBSD
Former-commit-id: e276182b11c518bc7b880eaebb7d9c8fd528761b
Former-commit-id: fc1f067c5c0df86109795feca05527be5322d829
2023-09-26 19:03:07 -04:00
RandyTheSilly 30afbafcbf Fixed xclip throwing errors on FreeBSD
Former-commit-id: 65b466c0598f2194d452c0897ffa9eeb7ec3b281
Former-commit-id: 51ad92728be141113047bb25fb8841d141d545e6
2023-09-26 18:37:42 -04:00
RandyTheSilly e010180219 (X11) Port new clipboard clear behavior to X11
Former-commit-id: 11edd45f8ccaa6de548d6656ef50cd0c1bdff0b4
Former-commit-id: 1fb779b6d27937d83802f50fb6857f24ec7765ed
2023-09-25 13:53:59 -04:00
RandyTheSilly 1f4e7d5cae (WSL) Marked "dos2unix" as a dependency for the WSL package
Former-commit-id: e1adc5ac923a07d87ccb2ee3c687b9e935200617
Former-commit-id: a906b07e1cc19921d1ec94cec99644657b963ee1
2023-09-25 13:11:01 -04:00
RandyTheSilly 67983da22e (WSL) Port new clipboard clear behavior to WSL
Former-commit-id: e1d96418abae79f6af75d72eeb6279e661196bd5
Former-commit-id: 0b345de72d9dc13de2f0db7c26264e0deb685965
2023-09-25 12:54:21 -04:00
RandyTheSilly aa0bd017c9 Fixed CLIPBOARD.py port-job overriding the new clipboard clear behavior
Former-commit-id: 13f705945bf0bbe95b5699f2bd64b9c790324048
Former-commit-id: 54e8c6f8d54e592bdda885de296f56f1d5ecdd24
2023-09-24 22:04:00 -04:00
RandyTheSilly 5a4e952d4d (Wayland) Only clear clipboard contents if they have not been changed since altered by sshyp
Former-commit-id: 2b6be8d327419bccc51430f732fb03ff9bba0439
Former-commit-id: 09406c55e394e97c90d984067bff9b4677b0496a
2023-09-24 21:50:14 -04:00
RandyTheSilly db05e9b05e Fixed offline-mode sync warning displaying at inappropriate times
Former-commit-id: 37c0fe00ec30a903ec7ba40525f01a2963b24d72
Former-commit-id: e6cea4d212e6f9b231dc0d0743b667b9f2eb376c
2023-09-24 19:35:48 -04:00
RandyTheSilly 397ad7d409 Update Haiku package to use Python 3.11
Former-commit-id: cc3ae472b67be63d960b4993c355f9d5acf7d899
Former-commit-id: 8d758713964c081c6dbb56899f2b84e51d25eac0
2023-09-24 19:27:20 -04:00
RandyTheSilly 5af02866b4 Fixed clipboard contents leaking through process list on Wayland
Former-commit-id: bb1485fec2d891af9f49b4d8e81df72b0e6160d9
Former-commit-id: 2eff4ace8b82735a890bf1e669d92d7abbb59dfa
2023-09-24 18:56:42 -04:00
RandyTheSilly e8267f838a Read some fields from config file as boolean values
Former-commit-id: ba2f082fc4d043d55ba5d25875ac9b9600bbbd3a
Former-commit-id: 4e31560e91047d035eb87e312fd17f3e8ad1935f
2023-09-24 16:38:30 -04:00
RandyTheSilly e4fbcd6825 Added an error for when the configured text editor cannot be found on the system
Former-commit-id: f41356854b88cf6a53604ef37025667d17041da7
Former-commit-id: 627cb9298583b7fbb6358edead75c65e671619d0
2023-09-24 15:04:36 -04:00
RandyTheSilly 9ba4b8d724 Added a warning when the user manually attempts to sync in offline mode
Former-commit-id: f54591cc6997078a248c5d8dc3dcd533824c04e4
Former-commit-id: fb405077f39e22840e98bca6a854496bd583c49c
2023-09-24 14:35:01 -04:00
RandyTheSilly 0b73d4016f Always use the user-specified ssh keyfile in place of the previously hard-coded ~/.ssh/sshyp
Former-commit-id: 2ec48a889401a5da39c162f966b2e1eaa4c90aad
Former-commit-id: e0071948993af51c3de731eaf49c16d5fdab3632
2023-09-24 14:03:44 -04:00
RandyTheSilly 185baec03f Fixed re-encryption not being possible in offline mode
Former-commit-id: f608b138c1d850523c3c5cde0e65ec592a1e1a10
Former-commit-id: 0c5f542c6bf66e51c79969dd3ba60586d814d73a
2023-07-12 21:07:31 -04:00
RandyTheSilly f930ffe94a Fixed version info graphic having invisible elements in white-background terminals
Former-commit-id: 0b2eafdf0bcecc580110455373d2fc3e5390b60b
Former-commit-id: 9889ea48fff7c744776b4687b7ab91e17534e03d
2023-07-12 20:55:38 -04:00
RandyTheSilly a6fb33705e Update documentation for release v1.5.0
Former-commit-id: d7e5cd4c453f28ab69cce51c9720f9bc81932525
Former-commit-id: 42b30444972be06c8781ad193abcd638b64fd2de
2023-07-12 19:22:58 -04:00
RandyTheSilly 6483ffe6cf Fixed extensions directory not being preserved in Fedora package
Former-commit-id: d2d094187d9fa2d037b94bdc387a54c463f3a2d1
Former-commit-id: 38dc77b41bcaf8afd15f6d058c6ef0fedc93f6b6
2023-07-12 18:35:03 -04:00
RandyTheSilly 33bc0fc10f Fixed extensions directory not being preserved in FreeBSD package
Former-commit-id: 5aeda29d8b3bfb0549fccf6b7f90880038293288
Former-commit-id: 4d5471ad85f47ff9e18624671a0fb55bc4413a2f
2023-07-12 17:47:09 -04:00
RandyTheSilly 58698c1c55 Updated version info screen text art
Former-commit-id: 3e4d061d96877024ab8ebc1710a08a477ac4a9ca
Former-commit-id: 66e5d57695cec0a87b8ed44ed632e00b2364be4f
2023-07-11 15:06:37 -04:00
RandyTheSilly 37075230cc Added port-job for disabling extension management; applied to Haiku and Termux packages
Former-commit-id: eb66222b45b41fbd92712dacd23ed825ba377982
Former-commit-id: 0544589759a4e41c005aae8a6b00fcdff58f72d9
2023-07-11 12:34:59 -04:00
RandyTheSilly 7e9786fe60 Fixed possibility of attempting to sync from a server installation
Former-commit-id: 4ac82c68470f451635c698a244899140e97640b2
Former-commit-id: 8b1381521016f23d1c53c6f1e23d1851a0aa04f0
2023-07-10 15:46:07 -04:00
RandyTheSilly 2e51a1ff15 Ensure ~/.ssh directory exists in sshync configuration
Former-commit-id: 84f8021609d8e62c12e89fc539fcb954ec876118
Former-commit-id: 3bb543b0b155f6ef73dc277042246bf8f918597b
2023-07-10 14:41:44 -04:00
RandyTheSilly b1567d768b Removed use of awk/sed from packaging script
Former-commit-id: 7dceca5cbeea3726c84b83fd274d795683692415
Former-commit-id: a7565aa6ebf70e8d7eea07f5e3ecac3606c54947
2023-07-10 14:16:58 -04:00
RandyTheSilly e487c381e7 Auto-detect Installed-Size for Debian packages
Former-commit-id: bc0244a0818f976c31e342e2bd2ec1f09a2d00b8
Former-commit-id: 0a4361c046776c7a7d7a40fba054482fad9cdcd9
2023-07-10 14:09:14 -04:00
RandyTheSilly 8ce1f18ff9 Converted Termux package to client-only due to server-hosting bugs on Termux
Former-commit-id: e5315b2037e0e8355d6d3765e252c402a67ec18d
Former-commit-id: 90636fda875b795ff65b2ce4abee73d418616ed1
2023-07-10 12:21:58 -04:00
RandyTheSilly 3783230606 Rename Haiku package filename to match package name
Former-commit-id: 759cbd160e0ea0d7ef5c2934196d4f3468287634
Former-commit-id: d81c780f775655f5c8669a44af23b8cc0771e27a
2023-07-10 11:23:42 -04:00
RandyTheSilly a3551cc042 If $EDITOR is not set, default to "vi" instead of "nano"
Former-commit-id: e07df2bf109cc0de30a88a1bfe49ec15f8e739fb
Former-commit-id: 9dc13886c901240b8f8cfe99a1181817d92161a7
2023-07-09 13:17:50 -04:00
RandyTheSilly 5b9b6da341 Fixed CLIPTOOL.py adding an outdated, non-functional warning
Former-commit-id: 4072bb5ec0cd7b08eecb176f809aed9145385090
Former-commit-id: 1b42beaa6d097c1c953cb91dafdc821271791467
2023-07-09 13:00:39 -04:00
RandyTheSilly 9abb1c45bd Include stweak.py in FreeBSD and Fedora packages
Former-commit-id: a0af16d70dea2b0a2196fe2588d58574119d316f
Former-commit-id: 9bbdc72fe9e3a4d10819397af585980f55893fc6
2023-07-09 11:36:26 -04:00
RandyTheSilly ba1e2734be Re-implemented re-encryption termination warning
Former-commit-id: 328eb0038e909a9831edce0f1b978323c491f4f5
Former-commit-id: 337b2de2b370e6d410a14f5cffcea6d1b3b26034
2023-07-08 21:58:50 -04:00
RandyTheSilly d40d1daab5 Fixed Haiku using the wrong Python version, made building on Haiku easier
Former-commit-id: f5d19c55405790060136af4f2a012987ce88d5f2
Former-commit-id: 69aef95294b038c405d95ad3aa37c0a1991a9f8a
2023-07-08 20:25:59 -04:00
RandyTheSilly 5255d61f61 Fixed missing clipboard tool error message
Former-commit-id: 0f44766f316be7c27ba2a9a6cb94ac9bbb86c0ab
Former-commit-id: 4811948d213abb5f5170841022f5b026242ac80b
2023-07-08 19:58:14 -04:00
RandyTheSilly 9fc2aa69a3 No longer exit the tweak menu after (un-)installing an extension
Former-commit-id: 6589fef86d354b7dd3fd066e19b87b412c5e6eec
Former-commit-id: 6d9b5a407a566effa13943664d4d6ba00de40d54
2023-07-08 19:41:45 -04:00
RandyTheSilly 7f4ddd2775 Re-enforce proper syntax by always showing /<entry name>, rather the </entry name>
Former-commit-id: cd0cfb7df05a37999ae057e9d2908f8130107e9e
Former-commit-id: 64bcafbc58b241b74275e70675ae586e9180400f
2023-07-08 19:15:29 -04:00
RandyTheSilly 4a7234282b Replaced termination messages with mid-config confirmation dialogs
Former-commit-id: d6cf3398a45586fc2f21b209cc8a10ad7f67c5d9
Former-commit-id: 55b9c950ac3d9a2fa63341c0e7382c912abda216
2023-07-08 19:09:06 -04:00
RandyTheSilly 5fb5b5b108 Allow multiple lines of text before presenting radio options
Former-commit-id: 46751c0b67133a277612c46086b21f5c2477cf48
Former-commit-id: db8800da451d469e1d42dae19a4ca77bf657c947
2023-07-08 18:53:37 -04:00
RandyTheSilly 1344aa23f6 Fixed privilege escalation code attempting to run when interacting with user-only menus
Former-commit-id: bcc2a99ab5324a049982bfff83eb191cfd7c0346
Former-commit-id: ce58e4b07a2e5fc26ab34c8ecdc695953b5a2d58
2023-07-08 17:24:57 -04:00
RandyTheSilly 2ac8e8e434 Fixed privilege escalation input in extension manager
Former-commit-id: d75cdc8010eb8b5285c532284c9b14d553c7deaf
Former-commit-id: 57edd15ca67e4f2e94f5201cdb18401b5ac40f59
2023-07-08 17:18:05 -04:00
RandyTheSilly aa7768fd6e Fixed potential variable undefined errors
Former-commit-id: e5e902682c90b221f8bb58d4a5ca08f2c82bb703
Former-commit-id: c210e048d0ee28327e8302f37f9dc439db826055
2023-07-08 12:58:26 -04:00
RandyTheSilly 2835214d60 Handle missing section and option errors on startup
Former-commit-id: 0729eb0432f1974f1957bd0eb146d287a36c43da
Former-commit-id: 60d0a88bf87fb87580b36feedecbf0b4a82215fd
2023-07-07 17:13:52 -04:00
RandyTheSilly ee56a7a919 Fixed many instances where the curses menus could break the terminal session
Former-commit-id: df73403b4a8bc3ffb238486516d0f1e5a1f601c6
Former-commit-id: 649503907f391ff318fc0d3247b965ed3b2aacba
2023-07-07 15:06:57 -04:00
RandyTheSilly 4ad516e156 Fixed required options not being set when switching from server to client modes
Former-commit-id: 70c190d280802779a92fe2ad509c648134ea83aa
Former-commit-id: a2d939cd3b467186714625da7eae0027e738c5e0
2023-07-07 12:53:42 -04:00
RandyTheSilly 3347c425d9 Fixed attempting to install extensions resulting in an error
Former-commit-id: 821b770fdcea74c51b4077c2c956060340827b81
Former-commit-id: 5ca345ef9391b834d7b6d276ec2ff552a3bf942b
2023-07-07 10:26:13 -04:00
RandyTheSilly 488b94e638 Documentation draft for release v1.5.0
Former-commit-id: 0b48dd00fa914cb5c1d734687dae0827a7a00d7c
Former-commit-id: 2396087e33fed9982f12cfe3593c4ec43d4f0d89
2023-07-07 10:12:06 -04:00
RandyTheSilly 343bc40ddd Added "other" error code to man page
Former-commit-id: ad89fc282ced553cb2647625c0206cb3e796bbaf
Former-commit-id: 4a0a3ca2d282c61a970ed07b5170bbb0e85b37a1
2023-07-06 13:23:54 -04:00
RandyTheSilly 3cc5b5633c Added cancel option for installing/uninstalling extensions
Former-commit-id: d594a918dbc21b9379a83e7fd01f560ba4b275ea
Former-commit-id: bfe3f71d2ee6be832e7614e4f05147e576530d78
2023-07-06 13:02:02 -04:00
RandyTheSilly 43c10e74e2 Default to 'no' selection for optional menu items
Former-commit-id: 25735d67f0be5df5a47b94803a6d9b8f133def09
Former-commit-id: 0d9665a1fa1ce248a26622d007fd0c440cc9f86e
2023-07-06 12:24:15 -04:00
RandyTheSilly 95cc769c23 Fixed menu options not related to extension management throwing errors
Former-commit-id: a6d55fa0f2e072d823b13ac69f8ff27251b3f3c0
Former-commit-id: 847eeb222459802dc3b8ac778c6b89243048fa4f
2023-07-06 12:17:43 -04:00
RandyTheSilly 25d0ef5a21 Added extension removal functionality
Former-commit-id: ed236f56d17c89a942332c25fb5ae8a45d408750
Former-commit-id: 9f20e5ddeed271363ffd4b7f13d55891f0b67ed2
2023-07-06 12:10:54 -04:00
RandyTheSilly 1cb5386756 Fixed error when declining extension download
Former-commit-id: 02933773afc9f542ba523f0ffe0c80af33673300
Former-commit-id: 50b2953f7af0351bda5f4c89b114db181ced0359
2023-07-06 10:17:30 -04:00
RandyTheSilly a00beeea45 Added initial extension downloading/updating support
Former-commit-id: 7bea089f44a499d448a910e1d060b9b43facd306
Former-commit-id: 98ed803ca1f8733908922428fa4fc3fe2df54402
2023-07-06 10:05:01 -04:00
RandyTheSilly 8daf01e986 Better explain purpose of custom text editor option
Former-commit-id: fec282230b92ee3035666a648544c86369643c21
Former-commit-id: fb0f46bac590e3f948c3404b1ae3991feefbbc5d
2023-06-22 11:25:53 -04:00
RandyTheSilly 404f787b89 Reinstate advertised Debian support as of Debian 12
Former-commit-id: 0bc026407a02d655ced349ceb64117e5fcc54262
Former-commit-id: 40a2f4d7417ce1345f3e57d2151f515e2622b8d9
2023-06-22 11:18:00 -04:00
RandyTheSilly e7de5761bd Hide input when creating or editing a password
Former-commit-id: b7224d0533bdb5c82d31d6854fe03c04b3efa6c1
Former-commit-id: 6af841f88fc4ae05c9bfec463b947d82bb5968d6
2023-06-20 14:45:17 -04:00
RandyTheSilly 9d94ba1eb9 Removed unnecessary output when shearing a non-existent entry
Former-commit-id: 7c264de0ebf49889e309d43d1ad5a7483845308e
Former-commit-id: 84c4c04e1bd4b085b457ddbd8184c9c3b028dcd1
2023-06-20 14:35:59 -04:00
RandyTheSilly 0c78a32195 Spaced entry input prompts apart
Former-commit-id: bbe5c986067096b0f18ebfdc38ddfbfd4d75567b
Former-commit-id: e312eb7fb3ce6c90d7d19c2c0918d6ce8f407614
2023-06-20 14:20:01 -04:00
RandyTheSilly 2813387577 Print a blank line after sync completion
Former-commit-id: 1eaa21a210aff947eddc4c35a2c59542a33b4282
Former-commit-id: 0602f43ae43d0ac931bffac99d5538c8f90e13a1
2023-06-20 14:07:57 -04:00
RandyTheSilly 3f86508f9c Fixed line spacing before sync when shearing entries
Former-commit-id: ba6325c80012acec52506f5005899655bb4688a9
Former-commit-id: 528c39efdbfc368e5bdfed38cff25db034b4217d
2023-06-20 14:00:11 -04:00
RandyTheSilly 2834c6d67c Made line spacing before sync text more consistent
Former-commit-id: 2539fcb335c63424ca9e4d6e6f49af42ad4ff6bf
Former-commit-id: 5041cb5b85e4f16706f91af3d6d16c38e4855fe8
2023-06-20 13:51:05 -04:00
RandyTheSilly 29c5e60804 Fixed password field showing for blank files
Former-commit-id: 6d0f8763a7d7ccc4208092fff70fa4795b6d1722
Former-commit-id: 124b80ba9c0596e28ffa7e1a85760236dea345ca
2023-06-20 13:26:05 -04:00
RandyTheSilly ba5f118048 Do not append extra new lines in line_edit
Former-commit-id: b2aefd5723c643f625865ea76957b2dbe560b58f
Former-commit-id: 194dd58228db64c0d55089edfe60055ed9492860
2023-06-20 11:44:13 -04:00
RandyTheSilly 05e9bcc478 Removed redundant code from optimized_edit, renamed to line_edit
Former-commit-id: 6fc1642909392c5c1f2f7e4602fd499ceff9d6a4
Former-commit-id: 9dd02b390893cb6239717ab886534a24bc3ea618
2023-06-20 11:12:30 -04:00
RandyTheSilly 7972040d5d Updated re-encryption to no longer use optimized_edit, as it is now redundant
Former-commit-id: e7f60332c00e1ba6be5372035c88e1828738d319
Former-commit-id: 86d492d1e464db37fef35e5963a541d79a3e6d54
2023-06-20 10:42:05 -04:00
RandyTheSilly d417ff48ba Strip trailing whitespace before encrypting entries
Former-commit-id: 32429dfb574e465486d1397445fa8b34f5dd73fb
Former-commit-id: aca5cc58197564a74e99345ed08c3363dd5acea0
2023-06-20 09:55:40 -04:00
RandyTheSilly 7dedfcac17 Fixed username and password fields being swapped on some new entries
Former-commit-id: 7cadad4527f9e08aa9f3b45e9d4d4b683709c5fd
Former-commit-id: 0949d3b8c4f2e050597f3a2e41e2795d7a380ff4
2023-06-20 09:50:42 -04:00
RandyTheSilly 307bcc3faa Do not re-encrypt and sync if an edited note is unchanged
Former-commit-id: b8bcb481830ad5deb344d4d0c79976db7f06bb52
Former-commit-id: 6ebe9ee2f25dcfd90bea3784d337cb6cefbe903e
2023-06-20 09:44:35 -04:00
RandyTheSilly d031e3c7ab Use tempfile.NamedTemporaryFile() for editing notes, removing the need for shm_gen()
Former-commit-id: 2d2e733945ba2748a24ed93f861145cf26ac1f13
Former-commit-id: e3b5add08675438e1a08607d081a9a44f426425e
2023-06-18 14:10:25 -04:00
RandyTheSilly 4f8d088d0e Removed unused option for su-security
Former-commit-id: d25ab089e078069b95a75482bab21999376e04c1
Former-commit-id: e02925d1e8446b4196bd529b092119e6039cdaa0
2023-06-18 00:26:51 -04:00
RandyTheSilly b035e208d7 No longer use tmpfs for entry decryption unless a note is being edited
Former-commit-id: f2087663fa4416500810bfd49575267c15b2097b
Former-commit-id: 4b830d1c7c9485a1bf816a0d7d3500638ab70451
2023-06-18 00:07:54 -04:00
RandyTheSilly 93647c0489 Demoted quick-unlock from recommended and added a security advisory
Former-commit-id: b894e8b66fa30394fd8cb43cea818f8a82f62878
Former-commit-id: 1c78d9ac043cc0478c112936a3bb99798a88e9b8
2023-06-17 20:50:56 -04:00
RandyTheSilly 75b9f4f0a5 Removed shebangs from libraries
Former-commit-id: 2d6d4000b0358ba7974350e2f85ec93d1387096f
Former-commit-id: c06d215f3d3dac7a8bf53ca5932b6da4752dc20c
2023-06-15 21:06:01 -04:00
RandyTheSilly 463df727e9 Allow directly passing a quick-unlock pin to decrypt()
Former-commit-id: 26d16e1c832cfd07dcc48fb807a4389f21f416b8
Former-commit-id: a197c1f00ee16ade6ae6cc253d4940c9a38356ad
2023-06-15 20:59:37 -04:00
RandyTheSilly 184a7c680d Made decrypt() more friendly to extensions
Former-commit-id: a52d6557e53ab834e8f6c39c66f4aec6f9ac0622
Former-commit-id: a19ed491bdf5cf2bfe5502752615cc465e14dddc
2023-06-15 20:45:19 -04:00
RandyTheSilly 49abdc4222 Require _quick_unlock_enabled parameter for decrypt()
Former-commit-id: af37809cfeb7c36de355d6cc0e8bc159f7291033
Former-commit-id: 195364d30d36467a4966347b54d66136e36dcdeb
2023-06-15 20:05:32 -04:00
RandyTheSilly 72f322b896 Merged determine_decrypt() into decrypt()
Former-commit-id: dd9483453409affdcbc54635ff187e4bc00ec5d4
Former-commit-id: c97d3856801cecf744f0c5bcebdaf9d21998967f
2023-06-15 19:58:09 -04:00
RandyTheSilly 5d0abb0537 Fixed potential variable undefined errors
Former-commit-id: 65168e24ed228816d4089241d4086317488fd696
Former-commit-id: 5c46855d45488b2ec5fd8b53040237fc224b45d4
2023-06-15 17:02:44 -04:00
RandyTheSilly 183582efbb Added missing new line after quick-unlock help message
Former-commit-id: a973b2dcdb3d93ec4a27ae77b09adb125a25a610
Former-commit-id: a3f54bcc22400e3da16ccc3bd8446cd860f6308f
2023-06-15 13:34:06 -04:00
RandyTheSilly 8e72ae1660 Moved quick-unlock+whitelist management to new tweak menu
Former-commit-id: ffb947c22fed9979052aa408db96a403f8654d7f
Former-commit-id: 9d4b8d043245f39c2ac8084f59c9dcfc26185d17
2023-06-15 13:30:23 -04:00
RandyTheSilly f154cbe400 Disallow entering negative quick-unlock pin lengths
Former-commit-id: b95a4003c8abd3ceb1fabd8e0c2758409f05e617
Former-commit-id: b1e4e8b8b297bd62277d02c9919ab2db9cb63ab9
2023-06-15 09:43:29 -04:00
RandyTheSilly ebb12e731f Use getpass for whitelist setup passphrase input
Former-commit-id: cf2b51588b2f79183e2bd263b4c3fa76d99b2b4e
Former-commit-id: 03b555137cbf646bbb22893d414a43fb3cd4753a
2023-06-15 09:23:37 -04:00
RandyTheSilly 7fc84d5f9b Updated whitelist setup gpg key detection method
Former-commit-id: d80505f72614d7fd49e5e8eba6f8f9443b8b6538
Former-commit-id: 4e627cb8830a714a39f6c71a8c745c50b2107f86
2023-06-15 09:15:30 -04:00
RandyTheSilly e0f37af453 Fixed the 'sync' argument working in offline mode if the user has previously saved sshync configurations
Former-commit-id: 9fa803ba406ede532a8d50c0138dace89cce405e
Former-commit-id: b63538263fa365e5a0f9ade3b5a90d5b066fe06f
2023-06-13 14:57:43 -04:00
RandyTheSilly f90d502106 Added an entry re-encryption/optimization option to the tweak menu
Former-commit-id: f868668a456300bcd46fd75381485a4fa75bcbbb
Former-commit-id: 4b812719f0d7cd17c8cc0c7f62903dba809f8a92
2023-06-13 14:38:01 -04:00
RandyTheSilly c7a8854f3f Optimized RMSERVER.py port-job script
Former-commit-id: 8ac85dff97de4dabab373fa784d6cdf3d4ae3084
Former-commit-id: af32466a41e6f152507569df651eda1fa8502ef3
2023-06-12 14:35:05 -04:00
RandyTheSilly da03e1e5f9 Fixed and re-enabled TWEAK-DEVTYPE port-job
Former-commit-id: 15038a5b6446b1356d6e45fd17111412bcd2072f
Former-commit-id: 9b6a5624f009d9b158b3ee722c2cd220582e8374
2023-06-12 13:57:23 -04:00
RandyTheSilly 43061b4fa0 List client options first in device type tweak menu
Former-commit-id: 8aebe573a8ae73026f8a7b1dca386d92fd5fd14f
Former-commit-id: 44bcf5f242b0dee634c4fea7cdae07e1a9a83d70
2023-06-12 13:42:30 -04:00
RandyTheSilly fcfa2adbf1 Optimized UNAME.py port-job script
Former-commit-id: 3b4e2b105fab3bb555dd4c6be3f421e68b808633
Former-commit-id: bd560b680c70bfb7a19d66ee0ad8eee4d99f3465
2023-06-12 11:43:38 -04:00
RandyTheSilly 28d0ba5448 Added patchnotes for backport release v1.4.3
Former-commit-id: 0a359e235d918cbb8b976c6cbc5a4c3bf7b39314
Former-commit-id: fc5920a2fa6da4ee43ef350637026c2fc157e1e9
2023-06-08 20:30:57 -04:00
RandyTheSilly 6c2d51aea6 Fixed checking /lib/sshyp instead of /usr/lib/sshyp
Former-commit-id: fc0ea87c0c15077897a5cbee7fc38b22f8022c70
Former-commit-id: e2abdc03fc4b3fa8c62f4c08164d36e83647a645
2023-06-08 19:36:20 -04:00
RandyTheSilly 2322140af7 Directly specify device type for tweak menu
Former-commit-id: 4969b540d5380edaddc26e7cd9d99a61f1a3ddbc
Former-commit-id: 9c375230650f780180d0d96952397814bc2eacc2
2023-06-08 14:53:52 -04:00
RandyTheSilly 93bffe2587 Use separate tweak menus for clients and servers
Former-commit-id: 92a7ce68f150aa223bc5a78ba02dd7cb7c07317d
Former-commit-id: 838381c35f3fec2a8780772bef8fcac33e7baac1
2023-06-08 14:46:47 -04:00
RandyTheSilly 8474807cd4 Fixed syncing over IPv6
Former-commit-id: f4a7e2b2c2273ad4d64574aca1288bc82319a2b1
Former-commit-id: e056a1b558042f572584d8a0f431bfbc4504a822
2023-06-03 20:16:19 -04:00
RandyTheSilly 227924cd81 Removed unneeded string processing when syncing entries
Former-commit-id: 2e8a632d487013cfd68ff8e2898a12b302bebd4c
Former-commit-id: 2253b64577cff33cf564fbbc31f0d2b62a39fdff
2023-06-03 19:45:16 -04:00
RandyTheSilly 1040a6f2ed Fixed IPv6 configuration support
Former-commit-id: 729d0009cf43999009d19747d70d87b2ac68b597
Former-commit-id: b48b284c1a811d5c7cb69963388f3eac0c3a1a79
2023-06-03 01:34:51 -04:00
RandyTheSilly a1ea9d6831 General cleanup and port-job updates
Former-commit-id: 343ec2505e3ee3858089ee0a4b5175c6029ad23f
Former-commit-id: 7cd32bc931d57e39166c62174561b6c7fdacb9cf
2023-06-01 23:09:53 -04:00
RandyTheSilly f36a7f5672 Fixed text formatting in device ID configuration
Former-commit-id: 7a032919fc0b9f82d861c4ec01f08cb75e6a44ff
Former-commit-id: c9cef5ee5d88027239871695e58a55f1e5fa9ac0
2023-05-25 14:46:39 -04:00
RandyTheSilly fe54acd3b0 Fixed clipboard tool warning showing on platforms where it is irrelevant, such as Termux and WSL
Former-commit-id: d979f20a0d6d24bcbe59773d6cb0d0654c06443c
Former-commit-id: b3168f92e537ec49d8b28e9e2fe8389672ae7ad7
2023-05-25 14:33:08 -04:00
RandyTheSilly 669c62510a Fixed keyboard interrupts not closing tweak menu
Former-commit-id: 76d730a63118b1e4490b6c4f8a5ca7bc84617a6b
Former-commit-id: 234c9c7ac5f3083cf9b0f3fdc35a2bce5f684d07
2023-05-25 14:15:40 -04:00
RandyTheSilly 97bce0cec7 Repeat the tweak menu after each choice path is completed
Former-commit-id: 4b49d43f13fbb006c5315e9be677bcc33dd2ac20
Former-commit-id: ac447b63ec5cb5e85dc9133466a434be0786c30d
2023-05-25 13:59:22 -04:00
RandyTheSilly 709db8f6de Re-use _copy_subject instead of _copy_line[_index]
Former-commit-id: 541227f28a7a2bbe7c5e7fe98e3223e3fb3ba5ae
Former-commit-id: 064b30c58d6905a68fa6684bb3ab17fd543f99cf
2023-05-25 13:29:34 -04:00
RandyTheSilly 273b3c97a5 Throw an error when trying to copy a line that does exist, but is blank
Former-commit-id: 15449013e83cb2454771399594305cf82150bd9c
Former-commit-id: ffe3d6a89cb1cfd86bbfb2beadce5510f143ff92
2023-05-25 13:24:14 -04:00
RandyTheSilly 657bc0291f Fixed errors when clearing clipboard on Windows (WSL)
Former-commit-id: 92b8baf923cccd20cd22cf6322c30ba1a0729cec
Former-commit-id: 8ef2d4f2fe2e3e91b820b0e0577a7fc5bd9b90ca
2023-05-25 11:29:22 -04:00
RandyTheSilly 4ec66f6352 Improved detection of and errors relating to clipboard support in raw ttys
Former-commit-id: 7b13af57872ff2bd2bf8285608b5d9a206c84fe8
Former-commit-id: 4406cd49234ff58cf568a55d07757f373830fe91
2023-05-25 11:07:22 -04:00
Randall Winkhart d061ded756 Link to known bugs list in README.md
Former-commit-id: c9212b660b38ea59b7a83d6dbbc32a8e6fa126e1
Former-commit-id: 1d63a876586e351fa23548c495d31ec941c4d8f5
2023-05-25 10:07:37 -04:00
RandyTheSilly d868476d35 Fixed use of multiple versions of Powershell under WSL (now uses only system-provided executable)
Former-commit-id: b804ff1921655a73423b67332385f7dbf5a20319
Former-commit-id: 8dfced454233d135877582617c12ec0615ba73ca
2023-05-25 09:38:20 -04:00
RandyTheSilly e594a625d9 Fixed fallback to standard unlock by converting some lists to tuples
Former-commit-id: d1f6a3af6f3904109e331ade7aee0f8747b34c9d
Former-commit-id: f8e5df1ce733d892559dd4154e79fa45dee163c8
2023-05-25 08:42:36 -04:00
RandyTheSilly 5fabdf5a86 Removed unneeded import statement and file exists checks
Former-commit-id: b20e08c31225cc085ef4dfbc801954742a59d3ae
Former-commit-id: 28edd16022adea08295a917affb85e0a3d28fb1f
2023-05-23 15:53:14 -04:00
RandyTheSilly c6951d8890 Moved all entry/folder exists/type checks to dedicated functions
Former-commit-id: a7a45850f1a808ce7e4f41d6804676650d990f20
Former-commit-id: fcddfd19d416f99ab2427ff33ed00ad980596bce
2023-05-23 15:45:05 -04:00
RandyTheSilly 8e26916bd7 Improve Termux clipboard detection method
Former-commit-id: 44ca402d01feb5aad992a77e781bc00568018e25
Former-commit-id: 0b149749308c365c891077f6f85dd5ff66212319
2023-05-19 13:57:41 -04:00
RandyTheSilly d981baab6c Save all gpg keys by recipient name
Former-commit-id: 57dfcf1f45480ddefff8821ab1b065517d6eb5ae
Former-commit-id: 95bca3145403ae542666ea004941ec5182206b29
2023-05-15 20:03:32 -04:00
RandyTheSilly ddf5fc2bc8 Silenced output from gpg and ssh auto-generation
Former-commit-id: 1d53e68b98fea537c89939dfb0f0938821bde356
Former-commit-id: be752a442af3050c406709e48b98f8d8b87ef03b
2023-05-15 15:37:48 -04:00
RandyTheSilly 2265207987 Re-implemented ssh keyfile auto-generation
Former-commit-id: fee233f5bec9c7b4edf024c09d489efebfa6a46e
Former-commit-id: d4df456842afcddca9807d5a7ae89666f65d3e4b
2023-05-15 15:15:04 -04:00
RandyTheSilly 293f9b8145 Only strip from the right when printing or copying entry contents
Former-commit-id: 67ceab321d24015a626d934f6ab56d1eaf604eee
Former-commit-id: b144c9ad791e37e07d521114a3d7baba49b290d9
2023-05-15 14:08:14 -04:00
RandyTheSilly 46dc81f0eb Strip data being copied when reading, rather than when sending to clipboard
Former-commit-id: 8b3ced0685b76b116ff9d1b7909c0d571054ee26
Former-commit-id: 34abaa4089dcad7dcc3bc3d8209d10e90915139c
2023-05-15 13:59:25 -04:00
RandyTheSilly 4894bc48e0 Rename options to arguments, flags to options
Former-commit-id: eb32adc94e5d746f42211e1a35cb507a9cfa2b6d
Former-commit-id: 0fd9c2e89778c1a8c4947436dd0bb19f551ec696
2023-05-15 13:22:57 -04:00
RandyTheSilly 0ca12cf4ab Replaced subprocess lists with tuples
Former-commit-id: 13e76157cedcc46af3b40fed5aa9e89091816586
Former-commit-id: 2ed9a7ac2ff0d1407811e89399812366340a5d3f
2023-05-15 13:03:20 -04:00
RandyTheSilly 03f011ccd0 Hid some broken output from gpg key generation
Former-commit-id: 7b1bbb84299a2693a5dd1a3018ca7aabc637f3c4
Former-commit-id: d98f1ac9192ff9c4113c0ba314f2fba1354fbe4b
2023-05-15 11:11:13 -04:00
RandyTheSilly 399d89f829 Removed "https://" from auto-generated gpg keys to fix curses display
Former-commit-id: d14833156a779ba8069db00c930ff048cc1b4ffa
Former-commit-id: c9ba8bf7533932436fd7331e6254154d3e2a045a
2023-05-15 10:59:02 -04:00
RandyTheSilly b14f925e53 Do not delete existing device IDs until a new one is set
Former-commit-id: 1f60a32e293d97059648c5c107af7e2b723f2319
Former-commit-id: 4c22d92687ccd58ddcf0cf55b0758e641b978ca4
2023-05-15 10:54:34 -04:00
RandyTheSilly f4bb0fb783 Allow configuring custom SSH keyfiles
Former-commit-id: 9c94bea462f8454ee547301f4a1cadb81251831f
Former-commit-id: 0838e13e3ff87c1be882303272246d4abc172f31
2023-05-15 10:50:17 -04:00
RandyTheSilly 453aacadbc Re-implemented quick-unlock tutorial
Former-commit-id: 30d7e1498a18409892403e580aaa16bf05fde40d
Former-commit-id: 6675cb6185ddd58f57b6b9114a18d1ccb1e7f911
2023-05-15 08:51:59 -04:00
RandyTheSilly 99379ec1b1 Fixed inconsistent spacing between items in entry reader
Former-commit-id: 268667df04d1bd7f22733475dc7079c698bba46a
Former-commit-id: 160b24686e81f304cb8426aaf043c239c2ab967f
2023-05-13 22:39:48 -04:00
RandyTheSilly 6288c45ba0 Fixed lock file not being generated in gpg setup
Former-commit-id: b9183ff7665bcc323ddcd9a59301b617794c0f79
Former-commit-id: fe1bab1c080ef4a1a9cf29a81c0e58c4e1b9fc4f
2023-05-13 21:59:19 -04:00
RandyTheSilly 53bb3dcacf Fixed errors when trying to set a device name from offline mode
Former-commit-id: f5d58f8d99fbef87cb0c44314595a4d2b7597538
Former-commit-id: 210d6f3fbc2672f53bfd438d941e0404de362d57
2023-05-13 21:19:40 -04:00
RandyTheSilly 2747aff0bf Updated port-jobs to allow for packaging the new config setup, fixed offline mode error
Former-commit-id: 511d1d887fb34b8613f063fc7992418bb614a740
Former-commit-id: 03f6817527864c52012de1d02bb2c34e8fed8a18
2023-05-13 20:48:51 -04:00
RandyTheSilly aeb3df7aed Update man page for the new tweak and init menus
Former-commit-id: 60feb572bb5b0c1a0b5b4e1be4ed3bc9c0146989
Former-commit-id: a479ae171c791277cfc305c8b780c9d239407737
2023-05-13 19:24:45 -04:00
RandyTheSilly 1ef290b289 Set success_flag when running the new tweak menu
Former-commit-id: b799bdc3b81c7e38cfad2fab46042bf25de7c157
Former-commit-id: a3e9b01e5b3c4f5f8bfb70ee94b26ea6d82cb031
2023-05-13 19:18:00 -04:00
RandyTheSilly bdedc98494 Switched to .INI config format, merged config files, finished adding functionality to new config menus
Former-commit-id: b5e877be47a49e967ced792156deb4f61841fb5e
Former-commit-id: c60df212fe964f089e246d39b3dbeaf28c006174
2023-05-13 19:11:38 -04:00
RandyTheSilly 60d3a674c4 Added basic functionality for new tweak menu + clean-up and optimization of all config menus
Former-commit-id: 59ecc6e80136bd1482aee48cff1b2b1167679836
Former-commit-id: 26043f564acf54fb97bdb3036ce48d57ee786f97
2023-05-13 15:53:46 -04:00
RandyTheSilly ebf58b7770 Initial implementation of optional tweak menu (design-only, non-functional)
Former-commit-id: 389b77adc683227597f2082920ed153d09a6cb94
Former-commit-id: 6a374155f4661d17a1939dd1911618aec76e78cd
2023-05-12 22:16:11 -04:00
RandyTheSilly 7b3270d70f Modularized configuration options for use in a future options menu
Former-commit-id: 45002b7ea5579407d47b14301b67dc0904f1121b
Former-commit-id: 4859a01aec7f9d1a70e1d887c6e4ab9a1f955fb8
2023-05-12 20:20:41 -04:00
RandyTheSilly 5e35bd7b3d Moved settings-related functions (anything that uses curses) to their own library
Former-commit-id: 95a43d9258c716c49e44020ffaec50a4b03eaaa6
Former-commit-id: 734e5249c491f87fb688651954a0ce84cd6f874e
2023-05-12 18:43:22 -04:00
RandyTheSilly c3aa63b585 Fixed clipboard tool detection on Wayland, various fixes related to curses menu
Former-commit-id: b021ed0871fb2e099ea82701378ca0876e8f594f
Former-commit-id: 21707287d99f03268c1f05eda6ab875c22272c27
2023-05-12 18:08:42 -04:00
RandyTheSilly fcca6321aa Initial implementation of curses config wizard
Former-commit-id: 430110dabec18b8e19528379e783ca9ea4e069c5
Former-commit-id: 722b819e32c838914b171b84feec9ce3526dbf45
2023-05-12 15:50:49 -04:00
RandyTheSilly d799a9d149 Added man page example for "--show"
Former-commit-id: b541410572815e9e4dce1db50b918fc5d849ba54
Former-commit-id: faa0c7cf9b4bec1e56aec87b0818bf988f46d31e
2023-05-12 08:12:05 -04:00
RandyTheSilly 2adee8978c Change FreeBSD dependencies to specify python3, rather than python
Former-commit-id: 8019c1fbe564af3969474ae70e4db7ab044ca3cd
Former-commit-id: 60b88be63ee6a3b1c63920970867bf4ca031d855
2023-05-11 19:19:48 -04:00
RandyTheSilly 63292e291d Hide passwords in password-only entries, ensure entry reader spacing is consistent
Former-commit-id: 30613971d642819f7ed40f777c966237ff592c1f
Former-commit-id: f7654f02d6c6663109c481415b2c7d4f91613a88
2023-05-11 15:48:34 -04:00
RandyTheSilly 2525260b3d Only show passwords in entry reader if command ends in "--show" or "-s"
Former-commit-id: 001d6e838c7b363897f3cdddefc5a75d581a1deb
Former-commit-id: 4e291ece75777038e1ec9547be78d5acc1a58b12
2023-05-11 15:26:26 -04:00
RandyTheSilly 50c4aa9a96 Fixed FreeBSD package using Termux clipboard
Former-commit-id: b54de0022328504eeaee74e31a495c69f7a782c8
Former-commit-id: d18f505374d1d10665d418f77642aa68428d3b23
2023-05-11 13:02:11 -04:00
RandyTheSilly a89b201fc7 Added warning if relevant clipboard tool is not installed
Former-commit-id: 2d89d7954a6d1c0133f235862e78b1bcfdcef9ff
Former-commit-id: 988a751409f02e2b065c461d4c3f723472ee725a
2023-05-11 12:11:30 -04:00
RandyTheSilly 64e56fb871 Fetch version number from changelog-archive
Former-commit-id: 017777ce0ce4bc51e5f8cc08c581501c6d9dc3db
Former-commit-id: ec36ca51fcadf38b8dea519b0fff5f80ee54ac32
2023-05-10 14:10:27 -04:00
RandyTheSilly 8062dad78d Marked xclip and wl-clipboard as optional dependencies
Former-commit-id: 18c803b31864f7759a71a2b1c7ec0b2b1cff3471
Former-commit-id: 7e92994170865b4e5b60d4bf12838e618f546dfd
2023-05-09 15:53:03 -04:00
RandyTheSilly 9eedb3c977 No longer include changelogs in distribution packages
Former-commit-id: f019cfe5a5d5080f02473123cba8e91f23821db2
Former-commit-id: a73603b784e19218c87b6602f9f52a3aaebb3e90
2023-05-09 15:32:05 -04:00
RandyTheSilly fc1c64a64d Silence existence errors when performing a silent sync
Former-commit-id: 69737630d74706da434a4e5056488124f6d59ecc
Former-commit-id: 688ff118ff212ae012def21fc2dfadd44dfcce54
2023-05-09 14:54:01 -04:00
RandyTheSilly 50ffbf2ec8 Fixed the moving of folders containing entries (entries are no longer deleted in sync mode)
Former-commit-id: 2773f7e35dc9f3bfbfb3959aff493e0f04e2a115
Former-commit-id: 9ad375002bb3942284cf93d120e3e0b21c5d34d4
2023-05-09 14:45:07 -04:00
RandyTheSilly c42cfc548e Update README.md with new packaging information
Former-commit-id: 7a0a7d5d2eae137bfd39c0890a778548f92cdb1e
Former-commit-id: 0e883e91814383b686291b5a58351ffc0d3fae35
2023-04-30 01:08:04 -04:00
RandyTheSilly 575156f2e6 Update documentation for v1.4.2
Former-commit-id: 981a958ee02d8bcd1a839ee2238fd39950cf1435
Former-commit-id: c742f69306688ea85bf0dc74e95e1b384f8f43c4
2023-04-29 23:53:24 -04:00
RandyTheSilly 1d2ffef6b1 No longer strip spaces when printing the contents of entries
Former-commit-id: b508b32ada7f5908e742d89c4f01d0f5521ece1f
Former-commit-id: c8f626440389451d760f7a856fbc709c2e70934c
2023-04-29 23:23:20 -04:00
RandyTheSilly 7fbfc50c0b Fixed decompression of Debian package in apkbuild
Former-commit-id: 73b2735b0bcf080eb043813eeeeb5b97c447e777
Former-commit-id: 6488fb9e20fd763011b8b4c1692cd8d44b159924
2023-04-28 23:11:17 -04:00
RandyTheSilly 7fe4e16fec Fixed broken sha512sum check for apkbuild(-generic)
Former-commit-id: ca921c73c331bf944e21b87ad2bc5e6397de2b71
Former-commit-id: 036094423868445e39f7a0d6cb99f0631c7d5029
2023-04-28 22:36:22 -04:00
RandyTheSilly 42791f3129 Fixed mismatched revision numbers for apkbuild
Former-commit-id: 97334d36610895c15ab51c511447197a2f13a221
Former-commit-id: b27d049b578d7cc2f4a32fcc973778f5d836ae46
2023-04-28 22:19:19 -04:00
RandyTheSilly b44f63b7fb Fixed some packages not building due to improper capitalization
Former-commit-id: 7cf48245eec6610f4394ec7d98a603da4c2e156d
Former-commit-id: 20ce5914b4e6c0fc7e715bb21db834e5e4bef17f
2023-04-28 20:21:15 -04:00
RandyTheSilly 6b80744903 Removed generic_all packaging, as it is no longer used for anything
Former-commit-id: ea39d65c0b58f670d2f8bc80f3301005251e7de9
Former-commit-id: 8cb8bb3c331618088474afaf6d075c4a2fca5223
2023-04-28 18:02:18 -04:00
RandyTheSilly d9d389335a Added ability for Arch/Alpine build scripts to use the Debian package, rather than a separate generic package
Former-commit-id: 0515dc4c09e1719b34e4119e7c60138f6fc796f5
Former-commit-id: 53690b88ce3ca098f9aaaa614ba75459c954924e
2023-04-28 15:48:42 -04:00
RandyTheSilly 8041d03833 Use more restrictive permissions on completions scripts
Former-commit-id: ebad1892f42f8017ebf584b5130d2781465b3905
Former-commit-id: 7eb5c348125061d42a12f4ef756b8ca0c8644bab
2023-04-27 16:33:19 -04:00
RandyTheSilly bbb361e261 Fixed Termux zsh completion script location
Former-commit-id: 0850fb5af085e2a4d96f4e710df94b2b49e4296b
Former-commit-id: df584b41cc4616ded2ff7679b407e15bf08bfe77
2023-04-27 16:12:58 -04:00
RandyTheSilly ddf3f21034 Fixed pkgbuild and apkbuild not generating when packaging with 'buildable-arch'
Former-commit-id: dc111ff538a770981a2d42f59740bd9dffc8f6e6
Former-commit-id: 4f8ae3f1ff6172ae5554fffd0cbfd5157570eb6f
2023-04-25 19:16:24 -04:00
RandyTheSilly 0539a3d182 Fixed over-indentation
Former-commit-id: 20226202f33008470082b174f2580b6b47c91a25
Former-commit-id: 641024c5dbc94469fcff29a3f20d0ce0815bd83f
2023-04-25 19:08:23 -04:00
RandyTheSilly d5fc92b5a3 Updated changelog draft to fix a packaging error
Former-commit-id: 76b13cb59a0c94039088f2e970f6c13f4a079fd0
Former-commit-id: 8ffa98ff35e8543b89f658c8f11d751ed4c2f478
2023-04-25 18:51:59 -04:00
RandyTheSilly ba6f485892 v1.4.2 changelog draft
Former-commit-id: b710f07dce2ea7ceb70472e0f1ba1df760d1a1ed
Former-commit-id: 26b7fdee2ee998357288421744f3cf865e2b4c94
2023-04-25 15:49:38 -04:00
RandyTheSilly 24ab17ce01 Split changelog-total into separate files by year
Former-commit-id: 72872f3938601d8c5cf12b7d1ada7694ba7813ce
Former-commit-id: 3d2b0073cb61bf5d2829f6f5918e697e0ce375b7
2023-04-25 15:25:35 -04:00
RandyTheSilly a1e1d9b0f6 Updated man page for server arguments changes
Former-commit-id: 9416fcd690c82d68bfa09ae53e3b037422d5ccbf
Former-commit-id: f3a39ad2835b0fff47ed652bb71cf5e90e340964
2023-04-25 14:51:53 -04:00
RandyTheSilly 9640066243 Added error message for whitelist removal of a device ID that is not whitelisted
Former-commit-id: 10829a9d368351b97d5391cdf20712dd9e6bccef
Former-commit-id: 1f3b47c9381ed7395654eaa9b918f0e38ae8024b
2023-04-25 14:21:18 -04:00
RandyTheSilly af655b1292 Removed interactive input for whitelist management (to match the removal of interactive input from clients in v1.4.0)
Former-commit-id: f49e2fc04e0ffd8fa231c6e714bf73354d93d633
Former-commit-id: aad37b6fbda6b0605a45a9dbe7453398a8c920da
2023-04-25 14:10:13 -04:00
RandyTheSilly d48a1af167 Fixed some unexpected tabs after running TABS.sh
Former-commit-id: a4516b08fcf43cbfcf9adeaa24603402cbace2fd
Former-commit-id: 3c93d862d514b059b4b35f33c90c9fa82d564a30
2023-04-25 12:58:14 -04:00
RandyTheSilly e35f9246ac Converted version art to multi-line f-strings
Former-commit-id: ccb4039e0c3abd40beafec79f61228183a6e07a3
Former-commit-id: 8456a21b05bd5be2889320eaf1909344a7c84ce2
2023-04-25 12:38:06 -04:00
RandyTheSilly 9d41523c32 Ensured help text is always displayed with consistent spacing
Former-commit-id: b4e9c8d48a2311c586a29afd115925611e4cbe37
Former-commit-id: 632ea6a1c09491351d0e5f5862a463098e7db6e2
2023-04-25 12:12:06 -04:00
RandyTheSilly 1f21ad571e Corrected use of the tab-stops argument in TABS.sh
Former-commit-id: 1194726925ca3cc5426835c5952875818a75782a
Former-commit-id: f687887beb8a64caf757d724eedc9f0fbf4f9f55
2023-04-24 15:33:13 -04:00
RandyTheSilly f9aaf16e13 Added dedicated help screen for 'gen'
Former-commit-id: 8ad0a1c9a2da2854d1ba93aa5e95bc75b958805b
Former-commit-id: d23abe8e29918fe40123a40d13bdc2f9d9046732
2023-04-24 15:18:20 -04:00
RandyTheSilly 6c2a2313fb Fixed regression: Visually broken help screens after running TABS.sh
Former-commit-id: 9243dda684024070c5b937416e44b5001000a376
Former-commit-id: 5dc1ee9b1f9e8c019161eb6a972346ceebd13ac2
2023-04-24 15:10:16 -04:00
RandyTheSilly 9027aee323 Fixed regression: Visually broken version screen after running TABS.sh
Former-commit-id: 3d857a5f3b83d08680961187e80b5a5b61e94a1d
Former-commit-id: b290553278bdda9f2709aa59ac6ef3fd55e7674a
2023-04-24 14:25:36 -04:00
RandyTheSilly 89b203c6a6 Removed unnecessary import statement from RMSERVER.py
Former-commit-id: 378608e93be21ad31b2cbf92ccf3a6d435b9d9fd
Former-commit-id: e171155cf8c84acd5063fa4734d7928b786aa037
2023-04-24 11:42:42 -04:00
RandyTheSilly 3c877d6e4a port-jobs: Added port-job for removing the need for os-detection via os.uname()
Former-commit-id: 640dd6a448fc9df35a20ec253e1498b142a47a04
Former-commit-id: e66d00a8bce55319c9310835b1d2963531ca34ca
2023-04-24 11:38:17 -04:00
RandyTheSilly c26975bdab port-jobs: Moved shebang swap to a port-job
Former-commit-id: f183e86fb5c748da366fc8821cfdd1f0c14c5f7e
Former-commit-id: 98b66ba0c8807acd0a4c5fcce2ba9b0f8e6e4be8
2023-04-24 09:47:17 -04:00
RandyTheSilly b04a7d2e45 Corrected Haiku package name
Former-commit-id: 7e972bc1ceef833127b2bbd06a97f77fbf73ef56
Former-commit-id: 98053d06bba57b952065e87db01be803ca0343a7
2023-04-20 15:48:39 -04:00
RandyTheSilly df262f4f37 Corrected case of file extension
Former-commit-id: 809e65bc920263978328fb96b05d1e3d2dd4d20d
Former-commit-id: 50ffffc2566d4f9b5aca8a9536c3a8a888488105
2023-04-20 15:45:00 -04:00
RandyTheSilly 17ce194b48 port-jobs: Allow server help code to be removed by RMSERVER.py
Former-commit-id: cb58ed696f9aca18b95297d784b1c021ec9f3461
Former-commit-id: b1d93eedcc74812fa68b8624c9a6490e8f58e565
2023-04-20 15:24:20 -04:00
RandyTheSilly a13f20db76 port-jobs: Allow server argument code to be removed by RMSERVER.py
Former-commit-id: 1e5c0df77643916b801a2965dddd72a2ca80597f
Former-commit-id: 42cb73d51a99a91c763cda4192ae5f76a3235d7f
2023-04-18 15:06:16 -04:00
RandyTheSilly b2cfa5d8f2 port-jobs: Allow server tweak code to be removed by RMSERVER.py
Former-commit-id: 788a356261f2bafbe66c1c7fa38204ba4f238cfa
Former-commit-id: 7ee419cde8eb74ce7bd4e2b6e671ac081dabfffa
2023-04-18 14:30:58 -04:00
RandyTheSilly 98a10cc0cf Switch Haiku packaging to sshyp-client
Former-commit-id: 04f48926a58ad5382fd5551a7b40ccd5b2ab5f37
Former-commit-id: f9e4062081c40375f01725490a38198564e787f6
2023-04-18 14:11:35 -04:00
RandyTheSilly d08e6fee53 port-jobs: Allow server whitelist code to be removed by RMSERVER.py
Former-commit-id: f810415074bcdb87725437f6ef8be775c21524b5
Former-commit-id: c2bb6e673e44b6f70b08a850a93f94c59ac44f90
2023-04-18 13:51:43 -04:00
RandyTheSilly 2d31aafa36 port-jobs: Added initial script for removal of server-only code
Former-commit-id: a5539fd86288aabf392b8f226100d232ee46514d
Former-commit-id: 19306b84cf881ba17d119675195bef84e6ab5fa2
2023-04-18 13:35:55 -04:00
RandyTheSilly 65e5c31163 port-jobs: Added script for removal of blank lines
Former-commit-id: 207f3b35f60accf85eecbd03e1fd12d914478388
Former-commit-id: 61ea79b06c1af0c70fd7cb3d1b4a6696944ca9fe
2023-04-18 12:58:45 -04:00
RandyTheSilly 4a1752f613 Increased compression efficiency for Debian packaging
Former-commit-id: 3abc9329a83ce909e1fdc14e5076ab26467f3f41
Former-commit-id: a3764576c3d668dd264c923f84a684587bfebb94
2023-04-17 15:12:29 -04:00
RandyTheSilly 47b000f416 Added WSL packaging support
Former-commit-id: 1805cf244ca2b08503cb8a0e225b106a248b6dbb
Former-commit-id: f69efe2d1735d6f729ec0d22a092c663ea6bce16
2023-04-17 13:36:16 -04:00
RandyTheSilly 727937772f Properly escape special characters for WSL clipboard
Former-commit-id: 6872560fa651713dd7fd31dacd8e872d1059013d
Former-commit-id: dc8901231a753531a19b43bb72e95b29949955e8
2023-04-17 13:15:29 -04:00
RandyTheSilly a03b250599 Move files from working directory, rather than copy them
Former-commit-id: 318fa15d5f0f2d2d9d7accc28823e6c41655361f
Former-commit-id: 90e9d83027359d36426eb6d0a4e04e401ec9e665
2023-04-17 11:27:14 -04:00
RandyTheSilly 29e7eb0f4c port-jobs: Corrected indentation in COMMENTS.py LINUX
Former-commit-id: c705f798d9365ee1e324157f2cb6c1e11f736685
Former-commit-id: 0c2368d5a15402103f0a1e09bce9e50778706691
2023-04-16 14:47:16 -04:00
RandyTheSilly ce928aba57 port-jobs: Removed comments added by CLIPBOARD.py LINUX
Former-commit-id: 49aa9c01d5ed6b8e5863bf4a071f70c2ae5c8fd5
Former-commit-id: 1cb19b41d438ab2f3a8423ced0c4cc99ae3168ab
2023-04-16 14:34:58 -04:00
RandyTheSilly 006f30a26c Fixed Fedora package failing to build
Former-commit-id: fdc66ed52e253d72fdf9e3bef5f8913a97f03611
Former-commit-id: d8b294856487cfa71dc55b136a4649a1f30d83d7
2023-04-15 18:59:34 -04:00
RandyTheSilly c65409c453 Corrected Fedora packaging zsh completions script placement
Former-commit-id: 86891713eb3ba92e67d6389ec35ae2579f513e78
Former-commit-id: 1497c278590363fe46d2a94b55231920f359df7c
2023-04-15 18:47:19 -04:00
RandyTheSilly 1c68226ab9 port-jobs: No longer remove shebang with COMMENTS.py
Former-commit-id: 7b67fcdcfa2993ef7967f2300b979c321e5966c2
Former-commit-id: 0e88fa41dcc7dfa0f1d69ebefa48c5f5d56739cc
2023-04-15 18:13:37 -04:00
RandyTheSilly bd7995fa39 Removed unnecessary blank lines after some comments
Former-commit-id: 3ebf6ef03d1ff08f5792d9637ef008c9dfbdcaa1
Former-commit-id: 4c3b2e8e44a743575d143a4c18e3b11cc69ab000
2023-04-15 17:56:15 -04:00
RandyTheSilly 6b71b81853 port-jobs: Changed method used for removing comments
Former-commit-id: 954de0d020fb579fb1355fd6918aea898038e751
Former-commit-id: 263ea195e60daddeca5c11fef2e2f5943e9a6eff
2023-04-15 17:43:42 -04:00
RandyTheSilly dd8c63631f Moved comments to dedicated lines for easier port-job removal
Former-commit-id: 674876366fda7898f6723a7aa255b4785d2b5cdd
Former-commit-id: dc0213e06fbc2bceedf7cc8d7bcc7d8737f795d8
2023-04-15 12:39:47 -04:00
RandyTheSilly 72f4bcca7d port-jobs: COMMENTS.py now acts on all Python files in the lib directory
Former-commit-id: 7cae54dec389cc649f2165cb723353ad72292992
Former-commit-id: 2ab248feeeed74b5b2ffab0d5cf8ee79955cc585
2023-04-14 18:38:36 -04:00
RandyTheSilly 7abf5c1641 TABS.sh is now able to check for and remove tabs from files
Former-commit-id: 6267fa7949d07a8498cb87d014ababab9df296ce
Former-commit-id: dad2b25c3971213a5179af19739ec03bab962212
2023-04-14 15:33:05 -04:00
RandyTheSilly 8b205b78a7 Added upload script for easier commits
Former-commit-id: 8fd9fafe1e13d524111d577647c2f8012281fca9
Former-commit-id: 8eaefd58e86ecc5911410f7f4cdab45e4f36a238
2023-04-14 14:58:59 -04:00
RandyTheSilly 7e24234c15 Removed tabs in all source files
Former-commit-id: 4bace4d00eb1fcfd9751c23c7d57c7403e0defe6
Former-commit-id: b1fcdbaccd5058fd5fc5a6ea32c7574afd6a3b9a
2023-04-14 14:52:27 -04:00
RandyTheSilly 8a0dd91201 port-jobs: Added script for converting between spaces and tabs
Former-commit-id: d3a1fcfcc5d9ddacfdbb3bae7726f978380e70ac
Former-commit-id: ab8e4e01699bbe2e98e33d11e24cce9aedf20a9e
2023-04-14 14:07:06 -04:00
RandyTheSilly 92f26c47af port-jobs: Added default behavior for port-jobs if no argument is supplied
Former-commit-id: 0af03c8af7101fead7de41f2f644ea80c38a5392
Former-commit-id: 1f9607f85ca9d1cf786741a34124eda589f3dd95
2023-04-14 12:50:49 -04:00
RandyTheSilly d706bb4452 port-jobs: Added comment/PORT comment removal script
Former-commit-id: 7dd83192d82c4c3a059b50fd6fd51f8a42d381ec
Former-commit-id: c789f40d10eee7efec8818cdae89e8edb252d7a1
2023-04-14 12:08:03 -04:00
RandyTheSilly da3938e80b Initial addition of #20 (ports framework), clipboard port-job
Former-commit-id: 2b6a931b1ae67e645a1f5dbf1b7ce51cf7c837ba
Former-commit-id: 04fffa7119d954f2c4cf41fdac01782306d888de
2023-04-12 22:37:36 -04:00
RandyTheSilly 9063d02cf1 Fix formatting of strings being fed through printf for X11 and MacOS
Former-commit-id: 1056b7c8efb6193ce4b43a7d72b2151aabee3559
Former-commit-id: c7b16925d45d3cffba08bac600044954e9561bd8
2023-04-03 22:07:00 -04:00
RandyTheSilly 8fe88a9b14 Initial MacOS support (no packaging)
Former-commit-id: 835ed80a9da57a7a40e6463f0ee822c900248e05
Former-commit-id: a3db3fbf88e8a8bcc485821a31ea4f3862a4abbf
2023-04-03 21:43:01 -04:00
RandyTheSilly 478d10384f Clear X11 clipboard with 'printf', rather than the less standard 'echo -n'
Former-commit-id: d6f994d9b0edd9aa333dcb76c34a15c26a3631b2
Former-commit-id: ad5858bbdcafec5be890e801938a0fb8f6df8a9c
2023-04-03 20:57:34 -04:00
RandyTheSilly 154905792a Added WSL clipboard support
Former-commit-id: 0d365e6ec00549a9578e7adc4330a89cc8b5dabd
Former-commit-id: 8a3fe31f06f92e4298dd21521b84500f3ca48734
2023-04-03 20:41:28 -04:00
RandyTheSilly d9873df2d1 Add distribution names to packages
Former-commit-id: 9dd795c4a3d84f7cba92c99de1389a200aad9d9f
Former-commit-id: dfd3368e54eaf4429637f27cf437d3535ae78d4c
2023-04-02 00:57:15 -04:00
RandyTheSilly 0c85703a73 Properly reset trimmed_paths for zsh completion
Former-commit-id: adda3df4ca4afbc7da162fb64592e853617802d4
Former-commit-id: 96917ce98bef0c879f392a2444f6d600589d9b53
2023-04-01 23:44:22 -04:00
RandyTheSilly 41c9d0a22b Complete 'help' if the entry directory is empty or does not exist
Former-commit-id: 1167f06b14ce50baa0c96e67a835247c6579aaa9
Former-commit-id: ea6be360d50c16579253d1e2d0b1825c5a1f1a4a
2023-04-01 23:19:56 -04:00
RandyTheSilly aa65ecf8fb Fixed typo preventing Termux package from being created
Former-commit-id: 582d5bf600455b8b494317607aa8aa98f0572713
Former-commit-id: 16f9db10858a8c3ba3f5c8e064505d4553f40b3c
2023-04-01 22:19:16 -04:00
RandyTheSilly 432a5f1e5a Update documentation for v1.4.1
Former-commit-id: 044613130dbc6d7cec9bb3a0d64f0727b868442b
Former-commit-id: 82716630a6f2395a89ed00398acea531647703c3
2023-04-01 21:29:25 -04:00
RandyTheSilly 03c8bdbf74 Integrate zsh completion into all supported platforms
Former-commit-id: 0e1e86349aaffb1269c9dd94606722779edb3d24
Former-commit-id: 3dfd223582096959789e6ce4dcf3ff5a7f3ef5e7
2023-03-28 01:17:58 -04:00
RandyTheSilly 1e0aa8aa39 Made source variables explicitly local
Former-commit-id: 0f7810121a1d7a905b10b208d0f31df2480207e8
Former-commit-id: 820c9bfcc79dadb363a1c62e615854a294b64a3a
2023-03-27 23:08:55 -04:00
RandyTheSilly 924d066676 Added source for APKBUILD
Former-commit-id: 8de8179129c2346368c65015fd91ccbc8dca0c26
Former-commit-id: b2b9f223c4dbaa571b21c19d9c41a8c50eca83c6
2023-03-27 23:07:09 -04:00
RandyTheSilly 07cfc7ddaf Fixed checks for dpkg and freebsd-pkg installations
Former-commit-id: ace1f3bd23195eaf52ea8d67dd79c40f732524c7
Former-commit-id: 23decaf206b05d7b62ece38bc332826b1da098bc
2023-03-27 22:43:35 -04:00
RandyTheSilly 6e0f19e8b8 No longer print sha512 sums, remove extra new lines
Former-commit-id: 5c37c834839bac92f6f95afd4b11abee3214a539
Former-commit-id: dca450cfb0eccc1cc9184d076979d1f74112fd2b
2023-03-27 22:16:53 -04:00
RandyTheSilly d2ee90a52c Removed the use of Bash-isms in packaging script
Former-commit-id: ce475f74daf3649b3522f865d382665fce75faff
Former-commit-id: 85b1a646261ed6dc3f80212e316a52a8cb48a1de
2023-03-27 21:55:23 -04:00
RandyTheSilly 3f4173b4fd Improved order completions are served in
Former-commit-id: e1eae46e144920b58c613d5e710d1ee30d3841a7
Former-commit-id: b6e78af74b29add6e63a708bdfc807dfe92c1094
2023-03-27 10:34:19 -04:00
RandyTheSilly fc94bfd774 Updated Bash completion to reflect zsh completion behavior
Former-commit-id: ea8d14d76e85500eb1d2a27884b068dc302ea225
Former-commit-id: c631d938ccf3aa6131f54e12249a983f74d4a09d
2023-03-27 10:12:31 -04:00
RandyTheSilly 0226180339 Use "extreme" compression mode for generic package
Former-commit-id: 9ec45bd900f397bdd9b846ec7079f3cbdc88cf32
Former-commit-id: 121fcfb0b424ee7214f2959ea807b8d4ba21b4a1
2023-03-13 10:03:05 -04:00
RandyTheSilly ed9c69248b Fixed zsh completions script breaking $path
Former-commit-id: 7179fd168dd5c5a68854a72efe6a00153b97f1e5
Former-commit-id: 3329e42498daa2a78295bcd8949d8c7281d3575b
2023-03-09 16:24:47 -05:00
RandyTheSilly 902e041f51 Initial zsh completion support (for generic-based packages)
Former-commit-id: 17f1773c8653e8525fd58380a34f6574473ed62c
Former-commit-id: 3c90b366b8c9ad3c083110d0c9b0f19080fbdea7
2023-03-09 16:04:17 -05:00
RandyTheSilly 648bed832f Made Bash completions significantly faster, temporarily ensure recursive globbing is enabled
Former-commit-id: c974ce1e0cb0198094d6ece325ab3216f1925f36
Former-commit-id: 762562fbbdb298f4b13210d0014a942b430c1197
2023-03-08 23:00:53 -05:00
RandyTheSilly 843dff6527 Use globbing to generate entry list for shell completion (faster)
Former-commit-id: ea8212223896fc86368f772f43053f6ee8742068
Former-commit-id: 5f35b58014dcc00cb733d4980e28157e4de1ffcb
2023-03-08 16:19:02 -05:00
RandyTheSilly 4f409f62d6 Fixed FreeBSD package failing to build
Former-commit-id: f46fcd366860da4917ee07057fbf4ef5fe84061a
Former-commit-id: 78e1eb488bd424f6f31f359d69d825504a3718b5
2023-03-04 19:27:33 -05:00
RandyTheSilly 21550ddef2 Update README.md
Former-commit-id: 8ed1c84d8ddee05e079af95e963409c9fa54af3a
Former-commit-id: a69fc21e3f566fba1e69dbd0dc44525c1fd3a34f
2023-03-04 18:33:22 -05:00
RandyTheSilly c7dfb6a419 Fixed location of Bash completions script on FreeBSD
Former-commit-id: b748400bfe2e1f0f2a3635236a7273f434ae193b
Former-commit-id: b5b31147f3de254e53da92191597fd4c9d5cb53b
2023-03-04 18:16:39 -05:00
RandyTheSilly cc5d54914c Fixed folder names occasionaly not showing in entry list
Former-commit-id: 396b2d4b97957453cd735750f4ec5a7bb9f1e233
Former-commit-id: ce0c40855327d6263f0fbdc445f8abf1fb0077e7
2023-03-04 16:28:34 -05:00
RandyTheSilly b090c24d59 Update documentation for release v1.4.0
Former-commit-id: 25559878dca6f91567805473078398b7b6728126
Former-commit-id: 1f88fe4849e4f0d26d32fa69a772ca9863d53c42
2023-03-04 15:05:29 -05:00
RandyTheSilly d1a994a103 Better detect whether user input is a file or a directory (re-write of rename())
Former-commit-id: b74a0973086ecf9967e40024e75a4c5cab730801
Former-commit-id: ea1a29a39eee6fa5b1da12f83455d3ea7da6c00a
2023-03-02 01:32:40 -05:00
RandyTheSilly 6584686b2c Copy new expanduser() usage from sshyp to sshync
Former-commit-id: 5a9e2f23d2e2b74901e94424e93e59b30b10782b
Former-commit-id: 3c92a86c2751499484e78eaf86b6d193f6a4511d
2023-03-01 23:59:55 -05:00
RandyTheSilly 0109816d3d Use global entry_name with the leading '/' removed to avoid double '/'s
Former-commit-id: 34e94942853ab637b15eef31701e5fa7e7b72160
Former-commit-id: f5db9245053daf860e533b96cc0ed02f31edee58
2023-03-01 23:46:40 -05:00
RandyTheSilly 30962b8cb2 Fixed a regression causing server arguments to be unusable
Former-commit-id: 89be58bc3a1ce059a4fbbe69a5a36498808f5f04
Former-commit-id: bc6d77c6b4c848905acf155d11a49283025941ff
2023-03-01 21:46:25 -05:00
RandyTheSilly fbf5ac02a4 Fixed the read shortcut showing the help menu
Former-commit-id: 52a2e39bf3449cdaa82ef6c4f224e8f78c103528
Former-commit-id: c7a99441eaca0b3306b4b11e3ae61053a002ef02
2023-03-01 21:32:35 -05:00
RandyTheSilly 6649fce7d1 Fixed typo in help text
Former-commit-id: 48012c99981d329b4a1753186c8e1b10d6d2997a
Former-commit-id: 4a760cbb9d292a086a753e4952955f3e1816a669
2023-03-01 21:24:11 -05:00
RandyTheSilly 6375a086cc Saved the home directory to a variable for efficient re-use
Former-commit-id: 510d5d3f5ffc28ddf678c826919c4bf0f48e3197
Former-commit-id: ec05cf8d96f98485d7dc4f94bb8fef302066ee20
2023-03-01 21:05:44 -05:00
RandyTheSilly 43a53070a8 Use os.path for checking if files exist, are files, or are directories, rather than pathlib.Path
Former-commit-id: d7cc6ea6b6028f31729518ff20a267104196533b
Former-commit-id: 442527f45e5354c710d2328a9c1c6c79cef3d0bb
2023-03-01 20:08:39 -05:00
RandyTheSilly 16f1225621 Added missing function comment
Former-commit-id: 623987f9ecefc09e698f2229a38f505835e0e2d7
Former-commit-id: f16903cda0f49d4bbb701158d1d49b14bc1fe757
2023-03-01 19:33:38 -05:00
RandyTheSilly 99cf9b7413 No longer display empty directory notification on the root
Former-commit-id: 86b964901547d3daf607583da762b1e10426cc3a
Former-commit-id: da5e860b1e237b82e0a9525ff451f17825c6ac88
2023-03-01 19:30:15 -05:00
RandyTheSilly 7d26170d7f Fixed 'version', '-v', and 'license' arguments causing an unnecessary extension check
Former-commit-id: 1841bca9844455a8f11408a7adff67c399246397
Former-commit-id: e24216f8c11eeb1bf5bf946d27c8f82055778a88
2023-03-01 19:16:10 -05:00
RandyTheSilly 6907c10f81 Re-wrote entry_list_gen to be much smaller and more efficient/less buggy
Former-commit-id: e137203efee4415ce6a368f599d9afd26c271075
Former-commit-id: 7c914ef2d682a6b61469217f537a65607c305cb4
2023-03-01 16:48:24 -05:00
RandyTheSilly a5d36bf6b4 Prevent errors when checking for extensions if there is no extension directory
Former-commit-id: edb03fb89643e74d28bdbfa20bef5deb4da62e49
Former-commit-id: 306b9928f47d1fe6880ca30c91adbb001b4684f3
2023-03-01 16:40:58 -05:00
RandyTheSilly 24ae771b85 Updated argument help text
Former-commit-id: 6e5eb93fb268bab785460efe1abbaa5808bf131d
Former-commit-id: fb77cfc0bba7723b4d8add73014643dd8314419e
2023-02-28 17:08:59 -05:00
RandyTheSilly 0429070b5d Removed interactive entry prompt
Former-commit-id: 83c9d7e9ef2c54cf33f0f0d6827929928359d1da
Former-commit-id: a907b990c17f2931a3a38777bf5e11752020efb9
2023-02-28 16:53:26 -05:00
RandyTheSilly 6aa9a663b5 Fixed gen arguments preferring update mode regardless of arguments
Former-commit-id: 6854fff9cce1db65f4784265f3ba4bfc1efa33a6
Former-commit-id: 67a2d47e1f6ccd8bf6bc957aec575c72d8c8ff90
2023-02-27 16:17:16 -05:00
RandyTheSilly 2c17a6b711 Corrected server help text
Former-commit-id: b15932ce8632fa8d5c2f2306c78856c7c6853e14
Former-commit-id: 29c7ad88892f1826162831c34e673ced349384a1
2023-02-27 09:59:08 -05:00
RandyTheSilly b649ae2c16 Fixed server index errors and whitelist arguments
Former-commit-id: f9c34c4a4f02dfc88934e17ac8b8fa0f2e190f29
Former-commit-id: bd9fa9d1ea95a5092218b21df2d38a105ee5f6e0
2023-02-27 09:51:33 -05:00
RandyTheSilly a0b533d9dd Fixed failure to pass entry names to extensions from typed arguments
Former-commit-id: 4a2828e1c5f0ea098ccc7c8d8dbef7cf9a8a1964
Former-commit-id: c66bae1cb6cbe49a50a838f96528c3d08cdabf3a
2023-02-26 16:42:14 -05:00
RandyTheSilly 4c78ffb0de Exit after running an extension
Former-commit-id: 5166d0902a517b5d3a7a467854acce89b08b42a0
Former-commit-id: 948e9120bffea0ba6d8d96ac8e0f074df7d6984c
2023-02-26 02:22:55 -05:00
RandyTheSilly a2f2525df1 Added more advanced extension integration - extensions can now ship a config file that allows them to be ran by passing arguments to sshyp
Former-commit-id: 249674dd5fd66b064365a192f3cd43e200e3bd34
Former-commit-id: 4df1ffcf3152ca19d6c9afd69f997efc3b650ad0
2023-02-26 02:19:20 -05:00
RandyTheSilly eefedde98c Follow-up to previous merge
Former-commit-id: bd62ed039b6464e3efd1f733e5644a0ab70f3c20
Former-commit-id: 9fa2ac0f23e6235164f0742f8cf6a1850b9d2120
2023-02-26 01:04:36 -05:00
Randall Winkhart 12cbcdd9af Merge pull request #25 from AntonMcClure/main
Make some errors more descriptive

Former-commit-id: 52aacffe3aa69de821a7a5e4e0e30ea99db3e186
Former-commit-id: 9be8cfc9a5f94160bbc526b5e8d0130abf9ce800
2023-02-26 05:55:01 +00:00
Anton McClure 5219bf0448 Make some errors more descriptive
Former-commit-id: 5667d12d7e66d63b9dcff66dd30494c742c512da [formerly a8d1754f72]
Former-commit-id: 077eddc1625268631f126935a414c728c558c38a
2023-02-25 18:24:29 -05:00
RandyTheSilly a91c48533c When shearing, send "None" for shm instead of "0"
Former-commit-id: 6882b4cf064dac1465bfe06bd5c837c149e0f5cd [formerly e30ce078d5]
Former-commit-id: bca35d2da074b16b8cdf39b0d3d609b95b9ef059
2023-02-25 15:28:30 -05:00
RandyTheSilly e22066f015 Replace lists with tuples where applicable
Former-commit-id: ed278028301b757771eceecbd3cf4b5786d7c7d7 [formerly 900482c530]
Former-commit-id: 9c88ce5e0769e077c9eeacd318d4e7f6a023d89e
2023-02-25 04:00:27 -05:00
RandyTheSilly d1cc6fe3e6 Made errors containing entry names reinforce correct syntax, fixed various errors in gen() function
Former-commit-id: 9af80b41e297c4878eb0ddd10d977bab95fb1879 [formerly dd036042f3]
Former-commit-id: 367b2d491fb966783e473ebfe25e3479dbfb90d3
2023-02-25 03:54:50 -05:00
RandyTheSilly f9ad813ce6 Use clearer if/elif "in" syntax where applicable
Former-commit-id: 5af1dc46cedffc49fb0f151dd9877d0ca7f5b5e0 [formerly 6457ff7acd]
Former-commit-id: 050a84cc0a572970407a8198418e04ef7c8e0552
2023-02-25 03:31:36 -05:00
RandyTheSilly bee3149c74 Remove "delete" argument of whitelist (now just "del")
Former-commit-id: 7579fc06b08917e3c7ea02cc2769df7f48044b82 [formerly 8dfdc2ff8c]
Former-commit-id: 6b2ff6e8853d206ed063e17f38e62d2f9562bed8
2023-02-25 03:07:29 -05:00
RandyTheSilly ccee566a22 Re-separate server and client arguments
Former-commit-id: 6e76d9689c18d886c502008768fa65842896e02e [formerly beab695605]
Former-commit-id: ecbe41716fe817a81883f8006c4be5071ce974e7
2023-02-25 03:04:37 -05:00
RandyTheSilly e511159a6c Fixed all invalid/help arguments opening the shear dialog
Former-commit-id: a31adaa5d65742c5384765791d2bba5203525632 [formerly efdd32bd07]
Former-commit-id: 982fee2b669b9cd9c106a3923bf402af11be1855
2023-02-25 02:43:53 -05:00
RandyTheSilly f5bbe9516c Fixed various index errors
Former-commit-id: 96d8a1a3c2f2762ccd3cf1a8ccca9cce0227357f [formerly 3b92989abd]
Former-commit-id: 924b05ecbd436b285afa9ac45b5f46cce702230d
2023-02-25 02:41:59 -05:00
RandyTheSilly 6bbb84e1c0 Fixed incorrect and unfinished arguments throwing an exception (they now show the help screen)
Former-commit-id: 66269ca39397ade2d8b27f75b18aa5ddd48f5b32 [formerly 71cd1f7824]
Former-commit-id: d8aa34d767f05063265550db0d6bee73a11833ac
2023-02-23 23:47:50 -05:00
RandyTheSilly 39dbc1c83d Updated help menu for new argument system, adjusted exit codes
Former-commit-id: 4c326eb4668fcdb2cacc7b86d800a4f941c4630c [formerly a068d19aeb]
Former-commit-id: ed67ead67fc4a23eb11df52a7627d79a09835589
2023-02-21 16:58:29 -05:00
RandyTheSilly 1d969cc1f1 Removed redundant server help list trigger
Former-commit-id: c4e3b5d8f264d59b655e9c557e17c2948df443db [formerly addb022772]
Former-commit-id: b47a2cd8dc98eb8e11fdce194ac83ca9e1c3d61f
2023-02-21 16:23:59 -05:00
RandyTheSilly c5dd735f7a Removed "-rm" and "-s" arguments
Former-commit-id: 101783c23034a85ad4d9af5e3527125b61fe9ee8 [formerly b925a7bdb1]
Former-commit-id: 317109e8a0755ac530be776c2d9c3969a907ec2b
2023-02-21 16:20:53 -05:00
RandyTheSilly bf8adfc1c1 Fixed syncing after incorrect arguments
Former-commit-id: 3fbc4a6717f8a56ae5419fe612479b30c7ec83a9 [formerly 92871d85d7]
Former-commit-id: 1beb51fd5844ef37a6be3db88ccfcd5422ba9cc5
2023-02-21 16:15:41 -05:00
RandyTheSilly 764d165ad4 Disallow any additional arguments after "shear"
Former-commit-id: 9e523edde7e05634020536cec6e6a3100e298c42 [formerly 2f795b4d03]
Former-commit-id: 847c509f7977ef8aad1582c06be056d1347aee2a
2023-02-20 18:04:37 -05:00
RandyTheSilly 9928a43d6a Automatically add backslashes to arguments when needed
Former-commit-id: 7a31d3cebdb03af4c2067437d4a983293fce36ba [formerly 2fba1262a1]
Former-commit-id: 568c22399a1bea5a63bbde22f6710b287127acda
2023-02-20 17:56:25 -05:00
RandyTheSilly 25121f3a5c Removed broken space replacer
Former-commit-id: 071e2959241ebd7c08b5692d6907f73a1186ee8b [formerly 3cda23ad3d]
Former-commit-id: 58664b2a6205f5806cd0f5b1a469703fea131b58
2023-02-20 17:34:43 -05:00
RandyTheSilly 2c78a1456c Switch to mapfile for a minor completions speed improvement
Former-commit-id: b1c6d34c450dc0adb6df20fa25a7fa53c6c39ccb [formerly 1975424886]
Former-commit-id: 9add0ef201cc8f3c934af91c51aad94057d2e9e3
2023-02-20 16:49:59 -05:00
RandyTheSilly 6173a11710 Updated bash completion for #24
Former-commit-id: 26affc44102cf433a6bfe5fd37b19af1b0561723 [formerly eee0a3c3e3]
Former-commit-id: 94cc077612720161ba0f9d6d5766dcdf28548801
2023-02-20 16:36:30 -05:00
RandyTheSilly 52e41dfab8 Fixed various issues with arguments being parsed incorrectly
Former-commit-id: 33b6ede60dde3e3b5dbf8e412f827ff6d1452bde [formerly aa97e0237b]
Former-commit-id: 5e877794d8deb327d82a6e37eb601551865478dc
2023-02-20 14:12:54 -05:00
RandyTheSilly 8b0f25479d Combined similar conditions
Former-commit-id: 6e09e1c73ad82a7e5054aeeeda530caef3eda4f8 [formerly 563539bc2a]
Former-commit-id: 27471ea558e589177e5654cce9ed8ae554b6381f
2023-02-20 00:35:27 -05:00
RandyTheSilly 0a210d0395 Removed unnecessary if condition
Former-commit-id: 0bddbb3e681d41d656a156c477475ea4179ef036 [formerly 6857fe3c09]
Former-commit-id: f84f4e373e249d3b97106e16ab7e8cf3459eecd2
2023-02-20 00:14:01 -05:00
RandyTheSilly d29bee2d45 Save the value of arg_start+1 to arg_start_p
Former-commit-id: aa0755682280c2ff0f76da1f9c4f0d176a64a597 [formerly 93af84766f]
Former-commit-id: b96fff1ec454efcbefee17e990a749775a30c31d
2023-02-19 18:33:09 -05:00
RandyTheSilly 052a489bec Made entry_name_fetch()'s parameter optional
Former-commit-id: c7181ee1ce82cc2c198a1a56aa6b4e4da5276918 [formerly 8d302f52c2]
Former-commit-id: 915bac272cef2dd7a0fc3efab39f5a8ead5a0e43
2023-02-19 18:28:04 -05:00
RandyTheSilly b458265fd1 Addressed #24 - Made the argument order more natural
Former-commit-id: 985964af85c2a2fca392819c3703fd395071ac62 [formerly 1e7328fded]
Former-commit-id: 4fae3305d8c579a8055af0855566b3273b640998
2023-02-19 18:19:27 -05:00
RandyTheSilly c916a738a2 Organized argument parsing order based on use frequency
Former-commit-id: abe9564140372b6d430b4082441fcd3aee10f297 [formerly d7091e5157]
Former-commit-id: 24deda9095e4301c4210131e9616e2857aa94108
2023-02-19 02:41:56 -05:00
RandyTheSilly 9c5b007946 Re-write of argument parsing (enables future changes)
Former-commit-id: 0c0b58ada444e1194e9a23cd20c141edaf702e24 [formerly 06106e7bc3]
Former-commit-id: 86880d13ec8240afba77d8412157bdd1a683ad7e
2023-02-19 02:00:52 -05:00
RandyTheSilly ff1c984024 Fixed IPv6 configuration
Former-commit-id: 1a67fee5b7398b0e720e4e2addd847525c1d7844 [formerly 8b0b802dfd]
Former-commit-id: 4a039a911e0155baf624712a1b3886302465cb65
2023-02-15 13:36:20 -05:00
RandyTheSilly 164c719b90 Revert seasonal colors
Former-commit-id: b16327bb9e27a29c7c448e9cfb59614b5a0a5b02 [formerly 75f469b6ba]
Former-commit-id: 992f0ad0f8880d113978e7a22ec9e9b74d228dd2
2023-02-15 13:07:54 -05:00
RandyTheSilly d49ce1bb87 Optimized usage of str.split(), use str.splitlines() where applicable
Former-commit-id: ef4dbc238eb361170b5e9ec06fd337a34082b53e [formerly 2f738a4e89]
Former-commit-id: 439398077bf543f0fc37f5ea01340a224761d9eb
2023-02-15 13:01:19 -05:00
RandyTheSilly 800a1181f8 Correctly split in IP configuration instead of strip
Former-commit-id: b72de4eefa64e5f871076f8c633512ecd86c7a3d [formerly 5efc2d8a21]
Former-commit-id: 6ab008a6779650acb839d54defc7d33f16d9d243
2023-01-16 19:16:49 -05:00
RandyTheSilly d9414dbcdf Added IPv6 configuration support
Former-commit-id: 8111c5a2aac95f6134db4dccb946a353bfc9d893 [formerly 18d32939f1]
Former-commit-id: 7f0cfea9d2161feccb1f5c3ec67a908838f5e088
2023-01-16 18:48:14 -05:00
RandyTheSilly 0869b83505 Replaced += with .append when appending to lists
Former-commit-id: 923f6784af9b4b773ced26888e0b89f8cc3c02ff [formerly ced260d6de]
Former-commit-id: 85cd6ead668fa86083a8eb60da46b202de42cd6a
2023-01-16 18:19:29 -05:00
RandyTheSilly 7dfa12012a Bump copyright year to 2023
Former-commit-id: 66ea83d57a820d95e38af3ac897e0ecb2a6ae4c1 [formerly cfac8ddc3b]
Former-commit-id: 00cdceec419234325784b50a70a892bf960a604d
2023-01-11 16:11:06 -05:00
RandyTheSilly 921630f5a8 Re-organized badges
Former-commit-id: b6055b13fc6cdb1b629ea4a76e3f5997fbbbf33f [formerly fdc014c44a]
Former-commit-id: 3c86294a4149f4395a2314e58a8c0d1aef4a43fb
2022-12-14 02:52:23 -05:00
RandyTheSilly 627c6a1a14 Update documentation for release v1.3.0
Former-commit-id: ac89c761d964360d80863c926f908d937ed00865 [formerly 697f7a870d]
Former-commit-id: fde0008b65ef6135476a448dd1cc768a7e511cb8
2022-12-14 02:40:13 -05:00
RandyTheSilly a9f4435493 Replaced use of system-provided chmod and find with os.chmod and os.walk, respectively
Former-commit-id: 89be833d3e15aaf00578a093ce5b5efb8c3b84f7 [formerly bad92878e4]
Former-commit-id: 1871adcc80cd91666325fe0a3db3771c9256357c
2022-12-14 01:05:22 -05:00
RandyTheSilly 7d639ecca9 Use getpass() for quick-unlock password input
Former-commit-id: b7312096d7b58ddea540f08064ea536fb6d0543c [formerly b4fb37d877]
Former-commit-id: 672c2e53a6827119a85a41e435508453f693009e
2022-12-11 18:21:31 -05:00
RandyTheSilly eefe5e39b5 Fixed deletions occuring after the local index is generated, causing sshync to believe sheared files still exist on the client
Former-commit-id: 0f303028224689cb7b5e290d28ad30d7ea0a0776 [formerly 4ebbf7847d]
Former-commit-id: 348fa6dcc8b6f35c102c9cd9c3912d161bc200e7
2022-12-07 22:29:15 -05:00
RandyTheSilly c28b836c2a Updated packaging script to accommodate the removal of sshypRemote.py
Former-commit-id: ecdc146022c96c463d4ce0bbb3601eb2f128b582 [formerly af44f244db]
Former-commit-id: 42e50a6d827987551163a386b78c487502defe8d
2022-12-07 20:43:56 -05:00
RandyTheSilly b53370a3e2 Strip entry/folder names after user input to ensure compatibility with sshync
Former-commit-id: f07a48fc2bde0d651199d62cb0f35a1c18f51f8e [formerly 9d8eca3a2b]
Former-commit-id: 438ac436902369f1af4dc8dae5abc38d7e6dabaf
2022-12-07 20:27:39 -05:00
RandyTheSilly 9776961f2a Assigned exit code 6 to "server connection error"
Former-commit-id: 34c2312b779b7c0f6e6dfcd1e9b4d7e700229142 [formerly b24d1df721]
Former-commit-id: 72c0e4cef04abd78bffb3731434c55cf9998eb7b
2022-12-07 15:55:01 -05:00
RandyTheSilly 1a35aaf33b Combined all list fetching functions into one to drastically reduce the number of SSH connections (speeds up sshync exponentially)
Former-commit-id: 11290b3915a2f3d92696e0953997c3fb293ec7e3 [formerly 6080726dc6]
Former-commit-id: 3f799d1c8e2d3cd694cad90ba9f4444bb2673934
2022-12-07 15:46:33 -05:00
RandyTheSilly 66b15ac22c Organized functions in sshync.py by use method
Former-commit-id: 1bbcac88ffe5c4d08aac1f34c1a40ce0fbff092e [formerly a49334482c]
Former-commit-id: ba2ee6fa69228ef2fe52560f4aa22c39ec69c9ab
2022-12-05 23:21:02 -05:00
RandyTheSilly 56db2e65f8 Moved all syncing functionality into sshync.py, removed sshypRemote.py
Former-commit-id: bf7833a21db35a7d33fdd89ee8a41775fd2f55c0 [formerly 56ea8d0cf9]
Former-commit-id: 820f85f9b0efc8a33ebf8a33f751e8f130fc8c34
2022-12-05 12:13:28 -05:00
RandyTheSilly 1be67d404b Call specifically 'python3' over ssh, as some environments do not have a binary/symlink named 'python', or 'python' may refer to python2
Former-commit-id: db4e264c648a05a9d0293873c5ffae6173e4f8a0 [formerly 6f016bfb0a]
Former-commit-id: f4635300ddda1927fa89b63edf0dc0be7729abbf
2022-12-05 09:36:37 -05:00
RandyTheSilly a279819260 Replaced use of system-provided 'ls' with 'os.listdir'
Former-commit-id: cbd6302ec15624381303d1181861d3c2792475a6 [formerly 31a4c7b8e7]
Former-commit-id: acd4d9db5d557793aca4662e48ca88320b7a3bfa
2022-12-04 18:57:23 -05:00
RandyTheSilly 578f7dee14 Replaced use of system-provided 'touch' with pathlib's Path.touch, added 'mode=' when specifying permissions
Former-commit-id: 7ca6d3e2ef3ff494932a849d9ea576218ec5e054 [formerly 45e2b60e10]
Former-commit-id: b477cbd7b3771aa8a513d4ef481e725c59b4bdf4
2022-12-04 18:33:41 -05:00
RandyTheSilly 5bec4fdaa9 Detect Wayland sessions by checking if $WAYLAND_DISPLAY is set
Former-commit-id: 584427e2b5f0d8a1cad1c1fa30b5024d976b9a14 [formerly d7987a1bc0]
Former-commit-id: c79d54b2d7fb8ff2f1283c388ad5aa1c16a7dcd1
2022-12-04 17:45:50 -05:00
RandyTheSilly 5f903966da Re-ordered clipboard support to match support priorities (Wayland first)
Former-commit-id: f14120402a6fde4a3d3124b7965e1ec5de70d8b4 [formerly 952fdd160b]
Former-commit-id: 1d96d2fbfda35b617ec7cfef1530bcba1d650601
2022-12-04 17:38:10 -05:00
RandyTheSilly cfd551ef7c Replace occasional use of system-provided mkdir with pathlib's Path.mkdir
Former-commit-id: 72c92e8f07ad9f3933c2593f426e2c05b194c3b3 [formerly c8c394e550]
Former-commit-id: d6eb5469dfd16a538da5fff5dcd6525aa3995234
2022-12-04 15:31:31 -05:00
RandyTheSilly 4d22b5b5a8 Removed all remaining instances of subprocess.run being called with shell=True
Former-commit-id: c6d663cf3af2e5a06f13e5cb3571d668880f6d6e [formerly db4351469e]
Former-commit-id: cba35421c41474e5daf5315f34b1f6d86380bc24
2022-11-28 14:17:26 -05:00
RandyTheSilly 46d5f8d515 Replace remaining uses of system()
Former-commit-id: 5a8ca97389b8d37c8050ba23d1e455357f5be0b1 [formerly e8703300fd]
Former-commit-id: 81b4d2783d5b09cc31515ab22f0f42e5ed55218b
2022-11-28 13:38:17 -05:00
RandyTheSilly 02ee2a5c0e Allow Haiku to use default pinentry, thanks to haikuports/haikuports#7457
Former-commit-id: 70edaa9d4c2a88d483d1247dc5682a30f0d593e5 [formerly 322db7ac54]
Former-commit-id: 6677ac5f2ae91f5b7a8c6656432ef962013592ff
2022-11-28 12:52:54 -05:00
RandyTheSilly fb1c3844a8 Use XDG_SESSION_TYPE to check for Wayland, rather than WAYLAND_DISPLAY
Former-commit-id: 4598a3038d49df81426dfcf2a29a366ea6bc4c74 [formerly cc81f219fa]
Former-commit-id: 4c8b1ddc2d9f7cee44007de0e2ae4cbea882a20e
2022-11-26 23:57:12 -05:00
RandyTheSilly 213ca41582 Renaming no longer throws an error while not in offline mode
Former-commit-id: e69e157a951cfc4151e3e511585c04a24b5a08ee [formerly bf20b83738]
Former-commit-id: dd90cb9f0518b9071b170a6b549cb71a352cd249
2022-11-26 15:18:47 -05:00
RandyTheSilly b8dc5c4f89 Move some rarely used import statements closer to where they are needed
Former-commit-id: a4785c178b5da044d1cf2ec2ecb2868ed8e3e877 [formerly 74f9f616f3]
Former-commit-id: c7c06f402627cc0169ed9e654086e89123639902
2022-11-26 14:05:19 -05:00
RandyTheSilly 574637392a Reduced code used for clipboard support
Former-commit-id: 2a7ac0d078526e60f742f8bdee1689f9f27df3f2 [formerly daf3f0d7bf]
Former-commit-id: d4d0683c63e19c3b9fdc33d02c105244e037035c
2022-11-26 13:53:47 -05:00
RandyTheSilly c6f31da6d4 Replace all currently replaceable instances of system() or run(X, shell=True) with run(X, shell=False) for security and compatibility
Former-commit-id: 8e316228ca46dbe9e6811625281c19a1118ff650 [formerly dc218025a7]
Former-commit-id: 7d19e68ccbd2b844ab00df8db69bbf08b9a1884e
2022-11-26 13:19:09 -05:00
RandyTheSilly 0f4c57bec3 Attempt to create ~/.ssh regardless of OS
Former-commit-id: 424cb44c13e9512d57cf6e04215cf975421e1336 [formerly 3a63966827]
Former-commit-id: b5847a53398576802f71ecddf005606de6d97481
2022-11-25 21:40:23 -05:00
RandyTheSilly 51b1b8c6ec Use os.symlink in place of shell commands
Former-commit-id: 3c62f4bb691a7c8d4b7419697c0e81e5826de736 [formerly 3ad2068b11]
Former-commit-id: 6fd9419e1904efabae07af45293da4f56c3b3188
2022-11-25 21:32:18 -05:00
RandyTheSilly 5f0a40efc0 Removed exit code 6 from man page, as it no longer has reason to exist in sshyp
Former-commit-id: 56f1761cbc55f7a348db132dfd7a8714bfe2fac7 [formerly 9b9f49a344]
Former-commit-id: 205e9dbbff27b8732024a8e602786afc104f050c
2022-11-25 21:17:41 -05:00
RandyTheSilly 05c034652f Replaced database downloads in sync() with newer output capture logic from sshync - much faster syncing
Former-commit-id: f6a9dce34263b3385440e6c166f9880f4781b5d5 [formerly 8276b9164e]
Former-commit-id: 850bf5889c2cf401ad9e91da5512a7455a353e6d
2022-11-25 21:11:07 -05:00
RandyTheSilly 1d185b1723 Removed useless pass statement in sync()
Former-commit-id: 12eebb98186597f164a3cc38306f67758273e506 [formerly dce6ad4390]
Former-commit-id: 4275468f89557716a8eec72183caaf2eccd5aad4
2022-11-25 19:37:13 -05:00
RandyTheSilly bca2af0ed8 pass_gen no longer recurses when the user gives invalid input
Former-commit-id: c9756093cd861911b7f5dc05a71fc5a8b858c17e [formerly b10c111640]
Former-commit-id: c8b7974ec39c4e114578314814c5c2a982339736
2022-11-25 19:23:14 -05:00
RandyTheSilly d301cf6298 Import os.path.expanduser directly to remove lots of repeated text
Former-commit-id: 247c04a8aa9720fd0a06a128d292a21cca2cf08c [formerly 3a96ef29dc]
Former-commit-id: 3f97f7d5199c477f311789a6c5c3f38c4624d10e
2022-11-25 18:45:06 -05:00
RandyTheSilly 89c9a03cc1 Use subprocess.run without shell=True where easily applicable, redirect unused captured output to DEVNULL
Former-commit-id: bae14d658f4e1fa04f723e8545bc35d69e0c4cbb [formerly 3a85f06ffe]
Former-commit-id: 7b7b48c870b9a6d4646d9be3d208ea792e665399
2022-11-25 18:11:38 -05:00
RandyTheSilly 3392e3ceea Use ASCII 30 and 31 as separators, removes limitations on "@", "^&*", and "*&^".
Former-commit-id: cd08e1adde9f810e0099338722b617357055c422 [formerly 289d12f45a]
Former-commit-id: 7f70d015e3afe2101aba2d1d21001101db0de81e
2022-11-25 12:00:51 -05:00
RandyTheSilly 176ee623cf Replaced sshync mod time/title retrieval logic with much more efficient and compatible logic
Former-commit-id: a9107238fd80398b570ca04ac36e212bcb3c0ddc [formerly ae5172a6c8]
Former-commit-id: 4984678e5544d0594bbcbe10b23100427ca2e8b8
2022-11-24 19:40:04 -05:00
RandyTheSilly 42abb7b674 Corrected Fedora packaging
Former-commit-id: 5fc5021f68b98bcb71df7794f2c7961445926c38 [formerly d1c968ed12]
Former-commit-id: 7386503874acef51bb1f02b02eab4637b94dff60
2022-11-06 14:00:51 -05:00
RandyTheSilly 3a6655e977 Removed '~' from generated filename character pool to avoid issues with quick-unlock
Former-commit-id: bcb77c5030c48693bcd0a479f7576e6ddc4d6729 [formerly 109141a266]
Former-commit-id: b7bd4134b3bee5760aaa56064a1ad9b29957fa1c
2022-11-06 13:25:35 -05:00
RandyTheSilly 9d1f0a065b Corrected date in man page
Former-commit-id: 61310403c6cfe504e1b8453c29e564459cd08bef [formerly 57cc730d92]
Former-commit-id: 3f614eb15a35f252188ee0a807c5b324ce409084
2022-11-06 11:21:21 -05:00
RandyTheSilly 8298966d8f Fixed documentation location in Haiku
Former-commit-id: 4d7a9a8f9b18efd21cb4273dc2dcaed189fdd21e [formerly 790ac573e5]
Former-commit-id: 2d7cb8bb642a96080be8c6396506cd7257d76bca
2022-11-06 10:50:25 -05:00
RandyTheSilly d4d9fb88fd Updated quick-unlock failure error message
Former-commit-id: bd491483ab2b0d09ccfb6c007c786262553d66a7 [formerly 8b8e0c510f]
Former-commit-id: 6a64c402f0687bc3babb0370cd0785a6b2e487f7
2022-11-06 00:49:44 -04:00
RandyTheSilly 2beeb1dc38 Only check whitelist status if the gpg agent is locked (speeds up successive quick-unlock attempts)
Former-commit-id: 57486bc120fc8734cbaf1694655ad9bc14c3276b [formerly 0b0c8a37d1]
Former-commit-id: 171de872a6f4c1f08f151d8b287d1584ac4f7061
2022-11-06 00:43:25 -04:00
RandyTheSilly 86ad4e5cad Added instructions for enabling Bash completions
Former-commit-id: 35b317ff508a4da2c1052cbda230be4e4af42985 [formerly 5fa30fa770]
Former-commit-id: c48091e8a5849359e2a6ef97970d30c008d6a70d
2022-11-06 00:15:28 -04:00
RandyTheSilly e55c812a06 Fixed device id fetching (and quick-unlock verification) on Haiku
Former-commit-id: 2ed945a3fea77e8be59bb2c8c92361cf23f950e8 [formerly 8b3bf04945]
Former-commit-id: 0df6eeb06ab5d68c8252a1b4515895d1eed313ff
2022-11-05 23:57:09 -04:00
RandyTheSilly a0351d19d3 Fixed FreeBSD package symlink target
Former-commit-id: b3d5912d8e12ecea8234ca071cf242fc4b4411cf [formerly 24be16faaa]
Former-commit-id: 2ac9997b4e22f2a9f5d4ffcef75476ce1ae24318
2022-11-05 22:42:53 -04:00
RandyTheSilly 90c15bcda8 Specified changelog location in Fedora package
Former-commit-id: b16bfc43bd29de0ff64d081ec33ffccd86a63e0c [formerly 446cab94c2]
Former-commit-id: d8886c635b20705e8188e14d4bbc8a780e6c1afc
2022-11-05 22:39:28 -04:00
RandyTheSilly cb754c5ba7 Removed executable bits where they are not needed
Former-commit-id: 26ea77aa4734c759aa7e68607250a74ea9d57b71 [formerly e3af035bce]
Former-commit-id: b3acead7183e5c60258b3e0ae9da861f4896f649
2022-11-05 22:33:48 -04:00
RandyTheSilly 9979de26d0 Fixed options/flags layout in man page
Former-commit-id: bcfb14f5de98ae07a743a0d3e3efe2911e594259 [formerly 687a606160]
Former-commit-id: a0c3a8727d5adcc750bfa57305102a23778c42af
2022-11-05 19:40:00 -04:00
RandyTheSilly 4207ecb555 Update 'whitelist del' example to match 'whitelist add' example
Former-commit-id: 16e37f29fe93494f41b82d8bb0bc8cc4f2dc9a59 [formerly e840b9def0]
Former-commit-id: ce1baa1ec004251186d24e228c91608c4641f3ea
2022-11-05 19:32:01 -04:00
RandyTheSilly 8bcfd3fcd8 Fix spacing between exit codes in man page
Former-commit-id: 10708f1512aa4f7aa0d4c410d8d204e27c83eb2f [formerly 486fc39f22]
Former-commit-id: 91a167647b61de66301ab7bf14046637057ec4f3
2022-11-05 19:28:27 -04:00
RandyTheSilly 78588f686e Update whitelist add example in man page to match new string generation
Former-commit-id: dd8e68e426c0a54c038551246877366959bd82fc [formerly a63d1caa2e]
Former-commit-id: d020cf6afd738db53dfde8f0bcd09aedf62b13cc
2022-11-05 19:27:20 -04:00
RandyTheSilly 4753bb4c37 Update synopsis in man page
Former-commit-id: c0b0484f0b221484edda25620844db8414d5e3cd [formerly c2639d1f42]
Former-commit-id: d88298469cb341750174cc9d3c25d2d3ab39056a
2022-11-05 19:22:39 -04:00
RandyTheSilly 81ccdf71ea Fixed visual issue with version info screen
Former-commit-id: 62838cdd5811c70bc60c92803971f4c4e3b2326a [formerly 9cd5066cc9]
Former-commit-id: 326b58542b773f86e333ca6a9f2f07a2c267557a
2022-11-05 19:12:51 -04:00
RandyTheSilly 67eb1a44ca Update documentation for v1.2.0
Former-commit-id: 6068da810b16810c8afc0322cdd26fea734e3671 [formerly 517d2a3d22]
Former-commit-id: a8b3385517fe0f3bc33b7ede1951bae56cd3a265
2022-11-05 18:27:43 -04:00
RandyTheSilly 8af7de10a7 Added a packaging option to create all packages buildable on Arch Linux
Former-commit-id: c8ec6a71c06308ffd9bfc82061c2c8df18c8755f [formerly 80594712c7]
Former-commit-id: e8b9266385f7e2a64de49a863ccb89305f537712
2022-11-05 17:56:14 -04:00
RandyTheSilly 3108a072dd Fixed editing entries with new string generation
Former-commit-id: 957b2fd14635380ebcc1639e60bff0ccb8a7ed13 [formerly ca983d4992]
Former-commit-id: 9e6461835b8e7f2111fa64f5759b88fb00a8cb62
2022-11-05 15:34:19 -04:00
RandyTheSilly 65be0eaf6f Allow complex string generation for /dev/shm and device ids
Former-commit-id: 534577ba9d348aa3bfbce63a940229594a2ae68d [formerly 0614c2c83b]
Former-commit-id: c28b84e388cb9969a881a2a0ab15dfd814875a47
2022-11-05 15:21:30 -04:00
RandyTheSilly bb34025c31 Removed generated password length limit
Former-commit-id: ac2d03db87329e939ef6a0a9494653f53c160348 [formerly 900f216ac0]
Former-commit-id: ad17b1a2d026ab6ee221dfb260acb6a8a79200de
2022-11-05 14:01:49 -04:00
RandyTheSilly 278231fe40 Several fixes to allow the Haiku package to work again
Former-commit-id: a1babda0d16b3a264a53936fd76f79d00b56976a [formerly 022ad9ef6d]
Former-commit-id: a3a64fe962fd866bae3b5a8293293f9bad211994
2022-11-04 00:30:48 -04:00
RandyTheSilly 7356777e50 Made spacing in server help menus consistent with client help menus
Former-commit-id: 6b5209753e1a4d91de9f058bd4003def53b9e44c [formerly a1d5c8607c]
Former-commit-id: f1dc1e65d8eb65b58c87be822e1540e6862fce57
2022-11-03 22:58:35 -04:00
RandyTheSilly 5a33eb26f0 Fedora now only requires openssh-clients, rather than the openssh meta package
Former-commit-id: 320ec033563f9bf6d246c82ba504ee29085dfb5f [formerly 942febfac9]
Former-commit-id: ec41cf2e719ad9127ed84322f91248075e52ccbc
2022-11-03 22:47:58 -04:00
RandyTheSilly d796c48ede Made exit codes more specific to their errors
Former-commit-id: 62c004c84333a8b8645ea3247fdb56c1509a36f9 [formerly 33f7330886]
Former-commit-id: 0d849ab1792d4c960cf632f75a28feba5610f57e
2022-10-26 13:32:23 -04:00
RandyTheSilly b1fd934b96 Added bash-completion as an optional dependency where applicable
Former-commit-id: 2ad3b6bf53ac4c211a3e06079e0b32d7c362949f [formerly 07394c1740]
Former-commit-id: a985cf7c1230bc4f0f821ad83e689ddd769ba8d0
2022-10-25 23:10:51 -04:00
RandyTheSilly 9848d38a0b Fixed quick-unlock requirng passphrase regardless of whether or not it is needed - again
Former-commit-id: 53325cbf8c6f46d4e83c4e9ed4b9f9d4b1196bd5 [formerly a26ca86977]
Former-commit-id: 21fb1f899370f428ea08e1e5bb50bc2610e00983
2022-10-25 11:53:52 -04:00
RandyTheSilly 2ab409e95e Require _client_device_id as parameter to whitelist_verify (for extension support)
Former-commit-id: 608cd556ac34c6d64a0559398a43c180e41e1510 [formerly 51d99992a5]
Former-commit-id: d0e316a16321a13972be7233c88ffb61d5f5c3f7
2022-10-24 15:31:06 -04:00
RandyTheSilly 64d46f1746 Initial enablement of extension support for quick-unlock
Former-commit-id: 91400c4725bf786d727695287ec122c01d2447da [formerly d887047fd0]
Former-commit-id: 9576649c2d5f2de0fd6a8cfa5a92afae45304f45
2022-10-20 15:25:57 -04:00
RandyTheSilly e9c787cfe3 Removed an exit statement that was preventing extensions from working
Former-commit-id: 1f89608ad6b7a6a65aca87742991f9195937d8a1 [formerly 304c1b09f0]
Former-commit-id: 8856ed6d9f72fd72f7a91d35dd987f00f1f8eaaf
2022-10-19 15:13:14 -04:00
RandyTheSilly c200b5bbec Allow fallback to standard unlock if quick-unlock fails
Former-commit-id: b6bfe67cdd983da31366ec45c7f5950f856d0dfe [formerly 6b20b82dd5]
Former-commit-id: f685be2b3e57f396ca41a8d2d1e3382a0f978990
2022-10-19 11:34:02 -04:00
RandyTheSilly b6593e609b Created local _quick_enabled for decrypt() for extension support
Former-commit-id: 996ed134188de1425a4ffb0f1bb741fd38b25ab1 [formerly e66ecd9514]
Former-commit-id: 1792c36fd44437f22ad1f86cedcf1c66083715cc
2022-10-19 10:14:39 -04:00
RandyTheSilly 32b0c39fb6 Removed need to re-enter quick-unlock passphrase is the gpg agent is already unlocked
Former-commit-id: e1c94c5f40e1ad16f710c11008c22ce353e50ade [formerly c8691372ca]
Former-commit-id: 94164815b1ee10e3a99c5c48f288f86b751b2449
2022-10-19 10:04:52 -04:00
RandyTheSilly 6b8e24b0b2 Optimized decrypt()
Former-commit-id: 8ad01f00ecf678ea8716507745791818343eaf66 [formerly 2b98562dca]
Former-commit-id: fdc02b6db471b98fbbdf55ddc381a25b68477f0b
2022-10-19 09:33:38 -04:00
RandyTheSilly 2d47f42414 Fixed string_gen complex generating unprintable strings
Former-commit-id: beec4dc72264edf0a2818a5088c849a310d5f7d0 [formerly 9d990eb9f6]
Former-commit-id: 09895d9c665ece34d74c5c68ce6657952c19ca59
2022-10-18 14:54:10 -04:00
RandyTheSilly a773056202 Fixed shearing and renaming entries with quick-unlock
Former-commit-id: f2e3558a0f923d0b5082987858d0e0e59f820f7d [formerly 07cf7a558f]
Former-commit-id: f5036da37b69cb339aba710aa53c9bbf9853567a
2022-10-18 13:35:12 -04:00
RandyTheSilly 097aca8c43 Automatically set quick-unlock passphrase length if the user specifies an invalid option
Former-commit-id: 0343f407b9c9bae5d68af1a0d1cd8028ff9b09be [formerly fa7e03bcf7]
Former-commit-id: dd454b8b47747b556d3268eaf6a38bda5a6a2627
2022-10-13 16:49:08 -04:00
RandyTheSilly 275b07e53f Removed unnecessary s_exit() statements
Former-commit-id: ab2a098f5d620ad8b25665a55e0051c2509e9c99 [formerly f5161ef5cb]
Former-commit-id: 6842c72fb31ab57fc59e0643a332d66b24ab050c
2022-10-13 10:58:07 -04:00
RandyTheSilly 46d539f386 Made error message for when quick-unlock fails more clear
Former-commit-id: 2acc2f84b9205e32cf5bd6bda23abb576002c2a9 [formerly fd12a3c003]
Former-commit-id: 14dc80d8c7c22baed913a0c84abdb3c67138bef9
2022-10-12 16:24:27 -04:00
RandyTheSilly 0adf00d81e Respect the user-specifed quick-unlock passphrase length
Former-commit-id: 5ef20818df71d226d14bf97d99d8646b09a0a7b6 [formerly 70ee2c6d04]
Former-commit-id: 65b4c531f2e84aa5198e1c77a1d0624482cd70e0
2022-10-12 14:57:33 -04:00
RandyTheSilly 46b212988f Truncate max quick-unlock password length
Former-commit-id: c405a82ba419a61bc6d65e89315c8306cec3f01e [formerly 35ee78f717]
Former-commit-id: 53d536d2c37dfca60fd154a90e7857fd1204fc35
2022-10-12 14:53:48 -04:00
RandyTheSilly 3e8772786a Fixed failed decryption on excluded.gpg
Former-commit-id: 8bd59bcf06d63daad654f9ddea9e5ccbcf1b2ea5 [formerly 8dd5101c7f]
Former-commit-id: 6b4e01337c3a0a337a558384283a467eb9e7de1c
2022-10-12 14:37:54 -04:00
RandyTheSilly 3a01157cb3 Fixed quick-unlock gpg key passphrase creation and made quick-unlock more verbose
Former-commit-id: 88dc9cc46cbdaaa3fc547b81758892ebc463573d [formerly 844280c13e]
Former-commit-id: 454e554a4009ed89d3413d57662cde7cca7d9289
2022-10-12 13:39:01 -04:00
RandyTheSilly 079a1412ae Attempt remote imports from /lib/sshyp, rather than /bin
Former-commit-id: 839058d4882b8c8837b4543e6b290643d9f1d409 [formerly d9e2a7d4e1]
Former-commit-id: eeb4a7bb40356e453a41e0176e40d08c6056a7c1
2022-10-12 12:48:08 -04:00
RandyTheSilly 359edcd46c Ensure generated device id is a valid file name
Former-commit-id: 950080785d4666364b5452a4e0b48ce999852ef8 [formerly 3147d9327b]
Former-commit-id: da5d01ac15b077cb2d63668ee9be491ef597a105
2022-10-12 12:32:54 -04:00
RandyTheSilly 60c2920f3c Fixed quick-unlock configuration looking for an integer as input
Former-commit-id: 4a87cd897e7cc5f480d4b68c809ee794af88b7eb [formerly 29c7b931c9]
Former-commit-id: 49fc70a301120b8c7221ec10328186f41ef7294c
2022-10-12 12:19:02 -04:00
RandyTheSilly a3cd6a1f17 Implemented quick-unlock decryption support
Former-commit-id: e09eafab15796554dd5ae4013834c68a99b1df8a [formerly b81018c122]
Former-commit-id: 6a539e12d1ff63e29ba551b3b4622c4022673ff0
2022-10-12 12:06:07 -04:00
RandyTheSilly 8c2b7df1da Simplify client-side quick-unlock configuration
Former-commit-id: efb36f511a0d12172d0274c10f4000ce0b3822fa [formerly 5a9457cc5d]
Former-commit-id: fd65329c7834164054de79f6d0889c2a3957b7d9
2022-10-12 11:46:12 -04:00
RandyTheSilly 994eaee49b Initial implementation of quick-unlock verification
Former-commit-id: a71a8d0a7a1964597e5c52889b8f89117ba82ab9 [formerly 845f968aeb]
Former-commit-id: e53a2994ca43ac3a82c0cdeb88e74c180c20d85a
2022-10-11 17:08:30 -04:00
RandyTheSilly 8f0eb1134a Properly increment _i in whitelist_setup()
Former-commit-id: afced727ea431a420d43780f417e991c3457641c [formerly 9b0b4acf77]
Former-commit-id: 1d5bb9e6359e5a39d49764d8d920d776532f8de6
2022-10-11 12:42:42 -04:00
RandyTheSilly c95643ca89 Added server-side whitelist setup
Former-commit-id: 5cfa4acfc90eaa977feec5ddc427bc5292b228d7 [formerly c9934368a4]
Former-commit-id: 266b7c430437bf807de97833b20c7047058b332d
2022-10-11 12:40:35 -04:00
RandyTheSilly 35ea8bf7d7 Reduced questions asked for quick-unlock setup
Former-commit-id: 0903f70d8924df22eb5c09ff25a8adfd81bf7859 [formerly 243c3c466e]
Former-commit-id: 65d4a73935b03cb9eef41689e3e8f82b85e62ebf
2022-10-11 10:51:00 -04:00
RandyTheSilly 60431b623c Fixed decryption of multi-word entries
Former-commit-id: 3175538b5d759e29a70718fa10950d68e1822014 [formerly 40213aa518]
Former-commit-id: 9da31c6b23689091ad1be58cd71aab0c8c6bb379
2022-10-11 09:47:24 -04:00
RandyTheSilly 185ae4ebff Move a rarely used import statement closer to where it's needed in sshync
Former-commit-id: aceb7e080b29fedf9e8a52ab052af32450491b88 [formerly c31a5a1664]
Former-commit-id: 9844be47e81146aff688e7e1c8462ffc147ab29d
2022-10-11 09:28:13 -04:00
RandyTheSilly 1e290a1f26 Only import rarely used modules when they're needed
Former-commit-id: 1ec2f9c6884f0e06b32d693c38ffe5c698b7dc52 [formerly 8642601eee]
Former-commit-id: d5078e981c24350843ec99597cbbfed619f555bf
2022-10-11 09:22:40 -04:00
RandyTheSilly 71157633df Fixed renaming folders and receiving false error messages when renaming entries in offline mode
Former-commit-id: 49f2fef8ea219945446347df3d782c0660429a05 [formerly 71585770eb]
Former-commit-id: 5e956861f47581704d85bfee5d52728be784d6b3
2022-10-11 09:10:31 -04:00
RandyTheSilly 03487348ea Fixed deleting and renaming entries in offline mode
Former-commit-id: eb690eae6213b2863ac9f93c2fecacb1f77128fd [formerly affcb3adbe]
Former-commit-id: 15fc77ab3728b8f40f8d33bbd6df759fdc7c1283
2022-10-10 19:37:38 -04:00
RandyTheSilly 2d20ddbb97 Fixed folder creation in offline mode
Former-commit-id: 1669541a827e1f6c68e28e738778a131d56645c5 [formerly 45605bf7bc]
Former-commit-id: 62aa51979453eaa9fea50766cbab9fd968c5e65f
2022-10-10 18:20:43 -04:00
RandyTheSilly 21287ca57f Fixed bugs causing entries to not be saved or entries being saved to the wrong place
Former-commit-id: b8ff6c48caefdd051bc54705a9c08bf41add925a [formerly 772eaa0846]
Former-commit-id: 1700df7af1a9b1ce30ca881e8bfc5f6c42ed1666
2022-10-10 17:52:14 -04:00
RandyTheSilly 612f288904 Put .py files in /usr/lib/sshyp, symlink executables to /usr/bin
Former-commit-id: c44a817f58d2f232d93c2d38ca27c4b091a3c523 [formerly c9c88a041d]
Former-commit-id: cb19027d8aa9a1ea97a02bfaf3b41292f5a3f232
2022-10-10 11:16:56 -04:00
RandyTheSilly 0fbe084ff7 Correctly add strings to config file list
Former-commit-id: 7defa79968068b45f64deb0f7df183650ce111b5 [formerly cc4324f953]
Former-commit-id: a431ad4d3e40a85658d59b03455fbabc0667e41e
2022-10-08 21:33:35 -04:00
RandyTheSilly fdf90e043a Overwrite old configuration file
Former-commit-id: ca68d65edcb90d827ee8588d4c251e8bfb35fac6 [formerly 48170f494e]
Former-commit-id: 68c2175fea457766e0c0f8d2fe5751fc2812dbe0
2022-10-08 21:19:47 -04:00
RandyTheSilly b89158d0bb Bug fixes for the revised config file format and server-side arguments
Former-commit-id: 7a924b6a74a488a1116f341110d2bda73ea37cca [formerly 324a5f9a7c]
Former-commit-id: f24a5a8a859fa603b721f888393b25fe944d698e
2022-10-08 21:10:47 -04:00
RandyTheSilly dede7cf8ac Initial addition of offline mode
Former-commit-id: 8bd18e3b3ba4d5d737c25416632ba13a6a38c0ef [formerly 2c1241a1bc]
Former-commit-id: fdb675335dd16ed90cf1deb439a665ba2b3621bb
2022-10-06 16:42:58 -04:00
RandyTheSilly 6d3ba2714b Client-side whitelist error message now shows up will all additional whitelist options
Former-commit-id: c67567cdfd1881a10a39a3ab2b8deb27d9bed01c [formerly d069ab82f9]
Former-commit-id: 70339b78b1d65b2850c9deb431419eb6c9bf4eff
2022-10-06 09:02:32 -04:00
RandyTheSilly 09991a2a30 Added error message for when whitelist is used client-side
Former-commit-id: 70e01336cf53c78905784e6ec730d0c8f542d410 [formerly b8b99755f0]
Former-commit-id: 82f626a998106db61f101b21f2d1f1479eb604cd
2022-10-06 08:57:48 -04:00
RandyTheSilly c5884024de Use rstrip() in place of replace() where applicable
Former-commit-id: 6b0a80036ec8166663dfdbd02c720f4b5ed23064 [formerly 88e97d0131]
Former-commit-id: 1e861149b7485ef6676ce4c5b721dd4ea0d8ba90
2022-10-06 08:47:38 -04:00
RandyTheSilly 1e2166ddaf Added quick-unlock configuration, tweaked config files
Former-commit-id: bc51fe8e937af4b1723af804965eae0e2e0a4ed4 [formerly 012796f052]
Former-commit-id: 52db53b8633894dd5d0f3d5a0abfa4aeede41c61
2022-10-05 23:46:32 -04:00
RandyTheSilly 86487b8ae5 Rename 'device name' to 'device id'
Former-commit-id: 35521f185ee50203d24dab3e3ae84cf8930eb7e7 [formerly 0a450018de]
Former-commit-id: 783fab372f69f811417dd4f7be6269aaff7f15aa
2022-10-04 23:47:19 -04:00
RandyTheSilly fa05312d49 Whitelist bugfixes and polish
Former-commit-id: fa8991e443fb5117d1a69afa4cd0b0017bacda1f [formerly 773f27946e]
Former-commit-id: e417225d361e3fdb1021885336ec7a9f86e0fdaa
2022-10-04 22:50:05 -04:00
RandyTheSilly 71d942ffae Initial quick-unlock whitelist implementation
Former-commit-id: 0ec410451bf7799bd1c603e8ebc25401efe2850b [formerly 5f7074e04e]
Former-commit-id: ce55288649a10ef7cb20ad2dc1c815a13d263988
2022-10-04 21:08:11 -04:00
RandyTheSilly cc1a099363 Optimized device type setup
Former-commit-id: 3e7b61794bf27e88f0cee1cb3771ee474ef1df70 [formerly 2a56a3c427]
Former-commit-id: 20568fbd2f980319b9a167c3142dc6ee5ca87a6e
2022-10-04 15:12:14 -04:00
RandyTheSilly d6342faf84 Properly detect whitelist argument
Former-commit-id: 5bea6aa37ae4356de2d64d077da7c7f60eba3aa3 [formerly a573778972]
Former-commit-id: be5c0832c95991b9103c7ad97f13d76e60b61dba
2022-10-04 15:03:27 -04:00
RandyTheSilly c7cae5303a Add dedicated server help menu
Former-commit-id: 36a139597b19d1c5ad9c08424723069d72221b11 [formerly c009dd63ab]
Former-commit-id: 46227a7c5aad5aff8ecfd8529bc53e433b3a57a8
2022-10-04 14:37:04 -04:00
RandyTheSilly 1d80cb08ce Allow some arguments when running as server
Former-commit-id: c4d50678ff19fe452eb06de70e3890e919e0d0b2 [formerly aadca0ad44]
Former-commit-id: 21750ce3902b7e8bcc50b1068198c4a329c3912b
2022-10-04 13:42:21 -04:00
RandyTheSilly 8163aee868 Swap URL and note options in edit help menu for visual consistency
Former-commit-id: 974a7cbb5a21e9b093c690ef67621e41de16bfdd [formerly 6ffc65f0d0]
Former-commit-id: de6cc2e91778ac13a193e4d77edb297cb8dd543c
2022-10-04 13:25:31 -04:00
RandyTheSilly 7c061f561f Removed metainfo file, as it did not solve the issue with Debian licesning
Former-commit-id: 2a9ee72c9e6dca49ef7a95d62902237def77969f [formerly 8980bef8ce]
Former-commit-id: 11313daff2acf3980925e45776a88f7f40aff964
2022-10-04 13:18:25 -04:00
RandyTheSilly 339d20bc3e Update license to GPL-3.0-only
Former-commit-id: 89163bb523391768dcfdee8c9873ab5443cd66d0 [formerly 1436cdfb90]
Former-commit-id: 3a8ce9b0569a32839344a9fdfd664af28ce1fe07
2022-10-04 12:44:39 -04:00
RandyTheSilly 434f5f85cd Added metainfo.xml file for AppStream metadata
Former-commit-id: ad6f791e8c5c7036f70de16125e016cb9e7e40a3 [formerly 374c2336c8]
Former-commit-id: c855d50011ca4107fd007cf693575cff1178beb4
2022-10-04 11:44:35 -04:00
RandyTheSilly 22d9605781 Update README.md
Former-commit-id: 943e9e1f7daedddaaa861f4845118fb8db4c7803 [formerly 5c58151888]
Former-commit-id: 2925645b0f261b98a738240fcb6abec83622f8f7
2022-09-21 11:24:12 -04:00
RandyTheSilly d644f8df01 Initial implementation of non-interactive packaging script
Former-commit-id: 92c811513a6190f7d0f9e479e84bd54eb7a13556 [formerly 7e29a9ba9e]
Former-commit-id: 5fe414bb4dfbe286b53845826c9bdcf20ab5b22f
2022-09-12 15:21:55 -04:00
RandyTheSilly 551789636d Slight line count reduction
Former-commit-id: 442835aaecb34b116ca8a44109e08a0643344271 [formerly b27f4cb805]
Former-commit-id: 1087b9aae0e2c0e641e7f44e901ac16e07a33270
2022-09-08 10:19:43 -04:00
RandyTheSilly 9ab175a8d8 Roughly halved the amount of time to source bash completions
Former-commit-id: 624a99a5727e49b12c1468c27110cee893124fd2 [formerly f411a56d1f]
Former-commit-id: 48802e27abb02efaf80743bd4fc8dbe3a03219fa
2022-09-08 09:47:59 -04:00
RandyTheSilly e5a4d80e3b Packaging script shebang changed to "/usr/bin/env bash"
Former-commit-id: 6d7053b0f6e1e3aec1373d664acfb3fc71c00cc9 [formerly 6542e8f7e2]
Former-commit-id: f9506fab60e02e0f402ea246feab5c5ae8d77888
2022-09-07 09:46:09 -04:00
RandyTheSilly 0920dcf004 Fixed completions not generating
Former-commit-id: 3f8c64047f12456fd3c1ce8243293beb323912a2 [formerly 915a17b8e9]
Former-commit-id: 0e322f3cda6e75f2db8b9e649028fccbf1ae09ad
2022-09-05 14:29:43 -04:00
RandyTheSilly e18b3b4d0a Allow path completions alongside shortcuts
Former-commit-id: 8404cf01dd8b828b69d85bdbe520ad422a47b1ae [formerly d037acd5b0]
Former-commit-id: ae522f2d127096c5654748a53f4bffef7e234609
2022-09-04 15:10:04 -04:00
RandyTheSilly ffccc88a1d The _path_gen function is no longer run twice (completion is much faster now)
Former-commit-id: 996add6978d32e2a1d72b12352baa682645b3061 [formerly 2ed8b69abf]
Former-commit-id: 2e90025a3d6aaba8ff1987cb3731727a15d5b2e4
2022-09-04 14:55:39 -04:00
RandyTheSilly e1ec834e5c Added initial Bash completion script
Former-commit-id: 81ff7f4a6e515e36cea79953a0212bfd3f89958e [formerly 510ca3bfbb]
Former-commit-id: a85ddda326e5d210ce47bc03a668e3f4ba3537c9
2022-09-04 14:49:43 -04:00
RandyTheSilly 018d0c511d Updated README.md for release v1.1.2
Former-commit-id: 4eb7a866fa03d5990a300120974def01ab4babec [formerly 0ce5b1c1f6]
Former-commit-id: b0e3e46e63b15184ad7d600ccc5e33e98c185081
2022-08-27 14:27:35 -04:00
RandyTheSilly 55b94fc4cc Removed option for using local source from packaging script, as it is mostly unnecessary and/or broken
Former-commit-id: 86a32b1b3e217708078d5d99f8e30571169697a6 [formerly 35068270af]
Former-commit-id: db7e4d8eedcda2d94a5cec75e4ef9e354eec0687
2022-08-27 14:08:58 -04:00
RandyTheSilly 3f9c4e2c8d Automatically calculate revision number for Alpine packaging
Former-commit-id: 2de24f3dc4b9e5f5e27265da1271ea96be0387f5 [formerly cd5c9150a5]
Former-commit-id: 2c613cdc811dc127968a46758c4f238562bc64f9
2022-08-27 13:53:09 -04:00
RandyTheSilly 166ac50f42 Updated documentation for release v1.1.2
Former-commit-id: e212291e40989a1c50cbccf27060dbc7744da668 [formerly f97c9ad4f9]
Former-commit-id: 150048cc1ab40ee49e83295cedcdc9c3b1c49a8c
2022-08-27 13:12:58 -04:00
RandyTheSilly df1c6482a8 Optimized cross-device entry deletion code
Former-commit-id: 2a1dcda6460c06103846b41fbf2d83bf78c05527 [formerly f1aca39fd1]
Former-commit-id: 268b5564ff2f4cc157ebe039e9c46826a4bdb878
2022-08-27 12:46:54 -04:00
RandyTheSilly 38c6ef3d1b rename() now uses entry_name_fetch()
Former-commit-id: c3a3e7b95eb85225dd0bfbbbb15ac81d78adf7e2 [formerly 1f0b23c25f]
Former-commit-id: d2fe8fce784a01a9f5c127ad1eb3d05550624425
2022-08-27 12:11:59 -04:00
RandyTheSilly 7bea6093b8 Properly handle exception for attempting to copy a field that does not exist
Former-commit-id: 57c07b5ad482413febc9b6ee4e27c3f3a5f4fe11 [formerly 7355092cfe]
Former-commit-id: dc1d96e23a8a558c4b880b997a17e3a8d7cfcadd
2022-08-26 18:04:01 -04:00
RandyTheSilly f9ca6f8e94 Fixed generic package not being compressed
Former-commit-id: 600f05d063f52cfc34b58abef6acb799ce35f651 [formerly 56a99d09ef]
Former-commit-id: 90d9f29f91c3e44cf0e2ef75a8bbbd48ad3aa52c
2022-08-14 19:16:04 -04:00
RandyTheSilly 75d8eb7b7d Added Alpine packaging support, fixed packaging woes regarding a bad shebang
Former-commit-id: 2a440affcd09a28554c4ebe316408889047dc052 [formerly a83297c52b]
Former-commit-id: 41d6aebd702925cfbd4089f974b09250f3f6d8b3
2022-08-14 19:13:50 -04:00
RandyTheSilly 39316d04a2 Updated documentation for release v1.1.1
Former-commit-id: defed7054804d7bf36e93c302282039d335d6561 [formerly 558512ba52]
Former-commit-id: f6cf7d3e5633652439a46c51f9d5cfad007f2236
2022-07-21 22:40:29 -04:00
RandyTheSilly 3e9a4c0403 Fixed gpg auto-generation adding extra spaces to gpg-gen file
Former-commit-id: 0a273095a3a13d2997655c19ff62a674b135f530 [formerly 83a408ca0b]
Former-commit-id: eeee558508a68dcb9e243eea4e049704448c9f3e
2022-07-21 19:34:25 -04:00
RandyTheSilly 3bc07b48ef Fixed encrypt() using global tmp_dir
Former-commit-id: 2e993a03f745ae5b4a4f58acc6695e0660bc278c [formerly b6d3f7c5d1]
Former-commit-id: 9306abe18fe741cdd36280798f4bcffc66a77dd7
2022-07-21 01:37:53 -04:00
RandyTheSilly 5234e8c048 Improved encrypt() usability by extensions
Former-commit-id: 1dad668c15e2e1629c0233c80b88763ed5535c04 [formerly 0c975eab8f]
Former-commit-id: 3bddba6995f6aa92de8ea00500cb64b08d7e17db
2022-07-21 01:29:59 -04:00
RandyTheSilly b7c3535955 Exposed encrypt() function to be used by extensions
Former-commit-id: a055f6359a1bd2b81191ef1ef7b5dfb9432f75b2 [formerly 033bbd59de]
Former-commit-id: 451bafbfaaec27086c8c6cb50cb918ca94cf5497
2022-07-20 16:23:43 -04:00
RandyTheSilly 1f52c45c43 Bump version to v1.1.1
Former-commit-id: b2aad92f56b7931daf7ccab2a44793b29bec61f3 [formerly 5aeaee4c8f]
Former-commit-id: 2c651547721c89147dff385e0ad25d2d44694870
2022-07-17 07:29:56 -04:00
RandyTheSilly 7723baa69e Convert add_entry() and gen() to use optimized_edit()
Former-commit-id: 09f1256a4eed4bc042af7149f15ebb5b1197cbe8 [formerly 2d40db5467]
Former-commit-id: f7aa3b0cd2a761283ed11646b6c8fbb6f8130501
2022-07-17 07:25:12 -04:00
RandyTheSilly b680cc96d6 Significant overhaul to entry format optimization
Former-commit-id: 032103385be1ec017f97192829d591acd7a8c902 [formerly 8f318446bf]
Former-commit-id: 7ae69f3bafa268df1cf114d443d367ff45618f4a
2022-07-17 05:37:54 -04:00
RandyTheSilly f750fe1e4d Fixed compatibility check not adding the correct number of lines under certain circumstances
Former-commit-id: 93a4ff7bd25e38ae0a2b40d147afa51b08d73e04 [formerly a4368d60eb]
Former-commit-id: 58c89fcb9728bcfb430aaaf0df817f696688f1cd
2022-07-16 19:32:57 -04:00
RandyTheSilly b96db3ad92 Updated date in manpage for release v1.1.0
Former-commit-id: f9b74560f437e3dcc3d731909599957c460e8e8b [formerly 393ef08a21]
Former-commit-id: ddd1f4834f044d5e3da5016218138690627bcbfe
2022-07-14 03:21:43 -04:00
RandyTheSilly 224fc1fc6d Minor visual consistency tweak for Haiku gpg key generation
Former-commit-id: 1afd8df260d65f210e90cc93270971bf2c2fcb46 [formerly c5c110d0b4]
Former-commit-id: a24c571e55d987595250ebcfc558924cec675c62
2022-07-14 02:53:39 -04:00
RandyTheSilly 0bd2e45dba Fixed Termux packaging
Former-commit-id: 6d38a02d6211412bc99615704f311f820bdcef27 [formerly 4b02fd02b8]
Former-commit-id: 92f48521175fb89015cdb6dc9d99fb9485650c1f
2022-07-13 07:44:29 -04:00
RandyTheSilly 6410843911 Updated changelog for v1.1.0
Former-commit-id: 7ebe77ae88f470586d291eb4054cbdfa6f365950 [formerly de28d19969]
Former-commit-id: 7d27d41aef11546e74dc7073c8b260566addb0d7
2022-07-13 04:48:11 -04:00
RandyTheSilly 3dda6d8428 Update README.md
Former-commit-id: 5b20287fab20945ddc8841249503c321d6cbf999 [formerly beeb426ac8]
Former-commit-id: 90746e5b5225435bf8fd7ab9c2659fa5547a0c14
2022-07-11 22:30:48 -04:00
RandyTheSilly 4f31af5eff Clean up for automatically created gpg generation file
Former-commit-id: eba9c2f414fd59d655e2d3b992b2a8982745e01f [formerly e2b8e31f50]
Former-commit-id: 1166007ce70d0e1d61f2e2d8c3fab78970a6407b
2022-07-11 22:19:31 -04:00
RandyTheSilly bfb830c5e5 Fixed Haiku gpg key generation
Former-commit-id: 1a441cea301049608232742f4fddcc6338adf0a7 [formerly a673404fae]
Former-commit-id: 5ad1eef49307617c0f629f0a660d977f1784d380
2022-07-11 19:06:58 -04:00
RandyTheSilly 790121e7ea Greatly improved 'sshyp tweak' readability
Former-commit-id: 1f0f3ad2ca92e321c4819a14e9db1a961ff0816d [formerly d6bc4a2301]
Former-commit-id: 331e6e9b3d78f4aab1e4c958d526466a469ac515
2022-07-11 04:16:33 -04:00
rwinkhart 4168b800f8 Reduced code used for argument parsing
Former-commit-id: fb6b5f10b1077e2bba9c6bf43c23a59a455491eb [formerly faea36f6cd]
Former-commit-id: 5292e931128c413557c0e9609c009d7430949cf7
2022-07-10 05:41:49 -04:00
rwinkhart 801d515697 Restored banner image
Former-commit-id: 77219101a9c71848dce9d96e7dd17d9440d03b6c [formerly 398999b23f]
Former-commit-id: 77a032369f2f492f8227fa927da3a1b3d88ad7d0
2022-07-10 00:16:50 -04:00
rwinkhart 379970d53b Moved conversion scripts to sshyp-labs repo
Former-commit-id: b2ce1378324b6b19b71a54f02e4ac34a94d17728 [formerly 77873d061b]
Former-commit-id: ab23a45ed7b1d11597823081b2f0132b4b01ec2f
2022-07-10 00:15:56 -04:00
rwinkhart 4abb3ed718 Fixed entries readout not skipping lines between fields under certain conditions
Former-commit-id: 952acd940a754745d1798070113ea6c4d9d84408 [formerly f6875b15f0]
Former-commit-id: 496bdf8eb8abb6aa6c55e355e2b0457002793811
2022-07-09 23:35:08 -04:00
rwinkhart 6690fd15c9 Updated sshyp-refresh to use new entry directory
Former-commit-id: 9dedbb71ef7cf4f45511780d62a4c51d75d782a9 [formerly 8c520d972e]
Former-commit-id: 900cc5e3e7c0508a2629cfcb002faebb7c1d3753
2022-07-09 18:17:24 -04:00
rwinkhart 1582e73a98 Removed unused import
Former-commit-id: a7209c33c11d1eb36b7b27a1184b783f23253ff4 [formerly 01d59ce79a]
Former-commit-id: 8a9c2cb3017b966c138ebe9ae4cf8a1ea252ddca
2022-07-08 06:17:06 -04:00
rwinkhart dfe1703e62 gpg key generation and input is now automated
Former-commit-id: 97072166a69bc920cf39a87aa05f03ffc783d3d0 [formerly 9e49aa0bcb]
Former-commit-id: 9037e0b2a5f41f5db6616fc730ba21a8aec4dbe1
2022-07-08 06:14:13 -04:00
rwinkhart 7a76130b26 Updated banner artwork
Former-commit-id: c51116e0cdb7866b2c0bb969a23b57c4cb2cb7ff [formerly a2a473454f]
Former-commit-id: b5636d731c0398a17ca972d15325cced3c4df36a
2022-07-08 02:24:55 -04:00
rwinkhart 98dcbf57c6 Updated directory specified in the manpage
Former-commit-id: 934137a00c709169d9c316aa6a670eb6ef832f8f [formerly 2639cea365]
Former-commit-id: 98831f08192eb3deeb596594a9a24cbdb1c8dd1f
2022-07-08 00:46:23 -04:00
rwinkhart a5946d558a Added comments to every function
Former-commit-id: 6b8f15be379d51af5ced2449b1db7749d528dcf4 [formerly 87ae61ae30]
Former-commit-id: f5919588095deb509e899cff4e024dd76affbbce
2022-07-08 00:39:48 -04:00
rwinkhart 30fb5ed041 Updated compatibility with the upcoming sshyp-mfa extension
Former-commit-id: 3d900bfcce18345a9595deca8951b3a91bdfa85b [formerly bf22987544]
Former-commit-id: 34cbff97d0e671e71acd2baa95a0d129e1bafe79
2022-06-30 22:11:19 -04:00
rwinkhart fb1f5b92c3 Disabled all arguments on server except for 'tweak'
Former-commit-id: b35e7fca86b9fc7937dfb6119a8ba154ebade8fe [formerly c7fa3e3d09]
Former-commit-id: 7cab5ad48bd0a41d630fd5f943aa2e32c50ad434
2022-06-30 21:56:08 -04:00
rwinkhart 61b2186b0a In compliance with the XDG base directory spec, entries are now stored in ~/.local/share/sshyp/
Former-commit-id: fbb98f890b417395345a7a71ad158e48fa36a7ef [formerly 0c1f34bc30]
Former-commit-id: 91bd7170c0c56c093cf2126ce089be0e8255d6ce
2022-06-30 21:22:20 -04:00
rwinkhart 2113b93481 Allow the user to choose preferred editor, drop nano as dependency
Former-commit-id: d84048c212beca87419aac3577cf32c01d4f518f [formerly 9891fe4a81]
Former-commit-id: 2204730779caa4adad44a03f1fcd0bb76f25a1cd
2022-06-30 20:27:59 -04:00
RandyTheSilly 2030d90114 Fixed license name for Fedora package
Former-commit-id: 4caad0c333bdb66c3945692368ba26c702060426 [formerly 50972fcdf8]
Former-commit-id: 2645a1286c5d23f05f22e9dde0ead1edde6e27d5
2022-06-21 23:39:07 -04:00
RandyTheSilly 75071601e6 Update packaging for sshyp.py rename
Former-commit-id: 1f52fb7fb48c7e1152314d065602139f62b5ea2e [formerly 37fe8e37e7]
Former-commit-id: 8f17c38475e647b511bc7858c3859d3c65e29882
2022-06-21 23:37:45 -04:00
RandyTheSilly 9a0a261d55 Removed unused code in entry_name_fetch()
Former-commit-id: 047a66dc53042dda37f6825862c2fc14fb3a17cc [formerly 1f2543fe3f]
Former-commit-id: 4bb6fca31988c8ef74a4e4a730f1d25e9b21481d
2022-06-21 23:18:54 -04:00
RandyTheSilly 4ca2d89464 Updated read_shortcut() to use argument_list[] notation
Former-commit-id: 01a62c169c089618c8015f94f9d63ddbfb295d37 [formerly c0f3296a75]
Former-commit-id: 4bf2ff467f12d9f1e7c5f7fd0187d441718808a7
2022-06-21 23:12:03 -04:00
RandyTheSilly f90ec5c900 Optimized import statement for random
Former-commit-id: e18122f2bc1df6525c890d42ae02d90062e5bd6e [formerly c2f43e563a]
Former-commit-id: a993e29ce0410dd63a4171d10e3dc842c9297be5
2022-06-21 23:03:00 -04:00
RandyTheSilly fa0a4fe0b8 Removed unnecessary arguments in usage of decrypt()
Former-commit-id: cd966935bf552d5b5222c59e1887544b79e8a6aa [formerly db0142d202]
Former-commit-id: c3347ea5164901f8377414b097af426b1569b26d
2022-06-21 22:58:39 -04:00
RandyTheSilly c85a9d2ccd Compatibility with upcoming sshyp-mfa standalone extension
Former-commit-id: adf34e9d38e3ce5a7d96738a97593fca777aa244 [formerly f184864e90]
Former-commit-id: ff632e3bd21132c838ba4602d99ab4106d387971
2022-06-21 22:44:10 -04:00
RandyTheSilly 43351fd66f Bump version to v1.0.1
Former-commit-id: 73a9e537a08596e3a527f7c7b45405bd43818d54 [formerly 4aa9036d42]
Former-commit-id: 249daa62a333460a5c3142815872b3e26b4ad6a8
2022-06-21 03:46:24 -04:00
RandyTheSilly 096bdb0773 Updated changelog
Former-commit-id: 90c2c0be99f4e250b4a710c7f4013f73f648c0ed [formerly fdaff41f6f]
Former-commit-id: 4d8658fd6473e33ac3d4fecf88cfb500d2d44959
2022-06-21 03:44:48 -04:00
RandyTheSilly 330396c5f1 Improved usage of Popen in copy() function + removed import statement for subprocess.STDOUT
Former-commit-id: bbc39da1d30845aadac3430b0d8758d6958a159c [formerly 88417f5f67]
Former-commit-id: 5be7fe4d68ae5153ef1dbde3018b15ed5fe944b0
2022-06-21 03:28:56 -04:00
RandyTheSilly 8576f63479 Optimized copy_name_check() function
Former-commit-id: 07e02ab7b0bbf030b0ee1baedd8dbb7ec5ef2e4e [formerly 47e8383146]
Former-commit-id: 570a930a9c63aaa5315285ccf1a84316f4e6199a
2022-06-21 03:13:55 -04:00
RandyTheSilly 393f241538 Optimized decrypt() function (fixes issue #1)
Former-commit-id: d94cce05e9695f4d0744b5a3f4232ad48b146ed2 [formerly 3ad5acfc99]
Former-commit-id: b7edcf31903826ebb8010f6e694b728e1616a70f
2022-06-21 03:03:23 -04:00
rwinkhart c557d5bfee Update README.md
Added CodeQL badge

Former-commit-id: fa618db3f76919e31da43758bda1652f19e63912 [formerly 6f18076068]
Former-commit-id: 809209a1ba762b6dacb8a1eb9f7199873787438b
2022-06-20 09:15:39 +00:00
rwinkhart acca7d888c Create codeql-analysis.yml
Former-commit-id: 8323ea0d21b761f9ec50a79e926b15d691c9700a [formerly 492b10a44e]
Former-commit-id: 72b9d6a984840d399124efe919adaadd5d0d7f04
2022-06-20 09:05:07 +00:00
rwinkhart 2f3b3c67ba Delete codeql-analysis.yml
Former-commit-id: bedaabebf13648b28a564c575ff82723ddf70904 [formerly 94f5420f83]
Former-commit-id: 61593eb69cc8abb1120925965aaf81504cb8dd4f
2022-06-20 09:04:37 +00:00
rwinkhart 88d2402e88 Create codeql-analysis.yml
Former-commit-id: 3551b0bdb4902910a23abfcb369965f8bfb3dde8 [formerly 4f90e5ca0b]
Former-commit-id: b50cad12f70384329acc728a2628a83158c604af
2022-06-20 08:58:03 +00:00
34 changed files with 3635 additions and 1763 deletions
+72
View File
@@ -0,0 +1,72 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ "main" ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ "main" ]
schedule:
- cron: '34 22 * * 5'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'python' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
+1
View File
@@ -0,0 +1 @@
*
+34 -44
View File
@@ -1,20 +1,28 @@
![sshyp](https://github.com/rwinkhart/sshyp/blob/main/extra/sshyp-linux-banner.png)
![sshyp](https://github.com/rwinkhart/sshyp-labs/blob/main/extra/artwork/sshyp-banner.png)
[![release](https://img.shields.io/github/v/release/rwinkhart/sshyp)](https://github.com/rwinkhart/sshyp/releases)
![python](https://img.shields.io/badge/python-3.8--3.12-yellow)
[![downloads](https://img.shields.io/github/downloads/rwinkhart/sshyp/total)](https://github.com/rwinkhart/sshyp/releases)
[![CodeQL](https://github.com/rwinkhart/sshyp/actions/workflows/codeql-analysis.yml/badge.svg?branch=main)](https://github.com/rwinkhart/sshyp/actions/workflows/codeql-analysis.yml)
pronounced as: 'sheep', 'shēp'
sshyp is a very simple self-hosted, synchronized password manager for UNIX(-like) systems (currently Haiku/FreeBSD/Linux).
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 is (as of writing) the only password-store compatible CLI password manager available for Haiku.
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".
The name "sshyp" is a combination of its synchronization library, "sshync", and "passwords".
# WARNING
It is your responsibility to assess the security and stability of "sshyp" before using it and ensure it meets your needs.
I am not responsible for any data loss or breaches of your information resulting from the use of "sshyp".
"sshyp" is a new project that is constantly being updated, and though safety and security are priorities, they cannot be guaranteed.
Always check the [known bugs](https://github.com/rwinkhart/sshyp/wiki/Known-Bugs) list before updating or installing sshyp.
# Mission Statement
sshyp aims to make it as simple as possible to manage passwords and notes via CLI across multiple devices in a secure, self-hosted fashion.
@@ -22,75 +30,57 @@ What sshyp can do:
- securely manage a collection of encrypted passwords and notes via CLI
- 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 (or just manage them offline)
- utilize [extensions](https://github.com/rwinkhart/sshyp-labs) to interact with your entries is additional ways (such as generating TOTP keys or managing your entries in a GUI)
- everything above with entries created by pass/password-store!
- everything above on Haiku, FreeBSD, Linux, and Termux (an Android terminal emulator)!
What sshyp will likely do:
- (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
What sshyp definitely won't do:
- Non-UNIX(-like) support, e.g. Windows (I'd be happy to link to third-party ports, if someone were to make them)
- everything above on Haiku, FreeBSD, Linux, and Termux!
# Installation
**Important:** *Shell completions (both Bash and ZSH) may require additional configuration on some distributions - please see [this page](https://github.com/rwinkhart/sshyp/wiki/Completions) of the wiki for support.*
Please see the [installation guide](https://github.com/rwinkhart/sshyp/wiki/Installation) in the sshyp wiki for directions specific to your distribution/OS.
Pre-built packages exist for Haiku, FreeBSD, Arch Linux, Debian/Ubuntu Linux, Fedora Linux, and Termux. These can be downloaded from the releases page.
Pre-built packages exist for Haiku, FreeBSD, Alpine Linux, Debian/Ubuntu Linux, Fedora Linux, Termux, and WSL. These can be downloaded from the releases page.
Requests for additional distribution/OS support can be filed as issues.
Additionally, sshyp is distributed on the AUR.
Extensions can be installed from the `sshyp tweak` menu on most supported platforms.
For Haiku and Termux, extensions must instead be installed through the [system package manager](https://github.com/rwinkhart/sshyp-labs/releases).
# Building
Since sshyp is written entirely in Python, it doesn't need to be compiled. It does, however, need to be packaged for installation.
A packaging script is included in the root directory of the repo in order to package sshyp for your distribution. To package sshyp from source, simply run:
```
git clone https://github.com/rwinkhart/sshyp.git
cd sshyp
./package.sh
./package.sh [target] <revision>
```
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.
The packaging script has been tested on Arch Linux with "dpkg" as a dependency for Debian/Ubuntu/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 attached to the release tags were already packaged using this script.
Currently, the script can create packages for Haiku, FreeBSD, Arch Linux (PKGBUILD), Debian/Ubuntu Linux, Fedora Linux, Termux, and generic.
Currently, the script can create packages for Haiku, FreeBSD, Alpine Linux (APKBUILD), Arch Linux (PKGBUILD), Debian/Ubuntu Linux, Fedora Linux, Termux, and WSL.
# 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), run `sshyp init` to configure the settings necessary for sshyp to function.
```
sshyp tweak
```
In order to configure optional settings or change already configured settings, run `sshyp tweak`.
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.
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.
All available options can be found with:
```
sshyp --help
```
Or alternatively, in the manpage:
```
man sshyp
```
All available options can be found with `sshyp help`, or alternatively, in the man page.
# Roadmap
Short-term Goals:
- 2FA/MFA management
- create minimal GUI apps (Linux x86_64, Linux aarch64, Haiku x86_64)
- various optimizations/bug fixes
- implement a method for tracking how long it has been since a password has been changed (password aging)
- find and fix more bugs
Long-term Goals:
- migrate from gpg to a better-suited utility focused on symmetric cipher encryption
- seize the thrones, shear the humans
-103
View File
@@ -1,103 +0,0 @@
#!/bin/python3
# external modules
from os import path, system, walk
from os.path import expanduser, getmtime, join
from pathlib import Path
from sys import exit as s_exit
# utility functions
def get_titles_mods(_directory, _destination, _user_data):
_title_list, _mod_list = [], []
Path(path.expanduser('~/.config/sshync')).mkdir(0o700, parents=True, exist_ok=True) # create config directory
# local fetching
if _destination == 'l':
open(expanduser('~/.config/sshync/database'), 'w').write('') # blanks out database file
for _root, _directories, _files in walk(_directory):
for _filename in _files:
_title_list.append(join(_root.replace(_directory, '', 1), _filename))
_mod_list.append(int(getmtime(join(_root, _filename))))
for _title in _title_list:
open(expanduser('~/.config/sshync/database'), 'a').write(str(_title) + '\n')
open(expanduser('~/.config/sshync/database'), 'a').write('^&*\n')
for _mod in _mod_list:
open(expanduser('~/.config/sshync/database'), 'a').write(str(_mod) + '\n')
# remote fetching
if _destination == 'r':
system(f"ssh -i '{_user_data[5]}' -p {_user_data[2]} {_user_data[0]}@{_user_data[1]} \"cd /bin; python -c 'impo"
f"rt sshync; sshync.get_titles_mods(\"'\"{_user_data[4]}\"'\", \"'\"l\"'\", \"'\"{_user_data}\"'\")'\"")
system(f"scp -pqs -P {_user_data[2]} -i '{_user_data[5]}' {_user_data[0]}@{_user_data[1]}:"
f"'/home/{_user_data[0]}/.config/sshync/database' '{expanduser('~/.config/sshync/')}'")
_titles, _sep, _mods = '*&^'.join(open(expanduser('~/.config/sshync/database')).readlines()).replace('\n', '')\
.partition('^&*')
_title_list, _mod_list = _titles.split('*&^')[:-1], _mods.split('*&^')[1:]
return _title_list, _mod_list
def sort_titles_mods(_list_1, _list_2):
_title_list_2_sorted, _mod_list_2_sorted = [], []
# title sorting
for _title in _list_1[0]:
if _title in _list_2[0]:
_title_list_2_sorted.append(_title)
for _title in _list_2[0]:
if _title not in _title_list_2_sorted:
_title_list_2_sorted.append(_title)
# mod time sorting
for _title in _title_list_2_sorted:
_mod_list_2_sorted.append(_list_2[1][_list_2[0].index(_title)])
return _title_list_2_sorted, _mod_list_2_sorted
def make_profile(_profile_dir, _local_dir, _remote_dir, _identity, _ip, _port, _user):
open(_profile_dir, 'w').write(_user + '\n' + _ip + '\n' + _port + '\n' + _local_dir + '\n' + _remote_dir + '\n' +
_identity + '\n')
def get_profile(_profile_dir):
try:
_profile_data = open(_profile_dir).readlines()
except (FileNotFoundError, IndexError):
print('\n\u001b[38;5;9merror: the profile does not exist or is corrupted.\u001b[0m\n')
_profile_data = None
s_exit(1)
# extract data from profile
_user = _profile_data[0].replace('\n', '')
_ip = _profile_data[1].replace('\n', '')
_port = _profile_data[2].replace('\n', '')
_local_dir = _profile_data[3].replace('\n', '')
_remote_dir = _profile_data[4].replace('\n', '')
_identity = _profile_data[5].replace('\n', '')
return _user, _ip, _port, _local_dir, _remote_dir, _identity
def run_profile(_profile_dir):
_user_data = get_profile(_profile_dir)
_remote_titles_mods_saver = get_titles_mods(_user_data[4], 'r', _user_data) # saved to prevent re-walking directory
_index_l = sort_titles_mods(_remote_titles_mods_saver, get_titles_mods(_user_data[3], 'l', _user_data))
_index_r = sort_titles_mods(_index_l, _remote_titles_mods_saver)
_i = -1
for _title in _index_l[0]:
_i += 1
if _title in _index_r[0]:
# compare mod times and sync
if int(_index_l[1][_i]) > int(_index_r[1][_i]):
print(f"\u001b[38;5;4m{_title[:-4]}\u001b[0m is newer locally, uploading...")
system(f"scp -pqs -P {_user_data[2]} -i '{_user_data[5]}' '{_user_data[3]}{_title}' "
f"'{_user_data[0]}@{_user_data[1]}:{_user_data[4]}{'/'.join(_title.split('/')[:-1]) + '/'}'")
elif int(_index_l[1][_i]) < int(_index_r[1][_i]):
print(f"\u001b[38;5;2m{_title[:-4]}\u001b[0m is newer remotely, downloading...")
system(f"scp -pqs -P {_user_data[2]} -i '{_user_data[5]}' '{_user_data[0]}@{_user_data[1]}:"
f"{_user_data[4]}{_title}' '{_user_data[3]}{'/'.join(_title.split('/')[:-1]) + '/'}'")
else:
print(f"\u001b[38;5;4m{_title[:-4]}\u001b[0m is not on remote server, uploading...")
system(f"scp -pqs -P {_user_data[2]} -i '{_user_data[5]}' '{_user_data[3]}{_title}' "
f"'{_user_data[0]}@{_user_data[1]}:{_user_data[4]}{'/'.join(_title.split('/')[:-1]) + '/'}'")
for _title in _index_r[0]:
if _title not in _index_l[0]:
print(f"\u001b[38;5;2m{_title[:-4]}\u001b[0m is not in local directory, downloading...")
system(f"scp -pqs -P {_user_data[2]} -i '{_user_data[5]}' '{_user_data[0]}@{_user_data[1]}:"
f"{_user_data[4]}{_title}' '{_user_data[3]}{'/'.join(_title.split('/')[:-1]) + '/'}'")
-740
View File
@@ -1,740 +0,0 @@
#!/bin/python3
# external modules
from os import environ, listdir, path, remove, system, uname, walk
from pathlib import Path
import random
from shutil import get_terminal_size, move, rmtree
import sshync
import string
from subprocess import Popen, PIPE, STDOUT
from sys import argv, exit as s_exit
from textwrap import fill
# utility functions
def entry_list_gen(): # generates and prints a list of all folders and entries
print('\n\u001b[38;5;0;48;5;15msshyp entries:\u001b[0m\n')
_entry_list, _color_alternator = [], 1
for _entry in sorted(listdir(path.expanduser('~/.password-pasture'))):
if Path(path.expanduser(f"~/.password-pasture/{_entry}")).is_file():
if _color_alternator == 1:
_entry_list.append(f"{_entry.replace('.gpg', '')}")
_color_alternator = 2
else:
_entry_list.append(f"\u001b[38;5;8m{_entry.replace('.gpg', '')}\u001b[0m")
_color_alternator = 1
_real = len(' '.join(_entry_list)) - (5.5 * len(_entry_list))
if _real <= get_terminal_size()[0]:
_width = len(' '.join(_entry_list))
else:
_width = (len(' '.join(_entry_list)) / (_real / get_terminal_size()[0]) - 25)
try:
print(fill(' '.join(_entry_list), width=_width) + '\n')
except ValueError:
pass
for _root, _directories, _files in walk(path.expanduser('~/.password-pasture')):
for _dir in sorted(_directories):
_inner_dir = f"{_root.replace(path.expanduser('~/.password-pasture'), '')}/{_dir}"
print(f"\u001b[38;5;15;48;5;238m{_inner_dir}/\u001b[0m")
_entry_list, _color_alternator = [], 1
for _s_root, _s_directories, _s_files in walk(path.expanduser(f"~/.password-pasture{_inner_dir}")):
for _entry in sorted(_s_files):
if _color_alternator == 1:
_entry_list.append(f"{_entry.replace('.gpg', '')}")
_color_alternator = 2
else:
_entry_list.append(f"\u001b[38;5;8m{_entry.replace('.gpg', '')}\u001b[0m")
_color_alternator = 1
_real = len(' '.join(_entry_list)) - (5.5 * len(_entry_list))
if _real <= get_terminal_size()[0]:
_width = len(' '.join(_entry_list))
else:
_width = (len(' '.join(_entry_list)) / (_real / get_terminal_size()[0]) - 25)
try:
print(fill(' '.join(_entry_list), width=_width) + '\n')
except ValueError:
print('\u001b[38;5;9m-empty directory-\u001b[0m\n')
def entry_reader(_decrypted_entry):
_entry_lines, _notes_flag = open(_decrypted_entry, 'r').readlines(), 0
print()
for _num in range(len(_entry_lines)):
try:
if _num == 0 and _entry_lines[1] != '\n':
print(f"\u001b[38;5;15;48;5;238musername:\u001b[0m\n{_entry_lines[1]}")
elif _num == 1 and _entry_lines[0] != '\n':
print(f"\u001b[38;5;15;48;5;238mpassword:\u001b[0m\n{_entry_lines[0]}")
elif _num == 2 and _entry_lines[2] != '\n':
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:
_notes_flag = 1
print('\u001b[38;5;15;48;5;238mnotes:\u001b[0m\n' + _entry_lines[_num].replace('\n', ''))
elif _num >= 3 and _notes_flag == 1:
print(_entry_lines[_num].replace('\n', ''))
if _notes_flag == 1:
try:
_line_test = _entry_lines[_num + 1]
except IndexError:
print()
except IndexError:
if _num == 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
_lines = open(file_name, 'r').readlines()
_lines[line_num] = text
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
_shm_folder_gen = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits)
for _ in range(random.randint(10, 30)))
_shm_entry_gen = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits)
for _ in range(random.randint(10, 30)))
Path(tmp_dir + _shm_folder_gen).mkdir(0o700)
return _shm_folder_gen, _shm_entry_gen
def pass_gen():
def _pass_gen_function(__complexity, __length):
if __complexity.lower() == 's':
__character_pool = string.ascii_letters + string.digits
else:
__character_pool = string.ascii_letters + string.digits + string.punctuation
__gen = ''.join(random.SystemRandom().choice(__character_pool) for _ in range(__length))
__min_special, __special = round(.2 * __length), 0
for __character in __gen:
if not __character.isalpha():
__special += 1
if __special < __min_special:
__gen = _pass_gen_function(__complexity, __length)
return __gen
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:
_length = 840
print('\n\u001b[38;5;9mpassword length has been limited to the maximum of 840 characters\u001b[0m\n')
_complexity = str(input('password complexity - simple (for compatibility) or complex (for security)? (s/C) '))
_gen = _pass_gen_function(_complexity, _length)
return _gen
def encrypt(_shm_folder, _shm_entry, _location):
system(f"{gpg} -qr {str(gpg_id)} -e '{tmp_dir}{_shm_folder}/{_shm_entry}'")
move(f"{tmp_dir}{_shm_folder}/{_shm_entry}.gpg", f"{directory}{_location}.gpg")
rmtree(f"{tmp_dir}{_shm_folder}")
def 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):
lines = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}").readlines()
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(lines[0:3])
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'w').writelines(lines[3:])
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
edit_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n").read()
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'a').write(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
def tweak(): # runs configuration wizard
# storage/config directory creation
Path(path.expanduser('~/.password-pasture')).mkdir(0o700, parents=True, exist_ok=True)
Path(path.expanduser('~/.config/sshyp/devices')).mkdir(0o700, parents=True, exist_ok=True)
if not Path(f"{path.expanduser('~/.config/sshyp/tmp')}").exists():
if uname()[0] == 'Haiku' or uname()[0] == 'FreeBSD':
system(f"ln -s /tmp {path.expanduser('~/.config/sshyp/tmp')}")
elif Path("/data/data/com.termux").exists():
system(f"ln -s '/data/data/com.termux/files/usr/tmp' {path.expanduser('~/.config/sshyp/tmp')}")
else:
system(f"ln -s /dev/shm {path.expanduser('~/.config/sshyp/tmp')}")
# device type configuration
_device_type = input('\nclient or server installation? (C/s) ')
if _device_type.lower() == 's':
open(path.expanduser('~/.config/sshyp/sshyp-device'), 'w').write(_device_type)
Path(path.expanduser('~/.config/sshyp/deleted')).mkdir(0o700, parents=True, exist_ok=True)
print('\nmake sure the ssh service is running and properly configured\n\nconfiguration complete\n')
s_exit(0)
else:
# device type configuration
_device_type = 'c' # ensure device type flag is properly set
open(path.expanduser('~/.config/sshyp/sshyp-device'), 'w').write(_device_type)
# gpg configuration
_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) ')
if _gpg_id.lower() != 'y':
print('\na unique gpg key has been generated for you.')
system(f"{gpg} --full-generate-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')
# lock file generation
open(path.expanduser('~/.config/sshyp/lock'), 'w')
system(f"{gpg} -qr {str(_gpg_id)} -e {path.expanduser('~/.config/sshyp/lock')}")
remove(f"{path.expanduser('~/.config/sshyp')}/lock")
# ssh key configuration
_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 '
'generated? (Y/n) '))
if _ssh_gen.lower() != 'n':
if uname()[0] == 'Haiku':
Path(f"{path.expanduser('~')}/.ssh").mkdir(0o700, exist_ok=True)
system('ssh-keygen -t ed25519 -f ~/.ssh/sshyp')
else:
print(f"\nensure that the key file you are using is located at {path.expanduser('~/.ssh/sshyp')}")
# ssh ip+port configuration
_ip_port = str(input('\nexample input: 10.10.10.10:9999\n\nip and ssh port of the remote server: '))
_ip, _sep, _port = _ip_port.partition(':')
# ssh user configuration
_username_ssh = str(input('\nusername of the remote server: '))
print(f"\nentry directory: /home/{_username_ssh}/.password-pasture/")
# sshync profile generation
sshync.make_profile(path.expanduser('~/.config/sshyp/sshyp.sshync'),
path.expanduser('~/.password-pasture/'), f"/home/{_username_ssh}/.password-pasture/",
path.expanduser('~/.ssh/sshyp'), _ip, _port, _username_ssh)
# device name configuration
for _name in listdir(path.expanduser('~/.config/sshyp/devices')): # remove existing device name
remove(f"{path.expanduser('~/.config/sshyp/devices/')}{_name}")
print('\n\u001b[4;1mimportant:\u001b[0m This name \u001b[4;1mmust\u001b[0m be unique amongst your client '
'devices\n\nthis is used to keep track of which devices have up-to-date databases.\n')
_client_device_name = str(input('device name: '))
open(f"{path.expanduser('~/.config/sshyp/devices/')}{_client_device_name}", 'w')
copy_name_check(_port, _username_ssh, _ip, _client_device_name)
print('\nconfiguration complete\n')
def print_info(): # prints help text based on argument
if argument_list[0] == 'help' or argument_list[0] == '--help' or argument_list[0] == '-h':
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 "
"comes with absolutely no warranty;\ntype `sshyp license' for details")
print('\n\u001b[1musage:\u001b[0m sshyp [option [flag] [<entry name>]] | [/<entry name>]\n')
print('\u001b[1moptions:\u001b[0m')
print('help/--help/-h bring up this menu')
print('version/-v display sshyp version info')
print('tweak configure sshyp')
print('add add an entry')
print('gen generate a new password')
print('edit edit an existing entry')
print('copy copy details of an entry to your clipboard')
print('shear/-rm delete an existing entry')
print('sync/-s manually sync the entry directory via sshync\n')
print('\u001b[1mflags:\u001b[0m')
print('add:')
print(' password/-p add a password entry')
print(' note/-n add a note entry')
print(' folder/-f add a new folder for entries')
print('edit:')
print(' rename/relocate/-r rename or relocate an entry')
print(' username/-u change the username of an entry')
print(' password/-p change the password of an entry')
print(' note/-n change the note attached to an entry')
print(' url/-l change the url attached to an entry')
print('copy:')
print(' username/-u copy the username of an entry to your clipboard')
print(' password/-p copy the password of an entry to your clipboard')
print(' url/-l copy the url of an entry to your clipboard')
print(' note/-n copy the note of an entry to your clipboard')
print('gen:')
print(' update/-u generate a password for an existing entry\n')
print("\u001b[1mtip:\u001b[0m you can quickly read an entry with 'sshyp /<entry name>'")
elif argument_list[0] == 'version' or argument_list[0] == '-v':
print('\nsshyp is a simple, self-hosted, sftp-synchronized password manager\nfor unix(-like) systems (haiku/'
'freebsd/linux/termux)\n\nsshyp is a viable alternative to (and compatible with) pass/password-store\n')
print(" .. \u001b[38;5;9m♥♥ ♥♥\u001b[0m ..\n .''.''/()\\ \u001b[38;5;13m"
"♥♥♥♥♥♥♥\u001b[0m /()\\''.''.\n * : \u001b[38;5;9m♥♥♥♥♥\u001b[0m : *"
"\n `..'..' \u001b[38;5;13m♥♥♥\u001b[0m `..'..'\n // \\\\ "
"\u001b[38;5;9m♥\u001b[0m // \\\\")
print('\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[38;5;15;48;5;15m \u001b[38;5;15;48;5;8msshyp copyright (c) 2021-2022 '
'randall winkhart\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[38;5;15;48;5;15m \u001b[38;5;15;48;5;8mversion 1.0.0'
'\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 '
'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 '
'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.'
'\n\nhttps://opensource.org/licenses/GPL-3.0\n')
elif argument_list[0] == 'add':
print('\n\u001b[1musage:\u001b[0m sshyp add [flag [<entry name>]]\u001b[0m\n')
print('\u001b[1mflags:\u001b[0m')
print('add:')
print(' password/-p add a password entry')
print(' note/-n add a note entry')
print(' folder/-f add a new folder for entries\n')
elif argument_list[0] == 'edit':
print('\n\u001b[1musage:\u001b[0m sshyp edit [flag [<entry name>]]\u001b[0m\n')
print('\u001b[1mflags:\u001b[0m')
print('edit:')
print(' rename/relocate/-r rename or relocate an entry')
print(' username/-u change the username of an entry')
print(' password/-p change the password of an entry')
print(' url/-l change the url attached to an entry')
print(' note/-n change the note attached to an entry\n')
elif argument_list[0] == 'copy':
print('\n\u001b[1musage:\u001b[0m sshyp copy [flag [<entry name>]]\u001b[0m\n')
print('\u001b[1mflags:\u001b[0m')
print('copy:')
print(' username/-u copy the username of an entry to your clipboard')
print(' password/-p copy the password of an entry to your clipboard')
print(' url/-l copy the url of an entry to your clipboard')
print(' note/-n copy the note of an entry to your clipboard\n')
def no_arg(): # displays a list of entries and gives an option to select one for viewing
print("\nfor a list of usable commands, run 'sshyp help'")
_entry_name = entry_name_fetch('entry to read: ')
if not Path(f"{directory}{_entry_name}.gpg").exists():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
s_exit(1)
_shm_folder, _shm_entry = shm_gen()
decrypt(directory + _entry_name, _shm_folder, _shm_entry)
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
rmtree(f"{tmp_dir}{_shm_folder}")
def read_shortcut(): # shortcut to quickly read an entry
if not Path(f"{directory}{argument.replace('/', '', 1)}.gpg").exists():
print(f"\n\u001b[38;5;9merror: entry ({argument.replace('/', '', 1)}) does not exist\u001b[0m\n")
s_exit(1)
_shm_folder, _shm_entry = shm_gen()
decrypt(directory + argument.replace('/', '', 1), _shm_folder, _shm_entry)
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
rmtree(f"{tmp_dir}{_shm_folder}")
def sync(): # calls sshync to sync changes to the user's server
print('\nsyncing entries with the server device...\n')
# check for deletions
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c "
f"'import sshypRemote; sshypRemote.deletion_check(\"'\"{client_device_name}\"'\")'\"")
system(f"scp -pqs -P {port} -i '{path.expanduser('~/.ssh/sshyp')}' {username_ssh}@{ip}:'/home/{username_ssh}"
f"/.config/sshyp/deletion_database' {path.expanduser('~/.config/sshyp/')}")
try:
_deletion_database = open(path.expanduser('~/.config/sshyp/deletion_database')).readlines()
except (FileNotFoundError, IndexError):
print('\n\u001b[38;5;9merror: the deletion database does not exist or is corrupted\u001b[0m\n')
_deletion_database = None
s_exit(1)
for _file in _deletion_database:
if _file[:-1].endswith('/'):
try:
if silent_sync != 1:
print(f"\u001b[38;5;208m{_file[:-1]}\u001b[0m has been sheared, removing...")
rmtree(f"{path.expanduser('~/.password-pasture/')}{_file[:-1]}")
except FileNotFoundError:
if silent_sync != 1:
print('folder does not exist locally.')
else:
try:
if silent_sync != 1:
print(f"\u001b[38;5;208m{_file[:-1]}\u001b[0m has been sheared, removing...")
remove(f"{path.expanduser('~/.password-pasture/')}{_file[:-1]}.gpg")
except (FileNotFoundError, IsADirectoryError):
if silent_sync != 1:
print('file does not exist locally.')
# check for new folders
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c "
f"'import sshypRemote; sshypRemote.folder_check()'\"")
system(f"scp -pqs -P {port} -i '{path.expanduser('~/.ssh/sshyp')}' {username_ssh}@{ip}:'/home/{username_ssh}"
f"/.config/sshyp/folder_database' {path.expanduser('~/.config/sshyp/')}")
try:
_folder_database = open(path.expanduser('~/.config/sshyp/folder_database')).readlines()
except (FileNotFoundError, IndexError):
print('\n\u001b[38;5;9merror: the folder database does not exist or is corrupted\u001b[0m\n')
_folder_database = None
s_exit(1)
for _folder in _folder_database:
if Path(f"{path.expanduser('~')}{_folder[:-1]}").is_dir():
pass
else:
print(f"\u001b[38;5;2m{_folder.replace('/.password-pasture/', '')[:-1]}/\u001b[0m does not exist locally, "
f"creating...")
Path(f"{path.expanduser('~')}{_folder[:-1]}").mkdir(0o700, parents=True, exist_ok=True)
# set permissions before uploading
system('find ' + directory + ' -type d -exec chmod -R 700 {} +')
system('find ' + directory + ' -type f -exec chmod -R 600 {} +')
sshync.run_profile(path.expanduser('~/.config/sshyp/sshyp.sshync'))
def add_entry(): # adds a new entry
_shm_folder, _shm_entry = None, None # sets base-line values to avoid errors
if len(argument_list) < 3:
_entry_name = entry_name_fetch('name of new entry: ')
else:
_entry_name = entry_name_fetch(2)
if Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) already exists\u001b[0m\n")
s_exit(1)
if argument_list[1] == 'note' or argument_list[1] == '-n':
_shm_folder, _shm_entry = shm_gen()
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read()
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines('\n\n\n' + _notes)
elif argument_list[1] == 'password' or argument_list[1] == '-p':
_username = str(input('username: '))
_password = str(input('password: '))
_url = str(input('url: '))
_add_note = input('add a note to this entry? (y/N) ')
_shm_folder, _shm_entry = shm_gen()
if _add_note.lower() == 'y':
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read()
else:
_notes = ''
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_password + '\n' + _username + '\n' + _url +
'\n' + _notes)
print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
encrypt(_shm_folder, _shm_entry, _entry_name)
def add_folder(): # creates a new folder
if len(argument_list) < 3:
_entry_name = entry_name_fetch('name of new folder: ')
else:
_entry_name = entry_name_fetch(2)
Path(directory + _entry_name).mkdir(0o700)
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"mkdir -p '{directory_ssh}"
f"{_entry_name}'\"")
def rename(): # renames an entry or folder
if argument == 'edit rename' or argument == 'edit relocate' or argument == 'edit -r':
_entry_name = entry_name_fetch('entry/folder to rename/relocate: ')
else:
_entry_name = entry_name_fetch(2)
if not Path(f"{directory}{_entry_name}.gpg").is_file() and not Path(f"{directory}{_entry_name}").is_dir():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
s_exit(1)
_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)
if _entry_name.endswith('/'):
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}"
f"{_new_name}'\"")
else:
move(f"{directory}{_entry_name}.gpg", f"{directory}{_new_name}.gpg")
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c "
f"'import sshypRemote; sshypRemote.delete(\"'\"{_entry_name}\"'\")'\"")
def edit(): # edits the contents of an entry
_shm_folder, _shm_entry = None, None # sets base-line values to avoid errors
if len(argument_list) < 3:
_entry_name = entry_name_fetch('entry to edit: ')
else:
_entry_name = entry_name_fetch(2)
if not Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
s_exit(1)
_shm_folder, _shm_entry = shm_gen()
decrypt(directory + _entry_name, _shm_folder, _shm_entry)
# compatibility check for GNU pass entries (ensuring they have at least four lines)
_lines = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines()
if len(_lines) < 3:
while len(_lines) < 3:
_lines.append('\n')
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_lines)
if argument_list[1] == 'username' or argument_list[1] == '-u':
_detail = str(input('new username: '))
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 1, _detail + '\n')
elif argument_list[1] == 'password' or argument_list[1] == '-p':
_detail = str(input('new password: '))
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 0, _detail + '\n')
elif argument_list[1] == 'url' or argument_list[1] == '-l':
_detail = str(input('new url: '))
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 2, _detail + '\n')
elif argument_list[1] == 'note' or argument_list[1] == '-n':
edit_note(_shm_folder, _shm_entry)
remove(f"{directory}{_entry_name}.gpg")
print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
encrypt(_shm_folder, _shm_entry, _entry_name)
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
if argument == 'gen update' or argument == 'gen -u' or argument == 'gen':
_entry_name = entry_name_fetch('name of entry: ')
elif argument_list[1] == 'update' or argument_list[1] == '-u':
_entry_name = entry_name_fetch(2)
if not Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
s_exit(1)
else:
_entry_name = entry_name_fetch(1)
if len(argument_list) == 1 or (not argument_list[1] == 'update' and not argument_list[1] == '-u'):
if Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) already exists\u001b[0m\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()
if _add_note.lower() == 'y':
system(f"nano {tmp_dir}{_shm_folder}/{_shm_entry}-n")
_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read()
else:
_notes = ''
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_password + '\n' + _username + '\n' + _url + '\n'
+ _notes)
print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
encrypt(_shm_folder, _shm_entry, _entry_name)
else:
_password = pass_gen()
_shm_folder, _shm_entry = shm_gen()
decrypt(directory + _entry_name, _shm_folder, _shm_entry)
replace_line(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 0, _password + '\n')
remove(f"{directory}{_entry_name}.gpg")
print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
encrypt(_shm_folder, _shm_entry, _entry_name)
def copy_data(): # copies a specified field of an entry to the clipboard
if len(argument_list) < 3:
_entry_name = entry_name_fetch('entry to copy: ')
else:
_entry_name = entry_name_fetch(2)
if not Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
s_exit(1)
_shm_folder, _shm_entry = shm_gen()
decrypt(directory + _entry_name, _shm_folder, _shm_entry)
_copy_line = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines()
if uname()[0] == 'Haiku': # Haiku clipboard detection
if argument_list[1] == 'username' or argument_list[1] == '-u':
system('clipboard -c ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'")
elif argument_list[1] == 'password' or argument_list[1] == '-p':
system('clipboard -c ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'")
elif argument_list[1] == 'url' or argument_list[1] == '-l':
system('clipboard -c ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'")
elif argument_list[1] == 'note' or argument_list[1] == '-n':
system('clipboard -c ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'")
Popen('sleep 30; clipboard -r', shell=True)
elif Path("/data/data/com.termux").exists(): # Termux (Android) clipboard detection
if argument_list[1] == 'username' or argument_list[1] == '-u':
system('termux-clipboard-set ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'")
elif argument_list[1] == 'password' or argument_list[1] == '-p':
system('termux-clipboard-set ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'")
elif argument_list[1] == 'url' or argument_list[1] == '-l':
system('termux-clipboard-set ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'")
elif argument_list[1] == 'note' or argument_list[1] == '-n':
system('termux-clipboard-set ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'")
Popen("sleep 30; termux-clipboard-set ''", shell=True)
elif environ.get('WAYLAND_DISPLAY') == 'wayland-0': # Wayland clipboard detection
if argument_list[1] == 'username' or argument_list[1] == '-u':
system('wl-copy ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'")
elif argument_list[1] == 'password' or argument_list[1] == '-p':
system('wl-copy ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'")
elif argument_list[1] == 'url' or argument_list[1] == '-l':
system('wl-copy ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'")
elif argument_list[1] == 'note' or argument_list[1] == '-n':
system('wl-copy ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'")
Popen('sleep 30; wl-copy -c', shell=True)
else: # X11 clipboard detection
if argument_list[1] == 'username' or argument_list[1] == '-u':
system('echo -n ' + "'" + _copy_line[1].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
elif argument_list[1] == 'password' or argument_list[1] == '-p':
system('echo -n ' + "'" + _copy_line[0].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
elif argument_list[1] == 'url' or argument_list[1] == '-l':
system('echo -n ' + "'" + _copy_line[2].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
elif argument_list[1] == 'note' or argument_list[1] == '-n':
system('echo -n ' + "'" + _copy_line[3].replace('\n', '').replace("'", "'\\''") + "'" + ' | xclip -sel c')
Popen("sleep 30; echo -n '' | xclip -sel c", shell=True)
rmtree(f"{tmp_dir}{_shm_folder}")
def remove_data(): # deletes an entry from the server and flags it for local deletion on sync
if argument == 'shear' or argument == '-rm':
_entry_name = entry_name_fetch('entry/folder to shear: ')
else:
_entry_name = entry_name_fetch(1)
decrypt(path.expanduser('~/.config/sshyp/lock.gpg'), 0, 0)
system(f"ssh -i '{path.expanduser('~/.ssh/sshyp')}' -p {port} {username_ssh}@{ip} \"cd /bin; python -c "
f"'import sshypRemote; sshypRemote.delete(\"'\"{_entry_name}\"'\")'\"")
if __name__ == "__main__":
try:
silent_sync, ssh_error = 0, 0
# retrieve typed argument
argument_list, argument = argv, ''
del argument_list[0]
for _argument in argument_list:
argument += _argument + ' '
argument = argument[:-1]
if uname()[0] == 'Haiku': # set proper gpg command for OS
gpg = 'gpg --pinentry-mode loopback'
else:
gpg = 'gpg'
# import saved userdata
if argument != 'tweak':
device_type = ''
tmp_dir = path.expanduser('~/.config/sshyp/tmp/')
try:
device_type = open(path.expanduser('~/.config/sshyp/sshyp-device')).read().strip()
if device_type == 'c':
ssh_info = sshync.get_profile(path.expanduser('~/.config/sshyp/sshyp.sshync'))
username_ssh = ssh_info[0].replace('\n', '')
ip = ssh_info[1].replace('\n', '')
port = ssh_info[2].replace('\n', '')
directory = str(ssh_info[3].replace('\n', ''))
directory_ssh = '/home/' + username_ssh + '/.password-pasture/'
client_device_name = listdir(path.expanduser('~/.config/sshyp/devices'))[0]
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':
print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
print("not all necessary configuration files are present - please run 'sshyp tweak'")
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n')
s_exit(1)
else:
tweak()
s_exit(0)
# run function based on arguments
if argument.startswith('/'):
read_shortcut()
elif argument == '':
no_arg()
elif argument == 'help' or argument == '--help' or argument == '-h' or argument == 'license' or argument \
== 'version' or argument == '-v':
print_info()
elif argument_list[0] == 'add':
if len(argument_list) == 1:
print_info()
elif argument_list[1] == 'note' or argument_list[1] == '-n' or argument_list[1] == 'password' or \
argument_list[1] == '-p':
add_entry()
elif argument_list[1] == 'folder' or argument_list[1] == '-f':
add_folder()
else:
print_info()
s_exit(0)
elif argument_list[0] == 'edit':
if len(argument_list) == 1:
print_info()
elif argument_list[1] == 'rename' or argument_list[1] == 'relocate' or argument_list[1] == '-r':
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()
elif argument_list[0] == 'copy':
if len(argument_list) == 1:
print_info()
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':
copy_data()
else:
print_info()
elif argument_list[0] == 'shear' or argument_list[0] == '-rm':
remove_data()
elif argument_list[0] != 'sync' and argument_list[0] != '-s':
print(f"\n\u001b[38;5;9merror: invalid argument - run 'sshyp help' to list usable commands\u001b[0m\n")
s_exit(1)
# sync if any changes were made
if len(argument_list) > 0 and ssh_error == 0 and \
((argument_list[0] == 'sync' or argument_list[0] == '-s' or argument_list[0] == 'gen' or
argument_list[0] == 'shear' or argument_list[0] == '-rm') or ((argument_list[0] == 'add'
or argument_list[0] == 'edit')
and len(argument_list) > 1)):
sync()
s_exit(0)
except KeyboardInterrupt:
print('\n')
s_exit(0)
-45
View File
@@ -1,45 +0,0 @@
#!/bin/python3
# external modules
from os import listdir, remove, walk
from os.path import expanduser
from shutil import rmtree
# utility functions
def delete(_file_path):
if _file_path.endswith('/'):
try:
rmtree(f"{expanduser('~/.password-pasture/')}{_file_path}")
except FileNotFoundError:
print('folder does not exist remotely')
else:
try:
remove(f"{expanduser('~/.password-pasture/')}{_file_path}.gpg")
except FileNotFoundError:
print('file does not exist remotely')
for _device_name in listdir(expanduser('~/.config/sshyp/devices')):
open(f"{expanduser('~/.config/sshyp/deleted/')}{_file_path.replace('/', '@')}^&*{_device_name}", 'w')
def deletion_check(_client_device_name):
open(expanduser('~/.config/sshyp/deletion_database'), 'w').write('')
for _file in listdir(expanduser('~/.config/sshyp/deleted')):
_file_path = _file.replace('@', '/').split('^&*')[0]
_device = _file.split('^&*')[1]
if _device == _client_device_name:
try:
remove(f"{expanduser('~/.config/sshyp/deleted/')}{_file}")
except FileNotFoundError:
pass
open(expanduser('~/.config/sshyp/deletion_database'), 'a').write(_file_path + '\n')
def folder_check():
open(expanduser('~/.config/sshyp/folder_database'), 'w').write('')
for _root, _directories, _files in walk(expanduser('~/.password-pasture')):
for _dir in _directories:
open(expanduser('~/.config/sshyp/folder_database'), 'a')\
.write(f"{_root.replace(expanduser('~'), '')}/{_dir}\n")
Executable
+5
View File
@@ -0,0 +1,5 @@
#!/bin/sh
sed -i 's/[[:space:]]*$//' ./lib/* ./port-jobs/* ./package.sh
git add -f extra lib/sshyp.py lib/sshync.py lib/stweak.py lib/clipclear.py port-jobs share LICENSE README.md package.sh commit.sh .gitignore
git commit -m "$1"
git push
+460
View File
@@ -0,0 +1,460 @@
sshyp 2021.12.01.fr2.2
The Lighter Update - Patch 2
This release is a hotfix for 2021.12.01.fr2.1.
Changes:
- a major fix for "/var/lib/sshync_database" needing to already exist server-side
- a major fix for syncing functionality (it should actually work now)
- silenced some sftp output
An fr2.3 patch is planned for this version. It will include the following:
- fixes for any new bugs that may be discovered in the new sshyp and sshync code
- the gen command in sshyp will be updated to use the newer notetaking system
- printing functions in sshyp will be combined into one function (arguments will determine section to print)
- file not found exceptions will be re-implemented
- when syncing, a check will be made to see if any folders are not on all devices and this will be corrected
Planned for next major update (The Fluffier Update):
- new visual features
^ this includes the new file list and thematic text art. sshyp will be
getting a retro computing theme.
- packages for more environments
^ "sshyp" will be officially packaged for Arch Linux, Alpine Linux, and Termux (Android).
Debian/Ubuntu and Fedora packaging will come later.
- imporove password generator to guarantee more secure results
Planned for next, next major update (The Shears Update Pt. 1):
- enforce permissions on the server-side
- allow for copying entire notes (not just first line)
- allow for multi-client deletion... somehow
- detatch sshync and make it a separate package
- manpage
Planned for next, next, next major update (The Shears Update Pt. 2):
- ability to pass entries as arguments for more functions
- auto-completion on tab (currently unsure of best way to make this work)
Backlog:
- package for more Linux distributions, such as Debian and Fedora
- create separate gui frontend targetting mobile and desktop Linux
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2021.12.01.fr2.1
The Lighter Update - Patch 1
This release is a hotfix for 2021.12.01.fr2.
Changes:
- fixed a bug where "sshyp tweak" would not function on new installations
- moved the argument parser to the global process
- running "sshyp version" or "sshyp -v" no longer triggers syncing
- folders are now created natively with Python, rather than through system commands
An fr2.2 patch is planned for this version. It will include the following:
- fixes for any new bugs that may be discovered in the new sshyp and sshync code
- the gen command in sshyp will be updated to use the newer notetaking system
- printing functions in sshyp will be combined into one function (arguments will determine section to print)
- file not found exceptions will be re-implemented
Planned for next major update (The Fluffier Update):
- new visual features
^ this includes the new file list and thematic text art. sshyp will be
getting a retro computing theme.
- packages for more environments
^ "sshyp" will be officially packaged for Arch Linux, Alpine Linux, and Termux (Android).
Debian/Ubuntu and Fedora packaging will come later.
- imporove password generator to guarantee more secure results
Planned for next, next major update (The Shears Update Pt. 1):
- enforce permissions on the server-side
- allow for copying entire notes (not just first line)
- allow for multi-client deletion... somehow
- detatch sshync and make it a separate package
- manpage
Planned for next, next, next major update (The Shears Update Pt. 2):
- ability to pass entries as arguments for more functions
- auto-completion on tab (currently unsure of best way to make this work)
Backlog:
- package for more Linux distributions, such as Debian and Fedora
- create separate gui frontend targetting mobile and desktop Linux
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2021.12.01.fr2
The Lighter Update
This release features a major re-write of old "rpass" code.
sshyp is now more reliable and better documented.
New features:
- a full re-write of the old "rpass" code used in the last release
^ includes more reliable argument parsing and various optimizations
- a full re-write of "sshync", many issues fixed
^fixed many instances where sshync would refuse to upload/download
^fixed errors that were being thrown despite sshync working as intended
- new folders are now also created on the server
Changes:
- nested folders actually work now
- multi-word entry and folder titles are fixed
An fr2.1 patch is planned for this version. It will include the following:
- fixes for any new bugs that may be discovered in the new sshyp and sshync code
- the gen command in sshyp will be updated to use the newer notetaking system
- printing functions in sshyp will be combined into one function (arguments will determine section to print)
- file not found exceptions will be re-implemented
- the argument parser will be moved to the global process (no need for it to be in a function)
- folders will be created natively in python
Planned for next major update (The Fluffier Update):
- new visual features
^ this includes the new file list and thematic text art. sshyp will be
getting a retro computing theme.
- packages for more environments
^ "sshyp" will be officially packaged for Arch Linux, Alpine Linux, and Termux (Android).
Debian/Ubuntu and Fedora packaging will come later.
- imporove password generator to guarantee more secure results
Planned for next, next major update (The Shears Update Pt. 1):
- allow for copying entire notes (not just first line)
- allow for multi-client deletion... somehow
- detatch sshync and make it a separate package
- manpage
Planned for next, next, next major update (The Shears Update Pt. 2):
- ability to pass entries as arguments for more functions
- auto-completion on tab (currently unsure of best way to make this work)
Backlog:
- package for more Linux distributions, such as Debian and Fedora
- create separate gui frontend targetting mobile and desktop Linux
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2021.11.05.fr1
First public release of sshyp.
This release fixes major bugs from rpass and rebrands the project.
New features:
- an entirely new syncing back-end called sshync (custom Python wrapper around sftp)
^ in thoery, all syncing-related data loss should now be fixed, however, this new
system has just been created and is still under testing. Maybe wait for a few patches
before trusting this system.
Changes:
- branding has been updated to reflect new project name and goals
- custom directories, custom ssh keys, and offline only mode are removed (may be temporary)
^ the configuration wizard is being re-written in the next major update
Planned for next update (The Fluffy Update):
- modularized and optimized code
^ some older, bad code from "rpass" will be re-written.
- new visual features
^ this includes the new file list and thematic text art. sshyp will be
getting a retro computing theme.
- packages for more environments
^ "sshyp" will be officially packaged for Arch Linux, Alpine Linux, and Termux (Android).
Debian/Ubuntu and Fedora packaging will come later.
Planned for next update (The Sheep w/Shears Update):
- allow for copying entire notes (not just first line)
- allow for multi-client deletion... somehow
- ability to pass entries as arguments for more functions
- detatch sshync and make it a separate package
- manpage
Planned, no timeline:
- create separate gui frontend targetting mobile devices (Android + Linux phones)
^ the gui will also function on desktop linux
- package for more Linux distributions, such as Debian and Fedora)
- auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.11.01.mr5.1
The Notetaker Update - Patch 1
This is the FINAL release of "rpass".
After this release, the project will be rebranded as "sshyp".
rpass's syncing system is fundamentally broken, hence the need for "sshyp"
and its new syncing system. I would highly advise against using this release.
New features:
- none
Changes:
- fixed an issue with copying notes (currently only copies first line, will be changed in the future)
- rpass is validated to work with Python 3.10 (no changes were needed)
Planned for next update (sshyp fr1)
- full project rebrand ("sshyp")
- new syncing back-end
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.10.07.mr5
The Notetaker Update - Fifth main release of rpass
This release overhauls the note-taking system and provides general improvements
to overall code quality, including optimizations, bug fixes, and security improvements.
New features:
- notes are now edited in nano and can be split across multiple lines
- password confirmation has been added for entry deletion
Changes:
- fixed issues with copying passwords with certain special characters, e.g. '"()|
- auto-generated ssh key now uses ed25519, rather than rsa-3072
- entry format modified to include a blank line before the notes field (old format still mostly compatible)
- rpass is now much better at catching bad arguments
- some general code cleanup
Planned for next update (The Housekeeping Update Pt. 2):
- add new file list w/color and w/o extensions + proper displaying of nested folders
- ability to pass entries as arguments for more functions
- manpage
- add more comments to code
- validate for Python 3.10
Planned for next update (The cryptpass Update):
- initial implementation of a data store for other applications (libsecret alt.)
- modularize code in preparation for GUI frontends
Planned, no timeline:
- create separate gui frontend targetting mobile devices (first Linux phones, maybe Android at a later date - official iOS client not likely)
^ the gui will also function on desktop linux
- make platform agnostic (add Windows support and package for more Linux distributions, such as Alpine and Debian)
- auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.15.mr4.2
The Housekeeping Update (Pt. 1) - Hotfix 2
Changes:
- sync support is fixed
- files with spaces in their names can now be properly deleted from remote servers
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.15.mr4.1
The Housekeeping Update (Pt. 1) - Hotfix
Changes:
- the user is once again properly presented with a prompt to enter a gpg key when pressing enter through the config dialog
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass-2021.09.15.mr4
The Housekeeping Update (Pt. 1) - Fourth main release of rpass
This release focuses primarily on polishing rpass and tying up loose ends before
making any major changes in the future.
New features:
- added clipboard support for copying entry information
- many common errors are now handled with proper exceptions
- offline support (sync no longer needs to be configured for rpass to function)
Changes:
- fixed gpg decryption warnings
- added version info argument
- re-ordered config wizard to make more sense
- entry deletion can now be done client-side
- removed rsyncup/rsyncdown/username/ip/port/directoryssh files,
^ replaced with one file that holds usernamessh, ip, port, directoryssh, and devicetype
- files should no longer be left in /dev/shm when an error is encountered
- fixed issues relating to using a non-default entry directory
- lots of optimizations have been made to reduce the size of rpass
Planned for next update (The Housekeeping Update Pt. 2):
- a clean, colorful entry list w/o file extensions
- manpage
- multi-line notes
- commented the code
- ability to pass entries as arguments for more functions
- improve exceptions for unknown arguments
Planned, no timeline:
- possible libsecret integration
- create separate gui frontend targetting mobile devices (first Linux phones, maybe Android at a later date - official iOS client not likely)
^ the gui will also function on desktop linux
- make platform agnostic (add Windows support and package for more Linux distributions)
- auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.07.pr3.1
The Sync and Foundations Update - Hotfix
Changes:
- gpg configuration now prompts for expiration, rather than defaulting to two years
- rsync is now configured to not delete anything from any remote device when uploading
^ this behavior may be modified in the future - this is a quick fix to prevent data loss
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.07.pr3
The Sync and Foundations Update - Third public release of rpass.
As of this version, rpass has its intended base set of features and is considered usable.
It will now primarily recieve bug fixes and polish updates to prepare it to go
cross-platform and to make it compatible with GUI frontends.
New features:
- rsync support!
- new entry format with URL field (for future use)
- the temporary directory (/dev/shm) for editing entries has been somewhat secured
Changes:
- 'rpass edit relocate' is now properly bound
- dropped the use of 'echo'
- added 'rsync' and 'openssh' as dependencies
- fixed a bug with deleting entries from folders
- entry directory now has more secure permissions
^ these permissions are re-enforced every time rpass is used
- fixed some small typos and potential bugs, made some small optimizations
Planned for next update (The Housekeeping Update):
- move to github
- get rid of gpg decryption warnings
- proper error messages using 'except'
- add exceptions for unknown arguments
- cleanup file list by exporting to document and removing .gpg, adding color
- add a manpage
- allow notes to be multiple lines long (break lines after so many characters)
- validate for Python 3.10
- properly comment the code
Planned, no timeline:
- allow to function as alternative to gnome keyring (libsecret integration)
- create separate gui frontend targetting mobile devices (first linux phones, maybe android at a later date - official iOS client not likely)
^ the gui will also function on desktop linux
- make platform agnostic (add windows support and package for more Linux distributions)
- ability to pass entries as arguments for more functions
- auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.02.pr2
The Folder Update - Second public release of rpass.
New features:
- entry and folder titles can now have spaces and be as long as you want
- entires and folders can now be deleted with 'rpass remove' or 'rpass -rm'
- entries now properly save to folders via 'rpass add' and should no longer throw errors
- entries saved in folders are now readable
- existing entries can now be moved to, from, and between folders
- previews are now shown after creating or editing an entry
Changes:
- every pre-existing function of rpass has been updated to work with the new folder system
- dropped awk as a dependency
- removed 'argument' file in /var/lib/rpass
- reduced unneccessary characters in argument parsing to decrease compatibility issues
- ensured all user input is handled correctly as a string or an integer
- lots of miscellaneous optimizations
Expected for next update (The rsync Update):
- rsync (over ssh) support!
^ including any fixes, changes, or optimizations necessary to make that happen
- new file formatting with support for URLs
^all entries created in new format should be compatible with future versions of rpass
- secure /dev/shm with random text generator
Expected for the next (next) update (The Housekeeping Update)
- get rid of gpg decryption warnings
- proper error messages using 'except'
- add exceptions for unknown arguments
- cleanup file list by exporting to document and removing .gpg, adding color
Planned, no timeline:
- make platform agnostic (basically, add windows support)
- create separate gui frontend targetting mobile devices (first linux phones, android at a later date)
^ the gui will also function on desktop linux
- ability to pass entries as arguments for more functions
- auto-completion on tab
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.01.pr1.1
First public release of rpass.
Early build, missing critical features (e.g. sync support and the ability to have spaces in filenames).
What is currently functional:
- guided configuration wizard
- generate passwords
- add existing passwords
- make notes
- sort notes and passwords into folders
- gpg encryption
- edit password/note entries
+202 -464
View File
@@ -1,3 +1,204 @@
sshyp v1.3.0
the serious shepherd update
this release ties up many of sshyp's loose ends where there was
room for major performance, compatibility, and security improvements
compatibility-breaking changes:
- due to a near full re-write of the syncing functionality, all clients and servers
must be updated to this release (v1.3.0 is not backwards compatible with any prior release)
- it is recommended to either delete the contents of ~/.config/sshyp/deleted (on the server-side)
or sync all of your clients before updating
^ old entries in this folder will throw errors with v1.3.0
user-facing features:
- none - all changes were under-the-hood - the user experience should be
exactly the same as v1.2.0 - just faster, less buggy, and more secure
major fixes/optimizations:
- a near full re-write of the syncing functionality
^ all syncing logic has been moved into sshync.py (from sshyp.py and sshypRemote.py)
^ in my setup, a dry, local "sshyp sync" went from 2.00+ seconds (v1.2.0) to 0.36 seconds (v1.3.0)
^ the performance improvements are even greater when syncing from outside your local network
- the following character sequences will no longer break the syncing logic: "@", "^&*", and "*&^"
^ ASCII separator characters 29-31 are now used, instead
- os.system has been replaced with subprocess.run in all cases, shell=True is no longer used with subprocess.run
^ this protects against shell escape attacks and potentially makes sshyp more compatible with some environments
- replaced shell commands with python built-in library functions where applicable
^ this brings speed and compatibility improvements
- sshyp should no longer incorrectly assume an X11 environment when Wayland is in use
^ this fixes clipboard support in some Wayland environments, such as Sway (Plasma/Gnome/Phosh were unaffected)
- sshyp now uses the default pinentry on Haiku thanks to haikuports/haikuports#7457
^ this brings the Haiku port in-line with the other sshyp packages in terms of security
- "python3" is now called over ssh, rather than "python"
^ some environments do not have a "python" symlink, or it links to "python2" - changing this increases compatibility
- fixed an issue from v1.2.0 where renaming threw an error if not in offline mode
other notable changes:
- quick-unlock password input is now hidden while the user is typing
^ user input is now invisible to prevent snooping
- lots of smaller optimizations not listed here
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.2.0
the brisk bahh update
this release focuses on speeding up the sshyp user experience by adding
new features that reduce wasted time
compatibility-breaking changes:
- new configuration options (quick-unlock, offline mode) have been added and
the configuration files have been reorganized
^ simply running "sshyp tweak" and following the setup wizard will correct any compatibility
issues
- for quick-unlock security, device names have been replaced with more secure device ids
^ older device names are still compatible, but for security reasons it is recommended
to delete any pre-existing device names from the server and allow "sshyp tweak" to re-register
your devices
user-facing features:
- quick-unlock mode has been added
^ this allows you to use a shortened version of your password by verifying that your device
is whitelisted on your sshyp server - it's both faster and more secure than standard unlock,
but it requires an active connection to your sshyp server to authenticate (otherwise it will
fall back to standard unlock)
- full support for offline usage
^ though sshyp could be used without a server before, it now can be configured to not attempt
to find one ever - this saves time and hides sync failure error messages
- bash completions have been added
^ if you have bash-completion installed, you can now use the tab key in bash to auto-complete
sshyp arguments and entry names (client only, not added for server-specific arguments)
^ if you do not have bash-completion installed, you can source
/usr/share/bash-completion/completions/sshyp (Linux/BSD) or
/boot/system/data/bash-completion/completions/sshyp (Haiku) in your ~/.bashrc to
use this feature
fixes/optimizations:
- fixed entries with multi-word titles failing to decrypt
- password generation is now much faster and more resource efficient
- there is no longer a length limit on generated passwords
- improved visual consistency of help menus
- rarely used modules are now imported only when needed
- sshyp now uses one fewer configuration file
other notable changes:
- sshyp is now specifically licensed under the GPL-3.0-only (keyword: only)
- sshyp now has some possible arguments and its own help menu when running in server mode
- temporary files in /dev/shm are now generated with more complex names
- sshyp now installs in /usr/lib/sshyp (Linux/BSD) or /system/lib/sshyp (Haiku) instead of
/usr/bin or /bin (it is still symlinked to the old directories)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.1.2
the sheecrets update - patch two
this is a general polish/bugfix release
user-facing features:
- packaging support for Alpine Linux/postmarketOS
- the rename() function is no longer unnecessarily verbose
- handled exception for when the user attempts to copy an entry field that does not exist
fixes/optimizations:
- replaced shebang with "#!/usr/bin/env python3" for improved compatibility with various systems
^ does not affect Haiku packaging
- fixed the generic package not actually being compressed
- reduced lines of code used for cross-device entry deletion
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.1.1
the sheecrets update - patch one
this is a polish/bug fix release that makes tweaks to the entry format (without breaking compatibility)
compatibility-breaking changes:
- none; the entry format tweaks are backward compatible with sshyp v1.0.0+
^ the new format is slightly more efficient in terms of storage space
^ if you would like to upgrade to it, run this script (after updating to v1.1.1):
https://raw.githubusercontent.com/rwinkhart/sshyp-labs/main/extra/conversion-scripts/sshyp-refresh-1.1.1%2B.py
user-facing features:
- entries (when editing or adding) are now run through the new optimized_edit() function to strip trailing new lines
and ensure the format of the entries is fully compatible with all of sshyp's functions
fixes:
- when adding a note to an entry, there is no longer a chance the first note line will be added as a url
if the entry is using an older format/pass format
- the gpg auto-generation file temporarily created by sshyp no longer includes extra spaces
^ seems to serve no functional purpose - fixed for the sake of polish
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.1.0
the sheecrets update
the main focus of this release was adding extension support (particularly for sshyp-mfa)
and cleaning up the configuration experience
compatibility-breaking changes:
- the entry directory has been moved from ~/.password-pasture to ~/.local/share/sshyp
as a means of complying with the XDG base directory spec
^ this requires the user to move their entry directory to the new location manually
^ if this is not done, sshyp will not be able to find entries made prior to v1.1.0
- due to a new configuration option (preferred text editor), 'sshyp tweak' must be run after updating
user-facing features:
- extension support
^ some of sshyp's critical functions can now be imported into other programs to extend
upon sshyp's functionality
^ the first usecase of this is sshyp-mfa, which can be found at https://github.com/rwinkhart/sshyp-labs
- a new configuration experience
^ the 'sshyp tweak' menu has been made much more readable, and now the automatically generated
gpg key has its id automatically input, making the process easier for the user
- customizable text editor
^ the text editor used for editing notes can now be set to any editor preferred by the user
^ this means that nano was dropped as a dependency
fixes:
- to avoid exceptions on server devices, all arguments (apart from 'tweak') have been disabled on servers
- fixed entry readout not printing blank lines between fields under certain conditions
- various optimizations
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.0.1
The Polished Trotters Update - Patch 1
This is a hotfix for the Haiku decryption bug.
Changes:
- subprocess.Popen has been replaced with subprocess.run where applicable
- stdout is no longer captured with any subprocess.Popen or subprocess.run usages
^ this fixes decryption on Haiku
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.0.0
The Polished Trotters Update
@@ -502,7 +703,7 @@ Changes:
- sshyp now uses a symlink to the temporary storage directory, allowing for easy implementation of different temporary directories on different platforms
^ the first usage of this is enabling the use of temporary storage on Termux
- sshync now properly auto-generates its config directory
- sshync now properly auto-generates its config directory
Additions planned for minor releases:
@@ -696,466 +897,3 @@ Backlog:
- package for more Linux distributions, such as Debian and Fedora
- create separate gui frontend targetting mobile and desktop Linux
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2021.12.01.fr2.2
The Lighter Update - Patch 2
This release is a hotfix for 2021.12.01.fr2.1.
Changes:
- a major fix for "/var/lib/sshync_database" needing to already exist server-side
- a major fix for syncing functionality (it should actually work now)
- silenced some sftp output
An fr2.3 patch is planned for this version. It will include the following:
- fixes for any new bugs that may be discovered in the new sshyp and sshync code
- the gen command in sshyp will be updated to use the newer notetaking system
- printing functions in sshyp will be combined into one function (arguments will determine section to print)
- file not found exceptions will be re-implemented
- when syncing, a check will be made to see if any folders are not on all devices and this will be corrected
Planned for next major update (The Fluffier Update):
- new visual features
^ this includes the new file list and thematic text art. sshyp will be
getting a retro computing theme.
- packages for more environments
^ "sshyp" will be officially packaged for Arch Linux, Alpine Linux, and Termux (Android).
Debian/Ubuntu and Fedora packaging will come later.
- imporove password generator to guarantee more secure results
Planned for next, next major update (The Shears Update Pt. 1):
- enforce permissions on the server-side
- allow for copying entire notes (not just first line)
- allow for multi-client deletion... somehow
- detatch sshync and make it a separate package
- manpage
Planned for next, next, next major update (The Shears Update Pt. 2):
- ability to pass entries as arguments for more functions
- auto-completion on tab (currently unsure of best way to make this work)
Backlog:
- package for more Linux distributions, such as Debian and Fedora
- create separate gui frontend targetting mobile and desktop Linux
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2021.12.01.fr2.1
The Lighter Update - Patch 1
This release is a hotfix for 2021.12.01.fr2.
Changes:
- fixed a bug where "sshyp tweak" would not function on new installations
- moved the argument parser to the global process
- running "sshyp version" or "sshyp -v" no longer triggers syncing
- folders are now created natively with Python, rather than through system commands
An fr2.2 patch is planned for this version. It will include the following:
- fixes for any new bugs that may be discovered in the new sshyp and sshync code
- the gen command in sshyp will be updated to use the newer notetaking system
- printing functions in sshyp will be combined into one function (arguments will determine section to print)
- file not found exceptions will be re-implemented
Planned for next major update (The Fluffier Update):
- new visual features
^ this includes the new file list and thematic text art. sshyp will be
getting a retro computing theme.
- packages for more environments
^ "sshyp" will be officially packaged for Arch Linux, Alpine Linux, and Termux (Android).
Debian/Ubuntu and Fedora packaging will come later.
- imporove password generator to guarantee more secure results
Planned for next, next major update (The Shears Update Pt. 1):
- enforce permissions on the server-side
- allow for copying entire notes (not just first line)
- allow for multi-client deletion... somehow
- detatch sshync and make it a separate package
- manpage
Planned for next, next, next major update (The Shears Update Pt. 2):
- ability to pass entries as arguments for more functions
- auto-completion on tab (currently unsure of best way to make this work)
Backlog:
- package for more Linux distributions, such as Debian and Fedora
- create separate gui frontend targetting mobile and desktop Linux
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2021.12.01.fr2
The Lighter Update
This release features a major re-write of old "rpass" code.
sshyp is now more reliable and better documented.
New features:
- a full re-write of the old "rpass" code used in the last release
^ includes more reliable argument parsing and various optimizations
- a full re-write of "sshync", many issues fixed
^fixed many instances where sshync would refuse to upload/download
^fixed errors that were being thrown despite sshync working as intended
- new folders are now also created on the server
Changes:
- nested folders actually work now
- multi-word entry and folder titles are fixed
An fr2.1 patch is planned for this version. It will include the following:
- fixes for any new bugs that may be discovered in the new sshyp and sshync code
- the gen command in sshyp will be updated to use the newer notetaking system
- printing functions in sshyp will be combined into one function (arguments will determine section to print)
- file not found exceptions will be re-implemented
- the argument parser will be moved to the global process (no need for it to be in a function)
- folders will be created natively in python
Planned for next major update (The Fluffier Update):
- new visual features
^ this includes the new file list and thematic text art. sshyp will be
getting a retro computing theme.
- packages for more environments
^ "sshyp" will be officially packaged for Arch Linux, Alpine Linux, and Termux (Android).
Debian/Ubuntu and Fedora packaging will come later.
- imporove password generator to guarantee more secure results
Planned for next, next major update (The Shears Update Pt. 1):
- allow for copying entire notes (not just first line)
- allow for multi-client deletion... somehow
- detatch sshync and make it a separate package
- manpage
Planned for next, next, next major update (The Shears Update Pt. 2):
- ability to pass entries as arguments for more functions
- auto-completion on tab (currently unsure of best way to make this work)
Backlog:
- package for more Linux distributions, such as Debian and Fedora
- create separate gui frontend targetting mobile and desktop Linux
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp 2021.11.05.fr1
First public release of sshyp.
This release fixes major bugs from rpass and rebrands the project.
New features:
- an entirely new syncing back-end called sshync (custom Python wrapper around sftp)
^ in thoery, all syncing-related data loss should now be fixed, however, this new
system has just been created and is still under testing. Maybe wait for a few patches
before trusting this system.
Changes:
- branding has been updated to reflect new project name and goals
- custom directories, custom ssh keys, and offline only mode are removed (may be temporary)
^ the configuration wizard is being re-written in the next major update
Planned for next update (The Fluffy Update):
- modularized and optimized code
^ some older, bad code from "rpass" will be re-written.
- new visual features
^ this includes the new file list and thematic text art. sshyp will be
getting a retro computing theme.
- packages for more environments
^ "sshyp" will be officially packaged for Arch Linux, Alpine Linux, and Termux (Android).
Debian/Ubuntu and Fedora packaging will come later.
Planned for next update (The Sheep w/Shears Update):
- allow for copying entire notes (not just first line)
- allow for multi-client deletion... somehow
- ability to pass entries as arguments for more functions
- detatch sshync and make it a separate package
- manpage
Planned, no timeline:
- create separate gui frontend targetting mobile devices (Android + Linux phones)
^ the gui will also function on desktop linux
- package for more Linux distributions, such as Debian and Fedora)
- auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.11.01.mr5.1
The Notetaker Update - Patch 1
This is the FINAL release of "rpass".
After this release, the project will be rebranded as "sshyp".
rpass's syncing system is fundamentally broken, hence the need for "sshyp"
and its new syncing system. I would highly advise against using this release.
New features:
- none
Changes:
- fixed an issue with copying notes (currently only copies first line, will be changed in the future)
- rpass is validated to work with Python 3.10 (no changes were needed)
Planned for next update (sshyp fr1)
- full project rebrand ("sshyp")
- new syncing back-end
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.10.07.mr5
The Notetaker Update - Fifth main release of rpass
This release overhauls the note-taking system and provides general improvements
to overall code quality, including optimizations, bug fixes, and security improvements.
New features:
- notes are now edited in nano and can be split across multiple lines
- password confirmation has been added for entry deletion
Changes:
- fixed issues with copying passwords with certain special characters, e.g. '"()|
- auto-generated ssh key now uses ed25519, rather than rsa-3072
- entry format modified to include a blank line before the notes field (old format still mostly compatible)
- rpass is now much better at catching bad arguments
- some general code cleanup
Planned for next update (The Housekeeping Update Pt. 2):
- add new file list w/color and w/o extensions + proper displaying of nested folders
- ability to pass entries as arguments for more functions
- manpage
- add more comments to code
- validate for Python 3.10
Planned for next update (The cryptpass Update):
- initial implementation of a data store for other applications (libsecret alt.)
- modularize code in preparation for GUI frontends
Planned, no timeline:
- create separate gui frontend targetting mobile devices (first Linux phones, maybe Android at a later date - official iOS client not likely)
^ the gui will also function on desktop linux
- make platform agnostic (add Windows support and package for more Linux distributions, such as Alpine and Debian)
- auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.15.mr4.2
The Housekeeping Update (Pt. 1) - Hotfix 2
Changes:
- sync support is fixed
- files with spaces in their names can now be properly deleted from remote servers
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.15.mr4.1
The Housekeeping Update (Pt. 1) - Hotfix
Changes:
- the user is once again properly presented with a prompt to enter a gpg key when pressing enter through the config dialog
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass-2021.09.15.mr4
The Housekeeping Update (Pt. 1) - Fourth main release of rpass
This release focuses primarily on polishing rpass and tying up loose ends before
making any major changes in the future.
New features:
- added clipboard support for copying entry information
- many common errors are now handled with proper exceptions
- offline support (sync no longer needs to be configured for rpass to function)
Changes:
- fixed gpg decryption warnings
- added version info argument
- re-ordered config wizard to make more sense
- entry deletion can now be done client-side
- removed rsyncup/rsyncdown/username/ip/port/directoryssh files,
^ replaced with one file that holds usernamessh, ip, port, directoryssh, and devicetype
- files should no longer be left in /dev/shm when an error is encountered
- fixed issues relating to using a non-default entry directory
- lots of optimizations have been made to reduce the size of rpass
Planned for next update (The Housekeeping Update Pt. 2):
- a clean, colorful entry list w/o file extensions
- manpage
- multi-line notes
- commented the code
- ability to pass entries as arguments for more functions
- improve exceptions for unknown arguments
Planned, no timeline:
- possible libsecret integration
- create separate gui frontend targetting mobile devices (first Linux phones, maybe Android at a later date - official iOS client not likely)
^ the gui will also function on desktop linux
- make platform agnostic (add Windows support and package for more Linux distributions)
- auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.07.pr3.1
The Sync and Foundations Update - Hotfix
Changes:
- gpg configuration now prompts for expiration, rather than defaulting to two years
- rsync is now configured to not delete anything from any remote device when uploading
^ this behavior may be modified in the future - this is a quick fix to prevent data loss
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.07.pr3
The Sync and Foundations Update - Third public release of rpass.
As of this version, rpass has its intended base set of features and is considered usable.
It will now primarily recieve bug fixes and polish updates to prepare it to go
cross-platform and to make it compatible with GUI frontends.
New features:
- rsync support!
- new entry format with URL field (for future use)
- the temporary directory (/dev/shm) for editing entries has been somewhat secured
Changes:
- 'rpass edit relocate' is now properly bound
- dropped the use of 'echo'
- added 'rsync' and 'openssh' as dependencies
- fixed a bug with deleting entries from folders
- entry directory now has more secure permissions
^ these permissions are re-enforced every time rpass is used
- fixed some small typos and potential bugs, made some small optimizations
Planned for next update (The Housekeeping Update):
- move to github
- get rid of gpg decryption warnings
- proper error messages using 'except'
- add exceptions for unknown arguments
- cleanup file list by exporting to document and removing .gpg, adding color
- add a manpage
- allow notes to be multiple lines long (break lines after so many characters)
- validate for Python 3.10
- properly comment the code
Planned, no timeline:
- allow to function as alternative to gnome keyring (libsecret integration)
- create separate gui frontend targetting mobile devices (first linux phones, maybe android at a later date - official iOS client not likely)
^ the gui will also function on desktop linux
- make platform agnostic (add windows support and package for more Linux distributions)
- ability to pass entries as arguments for more functions
- auto-completion on tab (currently unsure of best way to make this work)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.02.pr2
The Folder Update - Second public release of rpass.
New features:
- entry and folder titles can now have spaces and be as long as you want
- entires and folders can now be deleted with 'rpass remove' or 'rpass -rm'
- entries now properly save to folders via 'rpass add' and should no longer throw errors
- entries saved in folders are now readable
- existing entries can now be moved to, from, and between folders
- previews are now shown after creating or editing an entry
Changes:
- every pre-existing function of rpass has been updated to work with the new folder system
- dropped awk as a dependency
- removed 'argument' file in /var/lib/rpass
- reduced unneccessary characters in argument parsing to decrease compatibility issues
- ensured all user input is handled correctly as a string or an integer
- lots of miscellaneous optimizations
Expected for next update (The rsync Update):
- rsync (over ssh) support!
^ including any fixes, changes, or optimizations necessary to make that happen
- new file formatting with support for URLs
^all entries created in new format should be compatible with future versions of rpass
- secure /dev/shm with random text generator
Expected for the next (next) update (The Housekeeping Update)
- get rid of gpg decryption warnings
- proper error messages using 'except'
- add exceptions for unknown arguments
- cleanup file list by exporting to document and removing .gpg, adding color
Planned, no timeline:
- make platform agnostic (basically, add windows support)
- create separate gui frontend targetting mobile devices (first linux phones, android at a later date)
^ the gui will also function on desktop linux
- ability to pass entries as arguments for more functions
- auto-completion on tab
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
rpass 2021.09.01.pr1.1
First public release of rpass.
Early build, missing critical features (e.g. sync support and the ability to have spaces in filenames).
What is currently functional:
- guided configuration wizard
- generate passwords
- add existing passwords
- make notes
- sort notes and passwords into folders
- gpg encryption
- edit password/note entries
+242
View File
@@ -0,0 +1,242 @@
sshyp v1.5.1
10/24/2023
the fortified flock update - patch one
this release fixes both long and short-standing bugs that managed to escape discovery in testing;
it also addresses some issues that first-time users may be put-off by upon encountering
user-facing features:
- the clipboard is now only cleared if the contents of the clipboard still match what was placed onto it by sshyp
^ this means that sshyp will no longer remove data from the clipboard that it did not place there
- a warning/explanation is now provided when the user attempts to sync in offline mode
- a readable error is now provided if the user attempts to edit a note and the specified text editor cannot be found
- the optional configuration menu is now explained when encountered during "sshyp init"
- the man page now includes common troubleshooting information
fixes/optimizations:
- custom, user-provided ssh keyfiles are now properly utilized in all cases
^ previously, using custom ssh keyfiles would break various features
- clipboard contents are no longer leaked via the process list on Wayland
- interpolation has been disabled for ConfigParser, allowing "%" to be stored in configuration files
- gpg keys with ":" or "\" in their names are now properly written to the configuration file
- copy_id_check() and whitelist_verify() are now safely callable from extensions
- the ssh key selection will no longer see "known_hosts.old" as a valid keyfile
- when possible, data from the configuration file is now read as boolean values
- the Haiku package has been updated to use Python 3.11
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.5.0
07/12/2023
the fortified flock update
this release implements new curses-based TUI configuration menus and improves the security of sshyp
compatibility-breaking changes:
- a completely new configuration system calls for a new configuration file
^ before using sshyp v1.5.0 for the first time, 'sshyp init' will need to be ran to create the
new configuration file - the old configuration files can be safely deleted
^ 'sshyp tweak' has been repurposed as the configuration menu for changing individual options,
rather than re-doing setup entirely - after initialization, this is the one you want to use
- the new extension manager is replacing the old method of installing extensions as system packages
^ any older extensions you have installed should be uninstalled to prevent conflicts
^ extensions are now installed and removed through the 'sshyp tweak' menu's extension manager
^ this does not yet apply to Haiku and Termux, which will continue to install extensions using
the previous method
- all clients and servers must be updated to this release for the folder renaming bug fix to work
^ failure to update all devices will result in errors and/or potential data loss
- various packaging changes
^ x-clip and wl-clipboard are now marked as optional dependencies, so the correct tool will
need to be installed as needed - a warning has been added for this if neither package is installed
^ the changelog no longer ships with sshyp - it is still available on GitHub
user-facing features:
- the old configuration menu, 'sshyp tweak', has been split into two new curses-based TUI menus
^ 'sshyp init' is for first-time setup/initialization
^ 'sshyp tweak' can be used at any time to quickly adjust individual settings
^ whitelist management tools have been moved to the new 'sshyp tweak' menu
^ clients and servers now each have their own dedicated 'sshyp tweak' menu
^ the new config file is in .INI format, making it easier to edit the config without sshyp
- added a 'sshyp tweak' option for re-encrypting all entries with a new gpg key
- added a security advisory when enabling quick-unlock to ensure the user understands potential risks
- the user is now warned if the clipboard tool relevant to their platform is not installed
- passwords are now hidden by default in the entry reader
^ they can be displayed by appending '--show' or '-s' to the end of the command
- input is now hidden when adding/editing a password in an entry
- entries are no longer re-encrypted and synced if the note editor is quit without saving
fixes/optimizations:
- a tmpfs is no longer used for decrypting entries unless editing notes
^ data is now decrypted directly into sshyp and written to entries pre-encrypted
^ this makes reading entries much more secure
^ editing entries is similarly secure to before - greater improvements coming in a future update
- folder renaming has been re-enabled and now functions as intended
- some unnecessarily verbose outputs were silenced and/or made to appear more cleanly
- FreeBSD packaging fixes
^ no longer incorrectly includes and uses the logic for the Termux clipboard
^ now specifies 'python3' dependency instead of 'python'
- many lists provided to the subprocess module have been swapped with tuples
- more correct and clear language is used to describe options and arguments in the help menus
- properly display an error when attempting to copy blank fields from entries
- shebangs have been removed from libraries not meant to be run directly
other factors of note:
- with the release of Debian 12 Bookworm, sshyp is once again fully supported on vanilla Debian
^ previously, it was only working correctly in offline mode due to Debian 11's old OpenSSH package
- this is the biggest release of sshyp ever
^ it includes LOTS of minor changes and optimizations not included in the patch notes summary
^ as such, keep an eye out for new bugs!
- the next major release of sshyp may be even larger...
^ but it is also likely very far away
^ GnuPG is great, but it is inherently incompatible with sshyp's future security model
^ if all goes according to plan, GnuPG will be replaced in the next release
^ assuming this happens, this next release will be crowned v2.0.0
^ sshyp v1.5.X is expected to be the latest stable release for a longer amount of time than usual
^ sshyp v1.5.X may receive security/bug fix patches after the release of v2.0.0, as needed
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.4.3
06/08/2023
the argumentative agronomist update - patch three
IMPORTANT: the next major release of sshyp, v1.5.0, will make breaking changes that will require
running through 'sshyp tweak' again - also starting with v1.5.0, a copy of the changelog will no
longer be packaged with sshyp (it will still be available on GitHub) and clipboard tools
(x-clip and wl-clipboard) will be set to optional dependencies ('sshyp tweak' will warn of this)
this is a highly unconventional release featuring backports to fix critical bugs found during the
development of the upcoming v1.5.0
fixes:
- folder renaming has been disabled to prevent a severe data loss bug from occuring
^ this has been properly fixed for v1.5.0, but the fix requires all clients and servers
to be updated - to avoid breaking compatibility with 1.4.X, folder renaming was simply disabled
for the time being
- backported fix for syncing over IPv6
- backported fix for multiple versions of Powershell being called under WSL
- backported fix for checking /lib/sshyp instead of /usr/lib/sshyp
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.4.2
04/30/2023
the argumentative agronomist update - patch two
IMPORTANT: the next major release of sshyp, v1.5.0, will make breaking changes that will require
running through 'sshyp tweak' again - also starting with v1.5.0, a copy of the changelog will no
longer be packaged with sshyp (it will still be available on GitHub) and clipboard tools
(x-clip and wl-clipboard) will be set to optional dependencies ('sshyp tweak' will warn of this)
this release makes use of a new ports framework to make sshyp even smaller and faster than before
user-facing features:
- full WSL (Windows Subsystem for Linux) support
- partial MacOS support
^ fully functional; packaging support has not yet been added
- dedicated help screen for 'gen'
^ this was previously not included due to 'sshyp gen' being a valid command prior to v1.4.0
- removed interactive input for whitelist management
^ this is to be consistent with the removal of interactive input on clients in v1.4.0
fixes/optimizations:
- leading and following spaces are no longer stripped when printing entry contents
- properly display an error when trying to remove a device from the whitelist that is not whitelisted
- ports framework to remove unneeded code for each platform
^ BLANKS.py removes all blank lines
^ CLIPBOARD.py removes non-platform-critical clipboard code
^ COMMENTS.py removes all comments
^ RMSERVER.py removes server-only code for creating client-only packages
^ the Haiku package, which was already unsupported as a server, now only includes client code
^ SHEBANG.sh sets the shebang to what is required by the platform
^ TABS.sh converts all groups of spaces to tabs for space efficiency
^ UNAME.py removes all instances of platform detection and leaves only the platform-required code
^ THESE SCRIPTS ARE ONLY USED FOR PACKAGING AND DO NOT AFFECT THE SOURCE FILES IN THE GIT REPO
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.4.1
the argumentative agronomist update - patch one
this release improves sshyp's shell completions by adding zsh support and significantly optimizing and improving Bash support
user-facing features:
- zsh completion support
^ ensure modern completions are enabled in your ~/.zshrc
fixes/optimizations:
- Bash completions are now much faster due to the use of recursive globbing
- Bash completions have been modified to be functionally similar to the new zsh completions
other notable changes:
- some official packages now use more space-efficient compression
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.4.0
the argumentative agronomist update
this release overhauls sshyp's argument system and further streamlines
the experience with optimizations and the removal of legacy features
compatibility-breaking changes:
- there are no technical breaking changes, but the UX has changed significantly due to the new argument system (detailed below)
user-facing features:
- when typing an entry/folder name, it is now always the FIRST argument
^ e.g. instead of "sshyp copy -p /example/test", it would now be "sshyp /example/test copy -p"
^ this allows more easily editing the previous command to copy/edit a different field
- better extension integration
^ extensions can now ship with a config file that sshyp can use to call them from standard sshyp arguments
^ the first extension supporting this is sshyp-mfa
^ if sshyp-mfa v1.4.0.1+ is installed, "sshyp /example/test copy -m" will copy MFA keys to your clipboard
- entry/folder names now MUST be specified as arguments
^ there is no longer a separate input prompt if the entry/folder name is not provided as an argument
^ the input prompt was a legacy feature from before arguments could specify entrys/folders with shell completion
^ the entry list generated by entry_list_gen() is still present and can be viewed by running "sshyp" with no arguments
- better Bash completions
^ now correctly places backslashes to escape spaces in entry/folder names
^ slightly faster than the previous iteration
- IPv6 configuration support
fixes/optimizations:
- replaced "+=" with ".append" when extending lists to prevent creating an additional list
- optimized usage of "str.split()" and replaced it with "str.splitlines()" where applicable
- more concise "if... in ()" syntax replaces long "if" statement chains
- lists have been substituted with tuples where applicable
- entry_list_gen() has been re-written to be much smaller and faster
- os.path is now used in place of pathlib.Path in areas where it is faster
- the user's home directory is saved to a variable to prevent running expanduser() every time it is needed
other notable changes:
- removed some uncommonly used, redundant arguments
^ e.g. "-rm", "-s", "delete"
^ their functionality was NOT removed, just their redundant arguments, since "shear", "sync", and "del" are the accepted syntax
- errors containing entry/folder names reinforce correct syntax by adding leading/following slashes where necessary
- thanks to pull request #25, there are new error messages for the read shortcut
^ includes when no entry name is provided or the entry name only refers to a directory
- directories provided in user input are no longer denoted by a following slash
^ instead, os.path is used to determine if the user is referring to a file or directory
+82
View File
@@ -0,0 +1,82 @@
sshyp v1.5.3
01/08/2024
the fortified flock update - patch three
this release is a quick hot-fix for some bugs that were noticed after the release of v1.5.2
fixes/optimizations:
- fixed a regression with the entry list causing entries not part of a subdirectory to appear
in-line with the entry list header
- fixed extension group ownership under FreeBSD
^ the "wheel" group is now used where previously the non-existent "root" group was used
- fixed notes sometimes being appended in the wrong position after editing an incomplete entry
- addressed flake8 suggestions (slight optimization)
- removed unnecessary empty variable declarations
^ these were previously included to silence PyCharm's PEP8 warnings
^ the project is now primarily developed in VSCodium with the flake8 linter
^ the only change to flake8 defaults in the line length limit (79->120)
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
sshyp v1.5.2
01/07/2024
the fortified flock update - patch two
this release focuses on fixing various bugs, crashes, and visual oddities;
additionally, the new-user setup experience has been vastly improved
compatibility-breaking changes:
- this release is fully compatible with sshyp v1.5.0-v1.5.1
- the minimum Python version has been raised from Python 3.7 to Python 3.8
^ this was needed for the new device id changing behavior
^ Python 3.7 no longer receives security updates, so this should have minimal impact
^ please create an issue on GitHub if any Python version (3.8 or newer) does not work as intended
user-facing features:
- registered device ids can now be removed from the server tweak menu
^ all device id menus now stay open until the user manually exits
- changing a client's device id now attempts to automatically remove the previous id from the server
- the extension downloader now supports showing multiple lines of usage information
^ sshyp-mfa is taking advantage of this to display the info from the old man page
- basic tweak/init menu text wrapping and terminal-resizing has been added
^ the tweak/init radio menus now warn if the terminal needs to be resized to see all content;
this resizing can be done in real time without restarting sshyp (layout dynamically adjusts)
^ this avoids crashes on large radio menus in small terminals (crashes are still possible, but
only on unreasonably small terminals - this will probably stay the way it is now)
- ssh connections are no longer made from the init menu
^ this is to give the user time to register their ssh pubkey with the server
- the user is now warned that gpg key generation may take time and that sshyp should not be terminated
- the user is now warned about risks associated with changing or removing active device ids
- back buttons have been added to menus that were missing a safe way to exit
fixes/optimizations:
- quick-unlock has been fixed - invalid pins have been generated since v1.5.0
^ if quick-unlock is not working for you, re-generate your pin after this update!
- extension removal now works on Busybox environments (Alpine Linux)
- instead of crashing with an unhelpful error, sshyp now warns if a valid pinentry program is not found (gpg)
^ affects some Alpine Linux 3.19 base installs (pinentry does not always get installed with gpg)
- a recursive curses.wrapper() function is no longer used (fixes menu crash on Alpine Linux 3.19)
^ the new method of transitioning menus is more efficient on all platforms
- the wl-paste empty clipboard warning is no longer shown when multiple copies are done within 30 seconds (Wayland)
- quotes are no longer copied to the Termux clipboard on clear
- the entry reader and entry list should now be more visible in light terminals
^ in testing, I noticed some solarized dark themes bind color 8 to the same color as the terminal background,
leading to some invisible text - this will not be fixed (unless custom accent colors are added), as
I believe this is poor theme design and the fault of the particular solarized dark themes I tested
- entry list text wrapping has been vastly improved
^ better utilization of full terminal width
^ less prone to splitting entry names in half (should be impossible now)
^ no longer crashes on small terminals
- multi-word device ids can now verify via quick-unlock
- various language standardization changes
^ all back buttons in menus are now named "BACK"
^ all mentions of device ids are now referred to as "ids", rather than "names"
^ various non-user-facing variable renamings have also been made
- various menu helptext have been made more clear
^ this includes quick-unlock configuration, ssh configuration, device id configuration, and more
+41
View File
@@ -0,0 +1,41 @@
# sshyp(1) completion
_path_gen() {
local sshyp_path="$HOME/.local/share/sshyp"
local glob_status=$(shopt -p globstar)
[ -z "${glob_status##*u*}" ] && shopt -s globstar # if recursive globbing is disabled, enable it
local full_paths=("$sshyp_path"/**/*.gpg)
$glob_status # set recursive globbing to user default
for scan_path in "${full_paths[@]}"; do
trimmed_paths+=("${scan_path:${#sshyp_path}:-4}")
done
if [ "${trimmed_paths[0]}" == '/**/*' ]; then trimmed_paths[0]=help; fi
} &&
_sshyp_completions() {
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
case $prev in
sshyp )
while read -r; do ITEM=${REPLY// /\\ }; COMPREPLY+=( "$ITEM" ); done < <( compgen -W "$(printf "'%s' " "${trimmed_paths[@]}")" -- "$cur" )
;;
/* )
while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "add gen edit copy shear" -- "$cur" )
;;
add )
while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "password note folder" -- "$cur" )
;;
copy )
while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "password username url note" -- "$cur" )
;;
edit )
while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "password username url note relocate" -- "$cur" )
;;
gen )
while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "update" -- "$cur" )
;;
esac
} &&
_path_gen && complete -F _sshyp_completions sshyp
+30
View File
@@ -0,0 +1,30 @@
#compdef sshyp
sshyp_path="$HOME/.local/share/sshyp"
full_paths=("$sshyp_path"/**/*.gpg)
trimmed_paths=()
for scan_path in "${full_paths[@]}"; do
trimmed_paths+=("${${scan_path#$sshyp_path}%????}")
done
[[ -z $trimmed_paths ]] && trimmed_paths=(help)
case ${words[-2]} in
sshyp )
compadd $trimmed_paths
;;
/* )
compadd {add,gen,edit,copy,shear}
;;
add )
compadd {password,note,folder}
;;
copy )
compadd {password,username,url,note}
;;
edit )
compadd {password,username,url,note,relocate}
;;
gen )
compadd update
;;
esac
+92 -40
View File
@@ -1,91 +1,143 @@
.TH sshyp 1 "20 June 2022" "v1.0.0" "sshyp man page"
.TH sshyp 1 "08 January 2024" "v1.5.3" "sshyp man page"
.SH NAME
sshyp \- A very simple self-hosted, synchronized password manager for UNIX(-like) systems. Alternative to (and compatible with) pass/password-store.
\fBsshyp\fR - Simple, self-hosted, synchronized password management for UNIX(-like) systems. Alternative to (and compatible with) pass/password-store.
.SH SYNOPSIS
sshyp [OPTION] [[FLAG]] [/<entry name>]
Client Usage: sshyp [/<entry name> [argument] [option]] | [argument]
Server Usage: sshyp <argument>
.SH DESCRIPTION
sshyp is a lightweight password and note management program written in Python. sshyp is used via CLI and is self-hosted with a client-server model. sshyp expects that you have access to a personal server with a properly configured ssh server, ideally accepting remote connections.
.SH EXAMPLES
Setting up sshyp for the first time or altering its configuration (also recommended after major updates):
.SH EXAMPLES (CLIENT)
Setting up sshyp for the first time:
sshyp init
Altering the existing sshyp configuration:
sshyp tweak
Viewing the entry database:
sshyp
Reading an existing entry saved as ~/.password-pasture/development/github.gpg:
Reading an existing entry saved as '~/.local/share/sshyp/development/github.gpg':
sshyp /development/github
Copying the password of an existing entry saved as ~/.password-pasture/financial/bank.gpg:
sshyp copy -p /financial/bank
Removing an existing folder saved as '~/.local/share/sshyp/social':
sshyp /social shear
Editing the username of an existing entry saved as ~/.password-pasture/game.gpg:
sshyp edit -u game
Reading the same entry without hiding the password:
sshyp /development/github --show
Making a new entry saved as ~/.password-pasture/school/university.gpg using the built-in password generator:
sshyp gen /school/university
Copying the password of an existing entry saved as '~/.local/share/sshyp/financial/bank.gpg':
sshyp /financial/bank copy -p
Creating a note-only entry saved as ~/.password-pasture/notes/testNote.gpg:
sshyp add -n /notes/testNote
Editing the username of an existing entry saved as '~/.local/share/sshyp/game.gpg':
sshyp /game edit -u
Manually syncing entries with the server:
Making a new entry saved as '~/.local/share/sshyp/school/university.gpg' using the built-in password generator:
sshyp /school/university gen
Creating a note-only entry saved as '~/.local/share/sshyp/notes/test note.gpg':
sshyp /notes/test\ note add -n
Manually synchronizing entries with the server:
sshyp sync
Removing an existing folder saved as ~/.password-pasture/social:
sshyp shear social/
.SH OPTIONS
USAGE: sshyp [OPTION [FLAG] [<entry name>]] | [/<entry name>]
help/--help/-h bring up the help menu
version/-v display sshyp version info
tweak configure sshyp
add add an entry
gen generate a new password
edit edit an existing entry
copy copy details of an entry to your clipboard
shear/-rm delete an existing entry
sync/-s manually sync the entry directory via sshync
.SH FLAGS
.SH ARGUMENTS (CLIENT)
help/-h bring up the help menu
version/-v display sshyp version info
init set up sshyp
tweak change configuration options/manage extensions and updates
add add an entry
gen generate a new password
edit edit an existing entry
copy copy details of an entry to your clipboard
shear delete an existing entry
sync manually sync the entry directory via sshync
.SH OPTIONS (CLIENT)
add:
password/-p add a password entry
note/-n add a note entry
folder/-f add a new folder for entries
edit:
rename/relocate/-r rename or relocate an entry
username/-u change the username of an entry
password/-p change the password of an entry
note/-n change the note attached to an entry
url/-l change the url attached to an entry
copy:
username/-u copy the username of an entry to your clipboard
password/-p copy the password of an entry to your clipboard
url/-l copy the URL of an entry to your clipboard
note/-n copy the note of an entry to your clipboard
gen:
update/-u generate a password for an existing entry
.SH LIMITATIONS
The following characters/character sequences are not supported in entry/folder titles:
@ ^&* *&^
.SH ARGUMENTS (SERVER)
help/-h bring up this menu
version/-v display sshyp version info
init set up sshyp
tweak change configuration options/manage extensions and updates
.SH SETUP
sshyp operates on a client-server model, and thus requires you to have access to your own server (whether it be a physical home server or a cloud rental) with remote access via SSH.
The sshyp package includes modes for operating on both client and server devices, so only one package is necessary.
The sshyp package (on fully supported platforms) includes modes for operating on both client and server devices, so only one package is necessary.
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, openssh-server and openssh-sftp-server must be installed manually - if sshyp was installed from the Fedora package, openssh-server must be installed manually)
Allow remote access to the SSH server w/public key authentication (disabling password-only authentication recommended)
Install sshyp
Run "sshyp tweak" and set the device type as server
Run "sshyp init" and set the device type as server
Optionally, configure a quick-unlock pin from the tweak menu
Done!
Client setup:
Install sshyp
Run "sshyp tweak" and follow the prompts
Run "sshyp init" and follow the prompts
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"
Optionally, shell completions (both Bash and ZSH) can be enabled with your shell's respective method
Done!
Please note that the server setup intentionally does not allow the reading of entries (it does not allow adding a gpg decryption key). For security purposes, only clients can read entries.
.SH TROUBLESHOOTING
.B Clipboard not clearing:
The intended way for sshyp to interact with the system clipboard is for it to clear it 30 seconds after copying a field. Unfortunately, this does not work by default on all systems due to the prevalence of clipboard managers.
Clipboard managers save a history of what has been copied to the clipboard, which is already a big enough issue on its own for people who copy sensitive information to their clipboard. Some clipboard managers simply will not allow the clipboard to be empty and will replace its contents with the last copied item if you attempt to clear it. One such naughty clipboard manager is KDE Klipper, which comes packaged into KDE Plasma and is typically enabled by default on most distributions. Due to this behavior, KDE Klipper breaks sshyp's clipboard clearing functionality and should not be left enabled.
It is likely other popular clipboard managers exhibit this behavior as well (Klipper is just the one I first noticed it with). Clipboard managers should not be enabled by default in any environment or distribution due to their potential security implications.
.B Shell completions not working:
ZSH:
Make sure your ~/.zshrc contains the following:
autoload -Uz compinit && compinit
Restart your shell
Bash:
Install your distribution's 'bash-completion' package and restart your shell
OR
Source the completion script manually by adding the following to your ~/.bashrc (then restart your shell):
Linux:
source /usr/share/bash-completion/completions/sshyp
FreeBSD:
source /usr/local/share/bash-completion/completions/sshyp
Haiku:
source /system/data/bash-completion/completions/sshyp
.SH EXIT CODES
0 - no error
1 - configuration error
2 - data not found error
3 - data already exists error
4 - decryption/encryption error
5 - server connection error
6 - other error
.SH AUTHOR
Randall Winkhart (https://github.com/rwinkhart)
-48
View File
@@ -1,48 +0,0 @@
#!/bin/python3
from os import path, remove, system, walk
from pathlib import Path
from shutil import move, rmtree
if __name__ == "__main__":
gpg_id = input('\nWhat is the ID of the GPG key you would like to use for re-encryption?\n\nID: ')
pasture = path.expanduser('~/.password-pasture')
if Path(f"{pasture}.new").exists():
rmtree(f"{pasture}.new")
if Path(f"{pasture}.old").exists():
rmtree(f"{pasture}.old")
if path.isdir(pasture):
for dirPath, dirNames, filenames in walk(pasture):
for filename in sorted(filenames):
Path(dirPath.replace(pasture, pasture + '.new')).mkdir(0o700, parents=True, exist_ok=True)
system(f"gpg -d '{dirPath}/{filename}' "
f"> '{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}'")
_old_contents, _new_contents = \
open(f"{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}", 'r').readlines(), ''
for _num in range(len(_old_contents)):
if _num == 0:
try:
_new_contents += _old_contents[1]
except IndexError:
_new_contents += '\n'
elif _num == 1:
_new_contents += _old_contents[0]
elif _num == 3:
if _old_contents[_num] == ' ' or _old_contents[_num] == '\n':
pass
else:
_new_contents += _old_contents[_num]
else:
_new_contents += _old_contents[_num]
for _num in reversed(range(len(_new_contents))):
if _new_contents[_num] == '\n' or _new_contents[_num] == '':
_new_contents = _new_contents[:-1]
else:
break
open(f"{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}", 'w').writelines(_new_contents)
system(f"gpg -qr {str(gpg_id)} -e '{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}'")
remove(f"{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}")
else:
print(f"\nError: no entry folder ({pasture}) found\n")
move(pasture, f"{pasture}.old")
move(f"{pasture}.new", pasture)
@@ -1 +0,0 @@
af6236472791614ed41bf13318a2d1c41228855c
-41
View File
@@ -1,41 +0,0 @@
#!/bin/python3
from os import path, remove, system, walk
from pathlib import Path
from shutil import move, rmtree
if __name__ == "__main__":
gpg_id = input('\nWhat is the ID of the GPG key you would like to use for re-encryption?\n\nID: ')
pasture = path.expanduser('~/.password-pasture')
if Path(f"{pasture}.new").exists():
rmtree(f"{pasture}.new")
if Path(f"{pasture}.old").exists():
rmtree(f"{pasture}.old")
if path.isdir(pasture):
for dirPath, dirNames, filenames in walk(pasture):
for filename in sorted(filenames):
Path(dirPath.replace(pasture, pasture + '.new')).mkdir(0o700, parents=True, exist_ok=True)
system(f"gpg -d '{dirPath}/{filename}' "
f"> '{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}'")
_old_contents, _new_contents = \
open(f"{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}", 'r').readlines(), ''
for _num in range(len(_old_contents)):
if _num == 3:
if _old_contents[_num] == ' ' or _old_contents[_num] == '\n':
pass
else:
_new_contents += _old_contents[_num]
else:
_new_contents += _old_contents[_num]
for _num in reversed(range(len(_new_contents))):
if _new_contents[_num] == '\n' or _new_contents[_num] == '':
_new_contents = _new_contents[:-1]
else:
break
open(f"{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}", 'w').writelines(_new_contents)
system(f"gpg -qr {str(gpg_id)} -e '{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}'")
remove(f"{dirPath.replace(pasture, pasture + '.new')}/{filename[:-4]}")
else:
print(f"\nError: no entry folder ({pasture}) found\n")
move(pasture, f"{pasture}.old")
move(f"{pasture}.new", pasture)
+42
View File
@@ -0,0 +1,42 @@
#!/usr/bin/env python3
from hashlib import sha512
from subprocess import DEVNULL, PIPE, run
from sys import argv
from time import sleep
# set period of time to wait before attempting to clear clipboard
sleep(30)
# enable the storing of clipboard contents hash for later comparison
hash_paste = sha512()
# PORT START CLIPCLEAR
if argv[2] == 'wsl':
hash_paste.update(run(('powershell.exe', '-c', 'Get-Clipboard'), stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(('powershell.exe', '-c', 'Set-Clipboard'))
elif argv[2] == 'wayland':
hash_paste.update(run('wl-paste', stdout=PIPE, stderr=DEVNULL).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(('wl-copy', '-c'))
elif argv[2] == 'haiku':
hash_paste.update(run(('clipboard', '-p'), stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(('clipboard', '-r'))
elif argv[2] == 'mac':
hash_paste.update(run('pbpaste', stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run('pbcopy', input=b'')
elif argv[2] == 'termux':
hash_paste.update(run('termux-clipboard-get', stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(("termux-clipboard-set", ''))
elif argv[2] == 'x11':
hash_paste.update(run(('xclip', '-o', '-sel', 'c'), stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(('xclip', '-i', '/dev/null', '-sel', 'c'))
# PORT END CLIPCLEAR
+184
View File
@@ -0,0 +1,184 @@
from os import listdir, remove, walk
from os.path import expanduser, isdir, isfile, getmtime, join
from subprocess import CalledProcessError, PIPE, run
from sys import exit as s_exit
home = expanduser('~')
# PORT START SSHYNC-REMOTE
# REMOTE
# prints all necessary remote data to stdout
def remote_list_gen(_client_device_id, _remote_dir):
# deletions
for _file in listdir(f"{home}/.config/sshyp/deleted"):
_file_path, _sep, _device = _file.partition('\x1f')
_file_path = _file_path.replace('\x1e', '/')
if _device == _client_device_id:
print(_file_path)
try:
remove(f"{home}/.config/sshyp/deleted/{_file}")
except FileNotFoundError:
pass
print('\x1d')
# folders
for _root, _directories, _files in walk(f"{home}/.local/share/sshyp"):
for _dir in _directories:
print(f"{_root.replace(home, '')}/{_dir}")
print('\x1d')
# titles and mod times
get_local_data(_remote_dir, 'server')
# PORT END SSHYNC-REMOTE
# HYBRID
# deletes a file or folder and/or marks it for deletion upon synchronizing
def delete(_file_path, _target_database, _silent):
from shutil import rmtree
_directory = f"{home}/.local/share/sshyp/"
try:
if isdir(_directory + _file_path):
rmtree(_directory + _file_path)
else:
remove(f"{_directory}{_file_path}.gpg")
except FileNotFoundError:
if not _silent:
print(f"location does not exist {_target_database}")
if _target_database == 'remotely':
for _device_id in listdir(f"{home}/.config/sshyp/devices"):
open(f"{home}/.config/sshyp/deleted/" + _file_path.replace('/', '\x1e') + '\x1f' + _device_id, 'w')
# retrieves and returns titles and mod times from the local device
def get_local_data(_directory, _device):
_title_list, _mod_list = [], []
for _root, _directories, _files in walk(_directory):
for _filename in _files:
_title_list.append(join(_root.replace(_directory, '', 1), _filename))
_mod_list.append(int(getmtime(join(_root, _filename))))
if _device == 'server':
for _title in _title_list:
print(_title.rstrip())
for _time in _mod_list:
print(_time)
return _title_list, _mod_list
# LOCAL
# captures and returns all necessary data from the remote server
def remote_list_fetch(_user_data):
try:
_remote_data = run(('ssh', '-i', _user_data[5], '-p', _user_data[2], f"{_user_data[0]}@{_user_data[1]}",
f'cd /usr/lib/sshyp; python3 -c \'from sshync import remote_list_gen; remote_list_gen'
f'("{_user_data[6]}", "{_user_data[4]}")\''), stdout=PIPE, text=True, check=True
).stdout.split('\x1d')
except CalledProcessError:
print('\n\u001b[38;5;9merror: failed to connect to the remote server\u001b[0m\n')
_remote_data = ''
s_exit(5)
_deletion_database = _remote_data[0].strip().splitlines()
_folder_database = _remote_data[1].strip().splitlines()
_titles_mods = _remote_data[2].strip().splitlines()
return _deletion_database, _folder_database, _titles_mods[:len(_titles_mods) // 2], \
_titles_mods[len(_titles_mods) // 2:]
# checks for and acts upon files and folders marked for deletion
def deletion_sync(_deletion_database, _silent):
_synced = False
for _file in _deletion_database:
if _file != '':
if not _silent:
_synced = True
print(f"\u001b[38;5;208m{_file}\u001b[0m has been sheared, removing...")
delete(_file, 'locally', _silent)
if _synced:
print()
# creates matches of remote folders on the local client
def folder_sync(_folder_database):
from pathlib import Path
for _folder in _folder_database:
if _folder != '' and not isdir(home + _folder):
print(f"\u001b[38;5;2m{_folder.replace('/.local/share/sshyp/', '')}/\u001b[0m does not exist locally, "
f"creating...")
Path(home + _folder).mkdir(mode=0o700, parents=True, exist_ok=True)
# creates and returns two lists (of titles and mod times) generated by sorting information from two provided 2D lists
def sort_titles_mods(_list_1, _list_2):
_title_list_2_sorted, _mod_list_2_sorted = [], []
# title sorting
for _title in _list_1[0]:
if _title in _list_2[0]:
_title_list_2_sorted.append(_title)
for _title in _list_2[0]:
if _title not in _title_list_2_sorted:
_title_list_2_sorted.append(_title)
# mod time sorting
for _title in _title_list_2_sorted:
_mod_list_2_sorted.append(_list_2[1][_list_2[0].index(_title)])
return _title_list_2_sorted, _mod_list_2_sorted
# returns a list of data read from a sshync job profile
def get_profile(_profile_dir):
from configparser import ConfigParser
_profile_data = ConfigParser(interpolation=None)
if isfile(_profile_dir):
_profile_data.read(_profile_dir)
else:
print('\n\u001b[38;5;9merror: the profile does not exist or is corrupted\u001b[0m\n')
s_exit(2)
_user = _profile_data.get('SSHYNC', 'user')
_ip = _profile_data.get('SSHYNC', 'ip')
_port = _profile_data.get('SSHYNC', 'port')
_local_dir = _profile_data.get('SSHYNC', 'local_dir')
_remote_dir = _profile_data.get('SSHYNC', 'remote_dir')
_identity = _profile_data.get('SSHYNC', 'identity_file')
_client_device_id = listdir(f"{home}/.config/sshyp/devices")[0].rstrip()
return _user, _ip, _port, _local_dir, _remote_dir, _identity, _client_device_id
# runs a sshync job profile
def run_profile(_profile_dir, _silent):
# import profile data
_user_data = get_profile(_profile_dir)
# fetch remote lists
_deletion_database, _folder_database, _remote_titles, _remote_mods = remote_list_fetch(_user_data)
_remote_titles_mods = (_remote_titles, _remote_mods)
# sync deletions and folders
deletion_sync(_deletion_database, _silent)
folder_sync(_folder_database)
# sort titles and mods
_index_local = sort_titles_mods(_remote_titles_mods, get_local_data(_user_data[3], 'client'))
_index_remote = sort_titles_mods(_index_local, _remote_titles_mods)
# sync new and updated files
_i, _synced = -1, False
for _title in _index_local[0]:
_i += 1
if _title in _index_remote[0]:
# compare mod times and sync
if int(_index_local[1][_i]) > int(_index_remote[1][_i]):
_synced = True
print(f"\u001b[38;5;4m{_title[:-4]}\u001b[0m is newer locally, uploading...")
run(('scp', '-pqs', '-P', _user_data[2], '-i', _user_data[5], _user_data[3] + _title,
f"{_user_data[0]}@[{_user_data[1]}]:{_user_data[4]}{_title}"))
elif int(_index_local[1][_i]) < int(_index_remote[1][_i]):
_synced = True
print(f"\u001b[38;5;2m{_title[:-4]}\u001b[0m is newer remotely, downloading...")
run(('scp', '-pqs', '-P', _user_data[2], '-i', _user_data[5],
f"{_user_data[0]}@[{_user_data[1]}]:{_user_data[4]}{_title}", f"{_user_data[3]}{_title}"))
else:
_synced = True
print(f"\u001b[38;5;4m{_title[:-4]}\u001b[0m is not on remote server, uploading...")
run(('scp', '-pqs', '-P', _user_data[2], '-i', _user_data[5], _user_data[3] + _title,
f"{_user_data[0]}@[{_user_data[1]}]:{_user_data[4]}{_title}"))
for _title in _index_remote[0]:
if _title not in _index_local[0]:
_synced = True
print(f"\u001b[38;5;2m{_title[:-4]}\u001b[0m is not in local directory, downloading...")
run(('scp', '-pqs', '-P', _user_data[2], '-i', _user_data[5],
f"{_user_data[0]}@[{_user_data[1]}]:{_user_data[4]}{_title}", f"{_user_data[3]}{_title}"))
if _synced:
print()
Executable
+741
View File
@@ -0,0 +1,741 @@
#!/usr/bin/env python3
from configparser import ConfigParser, NoOptionError, NoSectionError
from os import chmod, environ, listdir, walk
from os.path import expanduser, isdir, isfile, realpath
from pathlib import Path
from shutil import move
from sshync import delete as offline_delete, run_profile
from subprocess import CalledProcessError, DEVNULL, PIPE, run
from sys import argv, exit as s_exit
# PORT START UNAME-IMPORT-SSHYP
from os import uname
# PORT END UNAME-IMPORT-SSHYP
home = expanduser('~')
# UTILITY FUNCTIONS
# generates and prints full entry list
def entry_list_gen(_directory=f"{home}/.local/share/sshyp/"):
from shutil import get_terminal_size
_ran, _width = False, get_terminal_size().columns
print("\nfor a list of usable commands, run 'sshyp help'\n\n\u001b[38;5;0;48;5;15msshyp entries:\u001b[0m", end='')
for _root, _dirs, _files in sorted(walk(_directory, topdown=True)):
_color_alternator = 1
if _ran:
print(f"\n\n\u001b[38;5;7;48;5;8m{_root.replace(f'{home}/.local/share/sshyp', '', 1)}/\u001b[0m")
elif _root == f"{home}/.local/share/sshyp/" and len(_files) > 0:
print("\n\n\u001b[38;5;7;48;5;8m/\u001b[0m")
_char_counter = 0
for _filename in sorted(_files):
if _color_alternator > 0:
_print_string = _filename[:-4]
else:
_print_string = f"\u001b[38;5;8m{_filename[:-4]}\u001b[0m"
# -3 instead of -4 to account for trailing space character
_char_counter += len(_filename) - 3
if _char_counter >= _width:
# reset _char_counter to length of first entry in new line
_char_counter = len(_filename) - 3
print()
print(_print_string + ' ', end='')
_color_alternator = _color_alternator * -1
if _ran and _char_counter < 1:
print('\u001b[38;5;9m-empty directory-\u001b[0m', end='')
_ran = True
print('\n')
# displays the contents of an entry in a readable format
def entry_reader(_decrypted_entry):
_notes_flag = 0
if pass_show:
_entry_password = f'\u001b[38;5;10m{_decrypted_entry[0]}\u001b[0m'
else:
_entry_password = '\u001b[38;5;3mend command in "--show" or "-s" to view\u001b[0m'
print()
for _num in range(len(_decrypted_entry)):
try:
if _num == 0 and _decrypted_entry[1] != '':
print(f"\u001b[38;5;7;48;5;8musername:\u001b[0m\n{_decrypted_entry[1]}\n")
elif _num == 1 and _decrypted_entry[0] != '':
print(f"\u001b[38;5;7;48;5;8mpassword:\u001b[0m\n{_entry_password}\n")
elif _num == 2 and _decrypted_entry[2] != '':
print(f"\u001b[38;5;7;48;5;8murl:\u001b[0m\n{_decrypted_entry[_num]}\n")
elif _notes_flag == 1 and _num >= 3:
print(_decrypted_entry[_num])
elif _notes_flag != 1 and _num >= 3 and _decrypted_entry[_num] != '':
_notes_flag = 1
print('\u001b[38;5;7;48;5;8mnotes:\u001b[0m\n' + _decrypted_entry[_num])
if _notes_flag == 1:
try:
_ = _decrypted_entry[_num + 1]
except IndexError:
print()
except IndexError:
if _num == 0 and _decrypted_entry[0] != '':
print(f"\u001b[38;5;7;48;5;8mpassword:\u001b[0m\n{_entry_password}\n")
# generates and returns a random string based on input
def string_gen(_complexity, _length):
from random import SystemRandom
import string
if _complexity == 's':
_character_pool = string.ascii_letters + string.digits
elif _complexity == 'f':
_character_pool = string.digits + string.ascii_letters + string.punctuation.replace('/', '').replace('\\', '') \
.replace("'", '').replace('"', '').replace('`', '').replace('~', '')
else:
_character_pool = string.digits + string.ascii_letters + string.punctuation
_min_special, _special = round(.2 * _length), 0
while True:
_gen = ''.join(SystemRandom().choice(_character_pool) for _ in range(_length))
for _character in _gen:
if not _character.isalpha():
_special += 1
if _special >= _min_special:
break
return _gen
# prompts the user for necessary information to generate a password and passes it to string_gen
def pass_gen():
_length = 9
while True:
try:
_length = int(input('\npassword length: '))
except ValueError:
continue
else:
if _length < 1:
continue
else:
break
_complexity = str(input('\npassword complexity - simple (for compatibility) or complex (for security)? (s/C) '))
if _complexity not in ('s', 'S'):
_complexity = 'c'
_gen = string_gen(_complexity.lower(), _length)
return _gen
# creates a temporary file to allow notes to be edited by standard editors
def edit_note(_note_lines, _exit_on_match=False):
from tempfile import NamedTemporaryFile
_joined_note_lines = '\n'.join(_note_lines)
with NamedTemporaryFile(mode='w+') as _tmp:
_tmp.write(_joined_note_lines)
_tmp.seek(0)
try:
run((editor, _tmp.name))
except FileNotFoundError:
print(f"\n\u001b[38;5;9merror: the configured text editor ({editor}) cannot be found on this system\n\n"
f"please either install the editor or re-configure the active editor using 'sshyp tweak'\u001b[0m\n")
_tmp.seek(0)
_new_note = _tmp.read().rstrip()
if _exit_on_match and _joined_note_lines == _new_note:
s_exit(0)
return _new_note
# encrypts an entry
def encrypt(_entry_data, _entry_dir, _gpg_id):
_bytes_data = '\n'.join(_entry_data).rstrip().encode()
_encrypted_data = run(('gpg', '-qr', str(_gpg_id), '-e'), input=_bytes_data, stdout=PIPE).stdout
open(_entry_dir + '.gpg', 'wb').write(_encrypted_data)
# decrypts an entry and returns its contents
def decrypt(_entry_dir, _quick_verify=None, _quick_pass=None):
# check quick-unlock status, fetch passphrase
if _quick_verify:
_quick_pass = whitelist_verify(port, username_ssh, ip, client_device_id, identity)
else:
if _quick_pass is None:
_quick_pass = False
# set decryption method based on quick-unlock availability
if not isinstance(_quick_pass, bool):
_cmd = ['gpg', '--pinentry-mode', 'loopback', '--passphrase', _quick_pass, '-qd']
else:
_cmd = ['gpg', '-qd']
# set decryption target based on lock file availability
if _entry_dir is None:
_dec_target = [f"{home}/.config/sshyp/lock.gpg"]
else:
_dec_target = [f"{_entry_dir}.gpg"]
# run decryption command
try:
_contents = run(_cmd + _dec_target, stderr=DEVNULL, stdout=PIPE, text=True, check=True).stdout
except CalledProcessError:
if not isinstance(_quick_pass, bool):
print('\n\u001b[38;5;9merror: quick-unlock failed as a result of an incorrect passphrase, an unreachable '
'sshyp server, or an invalid configuration\n\nfalling back to standard unlock\u001b[0m\n')
try:
_contents = run(['gpg', '-qd'] + _dec_target, stderr=DEVNULL, stdout=PIPE, text=True, check=True).stdout
except CalledProcessError:
print('\n\u001b[38;5;9merror: could not decrypt - ensure the correct gpg key is present\u001b[0m\n')
s_exit(4)
else:
print('\n\u001b[38;5;9merror: could not decrypt - ensure the correct gpg key is present\u001b[0m\n')
s_exit(4)
return _contents.rstrip().split('\n')
# checks the user's whitelist status and fetches the full gpg key password if possible
def whitelist_verify(_port, _username_ssh, _ip, _client_device_id, _identity):
try:
run(('gpg', '--pinentry-mode', 'cancel', '-qd', '--output', '/dev/null',
f"{home}/.config/sshyp/lock.gpg"), stderr=DEVNULL, check=True)
return False
except CalledProcessError:
_i, _full_password = 0, ''
_server_whitelist = run(('ssh', '-i', _identity, '-p', _port, f"{_username_ssh}@{_ip}",
'python3 -c \'from os import listdir; [print(_id, end="\x1f") for _id in '
f'listdir("/home/{_username_ssh}/.config/sshyp/whitelist")]\''),
stdout=PIPE, text=True).stdout.rstrip().split('\x1f')
for _device_id in _server_whitelist:
if _device_id == _client_device_id:
from getpass import getpass
_quick_unlock_password = getpass(prompt='\nquick-unlock pin: ')
_quick_unlock_password_excluded = \
run(('ssh', '-i', _identity, '-p', _port, f"{_username_ssh}@{_ip}",
f"gpg --pinentry-mode loopback --passphrase '{_quick_unlock_password}' "
f"-qd ~/.config/sshyp/excluded.gpg"), stdout=PIPE, text=True).stdout.rstrip()
while _i < len(_quick_unlock_password_excluded):
try:
_full_password += _quick_unlock_password_excluded[_i]
except IndexError:
pass
try:
_full_password += _quick_unlock_password[_i]
except IndexError:
pass
_i += 1
break
return _full_password
# returns True if expected and reality align, otherwise error
def target_exists_check(_target_name, _expected_presence):
if isfile(f"{directory}{_target_name}.gpg") or isdir(f"{directory}{_target_name}"):
if _expected_presence:
return True
else:
print(f"\n\u001b[38;5;9merror: (/{_target_name}) already exists\u001b[0m\n")
s_exit(3)
else:
if not _expected_presence:
return True
else:
print(f"\n\u001b[38;5;9merror: (/{_target_name}) does not exist\u001b[0m\n")
s_exit(2)
# returns target type (entry == True, folder == False, null == None), optional errors
def target_type_check(_target_name, _expected_type=True, _error=False):
if isfile(f"{directory}{_target_name}.gpg"):
if _error and not _expected_type:
print(f"\n\u001b[38;5;9merror: (/{_target_name}) is an entry\u001b[0m\n")
s_exit(2)
return True
elif isdir(f"{directory}{_target_name}"):
if _error and _expected_type:
print(f"\n\u001b[38;5;9merror: (/{_target_name}) is a folder\u001b[0m\n")
s_exit(2)
return False
else:
print(f"\n\u001b[38;5;9merror: (/{_target_name}) does not exist\u001b[0m\n")
s_exit(2)
# ensures an entry has enough lines to complete an edit and optionally carries out the edit
def line_edit(_lines, _edit_line, _edit_data=None):
# ensure enough lines are present for edited field
while len(_lines) < _edit_line + 1:
_lines.append('')
if _edit_data is not None:
# write the edited field
_lines[_edit_line] = _edit_data.rstrip()
return _lines
# attempts to connect to the user's server via ssh to register the device for synchronization
def copy_id_check(_port, _username_ssh, _ip, _client_device_id, _identity, _sshyp_data):
from stweak import write_config
if not _sshyp_data.has_section('CLIENT-ONLINE'):
_sshyp_data.add_section('CLIENT-ONLINE')
try:
run(('ssh', '-o', 'ConnectTimeout=3', '-i', _identity, '-p', _port, f"{_username_ssh}@{_ip}",
f'python3 -c \'from pathlib import Path; Path("/home/{_username_ssh}/.config/sshyp/devices/'
f'{_client_device_id}").touch(mode=0o400, exist_ok=True)\''), stderr=DEVNULL, check=True)
except CalledProcessError:
print(f'\n\u001b[38;5;9mwarning: ssh connection could not be made - ensure the public key ({_identity}) is '
'registered on the remote server and that the entered ip, port, and username are correct\n\n'
'synchronization functionality will be disabled until this is addressed\u001b[0m\n')
_sshyp_data.set('CLIENT-ONLINE', 'ssh_error', 'true')
write_config(_sshyp_data)
return True
_sshyp_data.set('CLIENT-ONLINE', 'ssh_error', 'false')
write_config(_sshyp_data)
return False
# ARGUMENT-SPECIFIC FUNCTIONS
# prints help text based on argument
def print_info():
if arguments[0] in ('version', '-v'):
_blank = '\u001b[38;5;7;48;5;8m\\\u001b[38;5;15;48;5;15m' + 55 * ' ' + '\u001b[38;5;7;48;5;8m/\u001b[0m'
_border = '\u001b[38;5;7;48;5;8m' + 14 * '<>' + '-' + 14 * '<>' + '\u001b[0m\n'
print(f"""\nsshyp is a simple, self-hosted, sftp-synchronized\npassword manager for unix(-like) systems\n
{9 * ' '}..{15 * ' '}\u001b[38;5;12m♥♥ \u001b[38;5;9m♥♥\u001b[0m{15 * ' '}..
{8 * ' '}/()\\''.''.{7 * ' '}\u001b[38;5;12m♥♥♥\u001b[0m♥♥♥♥\u001b[0m{7 * ' '}.''.''/()\\{3 * ' '}_)
{5 * ' '}_.{3 * ' '}:{7 * ' '}*{7 * ' '}\u001b[38;5;9m♥♥♥♥♥\u001b[0m{7 * ' '}*{7 * ' '}:{3 * ' '}<[◎]|_|=
}}-}}-*]{4 * ' '}`..'..'{9 * ' '}\u001b[0m♥♥♥\u001b[0m{9 * ' '}`..'..'{6 * ' '}|
{4 * ' '}◎-◎{4 * ' '}//{3 * ' '}\\\\{10 * ' '}\u001b[38;5;9m♥\u001b[0m{10 * ' '}//{3 * ' '}\\\\{5 * ' '}/|\\""")
print(f"{_border}{_blank}\n\u001b[38;5;7;48;5;8m\\\u001b[38;5;15;48;5;15m{18 * ' '}\u001b[38;5;15;48;5;8msshyp "
f"version 1.5.3\u001b[38;5;15;48;5;15m{18 * ' '}\u001b[38;5;7;48;5;8m/\u001b[0m")
print(f"\u001b[38;5;7;48;5;8m\\\u001b[38;5;15;48;5;15m{14 * ' '}\u001b[38;5;15;48;5;8mthe fortified flock"
f" update\u001b[38;5;15;48;5;15m{15 * ' '}\u001b[38;5;7;48;5;8m/\u001b[0m\n{_blank}")
print(f"\u001b[38;5;7;48;5;8m\\\u001b[38;5;15;48;5;15m{9 * ' '}\u001b[38;5;15;48;5;8mcopyright 2021-2024 ",
f"randall winkhart\u001b[38;5;15;48;5;15m{9 * ' '}\u001b[38;5;7;48;5;8m/\u001b[0m")
print(f"{_blank}\n{_border}\nsee https://github.com/rwinkhart/sshyp for more information\n")
elif arguments[0] == 'license':
print('\nThis program is free software: you can redistribute it and/or modify it under the terms of\nversion 3 '
'(only) of the GNU General Public License as published by the Free Software Foundation.\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 PARTICULAR PURPOSE.\n\nSee the GNU General Public License '
'for more details:\nhttps://opensource.org/licenses/GPL-3.0\n')
elif arguments[0] == 'add' and device_type == 'client':
print(f"""\n\u001b[1musage:\u001b[0m sshyp /<entry name> add <option>\u001b[0m\n
\u001b[1moptions:\u001b[0m
add:
password/-p{12 * ' '}add a password entry
note/-n{16 * ' '}add a note entry
folder/-f{14 * ' '}add a new folder for entries\n""")
elif arguments[0] == 'edit' and device_type == 'client':
print(f"""\n\u001b[1musage:\u001b[0m sshyp /<entry name> edit <option>\u001b[0m\n
\u001b[1moptions:\u001b[0m
edit:
rename/relocate/-r{5 * ' '}rename or relocate an entry
username/-u{12 * ' '}change the username of an entry
password/-p{12 * ' '}change the password of an entry
url/-l{17 * ' '}change the url attached to an entry
note/-n{16 * ' '}change the note attached to an entry\n""")
elif arguments[0] == 'copy' and device_type == 'client':
print(f"""\n\u001b[1musage:\u001b[0m sshyp /<entry name> copy <option>\u001b[0m\n
\u001b[1moptions:\u001b[0m
copy:
username/-u{12 * ' '}copy the username of an entry to your clipboard
password/-p{12 * ' '}copy the password of an entry to your clipboard
url/-l{17 * ' '}copy the url of an entry to your clipboard
note/-n{16 * ' '}copy the note of an entry to your clipboard\n""")
elif arguments[0] == 'gen' and device_type == 'client':
print(f"""\n\u001b[1musage:\u001b[0m sshyp /<entry name> gen [option]\u001b[0m\n
\u001b[1moptions:\u001b[0m
gen:
update/-u{14 * ' '}generate a password for an existing entry\n""")
else:
print("\n\u001b[1msshyp ", "copyright (c) 2021-2024 ", """randall winkhart\u001b[0m
this is free software, and you are welcome to redistribute it under certain conditions;
this program comes with absolutely no warranty; type 'sshyp license' for details""")
if device_type == 'client':
print(f"""\n\u001b[1musage:\u001b[0m sshyp [/<entry name> [argument] [option]] | [argument]\n
\u001b[1marguments:\u001b[0m
help/-h{17 * ' '}bring up this menu
version/-v{14 * ' '}display sshyp version info
init{20 * ' '}set up sshyp
tweak{19 * ' '}change configuration options/manage extensions and updates
add{21 * ' '}add an entry
gen{21 * ' '}generate a new password
edit{20 * ' '}edit an existing entry
copy{20 * ' '}copy details of an entry to your clipboard
shear{19 * ' '}delete an existing entry
sync{20 * ' '}manually sync the entry directory via sshync
\n\u001b[1moptions:\u001b[0m
add:
password/-p{12 * ' '}add a password entry
note/-n{16 * ' '}add a note entry
folder/-f{14 * ' '}add a new folder for entries
edit:
rename/relocate/-r{5 * ' '}rename or relocate an entry
username/-u{12 * ' '}change the username of an entry
password/-p{12 * ' '}change the password of an entry
url/-l{17 * ' '}change the url attached to an entry
note/-n{16 * ' '}change the note attached to an entry
copy:
username/-u{12 * ' '}copy the username of an entry to your clipboard
password/-p{12 * ' '}copy the password of an entry to your clipboard
url/-l{17 * ' '}copy the url of an entry to your clipboard
note/-n{16 * ' '}copy the note of an entry to your clipboard
gen:
update/-u{14 * ' '}generate a password for an existing entry
\n\u001b[1mtip 1:\u001b[0m you can quickly read an entry with 'sshyp /<entry name>'
\u001b[1mtip 2:\u001b[0m type 'sshyp' to view a list of saved entries\n""")
# PORT START HELP-SERVER
else:
print(f"""\n\u001b[1musage:\u001b[0m sshyp <argument>\n
\u001b[1marguments:\u001b[0m
help/-h{17 * ' '}bring up this menu
version/-v{14 * ' '}display sshyp version info
init{20 * ' '}set up sshyp
tweak{19 * ' '}change configuration options/manage extensions and updates\n""")
# PORT END HELP-SERVER
# shortcut to quickly read an entry
def read_shortcut():
target_type_check(entry_name, True, True)
entry_reader(decrypt(directory + entry_name, _quick_verify=quick_unlock_enabled))
# calls sshync to sync changes to the user's server
def sync(_start_text=''):
print(f"{_start_text}synchronizing entries with the server device...\n")
# set permissions before uploading
for _root, _dirs, _files in walk(f"{home}/.local/share/sshyp"):
for _path in _root.splitlines():
chmod(_path, 0o700)
for _file in _files:
chmod(_root + '/' + _file, 0o600)
run_profile(f"{home}/.config/sshyp/sshyp.ini", silent_sync)
# adds a new entry
def add_entry():
# make sure the add target does not already exist
target_exists_check(entry_name, False)
# note entry
if arguments[2] in ('note', '-n'):
_password, _username, _url, _note = '', '', '', edit_note([])
else:
# password entry
from getpass import getpass
_username = str(input('\nusername: '))
_password = str(getpass(prompt='\npassword: '))
_url = str(input('\nurl: '))
if input('\nadd a note to this entry? (y/N) ').lower() == 'y':
_note = edit_note([])
else:
_note = ''
print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader([_password, _username, _url] + _note.split('\n'))
encrypt([_password, _username, _url, _note], directory + entry_name, gpg_id)
# creates a new folder
def add_folder():
Path(directory + entry_name).mkdir(mode=0o700, parents=True, exist_ok=True)
if not ssh_error:
run(('ssh', '-i', identity, '-p', port, f"{username_ssh}@{ip}",
f'python3 -c \'from pathlib import Path; Path("{directory_ssh}{entry_name}")'
f'.mkdir(mode=0o700, parents=True, exist_ok=True)\''))
# renames an entry or folder
def rename():
from shutil import copy
# check if the renaming target is an entry (file) or a folder
_file = target_type_check(entry_name)
# collect the new name for the target from user input
_new_name = str(input('new name: ')).strip('/')
# check if the new name already exists
target_exists_check(_new_name, False)
# if renaming a file
if _file:
if not ssh_error:
copy(f"{directory}{entry_name}.gpg", f"{directory}{_new_name}.gpg")
else:
move(f"{directory}{entry_name}.gpg", f"{directory}{_new_name}.gpg")
else:
# if renaming a folder
if not ssh_error:
Path(f"{directory}{_new_name}").mkdir(mode=0o700, parents=True, exist_ok=True)
run(('ssh', '-i', identity, '-p', port, f"{username_ssh}@{ip}",
f'python3 -c \'from pathlib import Path; Path("{directory_ssh}{entry_name}")'
f'.rename(Path("{directory_ssh}{_new_name}"))\''))
else:
move(f"{directory}{entry_name}", f"{directory}{_new_name}")
if not ssh_error:
run(('ssh', '-i', identity, '-p', port, f"{username_ssh}@{ip}",
f'cd /usr/lib/sshyp; python3 -c \'from sshync import delete; delete("{entry_name}", "remotely", True)\''))
# edits the contents of an entry
def edit():
# ensure the edit target is an entry
target_type_check(entry_name, True, True)
if arguments[2] in ('username', '-u'):
_detail, _edit_line = str(input('\nusername: ')), 1
elif arguments[2] in ('password', '-p'):
from getpass import getpass
_detail, _edit_line = str(getpass(prompt='\npassword: ')), 0
elif arguments[2] in ('url', '-l'):
_detail, _edit_line = str(input('\nurl: ')), 2
if arguments[2] in ('note', '-n'):
_old_lines = decrypt(directory + entry_name, _quick_verify=quick_unlock_enabled)
# pass 2 as _edit_line to simulate a full entry minus notes so that notes are appended correctly
_new_lines = line_edit(_old_lines[0:3], 2) + edit_note(_old_lines[3:], True).split('\n')
else:
_new_lines = line_edit(decrypt(directory + entry_name, _quick_verify=quick_unlock_enabled), _edit_line, _detail)
print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(_new_lines)
encrypt(_new_lines, directory + entry_name, gpg_id)
# generates a password for a new or an existing entry
def gen():
# gen update
if arg_count == 3 and arguments[2] in ('update', '-u'):
# ensure the gen update target is an entry
target_type_check(entry_name, True, True)
_new_lines = line_edit(decrypt(directory + entry_name, _quick_verify=quick_unlock_enabled), 0, pass_gen())
# gen
else:
# make sure the gen target does not already exist
target_exists_check(entry_name, False)
_username = str(input('\nusername: '))
_password = pass_gen()
_url = str(input('\nurl: '))
if input('\nadd a note to this entry? (y/N) ').lower() == 'y':
_note = edit_note([])
else:
_note = ''
_new_lines = [_password, _username, _url] + _note.split('\n')
print('\n\u001b[1mentry preview:\u001b[0m')
entry_reader(_new_lines)
encrypt(_new_lines, directory + entry_name, gpg_id)
# copies a specified field of an entry to the clipboard
def copy_data():
from hashlib import sha512
from subprocess import Popen
# ensure the copy target is an entry
target_type_check(entry_name, True, True)
_index = 0
if arguments[2] in ('username', '-u'):
_index = 1
elif arguments[2] in ('password', '-p'):
_index = 0
elif arguments[2] in ('url', '-l'):
_index = 2
elif arguments[2] in ('note', '-n'):
_index = 3
_copy_subject = decrypt(directory + entry_name, _quick_verify=quick_unlock_enabled)[_index]
# ensure field is not blank
if _copy_subject == '':
raise IndexError
# store hashed _copy_subject for later comparison
_hash = sha512()
_hash.update(_copy_subject.encode('utf-8'))
# PORT START CLIPBOARD
# WSL clipboard detection
if 'WSL_DISTRO_NAME' in environ:
run(('powershell.exe', '-c', "Set-Clipboard '" + _copy_subject.replace("'", "''") + "'"))
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'wsl'), stdout=DEVNULL,
stderr=DEVNULL)
# Wayland clipboard detection
elif 'WAYLAND_DISPLAY' in environ:
run('wl-copy', stdin=Popen(('printf', '%b', _copy_subject.replace('\\', '\\\\')), stdout=PIPE).stdout)
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'wayland'))
# Haiku clipboard detection
elif uname()[0] == 'Haiku':
run(('clipboard', '-c', _copy_subject))
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'haiku'))
# MacOS clipboard detection
elif uname()[0] == 'Darwin':
run('pbcopy', stdin=Popen(('printf', '%b', _copy_subject.replace('\\', '\\\\')), stdout=PIPE).stdout)
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'mac'))
# Termux (Android) clipboard detection
elif isdir("/data/data/com.termux"):
run(('termux-clipboard-set', _copy_subject))
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'termux'))
# X11 clipboard detection
elif 'DISPLAY' in environ:
run(('xclip', '-sel', 'c'), stdin=Popen(('printf', '%b', _copy_subject.replace('\\', '\\\\')), stdout=PIPE)
.stdout)
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'x11'))
else:
print('\n\u001b[38;5;9merror: clipboard tool could not be determined\n\nnote that the clipboard does not '
'function in a raw tty\u001b[0m\n')
# PORT END CLIPBOARD
# deletes an entry from the server and flags it for local deletion on sync
def remove_data():
decrypt(None, _quick_verify=quick_unlock_enabled)
if not ssh_error:
run(('ssh', '-i', identity, '-p', port, f"{username_ssh}@{ip}",
f'cd /usr/lib/sshyp; python3 -c \'from sshync import delete; delete("{entry_name}", "remotely", True)\''))
else:
offline_delete(entry_name, 'locally', silent_sync)
# checks extension config files for matches to argument, runs extensions
def extension_runner():
_output_com, _extension_dir = None, realpath(__file__).rsplit('/', 1)[0] + '/extensions/'
if isdir(_extension_dir):
for _extension in listdir(_extension_dir):
_extension_config = ConfigParser(interpolation=None)
_extension_config.read(_extension_dir + _extension)
_input_com = _extension_config.get('config', 'input').split()
if _input_com == arguments[arg_start:]:
_output_com = _extension_config.get('config', 'output').split()
if arg_start == 1:
_output_com.append(arguments[0])
if _output_com is not None:
run(_output_com)
else:
print_info()
else:
print_info()
s_exit()
if __name__ == "__main__":
try:
# set default states
ssh_error, success_flag, sync_flag, silent_sync, pass_show = False, False, False, False, False
# retrieve typed argument
arguments = argv[1:]
arg_count = len(arguments)
# check if an entry name is correctly supplied
if arg_count < 1 or (arg_count > 0 and arguments[0] != 'init'):
if arg_count > 0 and arguments[0].startswith('/'):
arg_start = 1
entry_name = arguments[0].strip('/')
# determine whether to show passwords in entry previews
if arg_count > 1 and arguments[arg_count - 1] in ('--show', '-s'):
del arguments[-1]
arg_count -= 1
pass_show = True
else:
arg_start = 0
# import saved userdata
try:
sshyp_data = ConfigParser(interpolation=None)
sshyp_data.read(f"{home}/.config/sshyp/sshyp.ini")
device_type = sshyp_data.get('GENERAL', 'device_type')
if device_type == 'client':
directory = f"{home}/.local/share/sshyp/"
gpg_id = sshyp_data.get('CLIENT-GENERAL', 'gpg_id')
editor = sshyp_data.get('CLIENT-GENERAL', 'text_editor')
offline_mode_enabled = sshyp_data.getboolean('CLIENT-GENERAL', 'offline_mode_enabled')
if offline_mode_enabled:
ssh_error = True
quick_unlock_enabled = False
else:
quick_unlock_enabled = sshyp_data.getboolean('CLIENT-ONLINE', 'quick_unlock_enabled')
username_ssh = sshyp_data.get('SSHYNC', 'user')
ip = sshyp_data.get('SSHYNC', 'ip')
port = sshyp_data.get('SSHYNC', 'port')
directory_ssh = sshyp_data.get('SSHYNC', 'remote_dir')
identity = sshyp_data.get('SSHYNC', 'identity_file')
client_device_id = listdir(f"{home}/.config/sshyp/devices")[0]
ssh_error = sshyp_data.getboolean('CLIENT-ONLINE', 'ssh_error')
if ssh_error:
ssh_error = copy_id_check(port, username_ssh, ip, client_device_id, identity, sshyp_data)
except (FileNotFoundError, NoSectionError, NoOptionError):
print(f"\n{73 * '!'}")
print("not all necessary configurations have been made - please run 'sshyp init'")
print(f"{73 * '!'}\n")
s_exit(1)
else:
from stweak import wrapped_entry
wrapped_entry(False, 'additional configuration options:')
s_exit()
# run function based on arguments
if device_type == 'client':
if arg_count < 1:
entry_list_gen()
elif arg_count == 3 and arg_start == 1:
if arguments[1] == 'copy':
if arguments[2] in ('username', '-u', 'password', '-p', 'url', '-l', 'note', '-n'):
try:
success_flag = 1
copy_data()
except IndexError:
print('\n\u001b[38;5;9merror: field does not exist in entry\u001b[0m\n')
s_exit(2)
elif arguments[1] == 'add':
if arguments[2] in ('note', '-n', 'password', '-p'):
success_flag, sync_flag = True, True
add_entry()
elif arguments[2] in ('folder', '-f'):
success_flag = 1
add_folder()
elif arguments[1] == 'edit':
if arguments[2] in ('rename', 'relocate', '-r'):
success_flag, sync_flag, silent_sync = True, True, True
rename()
elif arguments[2] in ('username', '-u', 'password', '-p', 'url', '-l', 'note', '-n'):
success_flag, sync_flag = True, True
edit()
elif arguments[1] == 'gen' and arguments[2] in ('update', '-u'):
success_flag, sync_flag = True, True
gen()
elif arg_count == 2 and arg_start == 1:
if arguments[1] == 'gen':
success_flag, sync_flag = True, True
gen()
elif arguments[1] == 'shear':
success_flag = True
remove_data()
elif arg_count == 1:
if arg_start == 1:
success_flag = True
read_shortcut()
elif arguments[0] == 'tweak':
success_flag = True
from stweak import wrapped_entry
wrapped_entry(device_type)
if arg_count > 0 and success_flag == 0 and arguments[0] != 'sync':
if arguments[0] not in ('help', '-h', 'version', '-v', 'license'):
extension_runner()
else:
print_info()
elif not ssh_error:
if sync_flag:
sync()
elif (arg_count > 0 and arguments[0] == 'sync') or (arg_count > 1 and arguments[1] == 'shear'):
sync('\n')
elif arg_count > 0 and arguments[0] == 'sync' and offline_mode_enabled:
print("\n\u001b[38;5;9mwarning: sshyp is currently configured in offline mode - ssh synchronization is "
"disabled\u001b[0m\n")
# PORT START ARGS-SERVER
# server arguments
else:
if arg_count == 1 and arguments[0] == 'tweak':
success_flag = True
from stweak import wrapped_entry
wrapped_entry(device_type)
else:
if arg_count < 1:
arguments.append('help')
print_info()
# PORT END ARGS-SERVER
except KeyboardInterrupt:
print('\n')
+734
View File
@@ -0,0 +1,734 @@
from configparser import ConfigParser
from curses import A_REVERSE, KEY_DOWN, KEY_UP, curs_set, newwin
from curses.textpad import rectangle, Textbox
from os import environ, listdir, remove
from os.path import exists, expanduser, isfile
from pathlib import Path
from random import randint
from shutil import which
from subprocess import CalledProcessError, DEVNULL, PIPE, run
# PORT START UNAME-IMPORT-STWEAK
from os import uname
# PORT END UNAME-IMPORT-STWEAK
home, sshyp_data, stdscr, gm_device_type = expanduser('~'), ConfigParser(interpolation=None), None, None
if isfile(f"{home}/.config/sshyp/sshyp.ini"):
_exists_flag = True
sshyp_data.read(f"{home}/.config/sshyp/sshyp.ini")
else:
_exists_flag = False
# writes data stored in ConfigParser to the correct config file
def write_config(_sshyp_data=sshyp_data):
with open(f"{home}/.config/sshyp/sshyp.ini", 'w') as configfile:
_sshyp_data.write(configfile)
# creates a radio selection between the provided options
def curses_radio(_options, _pretext):
curs_set(0)
_selected = 0
while True:
# clear curses window
stdscr.clear()
# get terminal size
_height, _width = stdscr.getmaxyx()
# track whether to generate interactive buttons (depending on terminal size)
_button_gen = False
# split text based on new lines
_pretext_lines = _pretext.split('\n')
# iterate through lines, splitting further (wrapping) as needed, to add to curses window
_current_line = 0
for _line in _pretext_lines:
if _current_line <= _height - 4:
_button_gen = True
while len(_line) > _width:
stdscr.addstr(_current_line, 0, _line[:_width])
_line = _line[_width:]
_current_line += 1
stdscr.addstr(_current_line, 0, _line)
_current_line += 1
else:
_button_gen = False
stdscr.addstr(_current_line, 0, '# warning: re-size terminal to see more information'[:_width - 1])
_current_line += 1
break
# create user-interactive options if all information has been displayed to the user
if _button_gen:
for _i, _option in enumerate(_options):
_y = _i + _current_line + 1
if _y < _height:
if _i == _selected:
stdscr.addstr(_y, 0, "[*] " + _option, A_REVERSE)
else:
stdscr.addstr(_y, 0, "[ ] " + _option)
else:
stdscr.addstr(_y - 1, 0, '# warning: re-size terminal to see more information')
break
# update _selected based on user input
_key = stdscr.getch()
if _button_gen:
if _key == KEY_UP:
_selected = (_selected - 1) % len(_options)
elif _key == KEY_DOWN:
_selected = (_selected + 1) % len(_options)
# ord('\n') == 10
elif _key == 10:
break
stdscr.refresh()
curs_set(1)
return _selected
# creates a text-box input
def curses_text(_pretext):
stdscr.clear()
stdscr.addstr(0, 0, _pretext)
_width = stdscr.getmaxyx()[1]
_editwin = newwin(1, _width - 2, 3, 1)
rectangle(stdscr, 2, 0, 4, _width - 1)
stdscr.refresh()
_box = Textbox(_editwin)
# let the user edit until ctrl+g/enter is struck
_box.edit()
# return resulting contents
return _box.gather().strip()
# device+sync type selection
def install_type():
_offline_mode = 'false'
# PORT START TWEAK-DEVTYPE
_install_type = curses_radio(('client (ssh-synchronized)', 'client (offline)', 'server'),
'device + sync type configuration')
# PORT END TWEAK-DEVTYPE
if _install_type == 2:
_dev_type = 'server'
Path(f"{home}/.config/sshyp/deleted").mkdir(mode=0o700, exist_ok=True)
Path(f"{home}/.config/sshyp/whitelist").mkdir(mode=0o700, exist_ok=True)
curses_radio(['okay'], 'make sure the ssh service is running and properly configured')
else:
_dev_type = 'client'
if _install_type == 1:
_offline_mode = 'true'
if not sshyp_data.has_section('CLIENT-GENERAL'):
sshyp_data.add_section('CLIENT-GENERAL')
sshyp_data.set('CLIENT-GENERAL', 'offline_mode_enabled', _offline_mode)
if not sshyp_data.has_section('GENERAL'):
sshyp_data.add_section('GENERAL')
sshyp_data.set('GENERAL', 'device_type', _dev_type)
write_config()
return _dev_type, _offline_mode
# gpg configuration
def gpg_config():
# gpg key selection
_uid_list = [_item for _item in run(('gpg', '-k', '--with-colons'),
stdout=PIPE, text=True).stdout.splitlines() if _item.startswith('uid')]
_named_uid_list = []
for _uid in _uid_list:
_named_uid_list.append(_uid.split(':')[9].replace('\\x3a', ':').replace('\\x5c', '\\'))
_named_uid_list.append('auto-generate')
_gpg_id_sel = curses_radio(_named_uid_list, 'gpg key selection')
if _gpg_id_sel == len(_named_uid_list) - 1:
if not isfile(f"{home}/.config/sshyp/gpg-gen"):
open(f"{home}/.config/sshyp/gpg-gen", 'w').writelines([
'Key-Type: 1\n', 'Key-Length: 4096\n', 'Key-Usage: sign encrypt\n', 'Name-Real: sshyp\n',
'Name-Comment: gpg-sshyp\n', 'Name-Email: github.com/rwinkhart/sshyp\n',
'Expire-Date: 0'])
curses_radio(['okay'], 'gpg key generation may take some time (especially on slower devices)\n\nselect "okay" '
'to start\n\ndo not terminate this process!')
try:
run(('gpg', '-q', '--batch', '--generate-key', f"{home}/.config/sshyp/gpg-gen"), stderr=PIPE, check=True)
except CalledProcessError as e:
if 'No pinentry' in e.stderr.decode("utf-8"):
curses_radio(['okay'], 'either a valid pinentry program is missing or gpg is not configured to use an '
'available pinentry program\n\nsshyp will now exit')
from sys import exit as s_exit
s_exit(6)
remove(f"{home}/.config/sshyp/gpg-gen")
_gpg_id = run(('gpg', '-k', '--with-colons'), stdout=PIPE, text=True).stdout.splitlines()[-1].split(':')[9]
else:
_gpg_id = _named_uid_list[_gpg_id_sel]
# lock file generation
if isfile(f"{home}/.config/sshyp/lock.gpg"):
remove(f"{home}/.config/sshyp/lock.gpg")
open(f"{home}/.config/sshyp/lock", 'w')
run(('gpg', '-qr', _gpg_id, '-e', f"{home}/.config/sshyp/lock"))
remove(f"{home}/.config/sshyp/lock")
if not sshyp_data.has_section('CLIENT-GENERAL'):
sshyp_data.add_section('CLIENT-GENERAL')
sshyp_data.set('CLIENT-GENERAL', 'gpg_id', _gpg_id)
write_config()
# text editor configuration
def editor_config(_env_mode):
if _env_mode:
# set default text editor to value of EDITOR environment variable, otherwise default to vi
if 'EDITOR' in environ:
_editor = environ['EDITOR']
else:
_editor = 'vi'
else:
_editor = curses_text('enter the name of your preferred text editor:\n\n\n\n\n(ctrl+g/enter to confirm)'
'\n\nthis will be used for writing notes\n\nexample input: vim')
if not sshyp_data.has_section('CLIENT-GENERAL'):
sshyp_data.add_section('CLIENT-GENERAL')
sshyp_data.set('CLIENT-GENERAL', 'text_editor', _editor)
write_config()
# ssh+sshync configuration
def ssh_config(_reconfig=False):
# private key selection/generation
_keys = []
# ensure ~/.ssh directory exists
Path(f"{home}/.ssh").mkdir(mode=0o700, exist_ok=True)
for _file in listdir(f"{home}/.ssh"):
if not _file.startswith('.') and _file not in ('known_hosts', 'known_hosts.old', 'authorized_keys') \
and not _file.endswith('.pub') and isfile(f"{home}/.ssh/{_file}"):
_keys.append(f"{home}/.ssh/{_file}")
_keys.extend(['auto-generate', 'other (type the location)'])
# append a back button if launched optionally
if _reconfig:
_keys.append('BACK')
_key_selected_num = curses_radio(_keys, 'which private ssh key would you like to use for sshyp?')
if _reconfig and _key_selected_num == len(_keys) - 1:
return
_gen_index = len(_keys) - 2
if _key_selected_num >= _gen_index:
_ssh_key = expanduser(curses_text('enter the location for your private ssh key:\n\n\n\n\n(ctrl+g/enter to '
'confirm)\n\nexample input:\n\n~/.ssh/privkey'))
if _key_selected_num == _gen_index:
_passphrase = curses_text('enter your desired ssh keyfile passphrase:\n\n\n\n\n(ctrl+g/enter to confirm)'
'\n\nnote: it is recommended to leave this blank and to use the keyfile without '
'a passphrase (the keyfile itself serves as your identity)')
run(('ssh-keygen', '-q', '-t', 'ed25519', '-N', _passphrase, '-f', _ssh_key))
else:
_ssh_key = _keys[_key_selected_num]
# ssh+sshync configuration
_uiport = curses_text('enter the username, ip, and ssh port of your sshyp server:\n\n\n\n\n(ctrl+g/enter to '
'confirm)\n\nexample inputs:\n\n ipv4: user@10.10.10.10:22\n ipv6: user@[2000:2000:2000:2000'
':2000:2000:2000:2000]:22\n domain: user@mydomain.com:22')
_uiport_split = _uiport.split('@')
_username_ssh = _uiport_split[0]
_iport = _uiport_split[1].lstrip('[').replace(']', '').rsplit(':', 1)
if not sshyp_data.has_section('SSHYNC'):
sshyp_data.add_section('SSHYNC')
sshyp_data.set('SSHYNC', 'user', _username_ssh)
sshyp_data.set('SSHYNC', 'ip', _iport[0])
sshyp_data.set('SSHYNC', 'port', _iport[1])
sshyp_data.set('SSHYNC', 'local_dir', f"{home}/.local/share/sshyp/")
sshyp_data.set('SSHYNC', 'remote_dir', f"/home/{_username_ssh}/.local/share/sshyp/")
sshyp_data.set('SSHYNC', 'identity_file', _ssh_key)
write_config()
return _iport[1], _username_ssh, _iport[0], _ssh_key
# device id configuration
def dev_id_config(_port, _username_ssh, _ip, _identity, _reconfig=False):
if _reconfig:
_sure = curses_radio(('no', 'yes'), "WARNING: ensure this sshyp client is synchronized (up-to-date) before "
"changing the device id\n\nfailure to do so may result in sync"
"hronization issues\n\nare you sure you wish to change the device id?")
if _sure != 1:
return
from sshyp import copy_id_check, string_gen
_device_id_prefix = curses_text('set this device\'s id:\n\n\n\n\n(ctrl+g/enter to confirm)\n\nimportant: this '
'id must be unique amongst your client devices\n\nthis is used to keep track of '
'database synchronization and quick-unlock permissions\n')
_device_id_suffix = string_gen('f', randint(24, 48))
_device_id = _device_id_prefix + '-' + _device_id_suffix
# remove existing device ids
_device_id_list = listdir(f"{home}/.config/sshyp/devices")
for _id in _device_id_list:
remove(f"{home}/.config/sshyp/devices/{_id}")
open(f"{home}/.config/sshyp/devices/{_device_id}", 'w')
# test server connection and attempt to register device id - only run if _reconfig is True, since the keyfile
# needs to be registered with the server before a successful connection can be made
if _reconfig:
# copy_id_check() returns false if successful
if not copy_id_check(_port, _username_ssh, _ip, _device_id, _identity, sshyp_data):
# remove old device id from registered pool and whitelist
run(('ssh', '-o', 'ConnectTimeout=3', '-i', _identity, '-p', _port, f"{_username_ssh}@{_ip}",
'python3 -c \'from pathlib import Path; '
f'Path("/home/{_username_ssh}/.config/sshyp/devices/{_device_id_list[0]}").unlink(missing_ok=True); '
f'Path("/home/{_username_ssh}/.config/sshyp/whitelist/{_device_id_list[0]}")'
f'.unlink(missing_ok=True)\''), stderr=DEVNULL, stdout=DEVNULL)
else:
sshyp_data.set('CLIENT-ONLINE', 'ssh_error', 'true')
write_config()
curses_radio(['okay'], 'this device will be registered with the server upon the first successful sync\n\n'
'you can force this now by running "sshyp sync"\n\nif you have not done so already, '
'ensure your ssh pubkey has been appended to the server\'s authorized_keys file!')
# quick-unlock configuration
def quick_unlock_config(_default):
if _default:
_enabled = 'false'
else:
_quick_unlock_sel = curses_radio(('no', 'yes'), 'WARNING: quick-unlock is only as secure as the environment you'
' use it in\n\nquick-unlock allows you to use a shorter version'
' of your gpg key passphrase and\nrequires a constant '
'connection to your sshyp server to authenticate\n\na '
'compromised program on your computer could scan the process '
'list in the\nbrief period during decryption to retrieve the '
'necessary information to decrypt your entries\n\nenable '
'quick-unlock?')
if _quick_unlock_sel == 1:
_enabled = 'true'
else:
_enabled = 'false'
if not sshyp_data.has_section('CLIENT-ONLINE'):
sshyp_data.add_section('CLIENT-ONLINE')
sshyp_data.set('CLIENT-ONLINE', 'quick_unlock_enabled', _enabled)
write_config()
return _enabled
# re-encrypt/optimize all entries
def refresh_encryption():
_directory = f"{home}/.local/share/sshyp"
# warn the user of potential data loss and prompt to continue
_sure = curses_radio(('no', 'yes'), "WARNING: proceeding with this action will remove/overwrite any directories"
f" matching the following:\n\n{home}/.local/share/sshyp.old\n{home}/.local/"
"share/sshyp.new\n\nare you sure you wish to re-encrypt all entries?")
if _sure != 1:
return 3
# set new gpg key
gpg_config()
from os import walk
from os.path import isdir
from shutil import move, rmtree
from sshyp import decrypt, encrypt
# prompt for unlock and display do not close warning
decrypt(None)
curses_radio(['okay'], 'entry optimization may take some time (especially on slower devices)\n\nselect "okay" '
'to start\n\ndo not terminate this process!')
# remove existing conflicts
for _extension in ('.new', '.old'):
if exists(f"{_directory}{_extension}"):
rmtree(f"{_directory}{_extension}")
# decrypt, optimize, and re-encrypt each entry with the newly selected key
if isdir(_directory):
_gpg_id = sshyp_data.get('CLIENT-GENERAL', 'gpg_id')
for _root, _dirs, _files in sorted(walk(_directory, topdown=True)):
for _filename in _files:
Path(_root.replace(_directory, _directory + '.new', 1)).mkdir(0o700, parents=True, exist_ok=True)
encrypt(decrypt(f"{_root}/{_filename[:-4]}"),
f"{_root.replace(_directory, _directory + '.new', 1)}/{_filename[:-4]}", _gpg_id)
# create a backup of the original version and activate the new version
move(_directory, _directory + '.old')
move(_directory + '.new', _directory)
return 1
else:
return 2
# PORT START WHITELIST-SERVER
# removes a registered device id from the server-side pool and prunes the quick-unlock whitelist
def registered_dev_id_remover(_back=False):
_device_ids = listdir(f"{home}/.config/sshyp/devices") + ['BACK']
_whitelisted_ids = listdir(f"{home}/.config/sshyp/whitelist")
while not _back:
_del_id = curses_radio(_device_ids, 'WARNING: only remove registered device ids if they are no longer in use'
'\n\nthe removal of an active device id will result in the malfunction of '
'the device still using the removed id\n\nregistered device id to remove:')
if _del_id == len(_device_ids) - 1:
_back = True
else:
# remove deleted device id from whitelist
if _device_ids[_del_id] in _whitelisted_ids:
remove(f"{home}/.config/sshyp/whitelist/{_whitelisted_ids[_del_id]}")
_whitelisted_ids = [_id for _id in _whitelisted_ids if _id != _device_ids[_del_id]]
# remove deleted device id from device pool
remove(f"{home}/.config/sshyp/devices/{_device_ids[_del_id]}")
del _device_ids[_del_id]
# takes input from the user to set up quick-unlock pin
def whitelist_setup():
_gpg_password_temp = str(curses_text('full gpg passphrase:\n\n\n\n\n(ctrl+g/enter to confirm)'))
_half_length = len(_gpg_password_temp) // 2
try:
_short_password_length = int(curses_text(f"quick unlock pin length ({_half_length}):\n\n\n\n\n(ctrl+g/enter "
"to confirm)\n\nnote: do NOT enter your desired pin - this is simply "
"an integer used to determine the length of the auto-generated pin"
"\n\npin must be half the length of the gpg passphrase or less and "
"must be greater than 0"))
if not 0 < _short_password_length <= _half_length:
_short_password_length = _half_length
except ValueError:
_short_password_length = _half_length
_i, _quick_unlock_password, _quick_unlock_password_excluded = 0, '', ''
for _char in _gpg_password_temp:
if _i % 2 == 1 and _i < _short_password_length * 2:
_quick_unlock_password += _char
else:
_quick_unlock_password_excluded += _char
_i += 1
# create assembly key
open(f"{home}/.config/sshyp/gpg-gen", 'w').writelines([
'Key-Type: 1\n', 'Key-Length: 4096\n', 'Key-Usage: sign encrypt\n', 'Name-Real: sshyp\n',
'Name-Comment: gpg-sshyp-whitelist\n', 'Name-Email: github.com/rwinkhart/sshyp\n', 'Expire-Date: 0'])
curses_radio(['okay'], 'gpg key generation may take some time (especially on slower devices)\n\nselect "okay" '
'to start\n\ndo not terminate this process!')
run(('gpg', '-q', '--pinentry-mode', 'loopback', '--batch', '--generate-key', '--passphrase',
_quick_unlock_password, f"{home}/.config/sshyp/gpg-gen"))
remove(f"{home}/.config/sshyp/gpg-gen")
_gpg_id = run(('gpg', '-k', '--with-colons'), stdout=PIPE, text=True).stdout.splitlines()[-1].split(':')[9]
# encrypt excluded with the assembly key
from sshyp import encrypt
encrypt([_quick_unlock_password_excluded], f"{home}/.config/sshyp/excluded", _gpg_id)
curses_radio(['okay, I have it memorized'], f"your quick-unlock pin: {_quick_unlock_password}")
# adds or removes quick-unlock whitelisted device ids
def whitelist_manage(_action, _back=False):
_whitelisted_ids = listdir(f"{home}/.config/sshyp/whitelist") + ['BACK']
_device_ids = listdir(f"{home}/.config/sshyp/devices")
_unwhitelisted_ids = []
for _id in _device_ids:
if _id not in _whitelisted_ids:
_unwhitelisted_ids.append(_id)
_unwhitelisted_ids.append('BACK')
while not _back:
# _action == True indicates adding
if _action:
_add_id = curses_radio(_unwhitelisted_ids, 'id to add to whitelist:')
if _add_id == len(_unwhitelisted_ids) - 1:
_back = True
else:
open(f"{home}/.config/sshyp/whitelist/{_unwhitelisted_ids[_add_id]}", 'w').write('')
del _unwhitelisted_ids[_add_id]
# _action == False indicates removing
else:
_del_id = curses_radio(_whitelisted_ids, 'id to remove from whitelist:')
if _del_id == len(_whitelisted_ids) - 1:
_back = True
else:
remove(f"{home}/.config/sshyp/whitelist/{_whitelisted_ids[_del_id]}")
del _whitelisted_ids[_del_id]
# runs quick-unlock configuration menu
def whitelist_menu():
while True:
_choice = curses_radio(('setup/create pin', 'add to whitelist', 'remove from whitelist',
'BACK'), 'quick-unlock/whitelist management')
if _choice == 0:
whitelist_setup()
elif _choice == 1:
whitelist_manage(True)
elif _choice == 2:
whitelist_manage(False)
else:
break
# PORT END WHITELIST-SERVER
# PORT START TWEAK-EXTEND-FUNCTIONS
# downloads/updates extensions
def extension_downloader():
from os import chmod
from tempfile import gettempdir
from urllib.request import urlopen, urlretrieve
# the version listed below will NOT always match the version of sshyp being used
# it is only updated if new extensions are incompatible with previous sshyp versions
_file_data = urlopen("https://raw.githubusercontent.com/rwinkhart/sshyp-labs/main/pointers/v1.5.2").read()
_pointer = ConfigParser(interpolation=None)
_pointer.read_string(_file_data.decode('utf-8'))
_extensions = _pointer.sections()
_extensions.append('BACK')
_choice = curses_radio(_extensions, 'select an extension for more info')
if _choice == len(_extensions) - 1:
return False
_selected = _extensions[_choice]
_divider = (stdscr.getmaxyx()[1]) * '-'
_choice = curses_radio(('no', 'yes'), '# description\n' + _divider + '\n\n' + _pointer.get(_selected, 'desc') +
'\n\n# usage\n' + _divider + '\n\n' + _pointer.get(_selected, 'usage').replace('<br>', '\n')
+ '\n\n' + _divider + '\n\ninstall ' + _selected + '?')
# if installing the extension...
if _choice == 1:
# download extension files to temporary directory
_exe_dir, _ini_dir = f"{gettempdir()}/sshyp_exe", f"{gettempdir()}/sshyp_ini"
urlretrieve(_pointer.get(_selected, 'exe'), _exe_dir)
urlretrieve(_pointer.get(_selected, 'ini'), _ini_dir)
# set permissions under active user
chmod(_exe_dir, 0o755)
chmod(_ini_dir, 0o644)
return _selected
return False
# uninstalls/deletes selected extensions
def extension_remover():
_installed = []
for _extension in listdir('/usr/lib/sshyp/extensions'):
_installed.append(_extension[:-4])
_installed.append('BACK')
_choice = curses_radio(_installed, 'select an extension to uninstall')
if _choice == len(_installed) - 1:
return False
_sure = curses_radio(('no', 'yes'), f"are you sure you want to remove {_installed[_choice]}?")
if _sure == 0:
return False
return _installed[_choice]
# provides options for managing extensions
def extension_menu():
_ext_name, _action = False, False
# determine which of the supported privilege escalation utilities is installed
if which('doas') is not None:
_escalator = 'doas'
elif which('sudo') is not None:
_escalator = 'sudo'
else:
# throw an error if no supported privilege escalation utility is found
raise ChildProcessError
while True:
_choice = curses_radio(('download/update extensions', 'remove extensions', 'BACK'), 'extension management')
if _choice == 0:
_ext_name = extension_downloader()
if _ext_name:
# True represents installation
_action = True
break
elif _choice == 1:
_ext_name = extension_remover()
if _ext_name:
break
else:
break
return _ext_name, _escalator, _action
# PORT END TWEAK-EXTEND-FUNCTIONS
# runs secondary configuration menu
def global_menu(_scr, _device_type, _top_message):
global stdscr
# only set global stdscr if running as entry point
if not isinstance(_scr, bool):
stdscr = _scr
while True:
_options, _choice, _exit_signal = ['change device/synchronization types'], 0, False
if _device_type == 'client':
_options.extend(['change gpg key', 're-configure ssh(ync)', 'change device id',
'[OPTIONAL, RECOMMENDED] set custom text editor',
'[OPTIONAL] enable/disable quick-unlock',
'[OPTIONAL] re-encrypt/optimize entries',
'[OPTIONAL] extension management'])
else:
_options.extend(['remove registered device ids', 'manage quick-unlock/whitelist'])
_options.append('EXIT/DONE')
_choice += curses_radio(_options, _top_message)
if _choice == 0:
_dev_sync_types = install_type()
# if switching to client mode...
if _dev_sync_types[0] == 'client':
# ...and gpg settings are missing
if not sshyp_data.has_option('CLIENT-GENERAL', 'gpg_id'):
gpg_config()
# ...and text editor settings are missing
if not sshyp_data.has_option('CLIENT-GENERAL', 'text_editor'):
editor_config(True)
# ...and online (synchronized) mode is enabled...
if _dev_sync_types[1] == 'false':
# ...and quick-unlock settings are missing
if not sshyp_data.has_option('CLIENT-ONLINE', 'quick_unlock_enabled'):
quick_unlock_config(True)
# set to None to check if modified later
_ip, _username_ssh, _port, _identity = None, None, None, None
# ...and there is no sshync config present
if not sshyp_data.has_section('SSHYNC'):
_ip, _username_ssh, _port, _identity = ssh_config()
# ...and there is no device ID present
if not listdir(f"{home}/.config/sshyp/devices"):
if None in (_ip, _username_ssh, _port):
_ip, _username_ssh, _port, _identity = ssh_config()
dev_id_config(_port, _username_ssh, _ip, _identity)
# ...or ssh_error is missing
elif not sshyp_data.has_option('CLIENT-ONLINE', 'ssh_error'):
sshyp_data.set('CLIENT-ONLINE', 'ssh_error', '1')
write_config()
_device_type = _dev_sync_types[0]
elif _choice == 1:
if _device_type == 'client':
gpg_config()
else:
registered_dev_id_remover()
elif _choice == 2:
if _device_type == 'client':
ssh_config(True)
else:
whitelist_menu()
elif _choice == 3:
if _device_type == 'client':
if not sshyp_data.has_section('SSHYNC'):
ssh_config()
dev_id_config(sshyp_data.get('SSHYNC', 'port'), sshyp_data.get('SSHYNC', 'user'),
sshyp_data.get('SSHYNC', 'ip'), sshyp_data.get('SSHYNC', 'identity_file'), True)
else:
_exit_signal = True
elif _choice == 4:
editor_config(False)
elif _choice == 5:
_enabled = quick_unlock_config(False)
if _enabled == 'true':
curses_radio(['okay'], 'quick-unlock has been enabled client-side - in order for this feature to '
'function,\nyou must first log in to the sshyp server and run:\n\nsshyp tweak\n'
'\nfrom there you can create a quick-unlock pin and add this device to the '
'whitelist')
elif _choice == 6:
_success = refresh_encryption()
if _success == 1:
curses_radio(['okay'], "a backup of your previous entry directory has been created:\n\n"
f"{home}/.local/share/sshyp.old")
elif _success == 2:
curses_radio(['okay'], '\u001b[38;5;9merror: re-encryption failed: entry directory not found\u001b[0m')
elif _choice == 7:
# PORT START TWEAK-EXTEND-OPTION
_ext_name, _escalator, _action = extension_menu()
# if root is needed for extension management...
if _ext_name:
return _ext_name, _escalator, _action
# PORT END TWEAK-EXTEND-OPTION
else:
_exit_signal = True
if _exit_signal:
break
return None, None, None
# runs initial configuration wizard
def initial_setup(_scr):
global stdscr
stdscr = _scr
# required directory creation
Path(f"{home}/.config/sshyp/devices").mkdir(mode=0o700, parents=True, exist_ok=True)
Path(f"{home}/.local/share/sshyp").mkdir(mode=0o700, parents=True, exist_ok=True)
# removal of old config files
if _exists_flag:
sshyp_data.clear()
# curses menu tree
# device+sync type selection
_dev_sync_types = install_type()
if _dev_sync_types[0] == 'client':
# gpg configuration
gpg_config()
# text editor configuration (automated)
editor_config(True)
# quick-unlock configuration (disabled by default)
quick_unlock_config(True)
# online (synchronized mode) configuration
if _dev_sync_types[1] != 'true':
# ssh+sshync configuration
_ip, _username_ssh, _port, _identity = ssh_config()
# device id configuration
dev_id_config(_port, _username_ssh, _ip, _identity)
# PORT START CLIPTOOL
# check for clipboard tool and display warning if missing
if uname()[0] in ('Linux', 'FreeBSD') and 'WSL_DISTRO_NAME' not in environ \
and not exists("/data/data/com.termux"):
_display_server, _clipboard_tool, _clipboard_package = None, None, None
if 'WAYLAND_DISPLAY' in environ:
_display_server, _clipboard_tool, _clipboard_package = 'Wayland', 'wl-copy', 'wl-clipboard'
elif 'DISPLAY' in environ:
_display_server, _clipboard_tool, _clipboard_package = 'X11', 'xclip', 'xclip'
if _display_server is not None and which(_clipboard_tool) is None:
curses_radio(['okay'], f'WARNING: you are using {_display_server} and "{_clipboard_tool}" is not '
'present - \ncopying entry fields will not function until '
f'"{_clipboard_package}" is installed')
# PORT END CLIPTOOL
# run optional configuration menu
curses_radio(['okay'], 'required configuration complete\n\na menu for additional (optional) configuration will be '
'displayed\n\nthis menu can be safely exited at any time')
# set gm_device_type so that after the init menu is terminated the global menu knows the device type
global gm_device_type
gm_device_type = _dev_sync_types[0]
return
# runs the specified entry function (menu start point) within a curses wrapper
def wrapped_entry(_gm_device_type, _gm_top_message='configuration options:'):
from curses import wrapper, use_default_colors
global gm_device_type
gm_device_type = _gm_device_type
# a boolean value represents init
if isinstance(gm_device_type, bool):
wrapper(lambda _wrap_stdscr: (use_default_colors(), initial_setup(_wrap_stdscr)))
# any other value will be interpreted as the global menu device type
# this code still runs when called for init once the init menu terminates
_repeat = True
while _repeat:
try:
_ext_name, _escalator, _action = \
wrapper(lambda _wrap_stdscr: (use_default_colors(),
global_menu(_wrap_stdscr, gm_device_type, _gm_top_message)))[1]
except ChildProcessError:
print("\n\u001b[38;5;9merror: privilege escalation required\n\nneither 'doas' nor 'sudo' were found in "
"the system's $PATH\u001b[0m\n")
return
# only run if privilege escalation is needed
if _action is not None:
if _action:
# install with privilege escalation (outside of curses)
from tempfile import gettempdir
_exe_dir, _ini_dir = f"{gettempdir()}/sshyp_exe", f"{gettempdir()}/sshyp_ini"
# PORT START TWEAK-EXT-CHOWN
if uname()[0] == 'FreeBSD':
run((_escalator, 'chown', 'root:wheel', _exe_dir, _ini_dir))
else:
run((_escalator, 'chown', 'root:root', _exe_dir, _ini_dir))
# PORT END TWEAK-EXT-CHOWN
run((_escalator, 'mv', _exe_dir, f"/usr/lib/sshyp/{_ext_name}"))
run((_escalator, 'mv', _ini_dir, f"/usr/lib/sshyp/extensions/{_ext_name}.ini"))
else:
# uninstall with privilege escalation (outside of curses)
run((_escalator, 'rm', f"/usr/lib/sshyp/{_ext_name}",
f"/usr/lib/sshyp/extensions/{_ext_name}.ini"))
else:
_repeat = False
+426 -187
View File
@@ -1,185 +1,366 @@
#!/bin/bash
#!/bin/sh
# 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.
echo -e '\nOptions (please enter the number only):'
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\n7. Arch Linux (PKGBUILD)'
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
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'
read -r -p "Version number: " version
echo -e '\nThe value entered in this field will only affect the revision number for build scripts.\n'
read -r -p "Revision number: " revision
if [ "$distro" == "7" ] || [ "$distro" == "8" ]; then
echo -e '\nOptions (please enter the number only):'
echo -e '\n1. GitHub Release Tag\n2. Local\n'
read -r -p "Source (for build scripts): " source
if [ "$source" == "1" ]; then
source='https://github.com/rwinkhart/sshyp/releases/download/v$pkgver/sshyp-$pkgver.tar.xz'
else
source=local://sshyp-"$version".tar.xz
fi
version=$(head -n1 extra/changelog-archive/2024 | cut -c8-)
if [ -z "$2" ]; then
revision=1
else
revision="$2"
fi
mkdir -p packages
mkdir -p port-jobs/working
if [ "$distro" == "1" ]; then
echo -e '\nPackaging for Haiku...\n'
mkdir -p packages/haikutemp/documentation/{man/man1,packages/sshyp}
echo "name sshyp
version "$version"-"$revision"
architecture any
summary \"A light-weight, self-hosted, synchronized password manager\"
description \"sshyp is the only password-store compatible CLI password manager available for Haiku - it is also available on Linux/Android (via Termux) so that you can sync your entries across all of your devices.\"
packager \"Randall Winkhart <idgr at tutanota dot com>\"
vendor \"Randall Winkhart\"
_create_generic_linux() {
printf '\npackaging as generic (Linux)...\n'
mkdir -p output/linuxtemp/usr/bin \
output/linuxtemp/usr/lib/sshyp/extensions \
output/linuxtemp/usr/share/man/man1 \
output/linuxtemp/usr/share/bash-completion/completions \
output/linuxtemp/usr/share/zsh/functions/Completion/Unix
# START PORT
cp lib/* port-jobs/working/
cd port-jobs
./CLIPTOOL.py LINUX
./CLIPBOARD.py LINUX
./CHOWN.py
./UNAME.py LINUX
./COMMENTS.py ALL
./BLANKS.py
./TABS.sh TABS
cd ..
mv port-jobs/working/* output/linuxtemp/usr/lib/sshyp/
# END PORT
ln -s /usr/lib/sshyp/sshyp.py output/linuxtemp/usr/bin/sshyp
cp -r share output/linuxtemp/usr/
cp extra/completion.bash output/linuxtemp/usr/share/bash-completion/completions/sshyp
cp extra/completion.zsh output/linuxtemp/usr/share/zsh/functions/Completion/Unix/_sshyp
cp extra/manpage output/linuxtemp/usr/share/man/man1/sshyp.1
gzip output/linuxtemp/usr/share/man/man1/sshyp.1
XZ_OPT=-e6 tar -C output/linuxtemp -cvJf output/GENERIC-LINUX-sshyp-"$version".tar.xz usr/
rm -rf output/linuxtemp
sha512="$(sha512sum output/GENERIC-LINUX-sshyp-"$version".tar.xz | cut -d' ' -f1)"
printf '\ngeneric (Linux) packaging complete\n\n'
} &&
_create_pkgbuild() {
printf '\ngenerating PKGBUILD...\n'
if [ "$1" = 'Deb' ]; then
local source='https://github.com/rwinkhart/sshyp/releases/download/v"$pkgver"/DEBIAN-sshyp_"$pkgver"-"$pkgrel"_all.deb'
local decomp_target='data.tar.xz'
else
local source='https://github.com/rwinkhart/sshyp/releases/download/v"$pkgver"/GENERIC-LINUX-sshyp-"$pkgver".tar.xz'
local decomp_target='GENERIC-LINUX-sshyp-"$pkgver".tar.xz'
fi
printf "# Maintainer: Randall Winkhart <idgr at tutanota dot com>
pkgname=sshyp
pkgver="$version"
pkgrel="$revision"
pkgdesc='A light-weight, self-hosted, synchronized password manager'
url='https://github.com/rwinkhart/sshyp'
arch=('any')
license=('GPL-3.0-only')
depends=(python gnupg openssh)
optdepends=(
'wl-clipboard: wayland clipboard support'
'xclip: x11 clipboard support'
'bash-completion: bash completion support'
)
source=(\""$source"\")
sha512sums=('"$sha512"')
package() {
tar -xf $decomp_target -C "\"\${pkgdir}\""
}
" > output/PKGBUILD
printf '\nPKGBUILD generated\n\n'
} &&
_create_apkbuild() {
printf '\ngenerating APKBUILD...\n'
if [ "$1" = 'Deb' ]; then
local source="https://github.com/rwinkhart/sshyp/releases/download/v\"\$pkgver\"/DEBIAN-sshyp_\"\$pkgver\"-"$revision"_all.deb"
local sumsname="DEBIAN-sshyp_\"\$pkgver\"-"$revision"_all.deb"
local processing='mkdir -p "$pkgdir"
7z x "$srcdir"/* -o"$srcdir"
tar -xf "$srcdir"/data.tar -C "$pkgdir"
mkdir -p "$pkgdir/usr/share/zsh/site-functions"
mv "$pkgdir/usr/share/zsh/functions/Completion/Unix/_sshyp" "$pkgdir/usr/share/zsh/site-functions/_sshyp"
rm -rf "$pkgdir/usr/share/zsh/functions"'
else
local source='https://github.com/rwinkhart/sshyp/releases/download/v"$pkgver"/GENERIC-LINUX-sshyp-"$pkgver".tar.xz'
local sumsname='GENERIC-LINUX-sshyp-"$pkgver".tar.xz'
local processing='mkdir -p "$pkgdir"
mkdir -p "$srcdir/usr/share/zsh/site-functions"
mv "$srcdir/usr/share/zsh/functions/Completion/Unix/_sshyp" "$srcdir/usr/share/zsh/site-functions/_sshyp"
rm -rf "$srcdir/usr/share/zsh/functions"
cp -r "$srcdir/usr/" "$pkgdir"'
fi
printf "# Maintainer: Randall Winkhart <idgr@tutanota.com>
pkgname=sshyp
pkgver="$version"
pkgrel="$((revision-1))"
pkgdesc='A light-weight, self-hosted, synchronized password manager'
options=!check
url='https://github.com/rwinkhart/sshyp'
arch='noarch'
license='GPL-3.0-only'
depends='python3 gnupg openssh'
source=\""$source"\"
package() {
$processing
}
sha512sums=\"
"$sha512" "$sumsname"
\"
" > output/APKBUILD
printf '\nAPKBUILD generated\n\n'
} &&
_create_hpkg() {
printf '\npackaging for Haiku...\n'
mkdir -p output/haikutemp/bin \
output/haikutemp/lib/sshyp/extensions \
output/haikutemp/documentation/packages/sshyp \
output/haikutemp/documentation/man/man1 \
output/haikutemp/data/bash-completion/completions \
output/haikutemp/data/zsh/site-functions
printf "name sshyp_client
version "$version"-"$revision"
architecture any
summary \"A light-weight, self-hosted, synchronized password manager (client only)\"
description \"The fully-featured client for the sshyp password manager ported for Haiku. This is just a client: server hosting functionality is only available on Linux/BSD.\"
packager \"Randall Winkhart <idgr at tutanota dot com>\"
vendor \"Randall Winkhart\"
licenses {
\"GNU GPL v3\"
\"GNU GPL v3\"
}
copyrights {
\"2021-2022 Randall Winkhart\"
\"2021-2024 Randall Winkhart\"
}
provides {
sshyp = "$version"
cmd:sshyp
sshyp_client = "$version"
cmd:sshyp
}
requires {
gnupg
openssh
python3
nano
gnupg
openssh
python3.11
}
urls {
\"https://github.com/rwinkhart/sshyp\"
\"https://github.com/rwinkhart/sshyp\"
}
" > packages/haikutemp/.PackageInfo
cp -r bin packages/haikutemp/
cp -r share/doc/sshyp/ packages/haikutemp/documentation/packages/
cp -r share/licenses/sshyp/ packages/haikutemp/documentation/packages/
cp extra/manpage packages/haikutemp/documentation/man/man1/sshyp.1
gzip packages/haikutemp/documentation/man/man1/sshyp.1
cd packages/haikutemp
package create -b sshyp-"$version"-"$revision"_all.hpkg
package add sshyp-"$version"-"$revision"_all.hpkg bin documentation
" > output/haikutemp/.PackageInfo
# START PORT
cp lib/* port-jobs/working/
cd port-jobs
./SHEBANG.sh
./RMSERVER.py
./RMEXTMAN.py
./CLIPTOOL.py
./CLIPBOARD.py HAIKU
./CHOWN.py
./UNAME.py TMP
./COMMENTS.py ALL
./BLANKS.py
./TABS.sh TABS
cd ..
mv port-jobs/working/* output/haikutemp/lib/sshyp/
# END PORT
ln -s /system/lib/sshyp/sshyp.py output/haikutemp/bin/sshyp
cp -r share/licenses/sshyp/. output/haikutemp/documentation/packages/sshyp/
cp extra/completion.bash output/haikutemp/data/bash-completion/completions/sshyp
cp extra/completion.zsh output/haikutemp/data/zsh/site-functions/_sshyp
cp extra/manpage output/haikutemp/documentation/man/man1/sshyp.1
gzip output/haikutemp/documentation/man/man1/sshyp.1
cd output/haikutemp
package create -b HAIKU-sshyp_client-"$version"-"$revision"_all.hpkg
package add HAIKU-sshyp_client-"$version"-"$revision"_all.hpkg bin lib documentation data
cd ../..
mv packages/haikutemp/sshyp-"$version"-"$revision"_all.hpkg packages/
rm -rf packages/haikutemp
echo -e "\nHaiku packaging complete.\n"
fi
mv output/haikutemp/HAIKU-sshyp_client-"$version"-"$revision"_all.hpkg output/
rm -rf output/haikutemp
printf '\nHaiku packaging complete\n\n'
} &&
if [ "$distro" == "2" ] || [ "$distro" == "8" ]; then
echo -e '\nPackaging for Debian...\n'
mkdir -p packages/debiantemp/sshyp_"$version"-"$revision"_all/{DEBIAN,usr/share/man/man1}
echo "Package: sshyp
_create_deb() {
printf "\npackaging for $1...\n"
mkdir -p output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN \
output/debiantemp/sshyp_"$version"-"$revision"_all/usr/lib/sshyp/extensions \
output/debiantemp/sshyp_"$version"-"$revision"_all/usr/bin \
output/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/man/man1 \
output/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/bash-completion/completions \
output/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/zsh/functions/Completion/Unix
# START PORT
cp lib/* port-jobs/working/
cd port-jobs
if [ "$1" = 'Debian' ]; then
./CLIPTOOL.py LINUX
./CLIPBOARD.py LINUX
special=DEBIAN
else
./CLIPTOOL.py
./CLIPBOARD.py WSL
special=WSL-ONLY-DEBIAN
fi
./CHOWN.py
./UNAME.py LINUX
./COMMENTS.py ALL
./BLANKS.py
./TABS.sh TABS
cd ..
mv port-jobs/working/* output/debiantemp/sshyp_"$version"-"$revision"_all/usr/lib/sshyp/
# END PORT
ln -s /usr/lib/sshyp/sshyp.py output/debiantemp/sshyp_"$version"-"$revision"_all/usr/bin/sshyp
cp -r share output/debiantemp/sshyp_"$version"-"$revision"_all/usr/
cp extra/completion.bash output/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/bash-completion/completions/sshyp
cp extra/completion.zsh output/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/zsh/functions/Completion/Unix/_sshyp
cp extra/manpage output/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/man/man1/sshyp.1
gzip output/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/man/man1/sshyp.1
size=$(du --block-size=1024 -s output/debiantemp/sshyp_"$version"-"$revision"_all | cut -f1)
printf "Package: sshyp
Version: $version
Section: utils
Architecture: all
Maintainer: Randall Winkhart <idgr at tutanota dot com>
Description: A light-weight, self-hosted, synchronized password manager
Depends: python3, gnupg, openssh-client, nano, xclip, wl-clipboard
Priority: optional
Installed-Size: 185
" > packages/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control
cp -r bin packages/debiantemp/sshyp_"$version"-"$revision"_all/usr/
cp -r share packages/debiantemp/sshyp_"$version"-"$revision"_all/usr/
cp extra/manpage packages/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/man/man1/sshyp.1
gzip packages/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/man/man1/sshyp.1
dpkg-deb --build --root-owner-group packages/debiantemp/sshyp_"$version"-"$revision"_all/
mv packages/debiantemp/sshyp_"$version"-"$revision"_all.deb packages/
rm -rf packages/debiantemp
echo -e "\nDebian packaging complete.\n"
fi
Installed-Size: $size
Depends: python3, gnupg, openssh-client
" > output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control
if [ "$1" = 'Debian' ]; then
printf "Suggests: wl-clipboard, xclip, bash-completion, openssh-server
" >> output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control
else
printf "Suggests: bash-completion, openssh-server
" >> output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control
fi
dpkg-deb --build --root-owner-group -z6 -Sextreme -Zxz output/debiantemp/sshyp_"$version"-"$revision"_all/
mv output/debiantemp/sshyp_"$version"-"$revision"_all.deb output/"$special"-sshyp_"$version"-"$revision"_all.deb
rm -rf output/debiantemp
sha512="$(sha512sum output/"$special"-sshyp_"$version"-"$revision"_all.deb | cut -d' ' -f1)"
printf "\n$1 packaging complete\n\n"
} &&
if [ "$distro" == "5" ] || [ "$distro" == "8" ]; then
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/data/com.termux/files/usr/share/man/man1
echo "Package: sshyp
_create_termux() {
printf '\npackaging for Termux...\n'
mkdir -p output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/DEBIAN \
output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/lib/sshyp/extensions \
output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/bin \
output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1 \
output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/bash-completion/completions \
output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/zsh/site-functions
# START PORT
cp lib/* port-jobs/working/
cd port-jobs
./RMSERVER.py
./RMEXTMAN.py
./CLIPTOOL.py
./CLIPBOARD.py TERMUX
./CHOWN.py
./UNAME.py TERMUX
./COMMENTS.py ALL
./BLANKS.py
./TABS.sh TABS
cd ..
mv port-jobs/working/* output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/lib/sshyp/
# END PORT
ln -s /data/data/com.termux/files/usr/lib/sshyp/sshyp.py output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/bin/sshyp
cp -r share output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/
cp extra/completion.bash output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/bash-completion/completions/sshyp
cp extra/completion.zsh output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/zsh/site-functions/_sshyp
cp extra/manpage output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1/sshyp.1
gzip output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1/sshyp.1
size=$(du --block-size=1024 -s output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux | cut -f1)
printf "Package: sshyp-client
Version: $version
Section: utils
Architecture: all
Maintainer: Randall Winkhart <idgr at tutanota dot com>
Description: A light-weight, self-hosted, synchronized password manager
Depends: python, gnupg, openssh, nano, termux-api, termux-am
Depends: python, gnupg, openssh, termux-api, termux-am
Suggests: bash-completion
Priority: optional
Installed-Size: 185
" > 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 share packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/
cp extra/manpage packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1/sshyp.1
gzip packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1/sshyp.1
dpkg-deb --build --root-owner-group packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux/
mv packages/termuxtemp/sshyp_"$version"-"$revision"_all_termux.deb packages/
rm -rf packages/termuxtemp
echo -e "\nTermux packaging complete.\n"
fi
Installed-Size: $size
" > output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/DEBIAN/control
dpkg-deb --build --root-owner-group -z6 -Sextreme -Zxz output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux/
mv output/termuxtemp/TERMUX-sshyp-client_"$version"-"$revision"_all_termux.deb output/
rm -rf output/termuxtemp
printf '\nTermux packaging complete\n\n'
} &&
if [ "$distro" == "3" ] || [ "$distro" == "4" ] || [ "$distro" == "6" ] || [ "$distro" == "7" ] || [ "$distro" == "8" ]; then
echo -e '\nPackaging as generic...\n'
mkdir -p packages/archtemp/usr/share/man/man1
cp -r bin packages/archtemp/usr/
cp -r share packages/archtemp/usr/
cp extra/manpage 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/
rm -rf packages/archtemp
sha512="$(sha512sum packages/sshyp-"$version".tar.xz | awk '{print $1;}')"
echo -e "\nsha512 sum:\n$sha512"
echo -e "\nGeneric packaging complete.\n"
fi
if [ "$distro" == "3" ]; then
echo -e '\nPackaging for Fedora...\n'
_create_rpm() {
printf '\npackaging for Fedora...\n'
rm -rf ~/rpmbuild
rpmdev-setuptree
cp packages/sshyp-"$version".tar.xz ~/rpmbuild/SOURCES
echo "Name: sshyp
mkdir -p output/fedoratemp/usr/bin \
output/fedoratemp/usr/lib/sshyp/extensions \
output/fedoratemp/usr/share/man/man1 \
output/fedoratemp/usr/share/bash-completion/completions \
output/fedoratemp/usr/share/zsh/site-functions
printf "Name: sshyp
Version: "$version"
Release: "$revision"
Summary: A light-weight, self-hosted, synchronized password manager
BuildArch: noarch
License: GPL3
License: GPL-3.0-only
URL: https://github.com/rwinkhart/sshyp
Source0: sshyp-"$version".tar.xz
Requires: python gnupg openssh nano wl-clipboard
%description
Source0: GENERIC-FEDORA-sshyp-"$version".tar.xz
Requires: python gnupg openssh-clients
Recommends: wl-clipboard xclip bash-completion openssh-server
%%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
%%install
tar xf %%{_sourcedir}/GENERIC-FEDORA-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
/usr/lib/sshyp/sshyp.py
/usr/lib/sshyp/sshync.py
/usr/lib/sshyp/stweak.py
/usr/lib/sshyp/clipclear.py
/usr/lib/sshyp/extensions/
/usr/share/bash-completion/completions/sshyp
/usr/share/zsh/site-functions/_sshyp
%%license /usr/share/licenses/sshyp/license
%%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
# START PORT
cp lib/* port-jobs/working/
cd port-jobs
./CLIPTOOL.py LINUX
./CLIPBOARD.py LINUX
./CHOWN.py
./UNAME.py LINUX
./COMMENTS.py ALL
./BLANKS.py
./TABS.sh TABS
cd ..
mv port-jobs/working/* output/fedoratemp/usr/lib/sshyp/
# END PORT
ln -s /usr/lib/sshyp/sshyp.py output/fedoratemp/usr/bin/sshyp
cp -r share output/fedoratemp/usr/
cp extra/completion.bash output/fedoratemp/usr/share/bash-completion/completions/sshyp
cp extra/completion.zsh output/fedoratemp/usr/share/zsh/site-functions/_sshyp
cp extra/manpage output/fedoratemp/usr/share/man/man1/sshyp.1
gzip output/fedoratemp/usr/share/man/man1/sshyp.1
XZ_OPT=-e6 tar -C output/fedoratemp -cvJf output/GENERIC-FEDORA-sshyp-"$version".tar.xz usr/
rm -rf output/fedoratemp
cp output/GENERIC-FEDORA-sshyp-"$version".tar.xz ~/rpmbuild/SOURCES
rpmbuild -bb ~/rpmbuild/SPECS/sshyp.spec
mv ~/rpmbuild/RPMS/noarch/sshyp-"$version"-"$revision".noarch.rpm output/FEDORA-sshyp-"$version"-"$revision".noarch.rpm
rm -rf ~/rpmbuild
printf '\nFedora packaging complete\n\n'
} &&
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
_create_freebsd_pkg() {
printf '\npackaging for FreeBSD...\n'
mkdir -p output/freebsdtemp/usr/lib/sshyp/extensions \
output/freebsdtemp/usr/bin \
output/freebsdtemp/usr/share/man/man1 \
output/freebsdtemp/usr/local/share/bash-completion/completions \
output/freebsdtemp/usr/local/share/zsh/site-functions
printf "name: sshyp
version: \""$version"\"
abi = \"FreeBSD:13:*\";
arch = \"freebsd:13:*\";
@@ -190,57 +371,115 @@ maintainer: <idgr at tutanota dot com>
www: https://github.com/rwinkhart/sshyp
prefix: /
\"deps\" : {
\"python\" : {
\"origin\" : \"lang/python\"
\"python3\" : {
\"origin\" : \"lang/python3\"
},
\"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
" > output/freebsdtemp/+MANIFEST
printf "/usr/bin/sshyp
/usr/lib/sshyp/sshyp.py
/usr/lib/sshyp/sshync.py
/usr/lib/sshyp/stweak.py
/usr/lib/sshyp/clipclear.py
/usr/local/share/bash-completion/completions/sshyp
/usr/local/share/zsh/site-functions/_sshyp
/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
@dir /usr/lib/sshyp/extensions/
" > output/freebsdtemp/plist
# START PORT
cp lib/* port-jobs/working/
cd port-jobs
./CLIPTOOL.py LINUX
./CLIPBOARD.py BSD
./CHOWN.py BSD
./UNAME.py TMP
./COMMENTS.py ALL
./BLANKS.py
./TABS.sh TABS
cd ..
mv port-jobs/working/* output/freebsdtemp/usr/lib/sshyp/
# END PORT
ln -s /usr/lib/sshyp/sshyp.py output/freebsdtemp/usr/bin/sshyp
cp -r share output/freebsdtemp/usr/
cp extra/completion.bash output/freebsdtemp/usr/local/share/bash-completion/completions/sshyp
cp extra/completion.zsh output/freebsdtemp/usr/local/share/zsh/site-functions/_sshyp
cp extra/manpage output/freebsdtemp/usr/share/man/man1/sshyp.1
gzip output/freebsdtemp/usr/share/man/man1/sshyp.1
pkg create -m output/freebsdtemp/ -r output/freebsdtemp/ -p output/freebsdtemp/plist -o output/
mv output/sshyp-"$version".pkg output/FREEBSD-sshyp-"$version"-"$revision".pkg
rm -rf output/freebsdtemp
printf '\nFreeBSD packaging complete\n\n'
} &&
if [ "$distro" == "7" ] || [ "$distro" == "8" ]; then
echo -e '\nGenerating PKGBUILD...'
echo "# Maintainer: Randall Winkhart <idgr at tutanota dot com>
pkgname=sshyp
pkgver="$version"
pkgrel="$revision"
pkgdesc='A light-weight, self-hosted, synchronized password manager'
url='https://github.com/rwinkhart/sshyp'
arch=('any')
license=('GPL3')
depends=(python gnupg openssh nano xclip wl-clipboard)
source=(\""$source"\")
sha512sums=('"$sha512"')
package() {
tar xf sshyp-"\"\$pkgver\"".tar.xz -C "\"\${pkgdir}\""
}
" > packages/PKGBUILD
echo -e "\nPKGBUILD generated.\n"
fi
case "$1" in
pkgbuild)
_create_generic_linux
_create_pkgbuild Generic
;;
pkgbuild-deb)
_create_deb Debian
_create_pkgbuild Deb
;;
apkbuild)
_create_generic_linux
_create_apkbuild Generic
;;
apkbuild-deb)
_create_deb Debian
_create_apkbuild Deb
;;
haiku)
_create_hpkg
;;
debian)
_create_deb Debian
;;
wsl)
_create_deb WSL
;;
termux)
_create_termux
;;
fedora)
_create_rpm
;;
freebsd)
_create_freebsd_pkg
;;
buildable-arch)
_create_generic_linux
_create_pkgbuild Generic
_create_apkbuild Generic
case "$(pacman -Q dpkg)" in
dpkg*)
_create_termux
_create_deb WSL
_create_deb Debian
;;
esac
case "$(pacman -Q freebsd-pkg)" in
freebsd-pkg*)
_create_freebsd_pkg
;;
esac
;;
buildable-arch-deb)
_create_termux
_create_deb WSL
_create_deb Debian
_create_pkgbuild Deb
_create_apkbuild Deb
case "$(pacman -Q freebsd-pkg)" in
freebsd-pkg*)
_create_freebsd_pkg
;;
esac
;;
*)
printf '\nusage: package.sh [target] <revision>\n\ntargets:\n full support: pkgbuild pkgbuild-deb apkbuild apkbuild-deb fedora debian wsl freebsd\n client-only: haiku termux\n groups: buildable-arch buildable-arch-deb\n\n'
;;
esac
+16
View File
@@ -0,0 +1,16 @@
#!/usr/bin/env python3
from os import listdir
# loop through all Python files in the working directory
for filename in listdir('working'):
if filename.endswith('.py'):
filepath = 'working/' + filename
# read input file
with open(filepath, 'r') as file:
new_file = []
for line in file:
# remove blank lines
if line != '\n':
new_file.append(line)
# write the updated file contents
open(filepath, 'w').writelines(new_file)
+28
View File
@@ -0,0 +1,28 @@
#!/usr/bin/env python3
import re
from sys import argv
# read arguments
arguments = argv[1:]
# define PORT target
string1 = '# PORT START TWEAK-EXT-CHOWN'
string2 = '# PORT END TWEAK-EXT-CHOWN'
# define replacement text depending on arguments
if len(arguments) > 0 and arguments[0] == 'BSD':
replacement = "run((_escalator, 'chown', 'root:wheel', _exe_dir, _ini_dir))"
else:
replacement = "run((_escalator, 'chown', 'root:root', _exe_dir, _ini_dir))"
# read input file
text = open('working/stweak.py', 'r').read()
# compile regex and modify text
regex = re.compile(f"{string1}.*?{string2}", re.DOTALL)
# find and replace the defined PORT target
new_text = re.sub(regex, replacement, text)
# write updated text
open('working/stweak.py', 'w').write(new_text)
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/env python3
import re
from sys import argv, exit as s_exit
# read arguments
arguments, clip_replacement, clear_replacement = argv[1:], None, None
# define replacement text depending on arguments
if len(arguments) > 0:
if arguments[0] == 'WSL':
clip_replacement = """run(('powershell.exe', '-c', "Set-Clipboard '" + _copy_subject.replace("'", "''") + "'"))
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'wsl'), stdout=DEVNULL, stderr=DEVNULL)"""
clear_replacement = """hash_paste.update(run(('powershell.exe', '-c', 'Get-Clipboard'), stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(('powershell.exe', '-c', 'Set-Clipboard'))"""
elif arguments[0] == 'MAC':
clip_replacement = """run('pbcopy', stdin=Popen(('printf', '%b', _copy_subject.replace('\\\\\\', '\\\\\\\\\\\\\\')), stdout=PIPE).stdout)
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'mac'))"""
clear_replacement = """hash_paste.update(run('pbpaste', stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run('pbcopy', input=b'')"""
elif arguments[0] == 'HAIKU':
clip_replacement = """run(('clipboard', '-c', _copy_subject))
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'haiku'))"""
clear_replacement = """hash_paste.update(run(('clipboard', '-p'), stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(('clipboard', '-r'))"""
elif arguments[0] == 'TERMUX':
clip_replacement = """run(('termux-clipboard-set', _copy_subject))
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'termux'))"""
clear_replacement = """hash_paste.update(run('termux-clipboard-get', stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(("termux-clipboard-set", "''"))"""
elif arguments[0] in ('LINUX', 'BSD'):
clip_replacement = """if 'WAYLAND_DISPLAY' in environ:
run('wl-copy', stdin=Popen(('printf', '%b', _copy_subject.replace('\\\\\\', '\\\\\\\\\\\\\\')), stdout=PIPE).stdout)
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'wayland'))
else:
run(('xclip', '-sel', 'c'), stdin=Popen(('printf', '%b', _copy_subject.replace('\\\\\\', '\\\\\\\\\\\\\\')), stdout=PIPE).stdout)
Popen((realpath(__file__).rsplit('/', 1)[0] + "/clipclear.py", _hash.hexdigest(), 'x11'))"""
clear_replacement = """if argv[2] == 'wayland':
hash_paste.update(run('wl-paste', stdout=PIPE, stderr=DEVNULL).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(('wl-copy', '-c'))
else:
hash_paste.update(run(('xclip', '-o', '-sel', 'c'), stdout=PIPE).stdout.strip())
if argv[1] == hash_paste.hexdigest():
run(('xclip', '-i', '/dev/null', '-sel', 'c'))"""
else:
s_exit()
targets = (('CLIPBOARD', 'sshyp.py', '', '', clip_replacement),
('CLIPCLEAR', 'clipclear.py', '\n', '', clear_replacement))
for target in targets:
# read text from target file
text = open(f"working/{target[1]}", 'r').read()
# compile regex and modify text
regex = re.compile(f"{target[2]}# PORT START {target[0]}.*?# PORT END {target[0]}{target[3]}", re.DOTALL)
new_text = re.sub(regex, target[4], text)
# write updated text to target file
open(f"working/{target[1]}", 'w').write(new_text)
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env python3
import re
from sys import argv
# read arguments
arguments = argv[1:]
# define PORT target
string1 = '# PORT START CLIPTOOL'
string2 = '# PORT END CLIPTOOL'
# define replacement text depending on arguments
if len(arguments) > 0:
regex = re.compile(f"{string1}.*?{string2}", re.DOTALL)
replacement = """# check for clipboard tool and display warning if missing
_display_server, _clipboard_tool, _clipboard_package = None, None, None
if 'WAYLAND_DISPLAY' in environ:
_display_server, _clipboard_tool, _clipboard_package = 'Wayland', 'wl-copy', 'wl-clipboard'
elif 'DISPLAY' in environ:
_display_server, _clipboard_tool, _clipboard_package = 'X11', 'xclip', 'xclip'
if _display_server is not None and which(_clipboard_tool) is None:
curses_radio(['okay'], f'''WARNING: you are using {_display_server} and "{_clipboard_tool}" is not present -
copying entry fields will not function until "{_clipboard_package}" is installed'''
)"""
else:
regex = re.compile(f"{string1}.*?{string2}\n", re.DOTALL)
replacement = ''
# read input file
text = open('working/stweak.py', 'r').read()
# find and replace the defined PORT target
new_text = re.sub(regex, replacement, text)
# write updated text
open('working/stweak.py', 'w').write(new_text)
+29
View File
@@ -0,0 +1,29 @@
#!/usr/bin/env python3
from os import listdir
from re import match as rematch
from sys import argv
# read arguments
arguments = argv[1:]
# loop through all Python files in the working directory
for filename in listdir('working'):
if filename.endswith('.py'):
filepath = 'working/' + filename
# read input file
with open(filepath, 'r') as file:
new_file = []
first_line = True
for line in file:
# determine whether to remove all or only PORT comments
if first_line:
new_file.append(line)
first_line = False
else:
if len(arguments) > 0 and arguments[0] == 'ALL':
if not rematch(r'^\s*#', line):
new_file.append(line)
elif not rematch(r'^\s*# PORT', line):
new_file.append(line)
# write the updated file contents
open(filepath, 'w').writelines(new_file)
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env python3
import re
targets = (('TWEAK-EXTEND-FUNCTIONS', 'stweak.py', '\n', '\n\n', ''),
('TWEAK-EXTEND-OPTION', 'stweak.py', '', '', "curses_radio(['okay'], "
"'extension management is not supported on this platform\\\\n\\\\ninstead, you may install and manage "
"extensions through your system package manager\\\\n\\\\nofficial extension packages are available "
"at https://github.com/rwinkhart/sshyp-labs/releases')"))
for target in targets:
# read text from target file
text = open(f"working/{target[1]}", 'r').read()
# compile regex and modify text
regex = re.compile(f"{target[2]}# PORT START {target[0]}.*?# PORT END {target[0]}{target[3]}", re.DOTALL)
new_text = re.sub(regex, target[4], text)
# write updated text to target file
open(f"working/{target[1]}", 'w').write(new_text)
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env python3
import re
devtype_replacement = """_install_type = curses_radio(('client (ssh-synchronized)', 'client (offline)'),
'device + sync type configuration')"""
targets = (('SSHYNC-REMOTE', 'sshync.py', '\n', '\n\n', ''), ('WHITELIST-SERVER', 'stweak.py', '\n', '\n\n', ''),
('TWEAK-DEVTYPE', 'stweak.py', '', '', devtype_replacement),
('ARGS-SERVER', 'sshyp.py', '', '\n\n ', ''), ('HELP-SERVER', 'sshyp.py', '', '\n', ''))
for target in targets:
# read text from target file
text = open(f"working/{target[1]}", 'r').read()
# compile regex and modify text
regex = re.compile(f"{target[2]}# PORT START {target[0]}.*?# PORT END {target[0]}{target[3]}", re.DOTALL)
new_text = re.sub(regex, target[4], text)
# write updated text to target file
open(f"working/{target[1]}", 'w').write(new_text)
+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
if [ "$1" = 'PREP' ]; then
sed -i '1 s/.*/#!\/bin\/env\ python3.11/' ./*.py
else
sed -i '1 s/.*/#!\/bin\/env\ python3.11/' ./working/sshyp.py ./working/clipclear.py
fi
+18
View File
@@ -0,0 +1,18 @@
#!/bin/sh
if [ "$1" = 'TABS' ]; then
unexpand -t 3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123 working/sshyp.py > working/sshyp.py.new
unexpand -t 3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123 working/sshync.py > working/sshync.py.new
unexpand -t 3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123 working/stweak.py > working/stweak.py.new
mv working/sshyp.py.new working/sshyp.py
mv working/sshync.py.new working/sshync.py
mv working/stweak.py.new working/stweak.py
chmod +x working/sshyp.py working/sshync.py working/stweak.py
elif [ "$(grep -qP '\t' "$1" && echo TABS)" = 'TABS' ]; then
printf "$1 contains tab characters...\n"
read -rp 'replace with (4) spaces? (Y/n) ' replace
if [ "$replace" != 'n' ] && [ "$replace" != 'N' ]; then
expand -t 3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123 "$1" > "$1".new
chmod --reference="$1" "$1".new
mv "$1".new "$1"
fi
fi
+13
View File
@@ -0,0 +1,13 @@
#!/usr/bin/env python3
import re
targets = (('UNAME-IMPORT-SSHYP', 'sshyp.py', ''), ('UNAME-IMPORT-STWEAK', 'stweak.py', ''))
for target in targets:
# read text from target file
text, special = open(f"working/{target[1]}", 'r').read(), ''
# compile regex and modify text
regex = re.compile(f"# PORT START {target[0]}.*?# PORT END {target[0]}\n", re.DOTALL)
new_text = re.sub(regex, target[2], text)
# write updated text to target file
open(f"working/{target[1]}", 'w').write(new_text)
-45
View File
@@ -1,45 +0,0 @@
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!
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
The full history of changes to "sshyp" can be found on the following page:
https://raw.githubusercontent.com/rwinkhart/sshyp/main/extra/changelog-total
Legend:
- = feature/change implemented and pushed upstream
^ = note regarding the above feature/change
Executable → Regular
+4 -5
View File
@@ -1,10 +1,9 @@
sshyp is a FOSS password manager that uses an sftp-based syncing back-end.
Copyright (C) 2022 Randall Winkhart idgr@tutanota.com
Copyright (C) 2021-2024 Randall Winkhart idgr@tutanota.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
it under the terms of version 3 (only) of the GNU General Public License
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -12,4 +11,4 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
along with this program. If not, see <http://www.gnu.org/licenses/>.