Compare commits

..
116 Commits
Author SHA1 Message Date
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
12 changed files with 936 additions and 870 deletions
+16 -20
View File
@@ -1,5 +1,9 @@
![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.7--3.11-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'
@@ -8,8 +12,6 @@ sshyp is a very simple self-hosted, synchronized password manager for UNIX(-like
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".
@@ -29,26 +31,20 @@ What sshyp can do:
- 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 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, Alpine Linux, Arch Linux, Debian/Ubuntu Linux, Fedora Linux, and Termux. These can be downloaded from the releases page.
Requests for additional distribution/OS support can be filed as issues.
Support for additional environments, such as MacOS and OpenBSD, is coming soon.
Extensions are available in the [sshyp-labs](https://github.com/rwinkhart/sshyp-labs) repository.
Bash completions can be enabled by installing your distribution's "bash-completion" package and restarting your terminal.
# 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:
```
@@ -57,11 +53,11 @@ cd sshyp
./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, Alpine Linux (APKBUILD), Arch Linux (PKGBUILD), Debian/Ubuntu Linux, Fedora Linux, Termux, and generic.
@@ -74,15 +70,15 @@ 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
sshyp help
```
Or alternatively, in the manpage:
Or alternatively, in the man page:
```
man sshyp
@@ -91,9 +87,9 @@ man sshyp
# Roadmap
Short-term Goals:
- create minimal GUI app (Linux x86_64, Linux aarch64) - being done as an [extension](https://github.com/rwinkhart/sshyp-labs)
- significant optimizations
- vaious bug fixes
- MacOS support
- improved temporary directory security
- a minimal GUI app - being made as an [extension](https://github.com/rwinkhart/sshyp-labs)
Long-term Goals:
+122
View File
@@ -1,3 +1,125 @@
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
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
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
+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
+27 -33
View File
@@ -1,10 +1,10 @@
.TH sshyp 1 "06 November 2022" "v1.2.0" "sshyp man page"
.TH sshyp 1 "02 April 2023" "v1.4.1" "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.
.SH SYNOPSIS
Client Usage: sshyp [option [flag] [<entry name>]] | [/<entry name>]
Client Usage: sshyp [</entry name> [option] [flag]] [option]
Server Usage: sshyp [option [flag] [<device id>]]
Server Usage: sshyp <option> [flag] [<device id>]
.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 (CLIENT)
@@ -14,26 +14,26 @@ Setting up sshyp for the first time or altering its configuration (also recommen
Viewing the entry database:
sshyp
Reading an existing entry saved as ~/.local/share/sshyp/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 ~/.local/share/sshyp/financial/bank.gpg:
sshyp copy -p /financial/bank
Copying the password of an existing entry saved as '~/.local/share/sshyp/financial/bank.gpg':
sshyp /financial/bank copy -p
Editing the username of an existing entry saved as ~/.local/share/sshyp/game.gpg:
sshyp edit -u game
Editing the username of an existing entry saved as '~/.local/share/sshyp/game.gpg':
sshyp /game edit -u
Making a new entry saved as ~/.local/share/sshyp/school/university.gpg using the built-in password generator:
sshyp gen /school/university
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/testNote.gpg:
sshyp add -n /notes/testNote
Creating a note-only entry saved as '~/.local/share/sshyp/notes/test note.gpg':
sshyp /notes/test\ note add -n
Manually syncing entries with the server:
sshyp sync
Removing an existing folder saved as ~/.local/share/sshyp/social:
sshyp shear social/
Removing an existing folder saved as '~/.local/share/sshyp/social':
sshyp /social/ shear
.SH EXAMPLES (SERVER)
Setting up the quick-unlock whitelist:
sshyp whitelist setup
@@ -41,21 +41,21 @@ Setting up the quick-unlock whitelist:
Checking the quick-unlock whitelist status of all registered client devices:
sshyp whitelist list
Adding a device with the id "laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_" to the quick-unlock whitelist:
Adding a device with the id 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_' to the quick-unlock whitelist:
sshyp whitelist add 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_'
Removing a device with the id "laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_" from the quick-unlock whitelist:
Removing a device with the id 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_' from the quick-unlock whitelist:
sshyp whitelist del 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_'
.SH OPTIONS (CLIENT)
help/--help/-h bring up the help menu
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
shear delete an existing entry
sync manually sync the entry directory via sshync
.SH FLAGS (CLIENT)
add:
password/-p add a password entry
@@ -78,7 +78,7 @@ copy:
gen:
update/-u generate a password for an existing entry
.SH OPTIONS (SERVER)
help/--help/-h bring up this menu
help/-h bring up this menu
version/-v display sshyp version info
tweak configure sshyp
whitelist manage the quick-unlock whitelist
@@ -87,11 +87,7 @@ whitelist:
setup set up the quick-unlock whitelist
list/-l view all registered device ids and their quick-unlock whitelist status
add whitelist a device id for quick-unlock
delete/del remove a device id from the quick-unlock whitelist
.SH LIMITATIONS
The following characters/character sequences are not supported in entry/folder titles:
@ ^&* *&^
del remove a device id from the quick-unlock whitelist
.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.
@@ -110,23 +106,21 @@ Client setup:
Run "sshyp tweak" 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, Bash completions can be enabled by installing your distribution's "bash-completion" package and restarting your terminal
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 EXIT CODES
0 - no error
1 - argument error
1 - configuration error
2 - configuration error
2 - data not found error
3 - data not found error
3 - data already exists error
4 - data already exists error
4 - decryption/encryption error
5 - decryption/encryption error
6 - server data retrieval error
5 - server connection error
.SH AUTHOR
Randall Winkhart (https://github.com/rwinkhart)
-50
View File
@@ -1,50 +0,0 @@
#!/usr/bin/env bash
_path_gen() {
local sshyp_path="$HOME/.local/share/sshyp"
local sshyp_path_length="$(("${#sshyp_path}" + 1))"
readarray -t full_paths < <(find "$sshyp_path" -type f -exec ls {} \;)
for path in "${full_paths[@]}"; do
trimmed_path=$(echo ${path%????} | cut -c"$sshyp_path_length"-)
trimmed_path=$(echo ${trimmed_path// /\\ })
trimmed_paths+=("$trimmed_path")
done
} &&
# from this point, this completions script was partially generated by
# completely (https://github.com/dannyben/completely)
_sshyp_completions() {
if [ "${#COMP_WORDS[@]}" -gt "4" ]; then
return
fi
local cur=${COMP_WORDS[COMP_CWORD]}
local compline="${COMP_WORDS[@]:1:$COMP_CWORD-1}"
case "$compline" in
'add password'* | 'add -p'* | 'add note'* | 'add -n'* | 'add folder'*| 'add -f'* | 'edit relocate'* | 'edit -r'* | 'edit username'* | 'edit -u'* | 'edit password'* | 'edit -p'* | 'edit url'* | 'edit -l'* | 'edit note'* | 'edit -n'* | 'copy username'* | 'copy -u'* | 'copy password'* | 'copy -p'* | 'copy note'* | 'copy -n'* | 'copy url'* | 'copy -l'* | 'gen update'* | 'gen -u'*)
while read; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(printf "'%s' " "${trimmed_paths[@]}")" -- "$cur" )
;;
'edit'*)
while read; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "relocate username password note url" -- "$cur" )
;;
'copy'*)
while read; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "username password url note" -- "$cur" )
;;
'add'*)
while read; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "password note folder" -- "$cur" )
;;
'gen'*)
while read; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "update" -- "$cur" )
;;
*)
while read; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "help version tweak add gen edit copy shear sync $(printf "'%s' " "${trimmed_paths[@]}")" -- "$cur" )
;;
esac
} &&
_path_gen && complete -F _sshyp_completions sshyp
+120 -54
View File
@@ -1,45 +1,102 @@
#!/usr/bin/env python3
# external modules
from os import path, system, walk
from os.path import expanduser, getmtime, join
from os import listdir, remove, walk
from os.path import expanduser, isdir, getmtime, join
from subprocess import CalledProcessError, PIPE, run
from sys import exit as s_exit
home = expanduser("~")
# utility functions
# REMOTE
def get_titles_mods(_directory, _destination, _user_data): # fetches and returns lists of titles and their mod times
from pathlib import Path
def remote_list_gen(_client_device_name, _remote_dir): # prints all necessary remote data to stdout
# 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_name:
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')
get_local_data(_remote_dir, 'server') # titles and mod times
# HYBRID
def delete(_file_path, _target_database): # deletes a file or folder and/or marks it for deletion upon syncing
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:
print(f"location does not exist {_target_database}")
if _target_database == 'remotely':
for _device_name in listdir(f"{home}/.config/sshyp/devices"):
open(f"{home}/.config/sshyp/deleted/" + _file_path.replace('/', '\x1e') + '\x1f' + _device_name, 'w')
def get_local_data(_directory, _device): # retrieves and returns titles and mod times from the local device
_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 _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:
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 /lib/sshyp; python -c"
f" 'import sshync; sshync.get_titles_mods(\"'\"{_user_data[4]}\"'\", \"'\"l\"'\", \"'\"{_user_data}"
f"\"'\")'\"")
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:]
print(_title.rstrip())
for _time in _mod_list:
print(_time)
return _title_list, _mod_list
# LOCAL
def remote_list_fetch(_user_data): # captures and returns all necessary data from the remote server
try:
_remote_data = run(['ssh', '-i', _user_data[5], '-p', _user_data[2], f"{_user_data[0]}@{_user_data[1]}",
f'cd /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:]
def deletion_sync(_deletion_database, _silent): # checks for and acts upon files and folders marked for deletion
for _file in _deletion_database:
if _file != '':
if not _silent:
print(f"\u001b[38;5;208m{_file}\u001b[0m has been sheared, removing...")
delete(_file, 'locally')
def folder_sync(_folder_database): # creates matches of remote folders on the local client
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)
def sort_titles_mods(_list_1, _list_2): # creates and returns two lists (of titles and mod times) generated by sorting
# information from two different, provided lists
# information from two provided 2D lists
_title_list_2_sorted, _mod_list_2_sorted = [], []
# title sorting
for _title in _list_1[0]:
@@ -62,43 +119,52 @@ def get_profile(_profile_dir): # returns a list of data read from a sshync job
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')
print('\n\u001b[38;5;9merror: the profile does not exist or is corrupted\u001b[0m\n')
_profile_data = None
s_exit(3)
# extract data from profile
s_exit(2)
_user = _profile_data[0].rstrip()
_ip = _profile_data[1].rstrip()
_port = _profile_data[2].rstrip()
_local_dir = _profile_data[3].rstrip()
_remote_dir = _profile_data[4].rstrip()
_identity = _profile_data[5].rstrip()
return _user, _ip, _port, _local_dir, _remote_dir, _identity
_client_device_id = listdir(f"{home}/.config/sshyp/devices")[0].rstrip()
return _user, _ip, _port, _local_dir, _remote_dir, _identity, _client_device_id
def run_profile(_profile_dir): # runs a sshync job profile
_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)
def run_profile(_profile_dir, _silent): # runs a sshync job profile
_user_data = get_profile(_profile_dir) # import profile data
# 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 = -1
for _title in _index_l[0]:
for _title in _index_local[0]:
_i += 1
if _title in _index_r[0]:
if _title in _index_remote[0]:
# compare mod times and sync
if int(_index_l[1][_i]) > int(_index_r[1][_i]):
if int(_index_local[1][_i]) > int(_index_remote[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]):
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]}{'/'.join(_title.split('/')[:-1]) + '/'}"])
elif int(_index_local[1][_i]) < int(_index_remote[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]) + '/'}'")
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]}{'/'.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]:
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]}{'/'.join(_title.split('/')[:-1]) + '/'}"])
for _title in _index_remote[0]:
if _title not in _index_local[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]) + '/'}'")
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]}{'/'.join(_title.split('/')[:-1]) + '/'}"])
+437 -542
View File
File diff suppressed because it is too large Load Diff
-42
View File
@@ -1,42 +0,0 @@
#!/usr/bin/env python3
# external modules
from os import listdir, remove, walk
from os.path import expanduser
from shutil import rmtree
# utility functions
def delete(_file_path, _target_database): # deletes an entry or folder, should be run remotely via ssh
try:
if _file_path.endswith('/'):
rmtree(f"{expanduser('~/.local/share/sshyp/')}{_file_path}")
else:
remove(f"{expanduser('~/.local/share/sshyp/')}{_file_path}.gpg")
except FileNotFoundError:
print(f"location does not exist {_target_database}")
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): # creates a list of entries and folders to be deleted from a local machine
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(): # creates a list of folders to be compared with those of a local machine
open(expanduser('~/.config/sshyp/folder_database'), 'w').write('')
for _root, _directories, _files in walk(expanduser('~/.local/share/sshyp')):
for _dir in _directories:
open(expanduser('~/.config/sshyp/folder_database'), 'a')\
.write(f"{_root.replace(expanduser('~'), '')}/{_dir}\n")
+134 -87
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env bash
#!/bin/sh
version=$(sed -n '1{p;q}' share/doc/sshyp/changelog | cut -c8-)
if [ -z "$2" ]; then
@@ -8,25 +8,29 @@ else
fi
_create_generic() {
echo -e '\npackaging as generic...\n'
mkdir -p output/generictemp/usr/{bin,lib/sshyp,share/{man/man1,bash-completion/completions}}
printf '\npackaging as generic...\n'
mkdir -p output/generictemp/usr/bin \
output/generictemp/usr/lib/sshyp/extensions \
output/generictemp/usr/share/man/man1 \
output/generictemp/usr/share/bash-completion/completions \
output/generictemp/usr/share/zsh/functions/Completion/Unix
cp -r lib/. output/generictemp/usr/lib/sshyp/
ln -s /usr/lib/sshyp/sshyp.py output/generictemp/usr/bin/sshyp
cp -r share output/generictemp/usr/
cp extra/sshyp-completion.bash output/generictemp/usr/share/bash-completion/completions/sshyp
cp extra/completion.bash output/generictemp/usr/share/bash-completion/completions/sshyp
cp extra/completion.zsh output/generictemp/usr/share/zsh/functions/Completion/Unix/_sshyp
cp extra/manpage output/generictemp/usr/share/man/man1/sshyp.1
gzip output/generictemp/usr/share/man/man1/sshyp.1
tar -C output/generictemp -cvJf output/sshyp-"$version".tar.xz usr/
XZ_OPT=-e6 tar -C output/generictemp -cvJf output/GENERIC-sshyp-"$version".tar.xz usr/
rm -rf output/generictemp
sha512="$(sha512sum output/sshyp-"$version".tar.xz | awk '{print $1;}')"
echo -e "\nsha512 sum:\n$sha512"
echo -e "\ngeneric packaging complete\n"
sha512="$(sha512sum output/GENERIC-sshyp-"$version".tar.xz | awk '{print $1;}')"
printf '\ngeneric packaging complete\n\n'
} &&
_create_pkgbuild() {
source='https://github.com/rwinkhart/sshyp/releases/download/v$pkgver/sshyp-$pkgver.tar.xz'
echo -e '\ngenerating PKGBUILD...'
echo "# Maintainer: Randall Winkhart <idgr at tutanota dot com>
local source='https://github.com/rwinkhart/sshyp/releases/download/v$pkgver/GENERIC-sshyp-$pkgver.tar.xz'
printf '\ngenerating PKGBUILD...\n'
printf "# Maintainer: Randall Winkhart <idgr at tutanota dot com>
pkgname=sshyp
pkgver="$version"
pkgrel="$revision"
@@ -40,15 +44,16 @@ source=(\""$source"\")
sha512sums=('"$sha512"')
package() {
tar xf sshyp-"\"\$pkgver\"".tar.xz -C "\"\${pkgdir}\""
tar xf GENERIC-sshyp-"\"\$pkgver\"".tar.xz -C "\"\${pkgdir}\""
}
" > output/PKGBUILD
echo -e "\nPKGBUILD generated\n"
printf '\nPKGBUILD generated\n\n'
} &&
_create_apkbuild() {
echo -e '\ngenerating APKBUILD...'
echo "# Maintainer: Randall Winkhart <idgr@tutanota.com>
local source='https://github.com/rwinkhart/sshyp/releases/download/v$pkgver/GENERIC-sshyp-$pkgver.tar.xz'
printf '\ngenerating APKBUILD...\n'
printf "# Maintainer: Randall Winkhart <idgr@tutanota.com>
pkgname=sshyp
pkgver="$version"
pkgrel="$((revision-1))"
@@ -62,20 +67,28 @@ source=\""$source"\"
package() {
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\""
}
sha512sums=\"
"$sha512' 'sshyp-\"\$pkgver\".tar.xz"
"$sha512' 'GENERIC-sshyp-\"\$pkgver\".tar.xz"
\"
" > output/APKBUILD
echo -e "\nAPKBUILD generated\n"
printf '\nAPKBUILD generated\n\n'
} &&
_create_hpkg() {
echo -e '\npackaging for Haiku...\n'
mkdir -p output/haikutemp/{bin,lib/sshyp,documentation/{packages/sshyp,man/man1},data/bash-completion/completions}
echo "name sshyp
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
version "$version"-"$revision"
architecture any
summary \"A light-weight, self-hosted, synchronized password manager\"
@@ -86,7 +99,7 @@ licenses {
\"GNU GPL v3\"
}
copyrights {
\"2021-2022 Randall Winkhart\"
\"2021-2023 Randall Winkhart\"
}
provides {
sshyp = "$version"
@@ -104,26 +117,31 @@ urls {
cp -r lib/. output/haikutemp/lib/sshyp/
sed -i '1 s/.*/#!\/bin\/env\ python3.10/' output/haikutemp/lib/sshyp/sshync.py
sed -i '1 s/.*/#!\/bin\/env\ python3.10/' output/haikutemp/lib/sshyp/sshyp.py
sed -i '1 s/.*/#!\/bin\/env\ python3.10/' output/haikutemp/lib/sshyp/sshypRemote.py
ln -s /system/lib/sshyp/sshyp.py output/haikutemp/bin/sshyp
cp -r share/doc/sshyp/. output/haikutemp/documentation/packages/sshyp/
cp -r share/licenses/sshyp/. output/haikutemp/documentation/packages/sshyp/
cp extra/sshyp-completion.bash output/haikutemp/data/bash-completion/completions/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 sshyp-"$version"-"$revision"_all.hpkg
package add sshyp-"$version"-"$revision"_all.hpkg bin lib documentation data
package create -b HAIKU-sshyp-"$version"-"$revision"_all.hpkg
package add HAIKU-sshyp-"$version"-"$revision"_all.hpkg bin lib documentation data
cd ../..
mv output/haikutemp/sshyp-"$version"-"$revision"_all.hpkg output/
mv output/haikutemp/HAIKU-sshyp-"$version"-"$revision"_all.hpkg output/
rm -rf output/haikutemp
echo -e "\nHaiku packaging complete\n"
printf '\nHaiku packaging complete\n\n'
} &&
_create_deb() {
echo -e '\npackaging for Debian/Ubuntu...\n'
mkdir -p output/debiantemp/sshyp_"$version"-"$revision"_all/{DEBIAN,usr/{lib/sshyp,bin,share/{bash-completion/completions,man/man1}}}
echo "Package: sshyp
printf '\npackaging for Debian/Ubuntu...\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
printf "Package: sshyp
Version: $version
Section: utils
Architecture: all
@@ -137,19 +155,25 @@ Installed-Size: 14584
cp -r lib/. output/debiantemp/sshyp_"$version"-"$revision"_all/usr/lib/sshyp/
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/sshyp-completion.bash output/debiantemp/sshyp_"$version"-"$revision"_all/usr/share/bash-completion/completions/sshyp
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
dpkg-deb --build --root-owner-group output/debiantemp/sshyp_"$version"-"$revision"_all/
mv output/debiantemp/sshyp_"$version"-"$revision"_all.deb output/
mv output/debiantemp/sshyp_"$version"-"$revision"_all.deb output/DEBIAN-sshyp_"$version"-"$revision"_all.deb
rm -rf output/debiantemp
echo -e "\nDebian/Ubuntu packaging complete\n"
printf '\nDebian/Ubuntu packaging complete\n\n'
} &&
_create_termux() {
echo -e '\npackaging for Termux...\n'
mkdir -p output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/{DEBIAN,data/data/com.termux/files/usr/{lib/sshyp,bin,share/{bash-completion/completions,man/man1}}}
echo "Package: sshyp
printf '\npackaging for Termux...\n'
mkdir -p output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/DEBIAN \
output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/lib/sshyp/extensions \
output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/bin \
output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1 \
output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/bash-completion/completions \
output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/zsh/functions/Completion/Unix
printf "Package: sshyp
Version: $version
Section: utils
Architecture: all
@@ -163,55 +187,61 @@ Installed-Size: 14584
cp -r lib/. output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/lib/sshyp/
ln -s /data/data/com.termux/files/usr/lib/sshyp/sshyp.py output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/bin/sshyp
cp -r share output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/
cp extra/sshyp-completion.bash output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/bash-completion/completions/sshyp
cp extra/completion.bash output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/bash-completion/completions/sshyp
cp extra/completion.zsh output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/zsh/functions/Completion/Unix/_sshyp
cp extra/manpage output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1/sshyp.1
gzip output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1/sshyp.1
dpkg-deb --build --root-owner-group output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/
mv output/termuxtemp/sshyp_"$version"-"$revision"_all_termux.deb output/
mv output/termuxtemp/sshyp_"$version"-"$revision"_all_termux.deb output/TERMUX-sshyp_"$version"-"$revision"_all_termux.deb
rm -rf output/termuxtemp
echo -e "\nTermux packaging complete\n"
printf '\nTermux packaging complete\n\n'
} &&
_create_rpm() {
echo -e '\npackaging for Fedora...\n'
printf '\npackaging for Fedora...\n'
rm -rf ~/rpmbuild
rpmdev-setuptree
cp output/sshyp-"$version".tar.xz ~/rpmbuild/SOURCES
echo "Name: sshyp
cp output/GENERIC-sshyp-"$version".tar.xz ~/rpmbuild/SOURCES
printf "Name: sshyp
Version: "$version"
Release: "$revision"
Summary: A light-weight, self-hosted, synchronized password manager
BuildArch: noarch
License: GPL-3.0-only
URL: https://github.com/rwinkhart/sshyp
Source0: sshyp-"$version".tar.xz
Source0: GENERIC-sshyp-"$version".tar.xz
Requires: python gnupg openssh-clients wl-clipboard
Recommends: bash-completion
%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}
tar xf %{_sourcedir}/GENERIC-sshyp-"$version".tar.xz -C %{_sourcedir}
cp -r %{_sourcedir}/usr %{buildroot}
%files
/usr/bin/sshyp
/usr/lib/sshyp/sshyp.py
/usr/lib/sshyp/sshync.py
/usr/lib/sshyp/sshypRemote.py
/usr/share/bash-completion/completions/sshyp
/usr/share/zsh/functions/Completion/Unix/_sshyp
%license /usr/share/licenses/sshyp/license
%changelog /usr/share/doc/sshyp/changelog
%doc /usr/share/man/man1/sshyp.1.gz
%doc
/usr/share/doc/sshyp/changelog
/usr/share/man/man1/sshyp.1.gz
" > ~/rpmbuild/SPECS/sshyp.spec
rpmbuild -bb ~/rpmbuild/SPECS/sshyp.spec
mv ~/rpmbuild/RPMS/noarch/* output/
mv ~/rpmbuild/RPMS/noarch/sshyp-"$version"-"$revision".noarch.rpm output/FEDORA-sshyp-"$version"-"$revision".noarch.rpm
rm -rf ~/rpmbuild
echo -e "\nFedora packaging complete\n"
printf '\nFedora packaging complete\n\n'
} &&
_create_freebsd_pkg() {
echo -e '\npackaging for FreeBSD...'
mkdir -p output/freebsdtemp/usr/{lib/sshyp,bin,share/{bash-completion/completions,man/man1}}
echo "name: sshyp
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:*\";
@@ -236,11 +266,11 @@ prefix: /
},
},
" > output/freebsdtemp/+MANIFEST
echo "/usr/bin/sshyp
printf "/usr/bin/sshyp
/usr/lib/sshyp/sshync.py
/usr/lib/sshyp/sshyp.py
/usr/lib/sshyp/sshypRemote.py
/usr/share/bash-completion/completions/sshyp
/usr/local/share/bash-completion/completions/sshyp
/usr/local/share/zsh/site-functions/_sshyp
/usr/share/doc/sshyp/changelog
/usr/share/licenses/sshyp/license
/usr/share/man/man1/sshyp.1.gz
@@ -248,44 +278,61 @@ echo "/usr/bin/sshyp
cp -r lib/. output/freebsdtemp/usr/lib/sshyp/
ln -s /usr/lib/sshyp/sshyp.py output/freebsdtemp/usr/bin/sshyp
cp -r share output/freebsdtemp/usr/
cp extra/sshyp-completion.bash output/freebsdtemp/usr/share/bash-completion/completions/sshyp
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
echo -e "\nFreeBSD packaging complete\n"
printf '\nFreeBSD packaging complete\n\n'
} &&
if [ "$1" == "generic" ]; then # build scripts
_create_generic
elif [ "$1" == "pkgbuild" ]; then
_create_generic
_create_pkgbuild
elif [ "$1" == "apkbuild" ]; then
_create_generic
_create_apkbuild
elif [ "$1" == "haiku" ]; then # distribution packages
_create_hpkg
elif [ "$1" == "debian" ]; then
_create_deb
elif [ "$1" == "termux" ]; then
_create_termux
elif [ "$1" == "fedora" ]; then
_create_generic
_create_rpm
elif [ "$1" == "freebsd" ]; then
_create_freebsd_pkg
elif [ "$1" == "buildable-arch" ]; then
_create_generic
_create_pkgbuild
_create_apkbuild
if [[ $(pacman -Q dpkg) == "dpkg"* ]]; then
case "$1" in
generic)
_create_generic
;;
pkgbuild)
_create_generic
_create_pkgbuild
;;
apkbuild)
_create_generic
_create_apkbuild
;;
haiku)
_create_hpkg
;;
debian)
_create_deb
;;
termux)
_create_termux
fi
if [[ "$(pacman -Q freebsd-pkg)" == "freebsd-pkg"* ]]; then
;;
fedora)
_create_generic
_create_rpm
;;
freebsd)
_create_freebsd_pkg
fi
else
echo -e '\nusage: package.sh [target] <revision>\n\ntargets:\n mainline: pkgbuild apkbuild haiku fedora debian\n experimental: freebsd termux\n other: buildable-arch\n'
fi
;;
buildable-arch)
_create_generic
_create_pkgbuild
_create_apkbuild
case "$(pacman -Q dpkg)" in
dpkg*)
_create_deb
_create_termux
;;
esac
case "$(pacman -Q freebsd-pkg)" in
freebsd-pkg*)
_create_freebsd_pkg
;;
esac
;;
*)
printf '\nusage: package.sh [target] <revision>\n\ntargets:\n mainline: pkgbuild apkbuild haiku fedora debian\n experimental: freebsd termux\n other: buildable-arch\n\n'
;;
esac
+8 -41
View File
@@ -1,55 +1,22 @@
sshyp v1.2.0
sshyp v1.4.1
the brisk bahh update
the argumentative agronomist update - patch one
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
this release improves sshyp's shell completions by adding zsh support and significantly optimizing and improving Bash support
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
- zsh completion support
^ ensure modern completions are enabled in your ~/.zshrc
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
- 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:
- 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)
- some official packages now use more space-efficient compression
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
+1 -1
View File
@@ -1,5 +1,5 @@
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-2023 Randall Winkhart idgr@tutanota.com
This program is free software: you can redistribute it and/or modify
it under the terms of version 3 (only) of the GNU General Public License