Compare commits

...
66 Commits
Author SHA1 Message Date
RandyTheSilly 5cd50c7ad2 Backport /lib/sshyp fix
Former-commit-id: 21f1705abc3581a6317cd4a390324a97de9ba1b9
Former-commit-id: 56ccd20bef6587cc3b185c6260b4328001eb541c
2023-06-08 19:44:22 -04:00
RandyTheSilly c48722f04f Update documentation for release v1.4.3
Former-commit-id: 7805e0878e776dfc321bba12ed8ecf26f94d594c
Former-commit-id: f3a9f1ea37a35c5d6607d3f3bc33e7da9799ffe4
2023-06-08 19:12:56 +00:00
RandyTheSilly d32bd72d68 Backport multi-version Powershell fix
Former-commit-id: 7e82515f1146e2551eb887cf2513fa7e7f6fc082
Former-commit-id: 827531aca1be7bfe18cfb194e5ce9fcb124099b8
2023-06-08 15:48:43 -04:00
RandyTheSilly 59d0844d77 Backport IPv6 sync fix
Former-commit-id: 231005bca34d7fd8984749f2bbaadd5ea375bd63
Former-commit-id: d7021e0135afd97802a421726e79ef45fbf970ac
2023-06-08 15:39:16 -04:00
RandyTheSilly 0eb283892f Disabled folder renaming to prevent data loss bug - real fix in v1.5.0
Former-commit-id: 3577551b710064fc3aa079f598394f0456b2c622
Former-commit-id: 0c0be57ae8a4549848b67c7b244cdc35e35a1c58
2023-06-08 15:30:34 -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
19 changed files with 1362 additions and 878 deletions
+1
View File
@@ -0,0 +1 @@
*
Executable
+4
View File
@@ -0,0 +1,4 @@
#!/bin/sh
git add -f extra lib/sshyp.py lib/sshync.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
@@ -1,77 +1,3 @@
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 sshyp v1.3.0
the serious shepherd update the serious shepherd update
@@ -777,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 - 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 ^ 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: Additions planned for minor releases:
@@ -971,466 +897,3 @@ Backlog:
- package for more Linux distributions, such as Debian and Fedora - package for more Linux distributions, such as Debian and Fedora
- create separate gui frontend targetting mobile and desktop Linux - 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
+110
View File
@@ -0,0 +1,110 @@
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
Executable → Regular
View File
Executable → Regular
View File
+4 -4
View File
@@ -1,10 +1,10 @@
.TH sshyp 1 "02 April 2023" "v1.4.1" "sshyp man page" .TH sshyp 1 "08 June 2023" "v1.4.3" "sshyp man page"
.SH NAME .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 .SH SYNOPSIS
Client Usage: sshyp [</entry name> [option] [flag]] [option] Client Usage: sshyp [</entry name> [option] [flag]] [option]
Server Usage: sshyp <option> [flag] [<device id>] Server Usage: sshyp <option> [flag] [device id]
.SH DESCRIPTION .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. 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) .SH EXAMPLES (CLIENT)
@@ -91,7 +91,7 @@ whitelist:
.SH SETUP .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. 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: Server setup:
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) 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)
+31 -21
View File
@@ -6,9 +6,10 @@ from sys import exit as s_exit
home = expanduser("~") home = expanduser("~")
# PORT START SSHYNC-REMOTE
# REMOTE # REMOTE
# prints all necessary remote data to stdout
def remote_list_gen(_client_device_name, _remote_dir): # prints all necessary remote data to stdout def remote_list_gen(_client_device_name, _remote_dir):
# deletions # deletions
for _file in listdir(f"{home}/.config/sshyp/deleted"): for _file in listdir(f"{home}/.config/sshyp/deleted"):
_file_path, _sep, _device = _file.partition('\x1f') _file_path, _sep, _device = _file.partition('\x1f')
@@ -25,12 +26,14 @@ def remote_list_gen(_client_device_name, _remote_dir): # prints all necessary r
for _dir in _directories: for _dir in _directories:
print(f"{_root.replace(home, '')}/{_dir}") print(f"{_root.replace(home, '')}/{_dir}")
print('\x1d') print('\x1d')
get_local_data(_remote_dir, 'server') # titles and mod times # titles and mod times
get_local_data(_remote_dir, 'server')
# PORT END SSHYNC-REMOTE
# HYBRID # HYBRID
# deletes a file or folder and/or marks it for deletion upon syncing
def delete(_file_path, _target_database): # deletes a file or folder and/or marks it for deletion upon syncing def delete(_file_path, _target_database):
from shutil import rmtree from shutil import rmtree
_directory = f"{home}/.local/share/sshyp/" _directory = f"{home}/.local/share/sshyp/"
try: try:
@@ -45,7 +48,8 @@ def delete(_file_path, _target_database): # deletes a file or folder and/or mar
open(f"{home}/.config/sshyp/deleted/" + _file_path.replace('/', '\x1e') + '\x1f' + _device_name, 'w') 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 # retrieves and returns titles and mod times from the local device
def get_local_data(_directory, _device):
_title_list, _mod_list = [], [] _title_list, _mod_list = [], []
for _root, _directories, _files in walk(_directory): for _root, _directories, _files in walk(_directory):
for _filename in _files: for _filename in _files:
@@ -60,11 +64,11 @@ def get_local_data(_directory, _device): # retrieves and returns titles and mod
# LOCAL # LOCAL
# captures and returns all necessary data from the remote server
def remote_list_fetch(_user_data): # captures and returns all necessary data from the remote server def remote_list_fetch(_user_data):
try: try:
_remote_data = run(['ssh', '-i', _user_data[5], '-p', _user_data[2], f"{_user_data[0]}@{_user_data[1]}", _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'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 f'("{_user_data[6]}", "{_user_data[4]}")\''], stdout=PIPE, text=True, check=True
).stdout.split('\x1d') ).stdout.split('\x1d')
except CalledProcessError: except CalledProcessError:
@@ -78,7 +82,8 @@ def remote_list_fetch(_user_data): # captures and returns all necessary data fr
_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 # checks for and acts upon files and folders marked for deletion
def deletion_sync(_deletion_database, _silent):
for _file in _deletion_database: for _file in _deletion_database:
if _file != '': if _file != '':
if not _silent: if not _silent:
@@ -86,7 +91,8 @@ def deletion_sync(_deletion_database, _silent): # checks for and acts upon file
delete(_file, 'locally') delete(_file, 'locally')
def folder_sync(_folder_database): # creates matches of remote folders on the local client # creates matches of remote folders on the local client
def folder_sync(_folder_database):
from pathlib import Path from pathlib import Path
for _folder in _folder_database: for _folder in _folder_database:
if _folder != '' and not isdir(home + _folder): if _folder != '' and not isdir(home + _folder):
@@ -95,8 +101,8 @@ def folder_sync(_folder_database): # creates matches of remote folders on the l
Path(home + _folder).mkdir(mode=0o700, parents=True, exist_ok=True) 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 # creates and returns two lists (of titles and mod times) generated by sorting information from two provided 2D lists
# information from two provided 2D lists def sort_titles_mods(_list_1, _list_2):
_title_list_2_sorted, _mod_list_2_sorted = [], [] _title_list_2_sorted, _mod_list_2_sorted = [], []
# title sorting # title sorting
for _title in _list_1[0]: for _title in _list_1[0]:
@@ -111,11 +117,13 @@ def sort_titles_mods(_list_1, _list_2): # creates and returns two lists (of tit
return _title_list_2_sorted, _mod_list_2_sorted return _title_list_2_sorted, _mod_list_2_sorted
def make_profile(_profile_dir, _local_dir, _remote_dir, _identity, _ip, _port, _user): # creates a sshync job profile # creates a sshync job profile
def make_profile(_profile_dir, _local_dir, _remote_dir, _identity, _ip, _port, _user):
open(_profile_dir, 'w').write(f"{_user}\n{_ip}\n{_port}\n{_local_dir}\n{_remote_dir}\n{_identity}\n") open(_profile_dir, 'w').write(f"{_user}\n{_ip}\n{_port}\n{_local_dir}\n{_remote_dir}\n{_identity}\n")
def get_profile(_profile_dir): # returns a list of data read from a sshync job profile # returns a list of data read from a sshync job profile
def get_profile(_profile_dir):
try: try:
_profile_data = open(_profile_dir).readlines() _profile_data = open(_profile_dir).readlines()
except (FileNotFoundError, IndexError): except (FileNotFoundError, IndexError):
@@ -132,8 +140,10 @@ def get_profile(_profile_dir): # returns a list of data read from a sshync job
return _user, _ip, _port, _local_dir, _remote_dir, _identity, _client_device_id return _user, _ip, _port, _local_dir, _remote_dir, _identity, _client_device_id
def run_profile(_profile_dir, _silent): # runs a sshync job profile # runs a sshync job profile
_user_data = get_profile(_profile_dir) # import profile data def run_profile(_profile_dir, _silent):
# import profile data
_user_data = get_profile(_profile_dir)
# fetch remote lists # fetch remote lists
_deletion_database, _folder_database, _remote_titles, _remote_mods = remote_list_fetch(_user_data) _deletion_database, _folder_database, _remote_titles, _remote_mods = remote_list_fetch(_user_data)
_remote_titles_mods = (_remote_titles, _remote_mods) _remote_titles_mods = (_remote_titles, _remote_mods)
@@ -152,19 +162,19 @@ def run_profile(_profile_dir, _silent): # runs a sshync job profile
if int(_index_local[1][_i]) > int(_index_remote[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...") 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, 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]) + '/'}"]) 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]): 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...") 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], 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[0]}@[{_user_data[1]}]:{_user_data[4]}{_title}",
f"{_user_data[3]}{'/'.join(_title.split('/')[:-1]) + '/'}"]) f"{_user_data[3]}{'/'.join(_title.split('/')[:-1]) + '/'}"])
else: else:
print(f"\u001b[38;5;4m{_title[:-4]}\u001b[0m is not on remote server, uploading...") 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, 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]) + '/'}"]) f"{_user_data[0]}@[{_user_data[1]}]:{_user_data[4]}{'/'.join(_title.split('/')[:-1]) + '/'}"])
for _title in _index_remote[0]: for _title in _index_remote[0]:
if _title not in _index_local[0]: if _title not in _index_local[0]:
print(f"\u001b[38;5;2m{_title[:-4]}\u001b[0m is not in local directory, downloading...") 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], 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[0]}@[{_user_data[1]}]:{_user_data[4]}{_title}",
f"{_user_data[3]}{'/'.join(_title.split('/')[:-1]) + '/'}"]) f"{_user_data[3]}{'/'.join(_title.split('/')[:-1]) + '/'}"])
+260 -199
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from os import chmod, environ, listdir, remove, uname, walk from os import chmod, environ, listdir, remove, walk
from os.path import exists, expanduser, isdir, isfile, realpath from os.path import exists, expanduser, isdir, isfile, realpath
from pathlib import Path from pathlib import Path
from random import randint from random import randint
@@ -7,12 +7,15 @@ from shutil import get_terminal_size, move, rmtree
from sshync import delete as offline_delete, run_profile, make_profile, get_profile from sshync import delete as offline_delete, run_profile, make_profile, get_profile
from subprocess import CalledProcessError, DEVNULL, PIPE, run from subprocess import CalledProcessError, DEVNULL, PIPE, run
from sys import argv, exit as s_exit from sys import argv, exit as s_exit
# PORT START UNAME-IMPORT
from os import uname
# PORT END UNAME-IMPORT
home = expanduser("~") home = expanduser("~")
# UTILITY FUNCTIONS # UTILITY FUNCTIONS
# generates and prints full entry list
def entry_list_gen(_directory=f"{home}/.local/share/sshyp/"): # generates and prints full entry list def entry_list_gen(_directory=f"{home}/.local/share/sshyp/"):
from textwrap import fill from textwrap import fill
_ran = False _ran = False
print("\nfor a list of usable commands, run 'sshyp help'\n\n\u001b[38;5;0;48;5;15msshyp entries:\u001b[0m\n") print("\nfor a list of usable commands, run 'sshyp help'\n\n\u001b[38;5;0;48;5;15msshyp entries:\u001b[0m\n")
@@ -38,22 +41,23 @@ def entry_list_gen(_directory=f"{home}/.local/share/sshyp/"): # generates and p
_ran = True _ran = True
def entry_reader(_decrypted_entry): # displays the contents of an entry in a readable format # displays the contents of an entry in a readable format
def entry_reader(_decrypted_entry):
_entry_lines, _notes_flag = open(_decrypted_entry, 'r').readlines(), 0 _entry_lines, _notes_flag = open(_decrypted_entry, 'r').readlines(), 0
print() print()
for _num in range(len(_entry_lines)): for _num in range(len(_entry_lines)):
try: try:
if _num == 0 and _entry_lines[1] != '\n': if _num == 0 and _entry_lines[1] != '\n':
print(f"\u001b[38;5;15;48;5;238musername:\u001b[0m\n{_entry_lines[1].strip()}\n") print(f"\u001b[38;5;15;48;5;238musername:\u001b[0m\n{_entry_lines[1]}\n")
elif _num == 1 and _entry_lines[0] != '\n': elif _num == 1 and _entry_lines[0] != '\n':
print(f"\u001b[38;5;15;48;5;238mpassword:\u001b[0m\n{_entry_lines[0].strip()}\n") print(f"\u001b[38;5;15;48;5;238mpassword:\u001b[0m\n{_entry_lines[0]}\n")
elif _num == 2 and _entry_lines[2] != '\n': elif _num == 2 and _entry_lines[2] != '\n':
print(f"\u001b[38;5;15;48;5;238murl:\u001b[0m\n{_entry_lines[_num].strip()}\n") print(f"\u001b[38;5;15;48;5;238murl:\u001b[0m\n{_entry_lines[_num]}\n")
elif _num >= 3 and _entry_lines[_num] != '\n' and _notes_flag != 1: elif _num >= 3 and _entry_lines[_num] != '\n' and _notes_flag != 1:
_notes_flag = 1 _notes_flag = 1
print(f"\u001b[38;5;15;48;5;238mnotes:\u001b[0m\n{_entry_lines[_num].strip()}") print('\u001b[38;5;15;48;5;238mnotes:\u001b[0m\n' + _entry_lines[_num].strip('\n'))
elif _num >= 3 and _notes_flag == 1: elif _num >= 3 and _notes_flag == 1:
print(_entry_lines[_num].replace('\n', '')) print(_entry_lines[_num].strip('\n'))
if _notes_flag == 1: if _notes_flag == 1:
try: try:
_line_test = _entry_lines[_num + 1] _line_test = _entry_lines[_num + 1]
@@ -64,7 +68,8 @@ def entry_reader(_decrypted_entry): # displays the contents of an entry in a re
print(f"\u001b[38;5;15;48;5;238mpassword:\u001b[0m\n{_entry_lines[0]}\n") print(f"\u001b[38;5;15;48;5;238mpassword:\u001b[0m\n{_entry_lines[0]}\n")
def string_gen(_complexity, _length): # generates and returns a random string based on input # generates and returns a random string based on input
def string_gen(_complexity, _length):
from random import SystemRandom from random import SystemRandom
import string import string
if _complexity == 's': if _complexity == 's':
@@ -85,7 +90,8 @@ def string_gen(_complexity, _length): # generates and returns a random string b
return _gen return _gen
def pass_gen(): # prompts the user for necessary information to generate a password and passes it to string_gen # prompts the user for necessary information to generate a password and passes it to string_gen
def pass_gen():
_length = 9 _length = 9
while True: while True:
try: try:
@@ -104,22 +110,24 @@ def pass_gen(): # prompts the user for necessary information to generate a pass
return _gen return _gen
def shm_gen(_tmp_dir=f"{home}/.config/sshyp/tmp/"): # creates a temporary directory for entry editing # creates a temporary directory for entry editing
def shm_gen(_tmp_dir=f"{home}/.config/sshyp/tmp/"):
_shm_folder_gen = string_gen('f', randint(12, 48)) _shm_folder_gen = string_gen('f', randint(12, 48))
_shm_entry_gen = string_gen('f', randint(12, 48)) _shm_entry_gen = string_gen('f', randint(12, 48))
Path(_tmp_dir + _shm_folder_gen).mkdir(mode=0o700) Path(_tmp_dir + _shm_folder_gen).mkdir(mode=0o700)
return _shm_folder_gen, _shm_entry_gen return _shm_folder_gen, _shm_entry_gen
# encrypts an entry and cleans up the temporary files
def encrypt(_entry_dir, _shm_folder, _shm_entry, _gpg_id, _tmp_dir=f"{home}/.config/sshyp/tmp/"): def encrypt(_entry_dir, _shm_folder, _shm_entry, _gpg_id, _tmp_dir=f"{home}/.config/sshyp/tmp/"):
# encrypts an entry and cleans up the temporary files
run(['gpg', '-qr', str(_gpg_id), '-e', f"{_tmp_dir}{_shm_folder}/{_shm_entry}"]) run(['gpg', '-qr', str(_gpg_id), '-e', f"{_tmp_dir}{_shm_folder}/{_shm_entry}"])
move(f"{_tmp_dir}{_shm_folder}/{_shm_entry}.gpg", f"{_entry_dir}.gpg") move(f"{_tmp_dir}{_shm_folder}/{_shm_entry}.gpg", f"{_entry_dir}.gpg")
rmtree(f"{_tmp_dir}{_shm_folder}") rmtree(f"{_tmp_dir}{_shm_folder}")
# decrypts an entry to a temporary directory
def decrypt(_entry_dir, _shm_folder, _shm_entry, _quick_pass, def decrypt(_entry_dir, _shm_folder, _shm_entry, _quick_pass,
_tmp_dir=f"{home}/.config/sshyp/tmp/"): # decrypts an entry to a temporary directory _tmp_dir=f"{home}/.config/sshyp/tmp/"):
if not isinstance(_quick_pass, bool): if not isinstance(_quick_pass, bool):
_unlock_method = ['gpg', '--pinentry-mode', 'loopback', '--passphrase', _quick_pass, '-qd', '--output'] _unlock_method = ['gpg', '--pinentry-mode', 'loopback', '--passphrase', _quick_pass, '-qd', '--output']
else: else:
@@ -144,14 +152,16 @@ def decrypt(_entry_dir, _shm_folder, _shm_entry, _quick_pass,
s_exit(4) s_exit(4)
def determine_decrypt(_entry_dir, _shm_folder, _shm_entry): # call decrypt() based on quick-unlock status # call decrypt() based on quick-unlock status
def determine_decrypt(_entry_dir, _shm_folder, _shm_entry):
if quick_unlock_enabled == 'y': if quick_unlock_enabled == 'y':
decrypt(_entry_dir, _shm_folder, _shm_entry, whitelist_verify(port, username_ssh, ip, client_device_id)) decrypt(_entry_dir, _shm_folder, _shm_entry, whitelist_verify(port, username_ssh, ip, client_device_id))
else: else:
decrypt(_entry_dir, _shm_folder, _shm_entry, False) decrypt(_entry_dir, _shm_folder, _shm_entry, False)
def optimized_edit(_lines, _edit_data, _edit_line): # ensures an edited entry is optimized for best compatibility # ensures an edited entry is optimized for best compatibility
def optimized_edit(_lines, _edit_data, _edit_line):
while len(_lines) < _edit_line + 1: while len(_lines) < _edit_line + 1:
_lines.append('\n') _lines.append('\n')
if _edit_data is not None: if _edit_data is not None:
@@ -170,7 +180,8 @@ def optimized_edit(_lines, _edit_data, _edit_line): # ensures an edited entry i
return _lines return _lines
def edit_note(_shm_folder, _shm_entry, _lines): # edits the note attached to an entry # edits the note attached to an entry
def edit_note(_shm_folder, _shm_entry, _lines):
_reg_lines = _lines[0:3] _reg_lines = _lines[0:3]
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'w').writelines(_lines[3:]) open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'w').writelines(_lines[3:])
run([editor, f"{tmp_dir}{_shm_folder}/{_shm_entry}-n"]) run([editor, f"{tmp_dir}{_shm_folder}/{_shm_entry}-n"])
@@ -181,8 +192,8 @@ def edit_note(_shm_folder, _shm_entry, _lines): # edits the note attached to an
return _noted_lines return _noted_lines
# attempts to connect to the user's server via ssh to register the device for syncing
def copy_id_check(_port, _username_ssh, _ip, _client_device_id): def copy_id_check(_port, _username_ssh, _ip, _client_device_id):
# attempts to connect to the user's server via ssh to register the device for syncing
try: try:
run(['ssh', '-o', 'ConnectTimeout=3', '-i', f"{home}/.ssh/sshyp", '-p', _port, f"{_username_ssh}@{_ip}", run(['ssh', '-o', 'ConnectTimeout=3', '-i', f"{home}/.ssh/sshyp", '-p', _port, f"{_username_ssh}@{_ip}",
f'python3 -c \'from pathlib import Path; Path("/home/{_username_ssh}/.config/sshyp/devices/' f'python3 -c \'from pathlib import Path; Path("/home/{_username_ssh}/.config/sshyp/devices/'
@@ -198,21 +209,24 @@ def copy_id_check(_port, _username_ssh, _ip, _client_device_id):
# ARGUMENT-SPECIFIC FUNCTIONS # ARGUMENT-SPECIFIC FUNCTIONS
# runs configuration wizard
def tweak(): # runs configuration wizard def tweak():
from os import symlink
_divider = f"\n{'=' * (get_terminal_size()[0] - int((.5 * get_terminal_size()[0])))}\n\n" _divider = f"\n{'=' * (get_terminal_size()[0] - int((.5 * get_terminal_size()[0])))}\n\n"
# config directory creation # config directory creation
Path(f"{home}/.config/sshyp/devices").mkdir(mode=0o700, parents=True, exist_ok=True) Path(f"{home}/.config/sshyp/devices").mkdir(mode=0o700, parents=True, exist_ok=True)
if not exists(f"{home}/.config/sshyp/tmp"): if not exists(f"{home}/.config/sshyp/tmp"):
if uname()[0] in ('Haiku', 'FreeBSD'): from os import symlink
# PORT START UNAME-TMP
if uname()[0] in ('Haiku', 'FreeBSD', 'Darwin'):
symlink('/tmp', f"{home}/.config/sshyp/tmp") symlink('/tmp', f"{home}/.config/sshyp/tmp")
elif exists('/data/data/com.termux'): elif exists('/data/data/com.termux'):
symlink('/data/data/com.termux/files/usr/tmp', f"{home}/.config/sshyp/tmp") symlink('/data/data/com.termux/files/usr/tmp', f"{home}/.config/sshyp/tmp")
else: else:
symlink('/dev/shm', f"{home}/.config/sshyp/tmp") symlink('/dev/shm', f"{home}/.config/sshyp/tmp")
# PORT END UNAME-TMP
# PORT START TWEAK-DEVTYPE
# device type configuration # device type configuration
_device_type = input('\nclient or server installation? (C/s) ') _device_type = input('\nclient or server installation? (C/s) ')
if _device_type.lower() == 's': if _device_type.lower() == 's':
@@ -223,6 +237,7 @@ def tweak(): # runs configuration wizard
else: else:
_sshyp_data = ['client'] _sshyp_data = ['client']
Path(f"{home}/.local/share/sshyp").mkdir(mode=0o700, parents=True, exist_ok=True) Path(f"{home}/.local/share/sshyp").mkdir(mode=0o700, parents=True, exist_ok=True)
# PORT END TWEAK-DEVTYPE
# gpg configuration # gpg configuration
_gpg_gen = input(f"{_divider}sshyp requires the use of a unique gpg key - use an (e)xisting key or (g)enerate a" _gpg_gen = input(f"{_divider}sshyp requires the use of a unique gpg key - use an (e)xisting key or (g)enerate a"
@@ -279,7 +294,8 @@ def tweak(): # runs configuration wizard
f"{home}/.ssh/sshyp", _iport[0], _iport[1], _username_ssh) f"{home}/.ssh/sshyp", _iport[0], _iport[1], _username_ssh)
# device id configuration # device id configuration
for _id in listdir(f"{home}/.config/sshyp/devices"): # remove existing device id # remove existing device id
for _id in listdir(f"{home}/.config/sshyp/devices"):
remove(f"{home}/.config/sshyp/devices/{_id}") remove(f"{home}/.config/sshyp/devices/{_id}")
print(f"{_divider}\u001b[4;1mimportant:\u001b[0m this id \u001b[4;1mmust\u001b[0m be unique amongst your " print(f"{_divider}\u001b[4;1mimportant:\u001b[0m this id \u001b[4;1mmust\u001b[0m be unique amongst your "
f"client devices\n\nthis is used to keep track of database syncing and quick-unlock permissions\n") f"client devices\n\nthis is used to keep track of database syncing and quick-unlock permissions\n")
@@ -315,28 +331,25 @@ def tweak(): # runs configuration wizard
print(f"{_divider}configuration complete\n") print(f"{_divider}configuration complete\n")
def print_info(): # prints help text based on argument # prints help text based on argument
def print_info():
if arguments[0] in ('version', '-v'): if arguments[0] in ('version', '-v'):
print('\nsshyp is a simple, self-hosted, sftp-synchronized\npassword manager for unix(-like) systems\n') _blank = '\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m' + 54*' ' + '\u001b[38;5;7;48;5;8m/\u001b[0m'
print(" .. \u001b[38;5;9m♥♥ ♥♥\u001b[0m ..\n .''.''/()\\ \u001b[38;5;13m" _border = '\u001b[38;5;7;48;5;8m' + 28*'<>' + '\u001b[0m\n'
"♥♥♥♥♥♥♥\u001b[0m /()\\''.''.\n * : \u001b[38;5;9m♥♥♥♥♥\u001b[0m : *" print(f"""\nsshyp is a simple, self-hosted, sftp-synchronized\npassword manager for unix(-like) systems\n
"\n `..'..' \u001b[38;5;13m♥♥♥\u001b[0m `..'..'\n // \\\\ " {16*' '}..{7*' '}\u001b[38;5;9m♥♥ ♥♥\u001b[0m{7*' '}..
"\u001b[38;5;9m\u001b[0m // \\\\") {9*' '}.''.''/()\\{5*' '}\u001b[38;5;13m♥♥♥♥♥♥\u001b[0m{5*' '}/()\\''.''.
print('\u001b[38;5;7;48;5;8m<><><><><><><><><><><><><><><><><><><><><><><><><><><><>\u001b[0m') {8*' '}*{7*' '}:{8*' '}\u001b[38;5;9m♥♥♥♥♥\u001b[0m{8*' '}:{7*' '}*
print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m ' {9*' '}`..'..'{10*' '}\u001b[38;5;13m♥♥♥\u001b[0m{10*' '}`..'..'
'\u001b[38;5;7;48;5;8m/\u001b[0m') {9*' '}//{3*' '}\\\\{11*' '}\u001b[38;5;9m♥\u001b[0m{11*' '}//{3*' '}\\\\""")
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-2023 ' print(f"{_border}{_blank}\n\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m{3*' '}\u001b[38;5;15;48;5;8m"
'randall winkhart\u001b[38;5;15;48;5;15m \u001b[38;5;7;48;5;8m/\u001b[0m') f"sshyp ", f"copyright (c) 2021-2023 ", f"randall winkhart\u001b[38;5;15;48;5;15m{3*' '}"
print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m ' f"\u001b[38;5;7;48;5;8m/\u001b[0m\n{_blank}")
'\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{20*' '}\u001b[38;5;15;48;5;8mversion 1.4.3"
print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m \u001b[38;5;15;48;5;8mversion 1.4.1' f"\u001b[38;5;15;48;5;15m{21*' '}\u001b[38;5;7;48;5;8m/\u001b[0m")
'\u001b[38;5;15;48;5;15m \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{9*' '}\u001b[38;5;15;48;5;8mthe argumentative "
print('\u001b[38;5;7;48;5;8m/\u001b[38;5;15;48;5;15m \u001b[38;5;15;48;5;8mthe argumentative ' f"agronomist update\u001b[38;5;15;48;5;15m{10*' '}\u001b[38;5;7;48;5;8m/\u001b[0m")
'agronomist update\u001b[38;5;15;48;5;15m \u001b[38;5;7;48;5;8m/\u001b[0m') print(f"{_blank}\n{_border}\nsee https://github.com/rwinkhart/sshyp for more information\n")
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 arguments[0] == 'license': elif arguments[0] == 'license':
print('\nThis program is free software: you can redistribute it and/or modify it under the terms\nof version 3 ' print('\nThis program is free software: you can redistribute it and/or modify it under the terms\nof version 3 '
'(only) of the GNU General Public License as published by the Free Software Foundation.\n\nThis program ' '(only) of the GNU General Public License as published by the Free Software Foundation.\n\nThis program '
@@ -344,92 +357,103 @@ def print_info(): # prints help text based on argument
'warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for' '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') ' more details.\n\nhttps://opensource.org/licenses/GPL-3.0\n')
elif arguments[0] == 'add' and device_type == 'client': elif arguments[0] == 'add' and device_type == 'client':
print('\n\u001b[1musage:\u001b[0m sshyp </entry name> add <flag>\u001b[0m\n') print(f"""\n\u001b[1musage:\u001b[0m sshyp </entry name> add <flag>\u001b[0m\n
print('\u001b[1mflags:\u001b[0m') \u001b[1mflags:\u001b[0m
print('add:') add:
print(' password/-p add a password entry') password/-p{12*' '}add a password entry
print(' note/-n add a note entry') note/-n{16*' '}add a note entry
print(' folder/-f add a new folder for entries\n') folder/-f{14*' '}add a new folder for entries\n""")
elif arguments[0] == 'edit' and device_type == 'client': elif arguments[0] == 'edit' and device_type == 'client':
print('\n\u001b[1musage:\u001b[0m sshyp </entry name> edit <flag>\u001b[0m\n') print(f"""\n\u001b[1musage:\u001b[0m sshyp </entry name> edit <flag>\u001b[0m\n
print('\u001b[1mflags:\u001b[0m') \u001b[1mflags:\u001b[0m
print('edit:') edit:
print(' rename/relocate/-r rename or relocate an entry') rename/relocate/-r{5*' '}rename or relocate an entry
print(' username/-u change the username of an entry') username/-u{12*' '}change the username of an entry
print(' password/-p change the password of an entry') password/-p{12*' '}change the password of an entry
print(' url/-l change the url attached to an entry') url/-l{17*' '}change the url attached to an entry
print(' note/-n change the note attached to an entry\n') note/-n{16*' '}change the note attached to an entry\n""")
elif arguments[0] == 'copy' and device_type == 'client': elif arguments[0] == 'copy' and device_type == 'client':
print('\n\u001b[1musage:\u001b[0m sshyp </entry name> copy <flag>\u001b[0m\n') print(f"""\n\u001b[1musage:\u001b[0m sshyp </entry name> copy <flag>\u001b[0m\n
print('\u001b[1mflags:\u001b[0m') \u001b[1mflags:\u001b[0m
print('copy:') copy:
print(' username/-u copy the username of an entry to your clipboard') username/-u{12*' '}copy the username of an entry to your clipboard
print(' password/-p copy the password of an entry to your clipboard') password/-p{12*' '}copy the password of an entry to your clipboard
print(' url/-l copy the url of an entry to your clipboard') url/-l{17*' '}copy the url of an entry to your clipboard
print(' note/-n copy the note of an entry to your clipboard\n') 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 [flag]\u001b[0m\n
\u001b[1mflags:\u001b[0m
gen:
update/-u{14*' '}generate a password for an existing entry\n""")
elif arguments[0] == 'whitelist': elif arguments[0] == 'whitelist':
if device_type == 'server': if device_type == 'server':
print('\n\u001b[1musage:\u001b[0m sshyp whitelist <flag> [device id]\u001b[0m\n') if arg_count > 1 and arguments[1] in ('add', 'del'):
print('\u001b[1mflags:\u001b[0m') print("\nwhen adding or deleting devices from the whitelist,\nthe device ID must be specified as an"
print('whitelist:') " argument\n\nexample: sshyp whitelist add 'this-is-a-quoted-device-id'")
print(' setup set up the quick-unlock whitelist') print(f"""\n\u001b[1musage:\u001b[0m sshyp whitelist <flag> [device id]\u001b[0m\n
print(' list/-l view all registered device ids and their quick-unlock whitelist status') \u001b[1mflags:\u001b[0m
print(' add whitelist a device id for quick-unlock') whitelist:
print(' delete/del remove a device id from the quick-unlock whitelist\n') setup{18*' '}set up the quick-unlock whitelist
list/-l{16*' '}view all registered device ids and their quick-unlock whitelist status
add{20*' '}whitelist a device id for quick-unlock
del{20*' '}remove a device id from the quick-unlock whitelist\n""")
else: else:
print('\n\u001b[38;5;9merror: argument (whitelist) only available on server\u001b[0m\n') print('\n\u001b[38;5;9merror: argument (whitelist) only available on server\u001b[0m\n')
else: else:
print('\n\u001b[1msshyp copyright (c) 2021-2023 randall winkhart\u001b[0m\n') print("\n\u001b[1msshyp ", "copyright (c) 2021-2023 ", """randall winkhart\u001b[0m
print("this is free software, and you are welcome to redistribute it under certain conditions;\nthis program " this is free software, and you are welcome to redistribute it under certain conditions;
"comes with absolutely no warranty;\ntype 'sshyp license' for details") this program comes with absolutely no warranty; type 'sshyp license' for details""")
if device_type == 'client': if device_type == 'client':
print('\n\u001b[1musage:\u001b[0m sshyp [</entry name> [option] [flag]] [option]\n') print(f"""\n\u001b[1musage:\u001b[0m sshyp [</entry name> [option] [flag]] [option]\n
print('\u001b[1moptions:\u001b[0m') \u001b[1moptions:\u001b[0m
print('help/-h bring up this menu') help/-h{17*' '}bring up this menu
print('version/-v display sshyp version info') version/-v{14*' '}display sshyp version info
print('tweak configure sshyp') tweak{19*' '}configure sshyp
print('add add an entry') add{21*' '}add an entry
print('gen generate a new password') gen{21*' '}generate a new password
print('edit edit an existing entry') edit{20*' '}edit an existing entry
print('copy copy details of an entry to your clipboard') copy{20*' '}copy details of an entry to your clipboard
print('shear delete an existing entry') shear{19*' '}delete an existing entry
print('sync manually sync the entry directory via sshync') sync{20*' '}manually sync the entry directory via sshync
print('\n\u001b[1mflags:\u001b[0m') \n\u001b[1mflags:\u001b[0m
print('add:') add:
print(' password/-p add a password entry') password/-p{12*' '}add a password entry
print(' note/-n add a note entry') note/-n{16*' '}add a note entry
print(' folder/-f add a new folder for entries') folder/-f{14*' '}add a new folder for entries
print('edit:') edit:
print(' rename/relocate/-r rename or relocate an entry') rename/relocate/-r{5*' '}rename or relocate an entry
print(' username/-u change the username of an entry') username/-u{12*' '}change the username of an entry
print(' password/-p change the password of an entry') password/-p{12*' '}change the password of an entry
print(' url/-l change the url attached to an entry') url/-l{17*' '}change the url attached to an entry
print(' note/-n change the note attached to an entry') note/-n{16*' '}change the note attached to an entry
print('copy:') copy:
print(' username/-u copy the username of an entry to your clipboard') username/-u{12*' '}copy the username of an entry to your clipboard
print(' password/-p copy the password of an entry to your clipboard') password/-p{12*' '}copy the password of an entry to your clipboard
print(' url/-l copy the url of an entry to your clipboard') url/-l{17*' '}copy the url of an entry to your clipboard
print(' note/-n copy the note of an entry to your clipboard') note/-n{16*' '}copy the note of an entry to your clipboard
print('gen:') gen:
print(' update/-u generate a password for an existing entry') update/-u{14*' '}generate a password for an existing entry
print("\n\u001b[1mtip 1:\u001b[0m you can quickly read an entry with 'sshyp </entry name>'") \n\u001b[1mtip 1:\u001b[0m you can quickly read an entry with 'sshyp </entry name>'
print("\u001b[1mtip 2:\u001b[0m type 'sshyp' to view a list of saved entries\n") \u001b[1mtip 2:\u001b[0m type 'sshyp' to view a list of saved entries\n""")
# PORT START HELP-SERVER
else: else:
print('\n\u001b[1musage:\u001b[0m sshyp <option> [flag] [<device id>]\n') print(f"""\n\u001b[1musage:\u001b[0m sshyp <option> [flag] [device id]\n
print('\u001b[1moptions:\u001b[0m') \u001b[1moptions:\u001b[0m
print('help/-h bring up this menu') help/-h{17*' '}bring up this menu
print('version/-v display sshyp version info') version/-v{14*' '}display sshyp version info
print('tweak configure sshyp') tweak{19*' '}configure sshyp
print('whitelist manage the quick-unlock whitelist') whitelist{15*' '}manage the quick-unlock whitelist
print('\n\u001b[1mflags:\u001b[0m') \n\u001b[1mflags:\u001b[0m
print('whitelist:') whitelist:
print(' setup set up the quick-unlock whitelist') setup{18*' '}set up the quick-unlock whitelist
print(' list/-l view all registered device ids and their quick-unlock whitelist status') list/-l{16*' '}view all registered device ids and their quick-unlock whitelist status
print(' add whitelist a device id for quick-unlock') add{20*' '}whitelist a device id for quick-unlock
print(' del remove a device id from the quick-unlock whitelist\n') del{20*' '}remove a device id from the quick-unlock whitelist\n""")
# PORT END HELP-SERVER
def read_shortcut(): # shortcut to quickly read an entry # shortcut to quickly read an entry
def read_shortcut():
if not exists(f"{directory}{entry_name}.gpg"): if not exists(f"{directory}{entry_name}.gpg"):
if not entry_name: if not entry_name:
print(f"\n\u001b[38;5;9merror: missing entry name\u001b[0m\n") print(f"\n\u001b[38;5;9merror: missing entry name\u001b[0m\n")
@@ -444,7 +468,8 @@ def read_shortcut(): # shortcut to quickly read an entry
rmtree(f"{tmp_dir}{_shm_folder}") rmtree(f"{tmp_dir}{_shm_folder}")
def sync(): # calls sshync to sync changes to the user's server # calls sshync to sync changes to the user's server
def sync():
print('\nsyncing entries with the server device...\n') print('\nsyncing entries with the server device...\n')
# set permissions before uploading # set permissions before uploading
for _root, _dirs, _files in walk(f"{home}/.local/share/sshyp"): for _root, _dirs, _files in walk(f"{home}/.local/share/sshyp"):
@@ -455,7 +480,9 @@ def sync(): # calls sshync to sync changes to the user's server
run_profile(f"{home}/.config/sshyp/sshyp.sshync", silent_sync) run_profile(f"{home}/.config/sshyp/sshyp.sshync", silent_sync)
def whitelist_setup(): # takes input from the user to set up quick-unlock password # PORT START WHITELIST-SERVER
# takes input from the user to set up quick-unlock password
def whitelist_setup():
_gpg_password_temp = str(input('\nfull gpg passphrase: ')) _gpg_password_temp = str(input('\nfull gpg passphrase: '))
_half_length = int(len(_gpg_password_temp)/2) _half_length = int(len(_gpg_password_temp)/2)
try: try:
@@ -489,8 +516,40 @@ def whitelist_setup(): # takes input from the user to set up quick-unlock passw
print(f"\nyour quick-unlock passphrase: {_quick_unlock_password}") print(f"\nyour quick-unlock passphrase: {_quick_unlock_password}")
# shows the quick-unlock whitelist status of device ids
def whitelist_list():
_whitelisted_ids = listdir(f"{home}/.config/sshyp/whitelist")
_device_ids = listdir(f"{home}/.config/sshyp/devices")
print('\n\u001b[1mquick-unlock whitelisted device ids:\u001b[0m')
for _id in _whitelisted_ids:
print(_id)
print('\n\u001b[1mother registered device ids:\u001b[0m')
for _id in _device_ids:
if _id not in _whitelisted_ids:
print(_id)
print()
# adds or removes quick-unlock whitelisted device ids
def whitelist_manage(_device_id):
if arguments[1] == 'add':
if _device_id in listdir(f"{home}/.config/sshyp/devices"):
open(f"{home}/.config/sshyp/whitelist/{_device_id}", 'w').write('')
whitelist_list()
else:
print(f"\n\u001b[38;5;9merror: device id ({_device_id}) is not registered\u001b[0m\n")
s_exit(1)
elif isfile(f"{home}/.config/sshyp/whitelist/{_device_id}"):
remove(f"{home}/.config/sshyp/whitelist/{_device_id}")
whitelist_list()
else:
print(f"\n\u001b[38;5;9merror: device id ({_device_id}) is not whitelisted\u001b[0m\n")
s_exit(1)
# PORT END WHITELIST-SERVER
# 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): def whitelist_verify(_port, _username_ssh, _ip, _client_device_id):
# checks the user's whitelist status and fetches the full gpg key password if possible
try: try:
run(['gpg', '--pinentry-mode', 'cancel', '-qd', '--output', '/dev/null', run(['gpg', '--pinentry-mode', 'cancel', '-qd', '--output', '/dev/null',
f"{home}/.config/sshyp/lock.gpg"], stderr=DEVNULL, check=True) f"{home}/.config/sshyp/lock.gpg"], stderr=DEVNULL, check=True)
@@ -522,50 +581,23 @@ def whitelist_verify(_port, _username_ssh, _ip, _client_device_id):
return _full_password return _full_password
def whitelist_list(): # shows the quick-unlock whitelist status of device ids # adds a new entry
_whitelisted_ids = listdir(f"{home}/.config/sshyp/whitelist") def add_entry():
_device_ids = listdir(f"{home}/.config/sshyp/devices") # set to avoid PEP8 warnings
print('\n\u001b[1mquick-unlock whitelisted device ids:\u001b[0m') _shm_folder, _shm_entry = None, None
for _id in _whitelisted_ids:
print(_id)
print('\n\u001b[1mother registered device ids:\u001b[0m')
for _id in _device_ids:
if _id not in _whitelisted_ids:
print(_id)
print()
def whitelist_manage(): # adds or removes quick-unlock whitelisted device ids
if arg_count == 2:
whitelist_list()
_device_id = input('device id: ')
else:
_device_id = arguments[2]
if arguments[1] == 'add':
if _device_id in listdir(f"{home}/.config/sshyp/devices"):
open(f"{home}/.config/sshyp/whitelist/{_device_id}", 'w').write('')
whitelist_list()
else:
print(f"\n\u001b[38;5;9merror: device id ({_device_id}) is not registered\u001b[0m\n")
s_exit(1)
elif isfile(f"{home}/.config/sshyp/whitelist/{_device_id}"):
remove(f"{home}/.config/sshyp/whitelist/{_device_id}")
whitelist_list()
def add_entry(): # adds a new entry
_shm_folder, _shm_entry = None, None # set to avoid PEP8 warnings
if isfile(f"{directory}{entry_name}.gpg"): if isfile(f"{directory}{entry_name}.gpg"):
print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) already exists\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) already exists\u001b[0m\n")
s_exit(3) s_exit(3)
if arguments[2] in ('note', '-n'): # note entry
# note entry
if arguments[2] in ('note', '-n'):
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
run([editor, f"{tmp_dir}{_shm_folder}/{_shm_entry}-n"]) run([editor, f"{tmp_dir}{_shm_folder}/{_shm_entry}-n"])
_notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read() _notes = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}-n", 'r').read()
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(optimized_edit(['', '', '', _notes], None, -1)) open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(optimized_edit(['', '', '', _notes], None, -1))
else: # password entry else:
# password entry
_username = str(input('username: ')) _username = str(input('username: '))
_password = str(input('password: ')) _password = str(input('password: '))
_url = str(input('url: ')) _url = str(input('url: '))
@@ -583,7 +615,8 @@ def add_entry(): # adds a new entry
encrypt(directory + entry_name, _shm_folder, _shm_entry, gpg_id) encrypt(directory + entry_name, _shm_folder, _shm_entry, gpg_id)
def add_folder(): # creates a new folder # creates a new folder
def add_folder():
Path(directory + entry_name).mkdir(mode=0o700, parents=True, exist_ok=True) Path(directory + entry_name).mkdir(mode=0o700, parents=True, exist_ok=True)
if not ssh_error: if not ssh_error:
run(['ssh', '-i', f"{home}/.ssh/sshyp", '-p', port, f"{username_ssh}@{ip}", run(['ssh', '-i', f"{home}/.ssh/sshyp", '-p', port, f"{username_ssh}@{ip}",
@@ -591,41 +624,42 @@ def add_folder(): # creates a new folder
f'.mkdir(mode=0o700, parents=True, exist_ok=True)\'']) f'.mkdir(mode=0o700, parents=True, exist_ok=True)\''])
def rename(): # renames an entry or folder # renames an entry or folder
def rename():
from shutil import copy from shutil import copy
_file = True _file, _folder_disabler = True, False
if not exists(f"{directory}{entry_name}.gpg") and not exists(f"{directory}{entry_name}"): if not exists(f"{directory}{entry_name}.gpg") and not exists(f"{directory}{entry_name}"):
print(f"\n\u001b[38;5;9merror: (/{entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: (/{entry_name}) does not exist\u001b[0m\n")
s_exit(2) s_exit(2)
elif not isfile(f"{directory}{entry_name}.gpg"): elif not isfile(f"{directory}{entry_name}.gpg"):
_file = False _file = False
_new_name = str(input('new name: ')).strip('/') _new_name = str(input('new name: ')).strip('/')
if _file: # if renaming a file
if isfile(f"{directory}{_new_name}.gpg"): # check if the new file already exists # if renaming a file
if _file:
# check if the new file already exists
if isfile(f"{directory}{_new_name}.gpg"):
print(f"\n\u001b[38;5;9merror: (/{_new_name}) already exists\u001b[0m\n") print(f"\n\u001b[38;5;9merror: (/{_new_name}) already exists\u001b[0m\n")
s_exit(3) s_exit(3)
if not ssh_error: if not ssh_error:
copy(f"{directory}{entry_name}.gpg", f"{directory}{_new_name}.gpg") copy(f"{directory}{entry_name}.gpg", f"{directory}{_new_name}.gpg")
else: else:
move(f"{directory}{entry_name}.gpg", f"{directory}{_new_name}.gpg") move(f"{directory}{entry_name}.gpg", f"{directory}{_new_name}.gpg")
else: # if renaming a folder else:
if isdir(f"{directory}{_new_name}"): # check if the new folder already exists
print(f"\n\u001b[38;5;9merror: (/{_new_name}/) already exists\u001b[0m\n") # if renaming a folder
s_exit(3) print('\n\u001b[38;5;9merror: folder renaming disabled due to a bug causing severe data loss'
if not ssh_error: '- fixed in future release v1.5.0\u001b[0m\n')
Path(f"{directory}{_new_name}").mkdir(mode=0o700, parents=True, exist_ok=True) _folder_disabler = True
run(['ssh', '-i', f"{home}/.ssh/sshyp", '-p', port, f"{username_ssh}@{ip}", if not ssh_error and not _folder_disabler:
f'python3 -c \'from pathlib import Path; Path("{directory_ssh}{_new_name}")'
f'.mkdir(mode=0o700, parents=True, exist_ok=True)\''])
else:
move(f"{directory}{entry_name}", f"{directory}{_new_name}")
if not ssh_error:
run(['ssh', '-i', f"{home}/.ssh/sshyp", '-p', port, f"{username_ssh}@{ip}", run(['ssh', '-i', f"{home}/.ssh/sshyp", '-p', port, f"{username_ssh}@{ip}",
f'cd /lib/sshyp; python3 -c \'from sshync import delete; delete("{entry_name}", "remotely")\'']) f'cd /usr/lib/sshyp; python3 -c \'from sshync import delete; delete("{entry_name}", "remotely")\''])
def edit(): # edits the contents of an entry # edits the contents of an entry
_shm_folder, _shm_entry, _detail, _edit_line = None, None, None, None # set to avoid PEP8 warnings def edit():
# set to avoid PEP8 warnings
_shm_folder, _shm_entry, _detail, _edit_line = None, None, None, None
if not isfile(f"{directory}{entry_name}.gpg"): if not isfile(f"{directory}{entry_name}.gpg"):
print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) does not exist\u001b[0m\n")
s_exit(2) s_exit(2)
@@ -650,10 +684,13 @@ def edit(): # edits the contents of an entry
encrypt(directory + entry_name, _shm_folder, _shm_entry, gpg_id) encrypt(directory + entry_name, _shm_folder, _shm_entry, gpg_id)
def gen(): # generates a password for a new or an existing entry # generates a password for a new or an existing entry
_username, _url, _notes = None, None, None # set to avoid PEP8 warnings def gen():
# set to avoid PEP8 warnings
_username, _url, _notes = None, None, None
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
if arg_count == 3 and arguments[2] in ('update', '-u'): # gen update # gen update
if arg_count == 3 and arguments[2] in ('update', '-u'):
if not isfile(f"{directory}{entry_name}.gpg"): if not isfile(f"{directory}{entry_name}.gpg"):
print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) does not exist\u001b[0m\n")
s_exit(2) s_exit(2)
@@ -661,7 +698,8 @@ def gen(): # generates a password for a new or an existing entry
_new_lines = optimized_edit(open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines(), pass_gen(), 0) _new_lines = optimized_edit(open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines(), pass_gen(), 0)
open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_new_lines) open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'w').writelines(_new_lines)
remove(f"{directory}{entry_name}.gpg") remove(f"{directory}{entry_name}.gpg")
elif isfile(f"{directory}{entry_name}.gpg"): # gen # gen
elif isfile(f"{directory}{entry_name}.gpg"):
print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) already exists\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) already exists\u001b[0m\n")
s_exit(3) s_exit(3)
else: else:
@@ -681,7 +719,8 @@ def gen(): # generates a password for a new or an existing entry
encrypt(directory + entry_name, _shm_folder, _shm_entry, gpg_id) encrypt(directory + entry_name, _shm_folder, _shm_entry, gpg_id)
def copy_data(): # copies a specified field of an entry to the clipboard # copies a specified field of an entry to the clipboard
def copy_data():
from subprocess import Popen from subprocess import Popen
if not isfile(f"{directory}{entry_name}.gpg"): if not isfile(f"{directory}{entry_name}.gpg"):
print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry (/{entry_name}) does not exist\u001b[0m\n")
@@ -697,31 +736,49 @@ def copy_data(): # copies a specified field of an entry to the clipboard
_index = 2 _index = 2
elif arguments[2] in ('note', '-n'): elif arguments[2] in ('note', '-n'):
_index = 3 _index = 3
if 'WAYLAND_DISPLAY' in environ: # Wayland clipboard detection # PORT START CLIPBOARD
# WSL clipboard detection
if 'WSL_DISTRO_NAME' in environ:
run(['powershell.exe', '-c', "Set-Clipboard '" + _copy_line[_index].rstrip().replace("'", "''") + "'"])
Popen("sleep 30; powershell.exe -c Set-Clipboard ''", shell=True, stdout=DEVNULL, stderr=DEVNULL))
# Wayland clipboard detection
elif 'WAYLAND_DISPLAY' in environ:
run(['wl-copy', _copy_line[_index].rstrip()]) run(['wl-copy', _copy_line[_index].rstrip()])
Popen('sleep 30; wl-copy -c', shell=True) Popen('sleep 30; wl-copy -c', shell=True)
elif uname()[0] == 'Haiku': # Haiku clipboard detection # Haiku clipboard detection
elif uname()[0] == 'Haiku':
run(['clipboard', '-c', _copy_line[_index].rstrip()]) run(['clipboard', '-c', _copy_line[_index].rstrip()])
Popen('sleep 30; clipboard -r', shell=True) Popen('sleep 30; clipboard -r', shell=True)
elif exists("/data/data/com.termux"): # Termux (Android) clipboard detection # MacOS clipboard detection
elif uname()[0] == 'Darwin':
run(['pbcopy'], stdin=Popen(['printf', _copy_line[_index].rstrip().replace('\\', '\\\\').replace('%', '%%')],
stdout=PIPE).stdout)
Popen("sleep 30; printf '' | pbcopy", shell=True)
# Termux (Android) clipboard detection
elif exists("/data/data/com.termux"):
run(['termux-clipboard-set', _copy_line[_index].rstrip()]) run(['termux-clipboard-set', _copy_line[_index].rstrip()])
Popen("sleep 30; termux-clipboard-set ''", shell=True) Popen("sleep 30; termux-clipboard-set ''", shell=True)
else: # X11 clipboard detection # X11 clipboard detection
run(['xclip', '-sel', 'c'], stdin=Popen(['echo', '-n', _copy_line[_index].rstrip()], stdout=PIPE).stdout) else:
Popen("sleep 30; echo -n '' | xclip -sel c", shell=True) run(['xclip', '-sel', 'c'], stdin=Popen(['printf', _copy_line[_index].rstrip().replace('\\', '\\\\')
.replace('%', '%%')], stdout=PIPE).stdout)
Popen("sleep 30; printf '' | xclip -sel c", shell=True)
# PORT END CLIPBOARD
rmtree(f"{tmp_dir}{_shm_folder}") rmtree(f"{tmp_dir}{_shm_folder}")
def remove_data(): # deletes an entry from the server and flags it for local deletion on sync # deletes an entry from the server and flags it for local deletion on sync
def remove_data():
determine_decrypt(f"{home}/.config/sshyp/lock.gpg", None, None) determine_decrypt(f"{home}/.config/sshyp/lock.gpg", None, None)
if not ssh_error: if not ssh_error:
run(['ssh', '-i', f"{home}/.ssh/sshyp", '-p', port, f"{username_ssh}@{ip}", run(['ssh', '-i', f"{home}/.ssh/sshyp", '-p', port, f"{username_ssh}@{ip}",
f'cd /lib/sshyp; python3 -c \'from sshync import delete; delete("{entry_name}", "remotely")\'']) f'cd /usr/lib/sshyp; python3 -c \'from sshync import delete; delete("{entry_name}", "remotely")\''])
else: else:
offline_delete(entry_name, 'locally') offline_delete(entry_name, 'locally')
def extension_runner(): # checks extension config files for matches to argument, runs extensions # checks extension config files for matches to argument, runs extensions
def extension_runner():
from configparser import ConfigParser from configparser import ConfigParser
_output_com, _extension_dir = None, realpath(__file__).rsplit('/', 1)[0] + '/extensions/' _output_com, _extension_dir = None, realpath(__file__).rsplit('/', 1)[0] + '/extensions/'
if isdir(_extension_dir): if isdir(_extension_dir):
@@ -745,7 +802,8 @@ def extension_runner(): # checks extension config files for matches to argument
if __name__ == "__main__": if __name__ == "__main__":
try: try:
ssh_error, success_flag, sync_flag, silent_sync = False, False, False, False ssh_error, success_flag, sync_flag, silent_sync = False, False, False, False
arg_start, device_type = None, None # set to avoid PEP8 warnings # set to avoid PEP8 warnings
arg_start, device_type = None, None
# retrieve typed argument # retrieve typed argument
arguments = argv[1:] arguments = argv[1:]
arg_count = len(arguments) arg_count = len(arguments)
@@ -834,20 +892,23 @@ if __name__ == "__main__":
success_flag = True success_flag = True
read_shortcut() read_shortcut()
else: # server arguments # PORT START ARGS-SERVER
# server arguments
else:
if arg_count < 1: if arg_count < 1:
arguments.append('help') arguments.append('help')
print_info() print_info()
elif arg_count > 1 and arguments[0] == 'whitelist': elif arg_count == 2 and arguments[0] == 'whitelist':
if arguments[1] in ('list', '-l'): if arguments[1] in ('list', '-l'):
success_flag = True success_flag = True
whitelist_list() whitelist_list()
elif arguments[1] in ('add', 'del'):
success_flag = True
whitelist_manage()
elif arguments[1] == 'setup': elif arguments[1] == 'setup':
success_flag = True success_flag = True
whitelist_setup() whitelist_setup()
elif arg_count > 2 and arguments[1] in ('add', 'del'):
success_flag = True
whitelist_manage(arguments[2])
# PORT END ARGS-SERVER
if arg_count > 0 and success_flag == 0 and arguments[0] != 'sync': if arg_count > 0 and success_flag == 0 and arguments[0] != 'sync':
if device_type == 'client' and arguments[0] not in ('help', '-h', 'version', '-v', 'license'): if device_type == 'client' and arguments[0] not in ('help', '-h', 'version', '-v', 'license'):
+228 -101
View File
@@ -7,29 +7,45 @@ else
revision="$2" revision="$2"
fi fi
_create_generic() { _create_generic_linux() {
printf '\npackaging as generic...\n' printf '\npackaging as generic (Linux)...\n'
mkdir -p output/generictemp/usr/bin \ mkdir -p output/linuxtemp/usr/bin \
output/generictemp/usr/lib/sshyp/extensions \ output/linuxtemp/usr/lib/sshyp/extensions \
output/generictemp/usr/share/man/man1 \ output/linuxtemp/usr/share/man/man1 \
output/generictemp/usr/share/bash-completion/completions \ output/linuxtemp/usr/share/bash-completion/completions \
output/generictemp/usr/share/zsh/functions/Completion/Unix output/linuxtemp/usr/share/zsh/functions/Completion/Unix
cp -r lib/. output/generictemp/usr/lib/sshyp/ # START PORT
ln -s /usr/lib/sshyp/sshyp.py output/generictemp/usr/bin/sshyp cp -r lib/. port-jobs/working/
cp -r share output/generictemp/usr/ cd port-jobs
cp extra/completion.bash output/generictemp/usr/share/bash-completion/completions/sshyp ./CLIPBOARD.py LINUX
cp extra/completion.zsh output/generictemp/usr/share/zsh/functions/Completion/Unix/_sshyp ./UNAME.py LINUX
cp extra/manpage output/generictemp/usr/share/man/man1/sshyp.1 ./COMMENTS.py ALL
gzip output/generictemp/usr/share/man/man1/sshyp.1 ./BLANKS.py
XZ_OPT=-e6 tar -C output/generictemp -cvJf output/GENERIC-sshyp-"$version".tar.xz usr/ ./TABS.sh TABS
rm -rf output/generictemp cd ..
sha512="$(sha512sum output/GENERIC-sshyp-"$version".tar.xz | awk '{print $1;}')" mv port-jobs/working/* output/linuxtemp/usr/lib/sshyp/
printf '\ngeneric packaging complete\n\n' # 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 | awk '{print $1;}')"
printf '\ngeneric (Linux) packaging complete\n\n'
} && } &&
_create_pkgbuild() { _create_pkgbuild() {
local source='https://github.com/rwinkhart/sshyp/releases/download/v$pkgver/GENERIC-sshyp-$pkgver.tar.xz'
printf '\ngenerating PKGBUILD...\n' printf '\ngenerating PKGBUILD...\n'
if [ "$1" = 'Deb' ]; then
local source='https://github.com/rwinkhart/sshyp/releases/download/v"$pkgver"/UBUNTU-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> printf "# Maintainer: Randall Winkhart <idgr at tutanota dot com>
pkgname=sshyp pkgname=sshyp
pkgver="$version" pkgver="$version"
@@ -44,15 +60,32 @@ source=(\""$source"\")
sha512sums=('"$sha512"') sha512sums=('"$sha512"')
package() { package() {
tar xf GENERIC-sshyp-"\"\$pkgver\"".tar.xz -C "\"\${pkgdir}\"" tar -xf $decomp_target -C "\"\${pkgdir}\""
} }
" > output/PKGBUILD " > output/PKGBUILD
printf '\nPKGBUILD generated\n\n' printf '\nPKGBUILD generated\n\n'
} && } &&
_create_apkbuild() { _create_apkbuild() {
local source='https://github.com/rwinkhart/sshyp/releases/download/v$pkgver/GENERIC-sshyp-$pkgver.tar.xz'
printf '\ngenerating APKBUILD...\n' printf '\ngenerating APKBUILD...\n'
if [ "$1" = 'Deb' ]; then
local source="https://github.com/rwinkhart/sshyp/releases/download/v\"\$pkgver\"/UBUNTU-sshyp_\"\$pkgver\"-"$revision"_all.deb"
local sumsname="UBUNTU-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> printf "# Maintainer: Randall Winkhart <idgr@tutanota.com>
pkgname=sshyp pkgname=sshyp
pkgver="$version" pkgver="$version"
@@ -66,15 +99,11 @@ depends='python3 gnupg openssh xclip wl-clipboard'
source=\""$source"\" source=\""$source"\"
package() { package() {
mkdir -p "\"\$pkgdir\"" $processing
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=\" sha512sums=\"
"$sha512' 'GENERIC-sshyp-\"\$pkgver\".tar.xz" "$sha512" "$sumsname"
\" \"
" > output/APKBUILD " > output/APKBUILD
printf '\nAPKBUILD generated\n\n' printf '\nAPKBUILD generated\n\n'
@@ -88,35 +117,45 @@ _create_hpkg() {
output/haikutemp/documentation/man/man1 \ output/haikutemp/documentation/man/man1 \
output/haikutemp/data/bash-completion/completions \ output/haikutemp/data/bash-completion/completions \
output/haikutemp/data/zsh/site-functions output/haikutemp/data/zsh/site-functions
printf "name sshyp printf "name sshyp_client
version "$version"-"$revision" version "$version"-"$revision"
architecture any architecture any
summary \"A light-weight, self-hosted, synchronized password manager\" summary \"A light-weight, self-hosted, synchronized password manager (client only)\"
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.\" 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>\" packager \"Randall Winkhart <idgr at tutanota dot com>\"
vendor \"Randall Winkhart\" vendor \"Randall Winkhart\"
licenses { licenses {
\"GNU GPL v3\" \"GNU GPL v3\"
} }
copyrights { copyrights {
\"2021-2023 Randall Winkhart\" \"2021-2023 Randall Winkhart\"
} }
provides { provides {
sshyp = "$version" sshyp_client = "$version"
cmd:sshyp cmd:sshyp
} }
requires { requires {
gnupg gnupg
openssh openssh
python310 python310
} }
urls { urls {
\"https://github.com/rwinkhart/sshyp\" \"https://github.com/rwinkhart/sshyp\"
} }
" > output/haikutemp/.PackageInfo " > output/haikutemp/.PackageInfo
cp -r lib/. output/haikutemp/lib/sshyp/ # START PORT
sed -i '1 s/.*/#!\/bin\/env\ python3.10/' output/haikutemp/lib/sshyp/sshync.py cp -r lib/. port-jobs/working/
sed -i '1 s/.*/#!\/bin\/env\ python3.10/' output/haikutemp/lib/sshyp/sshyp.py cd port-jobs
./SHEBANG.sh
./RMSERVER.py
./CLIPBOARD.py HAIKU
./COMMENTS.py ALL
./UNAME.py TMP
./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 ln -s /system/lib/sshyp/sshyp.py output/haikutemp/bin/sshyp
cp -r share/doc/sshyp/. output/haikutemp/documentation/packages/sshyp/ cp -r share/doc/sshyp/. output/haikutemp/documentation/packages/sshyp/
cp -r share/licenses/sshyp/. output/haikutemp/documentation/packages/sshyp/ cp -r share/licenses/sshyp/. output/haikutemp/documentation/packages/sshyp/
@@ -125,16 +164,16 @@ urls {
cp extra/manpage output/haikutemp/documentation/man/man1/sshyp.1 cp extra/manpage output/haikutemp/documentation/man/man1/sshyp.1
gzip output/haikutemp/documentation/man/man1/sshyp.1 gzip output/haikutemp/documentation/man/man1/sshyp.1
cd output/haikutemp cd output/haikutemp
package create -b HAIKU-sshyp-"$version"-"$revision"_all.hpkg package create -b HAIKU-sshyp-client-"$version"-"$revision"_all.hpkg
package add HAIKU-sshyp-"$version"-"$revision"_all.hpkg bin lib documentation data package add HAIKU-sshyp-client-"$version"-"$revision"_all.hpkg bin lib documentation data
cd ../.. cd ../..
mv output/haikutemp/HAIKU-sshyp-"$version"-"$revision"_all.hpkg output/ mv output/haikutemp/HAIKU-sshyp-client-"$version"-"$revision"_all.hpkg output/
rm -rf output/haikutemp rm -rf output/haikutemp
printf '\nHaiku packaging complete\n\n' printf '\nHaiku packaging complete\n\n'
} && } &&
_create_deb() { _create_deb() {
printf '\npackaging for Debian/Ubuntu...\n' printf "\npackaging for $1...\n"
mkdir -p output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN \ 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/lib/sshyp/extensions \
output/debiantemp/sshyp_"$version"-"$revision"_all/usr/bin \ output/debiantemp/sshyp_"$version"-"$revision"_all/usr/bin \
@@ -147,22 +186,46 @@ Section: utils
Architecture: all Architecture: all
Maintainer: Randall Winkhart <idgr at tutanota dot com> Maintainer: Randall Winkhart <idgr at tutanota dot com>
Description: A light-weight, self-hosted, synchronized password manager Description: A light-weight, self-hosted, synchronized password manager
Depends: python3, gnupg, openssh-client, xclip, wl-clipboard
Suggests: bash-completion
Priority: optional
Installed-Size: 14584
" > output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control " > output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control
cp -r lib/. output/debiantemp/sshyp_"$version"-"$revision"_all/usr/lib/sshyp/ if [ "$1" = 'Debian' ]; then
printf "Depends: python3, gnupg, openssh-client, xclip, wl-clipboard
" >> output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control
else
printf "Depends: python3, gnupg, openssh-client
" >> output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control
fi
printf "Suggests: bash-completion
Priority: optional
Installed-Size: 71680
" >> output/debiantemp/sshyp_"$version"-"$revision"_all/DEBIAN/control
# START PORT
cp -r lib/. port-jobs/working/
cd port-jobs
if [ "$1" = 'Debian' ]; then
./CLIPBOARD.py LINUX
special=UBUNTU
else
./CLIPBOARD.py WSL
special=WSL-ONLY-UBUNTU
fi
./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 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 -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.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/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 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 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/ dpkg-deb --build --root-owner-group -z6 -Sextreme -Zxz output/debiantemp/sshyp_"$version"-"$revision"_all/
mv output/debiantemp/sshyp_"$version"-"$revision"_all.deb output/DEBIAN-sshyp_"$version"-"$revision"_all.deb mv output/debiantemp/sshyp_"$version"-"$revision"_all.deb output/"$special"-sshyp_"$version"-"$revision"_all.deb
rm -rf output/debiantemp rm -rf output/debiantemp
printf '\nDebian/Ubuntu packaging complete\n\n' sha512="$(sha512sum output/"$special"-sshyp_"$version"-"$revision"_all.deb | awk '{print $1;}')"
printf "\n$1 packaging complete\n\n"
} && } &&
_create_termux() { _create_termux() {
@@ -172,7 +235,7 @@ _create_termux() {
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/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/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/bash-completion/completions \
output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/zsh/functions/Completion/Unix output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/zsh/site-functions
printf "Package: sshyp printf "Package: sshyp
Version: $version Version: $version
Section: utils Section: utils
@@ -182,16 +245,26 @@ Description: A light-weight, self-hosted, synchronized password manager
Depends: python, gnupg, openssh, termux-api, termux-am Depends: python, gnupg, openssh, termux-api, termux-am
Suggests: bash-completion Suggests: bash-completion
Priority: optional Priority: optional
Installed-Size: 14584 Installed-Size: 71680
" > output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/DEBIAN/control " > output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/DEBIAN/control
cp -r lib/. output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/lib/sshyp/ # START PORT
cp -r lib/. port-jobs/working/
cd port-jobs
./CLIPBOARD.py TERMUX
./UNAME.py TERMUX
./COMMENTS.py ALL
./BLANKS.py
./TABS.sh TABS
cd ..
mv port-jobs/working/* output/termuxtemp/sshyp_"$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/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/bin/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 -r share output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/
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.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/completion.zsh output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/zsh/site-functions/_sshyp
cp extra/manpage output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/data/data/com.termux/files/usr/share/man/man1/sshyp.1 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 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/ dpkg-deb --build --root-owner-group -z6 -Sextreme -Zxz output/termuxtemp/sshyp_"$version"-"$revision"_all_termux/
mv output/termuxtemp/sshyp_"$version"-"$revision"_all_termux.deb output/TERMUX-sshyp_"$version"-"$revision"_all_termux.deb mv output/termuxtemp/sshyp_"$version"-"$revision"_all_termux.deb output/TERMUX-sshyp_"$version"-"$revision"_all_termux.deb
rm -rf output/termuxtemp rm -rf output/termuxtemp
printf '\nTermux packaging complete\n\n' printf '\nTermux packaging complete\n\n'
@@ -201,7 +274,11 @@ _create_rpm() {
printf '\npackaging for Fedora...\n' printf '\npackaging for Fedora...\n'
rm -rf ~/rpmbuild rm -rf ~/rpmbuild
rpmdev-setuptree rpmdev-setuptree
cp output/GENERIC-sshyp-"$version".tar.xz ~/rpmbuild/SOURCES 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 printf "Name: sshyp
Version: "$version" Version: "$version"
Release: "$revision" Release: "$revision"
@@ -209,29 +286,49 @@ Summary: A light-weight, self-hosted, synchronized password manager
BuildArch: noarch BuildArch: noarch
License: GPL-3.0-only License: GPL-3.0-only
URL: https://github.com/rwinkhart/sshyp URL: https://github.com/rwinkhart/sshyp
Source0: GENERIC-sshyp-"$version".tar.xz Source0: GENERIC-FEDORA-sshyp-"$version".tar.xz
Requires: python gnupg openssh-clients wl-clipboard Requires: python gnupg openssh-clients wl-clipboard
Recommends: bash-completion Recommends: bash-completion
%description %%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. 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 %%install
tar xf %{_sourcedir}/GENERIC-sshyp-"$version".tar.xz -C %{_sourcedir} tar xf %%{_sourcedir}/GENERIC-FEDORA-sshyp-"$version".tar.xz -C %%{_sourcedir}
cp -r %{_sourcedir}/usr %{buildroot} cp -r %%{_sourcedir}/usr %%{buildroot}
%files %%files
/usr/bin/sshyp /usr/bin/sshyp
/usr/lib/sshyp/sshyp.py /usr/lib/sshyp/sshyp.py
/usr/lib/sshyp/sshync.py /usr/lib/sshyp/sshync.py
/usr/share/bash-completion/completions/sshyp /usr/share/bash-completion/completions/sshyp
/usr/share/zsh/functions/Completion/Unix/_sshyp /usr/share/zsh/site-functions/_sshyp
%license /usr/share/licenses/sshyp/license %%license /usr/share/licenses/sshyp/license
%doc %%doc
/usr/share/doc/sshyp/changelog /usr/share/doc/sshyp/changelog
/usr/share/man/man1/sshyp.1.gz /usr/share/man/man1/sshyp.1.gz
" > ~/rpmbuild/SPECS/sshyp.spec " > ~/rpmbuild/SPECS/sshyp.spec
rpmbuild -bb ~/rpmbuild/SPECS/sshyp.spec # START PORT
mv ~/rpmbuild/RPMS/noarch/sshyp-"$version"-"$revision".noarch.rpm output/FEDORA-sshyp-"$version"-"$revision".noarch.rpm cp -r lib/. port-jobs/working/
rm -rf ~/rpmbuild cd port-jobs
printf '\nFedora packaging complete\n\n' ./CLIPBOARD.py LINUX
./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'
} && } &&
_create_freebsd_pkg() { _create_freebsd_pkg() {
@@ -275,55 +372,73 @@ printf "/usr/bin/sshyp
/usr/share/licenses/sshyp/license /usr/share/licenses/sshyp/license
/usr/share/man/man1/sshyp.1.gz /usr/share/man/man1/sshyp.1.gz
" > output/freebsdtemp/plist " > output/freebsdtemp/plist
cp -r lib/. output/freebsdtemp/usr/lib/sshyp/ # START PORT
ln -s /usr/lib/sshyp/sshyp.py output/freebsdtemp/usr/bin/sshyp cp -r lib/. port-jobs/working/
cp -r share output/freebsdtemp/usr/ cd port-jobs
cp extra/completion.bash output/freebsdtemp/usr/local/share/bash-completion/completions/sshyp ./CLIPBOARD.py TERMUX
cp extra/completion.zsh output/freebsdtemp/usr/local/share/zsh/site-functions/_sshyp ./UNAME.py TMP
cp extra/manpage output/freebsdtemp/usr/share/man/man1/sshyp.1 ./COMMENTS.py ALL
gzip output/freebsdtemp/usr/share/man/man1/sshyp.1 ./BLANKS.py
pkg create -m output/freebsdtemp/ -r output/freebsdtemp/ -p output/freebsdtemp/plist -o output/ ./TABS.sh TABS
mv output/sshyp-"$version".pkg output/FREEBSD-sshyp-"$version"-"$revision".pkg cd ..
rm -rf output/freebsdtemp mv port-jobs/working/* output/freebsdtemp/usr/lib/sshyp/
printf '\nFreeBSD packaging complete\n\n' # 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'
} && } &&
case "$1" in case "$1" in
generic)
_create_generic
;;
pkgbuild) pkgbuild)
_create_generic _create_generic_linux
_create_pkgbuild _create_pkgbuild Generic
;;
pkgbuild-deb)
_create_deb Debian
_create_pkgbuild Deb
;; ;;
apkbuild) apkbuild)
_create_generic _create_generic_linux
_create_apkbuild _create_apkbuild Generic
;;
apkbuild-deb)
_create_deb Debian
_create_apkbuild Deb
;; ;;
haiku) haiku)
_create_hpkg _create_hpkg
;; ;;
debian) debian)
_create_deb _create_deb Debian
;;
wsl)
_create_deb WSL
;; ;;
termux) termux)
_create_termux _create_termux
;; ;;
fedora) fedora)
_create_generic
_create_rpm _create_rpm
;; ;;
freebsd) freebsd)
_create_freebsd_pkg _create_freebsd_pkg
;; ;;
buildable-arch) buildable-arch)
_create_generic _create_generic_linux
_create_pkgbuild _create_pkgbuild Generic
_create_apkbuild _create_apkbuild Generic
case "$(pacman -Q dpkg)" in case "$(pacman -Q dpkg)" in
dpkg*) dpkg*)
_create_deb
_create_termux _create_termux
_create_deb WSL
_create_deb Debian
;; ;;
esac esac
case "$(pacman -Q freebsd-pkg)" in case "$(pacman -Q freebsd-pkg)" in
@@ -332,7 +447,19 @@ case "$1" in
;; ;;
esac 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 mainline: pkgbuild apkbuild haiku fedora debian\n experimental: freebsd termux\n other: buildable-arch\n\n' printf '\nusage: package.sh [target] <revision>\n\ntargets:\n mainline: pkgbuild pkgbuild-deb apkbuild apkbuild-deb fedora debian wsl haiku freebsd\n experimental: termux\n groups: buildable-arch buildable-arch-deb\n\n'
;; ;;
esac 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)
+50
View File
@@ -0,0 +1,50 @@
#!/usr/bin/env python3
import re
from sys import argv, exit as s_exit
# read arguments
arguments = argv[1:]
# define replacement text depending on arguments
if len(arguments) > 0:
if arguments[0] == 'WSL':
replacement = """run(['powershell.exe', '-c', "Set-Clipboard '" + _copy_line[_index].rstrip().replace("'", "''") + "'"])
Popen("sleep 30; powershell.exe -c Set-Clipboard ''", shell=True, stdout=DEVNULL, stderr=DENVULL)"""
elif arguments[0] == 'MAC':
replacement = """run(['pbcopy'], stdin=Popen(['printf', _copy_line[_index].rstrip().replace('\\\\\\', '\\\\\\\\\\\\\\').replace('%', '%%')],
stdout=PIPE).stdout)
Popen("sleep 30; printf '' | pbcopy", shell=True)"""
elif arguments[0] == 'HAIKU':
replacement = """run(['clipboard', '-c', _copy_line[_index].rstrip()])
Popen('sleep 30; clipboard -r', shell=True)"""
elif arguments[0] == 'TERMUX':
replacement = """run(['termux-clipboard-set', _copy_line[_index].rstrip()])
Popen("sleep 30; termux-clipboard-set ''", shell=True)"""
elif arguments[0] == 'BSD':
replacement = """run(['xclip', '-sel', 'c'], stdin=Popen(['printf', _copy_line[_index].rstrip().replace('\\', '\\\\')
.replace('%', '%%')], stdout=PIPE).stdout)
Popen("sleep 30; printf '' | xclip -sel c", shell=True)"""
elif arguments[0] == 'LINUX':
replacement = """if 'WAYLAND_DISPLAY' in environ:
run(['wl-copy', _copy_line[_index].rstrip()])
Popen('sleep 30; wl-copy -c', shell=True)
else:
run(['xclip', '-sel', 'c'], stdin=Popen(['printf', _copy_line[_index].rstrip().replace('\\\\\\', '\\\\\\\\\\\\\\')
.replace('%', '%%')], stdout=PIPE).stdout)
Popen("sleep 30; printf '' | xclip -sel c", shell=True)"""
else:
s_exit()
# define PORT target
string1 = '# PORT START CLIPBOARD'
string2 = '# PORT END CLIPBOARD'
# read input file
text = open('working/sshyp.py', 'r').read()
# find and replace the defined PORT target
regex = re.compile(f"{string1}.*?{string2}", re.DOTALL)
new_text = re.sub(regex, replacement, text)
# write updated text
open('working/sshyp.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)
+82
View File
@@ -0,0 +1,82 @@
#!/usr/bin/env python3
import re
# SSHYNC-REMOTE
# define PORT target
string1 = '# PORT START SSHYNC-REMOTE'
string2 = '# PORT END SSHYNC-REMOTE'
# read input file
text = open('working/sshync.py', 'r').read()
# find and replace the defined PORT target
regex = re.compile(f"\n{string1}.*?{string2}\n\n", re.DOTALL)
new_text = re.sub(regex, '', text)
# write updated text
open('working/sshync.py', 'w').write(new_text)
# WHITELIST-SERVER
# define PORT target
string1 = '# PORT START WHITELIST-SERVER'
string2 = '# PORT END WHITELIST-SERVER'
# read input file
text = open('working/sshyp.py', 'r').read()
# find and replace the defined PORT target
regex = re.compile(f"\n{string1}.*?{string2}\n\n", re.DOTALL)
new_text = re.sub(regex, '', text)
# write updated text
open('working/sshyp.py', 'w').write(new_text)
# TWEAK-DEVTYPE
# define PORT target
string1 = '# PORT START TWEAK-DEVTYPE'
string2 = '# PORT END TWEAK-DEVTYPE'
# set replacement text
replacement = """if True:
_sshyp_data = ['client']
Path(f"{home}/.local/share/sshyp").mkdir(mode=0o700, parents=True, exist_ok=True)"""
# read input file
text = open('working/sshyp.py', 'r').read()
# find and replace the defined PORT target
regex = re.compile(f"{string1}.*?{string2}", re.DOTALL)
new_text = re.sub(regex, replacement, text)
# write updated text
open('working/sshyp.py', 'w').write(new_text)
# ARGS-SERVER
# define PORT target
string1 = '# PORT START ARGS-SERVER'
string2 = '# PORT END ARGS-SERVER'
# read input file
text = open('working/sshyp.py', 'r').read()
# find and replace the defined PORT target
regex = re.compile(f"{string1}.*?{string2}\n\n ", re.DOTALL)
new_text = re.sub(regex, '', text)
# write updated text
open('working/sshyp.py', 'w').write(new_text)
# HELP-SERVER
# define PORT target
string1 = '# PORT START HELP-SERVER'
string2 = '# PORT END HELP-SERVER'
# read input file
text = open('working/sshyp.py', 'r').read()
# find and replace the defined PORT target
regex = re.compile(f"{string1}.*?{string2}\n", re.DOTALL)
new_text = re.sub(regex, '', text)
# write updated text
open('working/sshyp.py', 'w').write(new_text)
+5
View File
@@ -0,0 +1,5 @@
#!/bin/sh
if [ "$1" = 'HAIKU' ]; then
sed -i '1 s/.*/#!\/bin\/env\ python3.10/' ./working/sshync.py
sed -i '1 s/.*/#!\/bin\/env\ python3.10/' ./working/sshyp.py
fi
+16
View File
@@ -0,0 +1,16 @@
#!/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
mv working/sshyp.py.new working/sshyp.py
mv working/sshync.py.new working/sshync.py
chmod +x working/sshyp.py working/sshync.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
+47
View File
@@ -0,0 +1,47 @@
#!/usr/bin/env python3
import re
from sys import argv, exit as s_exit
# read arguments
arguments = argv[1:]
# define replacement text depending on arguments
if len(arguments) > 0:
if arguments[0] == 'TMP':
replacement = 'symlink("/tmp", f"{home}/.config/sshyp/tmp")'
elif arguments[0] == 'TERMUX':
replacement = 'symlink("/data/data/com.termux/files/usr/tmp", f"{home}/.config/sshyp/tmp")'
elif arguments[0] == 'LINUX':
replacement = 'symlink("/dev/shm", f"{home}/.config/sshyp/tmp")'
else:
s_exit()
# UNAME-IMPORT
# define PORT target
string1 = '# PORT START UNAME-IMPORT'
string2 = '# PORT END UNAME-IMPORT'
# read input file
text = open('working/sshyp.py', 'r').read()
# find and replace the defined PORT target
regex = re.compile(f"{string1}.*?{string2}\n", re.DOTALL)
new_text = re.sub(regex, '', text)
# write updated text
open('working/sshyp.py', 'w').write(new_text)
# UNAME-TMP
# define PORT target
string1 = '# PORT START UNAME-TMP'
string2 = '# PORT END UNAME-TMP'
# read input file
text = open('working/sshyp.py', 'r').read()
# find and replace the defined PORT target
regex = re.compile(f"{string1}.*?{string2}", re.DOTALL)
new_text = re.sub(regex, replacement, text)
# write updated text
open('working/sshyp.py', 'w').write(new_text)
+18 -15
View File
@@ -1,24 +1,27 @@
sshyp v1.4.1 sshyp v1.4.3
06/08/2023
the argumentative agronomist update - patch one the argumentative agronomist update - patch three
this release improves sshyp's shell completions by adding zsh support and significantly optimizing and improving Bash support 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)
user-facing features: this is a highly unconventional release featuring backports to fix critical bugs found during the
development of the upcoming v1.5.0
- zsh completion support fixes:
^ ensure modern completions are enabled in your ~/.zshrc
fixes/optimizations: - 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
- Bash completions are now much faster due to the use of recursive globbing to be updated - to avoid breaking compatibility with 1.4.X, folder renaming was simply disabled
- Bash completions have been modified to be functionally similar to the new zsh completions for the time being
- backported fix for syncing over IPv6
other notable changes: - backported fix for multiple versions of Powershell being called under WSL
- backported fix for checking /lib/sshyp instead of /usr/lib/sshyp
- some official packages now use more space-efficient compression
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
The full history of changes to "sshyp" can be found on the following page: The full history of changes to "sshyp" can be found on the following page:
https://raw.githubusercontent.com/rwinkhart/sshyp/main/extra/changelog-total https://github.com/rwinkhart/sshyp/tree/main/extra/changelog-archive/