Compare commits

...

1027 Commits
ask ... main

Author SHA1 Message Date
Zack Scholl f6012939f3 v10.1.1 2024-11-28 03:02:27 -08:00
Zack Scholl bda3dcc670 Remove stun Fixes #849 2024-11-28 03:01:12 -08:00
Zack a96e7945e1
Merge pull request #847 from Ozoniuss/finish-qr-code
Add a qrcode flag
2024-11-24 03:41:38 -08:00
Ozoniuss 278e1b4099
Add a qrcode flag
- Introduces a new flag which allows displaying the receive command
  using a qr code.
- Adds a newline after the message indicating that the code was copied
  to the clipboard.
2024-11-24 13:33:38 +02:00
Zack c369c78b42
Merge pull request #843 from matthewfeickert/docs/add-conda-forge
docs: Add conda-forge install instructions for pixi and conda
2024-11-13 11:20:34 -08:00
Matthew Feickert a61a461436
docs: Add conda-forge install instructions for pixi and conda
* The conda-forge build supports Linux, macOS, and Windows.
   - c.f. https://github.com/conda-forge/croc-feedstock/
2024-11-13 12:17:51 -07:00
Zack d616b8fff7
Merge pull request #837 from gamagoat/mask-pass
Mask password in logs
2024-11-12 18:25:49 -08:00
gamagoat 3252f2abb2 Mask password in logs 2024-11-13 10:03:23 +09:00
Zack Scholl 53323cb8c4 v10.1.0 2024-11-08 15:29:45 -08:00
Zack Scholl d7ebb3d97c update dependencies 2024-11-08 15:28:48 -08:00
Zack 30684fb383
Merge pull request #825 from davidwoood/main
chore: fix some function names in comment
2024-10-21 01:23:03 -07:00
David Wood 09376c5c4b
chore: fix some function names in comment 2024-10-21 14:58:54 +08:00
Zack 917d9f16b4
Merge pull request #824 from bitraid/improve-clipboard-copy
Improve clipboard copy
2024-10-12 06:28:44 -07:00
bitraid 1adf845284
clipboard copy: add Linux/Wayland support 2024-10-12 14:53:48 +03:00
bitraid 10bd3b47e9
clipboard copy: don't run clip through cmd on Windows 2024-10-12 13:51:24 +03:00
Zack 0d48e346ad
Merge pull request #822 from elliot40404/feature/copy-to-clipboard
Added copy to clipboard functionality for windows,linux and mac
2024-10-07 15:30:15 -07:00
Elliot 234eb86f69
fixed log statement formatting error 2024-10-08 02:02:58 +05:30
Elliot 856e1c966e
Added copy to clipboard functionality for windows,linux and mac 2024-10-07 03:59:48 +05:30
Zack Scholl 12cc09f6e5 chore: update dependencies 2024-10-06 06:46:14 -07:00
Zack 7470ed1ea2 replace gortc.io Fixes #821 2024-10-05 15:49:25 -07:00
Zack 555cfc085a
Merge pull request #818 from schollz:schollz/issue817
add option -multicast to change multicast address
2024-10-03 20:06:46 -07:00
Zack Scholl 325cff6661 add option -multicast to change multicast address
Fixes #817
2024-10-03 20:06:32 -07:00
Zack Scholl 71369dee36 upgrade deps 2024-10-03 20:01:53 -07:00
Zack Scholl 146f6413a9 fix release.yml 2024-10-01 07:27:45 -07:00
Zack Scholl 38acf6f7e3 update deps 2024-10-01 07:25:09 -07:00
Zack Scholl 81d3593164 v10.0.13 2024-10-01 07:24:36 -07:00
Zack Scholl 3ca13a405f update builds 2024-10-01 06:56:15 -07:00
Zack Scholl b0a01a6634 fix ci 2024-10-01 06:50:07 -07:00
Zack Scholl c1392acb70 minimum go version 1.22 2024-10-01 06:37:55 -07:00
Zack Scholl 73ca44f064 inline dependencies 2024-10-01 06:36:57 -07:00
Zack Scholl a7235e1fcd fix ci 2024-10-01 06:10:08 -07:00
Zack Scholl 7bb1ea7a01 fix ci 2024-10-01 06:06:36 -07:00
Zack Scholl 4266ff0e41 fix ci 2024-10-01 06:02:10 -07:00
Zack Scholl 2d9769837f go mod tidy 2024-10-01 05:56:11 -07:00
Zack Scholl c275151ae4 add builds to CI 2024-10-01 05:55:09 -07:00
Zack 9231dc6bdd
Merge pull request #814 from schollz/dependabot/go_modules/github.com/schollz/progressbar/v3-3.16.0
build(deps): bump github.com/schollz/progressbar/v3 from 3.14.6 to 3.16.0
2024-10-01 05:50:44 -07:00
dependabot[bot] 2e18768770
build(deps): bump github.com/schollz/progressbar/v3
Bumps [github.com/schollz/progressbar/v3](https://github.com/schollz/progressbar) from 3.14.6 to 3.16.0.
- [Release notes](https://github.com/schollz/progressbar/releases)
- [Commits](https://github.com/schollz/progressbar/compare/v3.14.6...v3.16.0)

---
updated-dependencies:
- dependency-name: github.com/schollz/progressbar/v3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-24 08:46:08 +00:00
Zack Scholl 5c5e00310a benchmark new 2024-09-23 05:25:38 -07:00
Zack 9be175f1b0
Merge pull request #811 from schollz:schollz/issue796
fix: check whether path separator + ..
2024-09-17 06:39:31 -07:00
Zack Scholl 8c4594ad31 fix: check whether path separator + .. 2024-09-17 06:39:04 -07:00
Zack Scholl 519ce8c669 chore: update dependencies 2024-09-06 08:34:46 -07:00
Zack 76b1df5096 rm logging from main.go 2024-09-05 08:00:33 -07:00
Zack Scholl d6f1a63b7b update dependencies 2024-09-05 06:48:43 -07:00
Zack d0da7aafa2
Merge pull request #803 from schollz/dependabot/go_modules/golang.org/x/sys-0.25.0
build(deps): bump golang.org/x/sys from 0.24.0 to 0.25.0
2024-09-05 06:43:22 -07:00
dependabot[bot] ca8c36f38b
build(deps): bump golang.org/x/sys from 0.24.0 to 0.25.0
Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.24.0 to 0.25.0.
- [Commits](https://github.com/golang/sys/compare/v0.24.0...v0.25.0)

---
updated-dependencies:
- dependency-name: golang.org/x/sys
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-05 08:05:41 +00:00
Zack f9241b73fd
Merge pull request #801 from schollz:schollz/issue799
Schollz/issue799
2024-09-03 18:28:53 +02:00
Zack bb74eafd36 Remove Temporary Files if the program terminates abnormal.
Fixes #799
2024-09-03 09:28:42 -07:00
Zack 149d7364fb simplify cleanup 2024-09-03 09:16:07 -07:00
Zack cdf3aa0a31
Merge pull request #800 from Prince-Bhagat/adding-temp-directory-for-managing-temporary-files
Remove Temporary Files if the program terminates abnormal
2024-09-03 18:10:37 +02:00
Prince e663aa90cb updated log message 2024-09-03 19:49:56 -07:00
Prince 986d005449 removed unnessary file 2024-09-03 19:43:28 -07:00
Prince 0d8e4e10d6 added cleanup function to remove temporary file 2024-09-03 18:56:46 -07:00
Prince 95de3790d7 added signal for programme termination 2024-09-03 18:27:19 -07:00
Zack Scholl defee4b4f6 disable diskusage 2024-09-01 15:24:10 -07:00
Zack Scholl c146b150b8 fix mismatch 2024-09-01 14:47:40 -07:00
Zack a29b8e6d1d 10.0.11 -> 10.0.12 2024-09-01 14:38:55 -07:00
Zack 4c1facd68e chore: update deps 2024-09-01 14:37:33 -07:00
Zack 0f1d75a2ef refactor formatter 2024-09-01 14:35:36 -07:00
Zack 0017def27c
Merge pull request #794 from asukaminato0721/term.GetSize
use term.GetSize
2024-09-01 23:27:34 +02:00
Asuka Minato 319a403082 fix long file name 2024-09-01 21:39:40 +09:00
Asuka Minato 90ed1f797e add error handling 2024-08-31 00:23:21 +09:00
Asuka Minato bc9dbfd905 use term.GetSize 2024-08-31 00:08:25 +09:00
Zack 01609df902
Merge pull request #789 from schollz/dependabot/go_modules/github.com/kalafut/imohash-1.1.0
build(deps): bump github.com/kalafut/imohash from 1.0.4 to 1.1.0
2024-08-30 07:23:56 +02:00
Zack 6fbb02c196
Merge pull request #792 from schollz/schollz/issue791
feature: gracefully exit when not enough disk space
2024-08-30 07:17:30 +02:00
Zack Scholl 1b81055552 feature: gracefully exit when not enough disk space
Fixes #791
2024-08-29 22:16:12 -07:00
dependabot[bot] de623679fb
build(deps): bump github.com/kalafut/imohash from 1.0.4 to 1.1.0
Bumps [github.com/kalafut/imohash](https://github.com/kalafut/imohash) from 1.0.4 to 1.1.0.
- [Release notes](https://github.com/kalafut/imohash/releases)
- [Changelog](https://github.com/kalafut/imohash/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kalafut/imohash/compare/v1.0.4...v1.1.0)

---
updated-dependencies:
- dependency-name: github.com/kalafut/imohash
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-28 08:56:51 +00:00
Zack Scholl f8cf2eeb82 Revert "update to imohash v1.1.0 (Fixes #786)"
This reverts commit 565f252628.
2024-08-27 23:22:00 -07:00
Zack Scholl 565f252628 update to imohash v1.1.0 (Fixes #786) 2024-08-27 21:44:39 -07:00
Zack d49aaa05fe
Merge pull request #785 from nhtzr/feature/message
Show recommended croc commands for both Windows and Linux/OSX
2024-08-16 20:47:04 -07:00
vi'01-1'et df5b2994f6 Update cli.go to use inline environment variables instead of export
Also removed unnecessary quotes
2024-08-16 21:36:49 -06:00
Ezequiel Rosas 1a43826308 Make receive instructions copypaste-able 2024-08-13 12:50:48 -06:00
Zack 69af916d36 chore: update dependencies 2024-08-07 19:28:05 -07:00
Zack Scholl bf26db019c v10.0.11 2024-07-30 10:07:37 -07:00
Zack Scholl 35bf1548c4 chore: update dependencies 2024-07-30 10:07:02 -07:00
Zack Scholl f7bad72f6a chore: debug mode prints more information 2024-07-30 10:06:01 -07:00
Zack Scholl f32d060bef support for armv8l Fixes #769 2024-07-30 09:47:54 -07:00
Zack 6f3e0f1eaf
Merge pull request #767 from tnothy/fix-throttling-upload-speed-limit
fix upload speed throttling
2024-07-29 12:58:56 -07:00
tnothy 8681a4dc6d fix upload speed throttling 2024-07-29 21:46:25 +02:00
Zack 07c0a804d7 chore: update dependencies 2024-07-29 12:22:11 -07:00
Zack 5b93408c6e chore: update deps, change multicast address 2024-07-29 12:20:22 -07:00
Zack dccd6fe395
Merge pull request #766 from tnothy/fix-restore-ignored-test
fix test case name
2024-07-29 06:19:25 -07:00
tnothy 5a6f36626d fix test case name 2024-07-28 21:23:56 +02:00
Zack Scholl 677f44da6d check if busybox 2024-07-28 08:35:19 -07:00
Zack 66efe74094
Merge pull request #762 from doc75/fix_install_warning
prevent error message before insstalling completion file for non root user
2024-07-28 08:19:51 -07:00
Zack 5da253e940
Merge pull request #763 from tnothy/ports-and-transfers
define relay ports by amount
2024-07-28 08:18:51 -07:00
Zack Scholl e439b65daa fix tests 2024-07-28 08:18:21 -07:00
tnothy 6413c1c3e1 define relay ports by amount 2024-07-28 09:56:43 +02:00
Zack Scholl ce3c65ef1d chore: spelling 2024-07-27 10:44:30 -07:00
Guillaume Virlet 42bb64c434 prevent error message before insstalling completion file for non root user 2024-07-27 10:14:14 +02:00
Zack 8f226f72b6 print bytes 2024-07-25 08:41:48 -07:00
Zack 4f1a6a8d4f prevent more filenames 2024-07-25 08:36:56 -07:00
Zack 9235c341f9
Merge pull request #761 from schollz/schollz/issue756 2024-07-25 08:26:09 -07:00
Zack b2f446fd6b croc --classic Yes/no prompt default is backwards
Fixes #756
2024-07-25 08:25:54 -07:00
Zack 5ea4661e4b fix name 2024-07-20 10:22:53 -07:00
Zack 522ef9ef23 word change 2024-07-09 06:25:53 -07:00
Zack bc8b4b8ef9 update readme 2024-07-09 06:22:25 -07:00
clemisch d7c7440ae4
Add receiving on Linux and classic mode to README (#753) 2024-07-09 06:09:56 -07:00
Zack Scholl 527af8a612 redo issue terminology 2024-07-07 17:55:00 -07:00
Alex Bledea da51eb8da3
Refactor tcp (#749)
* Refactor TCP server initialization

This refactor uses the functional options pattern to extract away the
optional TCP server configuration parameters. This:

- improves overall readability, by moving away from global variables
- makes it easier to configure the tcp server for tests

* Use ticker instead of for loop for room deletion

Go offers a ticker abstraction designed for performing tasks at
a regular interval, and this change uses the ticker for tcp room
deletion. It also cleans up the deletion goroutine gracefully.

* Add local relay interaction diagram

The diagram sketches out the interaction between clients and a local
relay.

* Add debug logs for room cleanup

These would be useful for future development (e.g.
adding a stopping mechanism for the TCP listener).
2024-07-07 17:49:29 -07:00
Zack b5da962bd1 chore: update dependencies 2024-07-07 15:21:57 -07:00
Zack 72e51d8c2a v10.0.10 2024-07-07 15:21:35 -07:00
Zack c9bc41fc58 create armv5 build
Fixes #752
2024-07-07 15:20:22 -07:00
Zack 94cc704928
Merge pull request #751 from schollz/dependabot/go_modules/github.com/minio/highwayhash-1.0.3
build(deps): bump github.com/minio/highwayhash from 1.0.2 to 1.0.3
2024-07-07 13:42:42 -07:00
dependabot[bot] 6b25ca4bff
build(deps): bump github.com/minio/highwayhash from 1.0.2 to 1.0.3
Bumps [github.com/minio/highwayhash](https://github.com/minio/highwayhash) from 1.0.2 to 1.0.3.
- [Release notes](https://github.com/minio/highwayhash/releases)
- [Commits](https://github.com/minio/highwayhash/compare/v1.0.2...v1.0.3)

---
updated-dependencies:
- dependency-name: github.com/minio/highwayhash
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-05 08:57:37 +00:00
Zack 8577745d74
Merge pull request #750 from schollz:schollz/issue574
Sending folders from the root of a drive always goes to the same path on the receiver's end
2024-07-04 05:52:38 -07:00
Zack Scholl 232e162f8c Sending folders from the root of a drive always goes to the same path on the receiver's end
Fixes #574
2024-07-04 05:52:09 -07:00
Zack Scholl 4c120c4963 bump version 2024-06-26 10:55:12 -07:00
Zack 7c3dc4453a croc checks for error in file name 2024-06-26 06:58:12 -07:00
Zack 3e804a4a09 ValidFileName returns error 2024-06-26 06:57:57 -07:00
Zack 907f2b3824 Merge branch 'main' of github.com:schollz/croc 2024-06-26 06:09:33 -07:00
Zack 05da5007ed add new test 2024-06-26 06:09:23 -07:00
Zack 791e4c22d2
Merge pull request #742 from ryancdotorg/main
correct classic mode prompt
2024-06-22 08:26:12 -07:00
Zack dd3e3ff1ab
Merge pull request #740 from schollz/dependabot/github_actions/docker/build-push-action-6
build(deps): bump docker/build-push-action from 5 to 6
2024-06-22 08:25:17 -07:00
Ryan Castellucci 44f2b94164 correct classic mode prompt
"Do you wish to continue to enable the classic mode?" actually defaults to "no" rather than "yes" as the prompt text implies, this corrects the prompt text.
2024-06-22 09:03:42 +01:00
dependabot[bot] 6c7120edbb
build(deps): bump docker/build-push-action from 5 to 6
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-18 09:03:31 +00:00
Zack 1e34537bb2
Merge pull request #737 from schollz:schollz/issue735
fix: croc hangs with broken dns
2024-06-13 08:28:06 -07:00
Zack 0d0effd983 fix: croc hangs with broken dns
Fixes #735
2024-06-13 08:27:55 -07:00
Zack e85575f3a5
Merge pull request #734 from schollz/dependabot/go_modules/github.com/schollz/progressbar/v3-3.14.4
build(deps): bump github.com/schollz/progressbar/v3 from 3.14.3 to 3.14.4
2024-06-10 05:57:51 -07:00
dependabot[bot] 0afdcd7005
build(deps): bump github.com/schollz/progressbar/v3
Bumps [github.com/schollz/progressbar/v3](https://github.com/schollz/progressbar) from 3.14.3 to 3.14.4.
- [Release notes](https://github.com/schollz/progressbar/releases)
- [Commits](https://github.com/schollz/progressbar/compare/v3.14.3...v3.14.4)

---
updated-dependencies:
- dependency-name: github.com/schollz/progressbar/v3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-10 08:21:44 +00:00
Zack ca8f011844 v10.0.8 2024-06-06 10:22:46 -07:00
Zack 55518176e1 Merge branch 'main' of github.com:schollz/croc 2024-06-06 10:21:42 -07:00
Zack e502cf0c82 update dependencies 2024-06-06 10:19:44 -07:00
Zack 5cf4d7c103 update: imohash samples more of the file 2024-06-06 10:19:23 -07:00
Zack c28c4786a1
Merge pull request #728 from schollz/dependabot/go_modules/golang.org/x/net-0.26.0
build(deps): bump golang.org/x/net from 0.25.0 to 0.26.0
2024-06-05 19:53:49 -07:00
Zack 6f974d96e8
Merge pull request #732 from raimocom/main
Update croc.go - console output clarification
2024-06-05 18:48:24 -07:00
raimocom c2cb15cb73
Update croc.go - console output clarification 2024-06-06 03:43:01 +02:00
Zack 2d648aa580
Merge pull request #731 from raimocom/main
Update cli.go (help output clarification)
2024-06-05 18:42:00 -07:00
raimocom 80074b3727
Update cli.go (help clarification overwrite/resume) 2024-06-06 03:38:15 +02:00
raimocom e47ca8fbcb
Update cli.go 2024-06-06 02:56:53 +02:00
dependabot[bot] d011290559
build(deps): bump golang.org/x/net from 0.25.0 to 0.26.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.25.0 to 0.26.0.
- [Commits](https://github.com/golang/net/compare/v0.25.0...v0.26.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-05 08:46:37 +00:00
Zack 50e0f625bc v10.0.7 2024-05-31 14:32:59 -07:00
Zack 94af2374c3 Merge branch 'main' of github.com:schollz/croc 2024-05-31 14:32:03 -07:00
Zack a4322faa25 ui: add newlines to skipping messages 2024-05-31 14:31:46 -07:00
Zack 23dce2aa3e
Merge pull request #724 from schollz:schollz/issue723
fix: receiver needs to exit without initializing files if no files being transfered
2024-05-31 11:45:51 -07:00
Zack 88002b322d fix: receiver needs to exit without initializing files if no files being transfered 2024-05-31 11:44:56 -07:00
Zack 9246408278 for valid filename tests 2024-05-30 15:21:51 -07:00
Zack fbf1eeedce v10.0.6 2024-05-28 16:24:29 -07:00
Zack e4c9f2d9fb
Merge pull request #721 from schollz:schollz/issue720
show hash progress on large files
2024-05-28 16:21:45 -07:00
Zack c0c3370d9b add highway hash 2024-05-28 16:19:38 -07:00
Zack f6bd13fa06 show hash progress on large files 2024-05-28 16:08:31 -07:00
Zack Scholl f83616e9bd readme: remove coverage badge 2024-05-26 11:37:03 -07:00
Zack Scholl 23f385ab2f readme: update badge for CI 2024-05-26 11:35:54 -07:00
Zack Scholl 78feb393de fix println warnings 2024-05-26 11:33:21 -07:00
Zack 69fc3cee47 v10.0.5 2024-05-26 07:58:08 -07:00
Zack a5da77cf49
Merge pull request #717 from schollz:schollz/issue716
new: add flag `--classic` with warning for passing shared secret on single-user systems
2024-05-26 07:55:31 -07:00
Zack f66e17dd46 add the checks for the classic insecure mode 2024-05-26 07:54:37 -07:00
Zack 63c9201938 new: add flag with warning for passing shared secret on single-user systems 2024-05-26 07:52:12 -07:00
Zack ca7a5979cc need environmental variable on all unix systems 2024-05-26 07:20:48 -07:00
Zack fc457557e0 v10.0.4 2024-05-25 09:02:34 -07:00
Zack f044f4dd86
Merge pull request #713 from schollz:schollz/issue712
escape filenames that have invisible characters while allowing other languages
2024-05-25 09:00:36 -07:00
Zack a2e71c7e1a escape filenames that have invisible characters while allowing other languages
Fixes #712
2024-05-25 08:59:38 -07:00
Zack dff34fa7fc fix comment 2024-05-24 19:44:28 -07:00
Zack Scholl 08103bb7bb v10.0.3 2024-05-24 18:04:29 -07:00
Zack Scholl 4091ef0496 fix: remove hash extra 2024-05-24 18:03:51 -07:00
Zack 381f8369a3 update bug report 2024-05-23 09:49:18 -07:00
Zack a95d67e31c v10.0.2 2024-05-23 09:47:15 -07:00
Zack b0920bbe70
Merge pull request #708 from schollz/fix10
fix message passing for initial secure layer
2024-05-23 09:46:40 -07:00
Zack ed55c746c2 fix message passing for initial secure layer 2024-05-23 09:44:34 -07:00
Zack 8e10eac5c5 fix 2024-05-23 09:34:17 -07:00
Zack 43f1c53538 v10.0.1 2024-05-23 08:35:56 -07:00
Zack 3acac5d53b
Merge pull request #707 from schollz:schollz/issue706
ux: improve the environmental variable messaging for sending/receiving
2024-05-23 08:34:52 -07:00
Zack 66f0d1264a improve the ux around sending 2024-05-23 08:33:00 -07:00
Zack ee713c5146 improve ux around receiving 2024-05-23 08:27:52 -07:00
Zack 6181903c83 go.mod v9 -> v10 2024-05-23 06:25:53 -07:00
Zack 7acd2def69 version bump for breaking change 2024-05-23 06:15:03 -07:00
Zack eb0909033e reduce description lengths 2024-05-22 10:10:55 -07:00
Zack f6d862eac0 bump version 2024-05-20 12:08:57 -07:00
Zack 5a6005f1eb bump version 2024-05-20 12:08:45 -07:00
Zack f6633cbac9
Merge pull request #702 from schollz:schollz/issue599
chore: improve efficiency and remove extraneous reads
2024-05-20 10:39:49 -07:00
Zack d8ef7cda20 chore: improve efficiency and remove extraneous reads 2024-05-20 10:39:22 -07:00
Zack 7622e636e4 fix: refactor gathering ips 2024-05-20 10:16:37 -07:00
Zack bb018fd725 fix: address shared secret before creatgin 2024-05-20 10:16:02 -07:00
Zack 863dabb93a
Merge pull request #701 from schollz/issue598
fix: shared secret should be read from environmental variable
2024-05-20 09:53:39 -07:00
Zack 6f5f16aa1c
Merge pull request #700 from schollz/issue597
fix: establish encryption layer before transfering ip information
2024-05-20 09:53:31 -07:00
Zack 0f1ca436cd
Merge pull request #699 from schollz/issue596
fix: use more secure shared secret as room name
2024-05-20 09:53:17 -07:00
Zack 4929635eb8
Merge pull request #698 from schollz/schollz/issue594
fix: prompt for overwriting when unzipping
2024-05-20 09:53:09 -07:00
Zack 3f12f75fae
Merge pull request #697 from schollz/issue593
fix: client quits when discovering dangerous paths
2024-05-20 09:52:58 -07:00
Zack e255d472a6 fix: shared secret should be read from environmental variable 2024-05-20 09:46:38 -07:00
Zack 2ffd4daeaf fix: establish encryption layer before transfering ip information 2024-05-20 09:37:42 -07:00
Zack accb310337 ignore 2024-05-20 09:11:08 -07:00
Zack 2b4c088100 fix: use more secure shared secret as room name 2024-05-20 09:08:10 -07:00
Zack a591833dbf fix: filter escape sequences in filenames 2024-05-20 08:38:36 -07:00
Zack b3668a6f5c fix: prompt for overwriting when unzipping 2024-05-20 08:31:47 -07:00
Zack b05c3c8c42 fix: client quits when discovering dangerous paths 2024-05-20 08:23:21 -07:00
Zack 13bc190f8b ignore big file 2024-05-20 08:08:38 -07:00
Zack 1b90484bb8 chore: update dependencies 2024-05-20 06:08:20 -07:00
Zack Scholl 05359d6976 update deps 2024-05-12 16:15:52 +00:00
Zack Scholl cc4d74c490 Merge branch 'main' of github.com:schollz/croc 2024-04-06 16:45:03 +00:00
Zack d81116382f bump version to 9.6.15 2024-04-06 09:44:08 -07:00
Zack Scholl 94cc880568 Merge branch 'main' of github.com:schollz/croc 2024-04-06 16:44:02 +00:00
Zack 24b907f4bb chore: update deps 2024-04-06 09:43:27 -07:00
Zack Scholl 8166b2dbed Merge branch 'main' of github.com:schollz/croc 2024-04-05 21:39:02 +00:00
Zack 14187f6f30
Merge pull request #688 from schollz/dependabot/go_modules/golang.org/x/crypto-0.22.0
Bump golang.org/x/crypto from 0.21.0 to 0.22.0
2024-04-05 14:38:56 -07:00
dependabot[bot] 90682d3ebd
Bump golang.org/x/crypto from 0.21.0 to 0.22.0
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.21.0 to 0.22.0.
- [Commits](https://github.com/golang/crypto/compare/v0.21.0...v0.22.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-05 08:21:46 +00:00
Zack Scholl f4057aa28b Merge branch 'main' of github.com:schollz/croc 2024-04-04 18:31:02 +00:00
Zack 3c2548aa69
Merge pull request #687 from schollz/dependabot/go_modules/golang.org/x/net-0.23.0
Bump golang.org/x/net from 0.22.0 to 0.23.0
2024-04-04 11:30:06 -07:00
dependabot[bot] 7bab9c3cb5
Bump golang.org/x/net from 0.22.0 to 0.23.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.22.0 to 0.23.0.
- [Commits](https://github.com/golang/net/compare/v0.22.0...v0.23.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-04 08:06:47 +00:00
Zack Scholl 355628f895 Merge branch 'main' of github.com:schollz/croc 2024-04-01 19:29:03 +00:00
Zack eaffc6dcac
Merge pull request #686 from a1lu/readonly
Avoid to create config dir if not required
2024-04-01 12:28:36 -07:00
a1lu 4baec420c8 Aovoid to create config dir if not required
If `--remember` is not set, the config dir should not created.
2024-04-01 13:39:04 +02:00
a1lu cd89e8043f Introduce var doRemember in cli receive function 2024-04-01 13:15:50 +02:00
Zack Scholl 1324ff8897 Merge branch 'main' of github.com:schollz/croc 2024-03-31 19:11:02 +00:00
Zack 8bc7a62b9e
Merge pull request #683 from a1lu/patch-1
Support spaces in 4 word codes
2024-03-31 12:10:32 -07:00
Zack Scholl 0c49ac3f02 Merge branch 'main' of github.com:schollz/croc 2024-03-31 19:09:02 +00:00
Zack 8b4ab4c86c
Merge pull request #685 from a1lu/config_files
Gracefully handle non existend receive config file
2024-03-31 12:08:50 -07:00
Zack Scholl f8f69e3157 Merge branch 'main' of github.com:schollz/croc 2024-03-31 19:08:03 +00:00
Zack 4e75e131c4
Merge pull request #682 from vihu/rg/update-error-message
Update error message to be more verbose
2024-03-31 12:07:45 -07:00
a1lu e599e56415 Gracefully handle non existend receive config file
If croc shall not remember the config, it should not exit if the config
file could not be opened. This is similar to the handling of the send
config.
2024-03-31 00:08:12 +01:00
a1lu 956598c427 Check $HOME as last 2024-03-30 23:24:52 +01:00
a1lu 618ae1e5d0
Support spaces in 4 word codes
Since the code was extended by the 4 digit block, the patch from https://github.com/schollz/croc/pull/198 did not work anymore.
2024-03-30 22:58:16 +01:00
Zack Scholl 7763a971f2 Merge branch 'main' of github.com:schollz/croc 2024-03-30 18:49:02 +00:00
Zack d2b7c80369 chore: update dependencies 2024-03-30 11:48:03 -07:00
Rahul Garg 241176d8a4
Update error message to be more verbose
Summary
----
This changes the error message (when connecting to an unavailble
channel) like so:

before:

```
$ croc 6764-jimmy-hilton-inside
securing channel...2024/03/28 17:16:25 room not ready
```

after:

```
$ ./croc 6764-jimmy-hilton-inside
securing channel...2024/03/28 17:16:12 room (secure channel) not ready, maybe peer disconnected
```
2024-03-28 17:16:01 -06:00
Zack Scholl 719f9b62c9 Merge branch 'main' of github.com:schollz/croc 2024-03-11 22:51:03 +00:00
Zack Scholl 483c5255bb chore: bump version to 9.6.14 2024-03-11 15:50:04 -07:00
Zack Scholl 03e6dcd220 Merge branch 'main' of github.com:schollz/croc 2024-03-11 22:50:02 +00:00
Zack Scholl 22ddbd83c2 chore: update deps 2024-03-11 15:49:09 -07:00
Zack Scholl 6b930c365b Merge branch 'main' of github.com:schollz/croc 2024-03-11 22:49:03 +00:00
Zack 1f6851f33b
Merge pull request #680 from schollz/dependabot/github_actions/softprops/action-gh-release-2
Bump softprops/action-gh-release from 1 to 2
2024-03-11 15:48:20 -07:00
Zack 61224b4e6b
Merge pull request #678 from schollz/dependabot/go_modules/github.com/stretchr/testify-1.9.0
Bump github.com/stretchr/testify from 1.8.2 to 1.9.0
2024-03-11 15:48:07 -07:00
Zack Scholl 6f2771e7b5 Merge branch 'main' of github.com:schollz/croc 2024-03-11 13:46:03 +00:00
Zack c21beccb7a
Merge pull request #679 from bitraid/fix-win-build
Fix Windows builds
2024-03-11 06:45:41 -07:00
dependabot[bot] 40f5e9ca1e
Bump softprops/action-gh-release from 1 to 2
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v1...v2)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-11 08:56:10 +00:00
bitraid ed8c0475bf
Fix Windows builds 2024-03-09 22:31:27 +02:00
dependabot[bot] d7d7d3c8dc
Bump github.com/stretchr/testify from 1.8.2 to 1.9.0
Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.2 to 1.9.0.
- [Release notes](https://github.com/stretchr/testify/releases)
- [Commits](https://github.com/stretchr/testify/compare/v1.8.2...v1.9.0)

---
updated-dependencies:
- dependency-name: github.com/stretchr/testify
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-05 04:57:38 +00:00
Zack Scholl 945ac74690 Merge branch 'main' of github.com:schollz/croc 2024-03-05 04:57:05 +00:00
Zack Scholl fff6f48001 chore: update dependencies 2024-03-04 20:56:40 -08:00
Zack Scholl 28ef8e99ac Merge branch 'main' of github.com:schollz/croc 2024-02-22 22:41:05 +00:00
Zack 28bb36b321 bump version 2024-02-22 14:40:20 -08:00
Zack Scholl ab2cb477a8 Merge branch 'main' of github.com:schollz/croc 2024-02-22 22:40:05 +00:00
Zack abc5029fce update release with LICENSE 2024-02-22 14:39:57 -08:00
Zack e7f67ebea7 update date 2024-02-22 14:39:50 -08:00
Zack Scholl c7f0228786 Merge branch 'main' of github.com:schollz/croc 2024-02-22 22:35:05 +00:00
Zack 741714504a
Merge pull request #671 from dbohdan/main
Build release binaries for DragonFly/Free/Net/OpenBSD
2024-02-22 14:34:06 -08:00
D. Bohdan be8a6689ff build release bins for DragonFly/Free/Net/OpenBSD 2024-02-22 21:22:32 +00:00
Zack Scholl de9c54e57a Merge branch 'main' of github.com:schollz/croc 2024-02-20 15:59:03 +00:00
Zack 53fc9ebd99 bump version 2024-02-20 07:58:27 -08:00
Zack 4159ba7668 do static builds of croc
following https://github.com/golang/go/issues/26492#issuecomment-435462350
2024-02-20 07:57:49 -08:00
Zack Scholl 064f84ccd3 Merge branch 'main' of github.com:schollz/croc 2024-02-19 15:55:51 +00:00
Zack 8ac1e3a501 bump version 2024-02-19 07:47:23 -08:00
Zack 11bc4eecc6 update deps 2024-02-19 07:46:53 -08:00
Zack d92cff92b9 add arm/arm64 builds for windows fixes #664 2024-02-19 07:46:35 -08:00
Zack 00f12b5742
Merge pull request #663 from TravisRoad/main
remove unnecessary trailing newline character when stdout is enabled
2024-02-18 06:32:28 -08:00
Travis 4f1f57b1ba remove unnecessary trailing newline character when stdout is enabled 2024-02-18 10:17:35 +08:00
Zack a240a4b982
Merge pull request #657 from schollz/dependabot/github_actions/actions/stale-9
Bump actions/stale from 5 to 9
2024-02-17 10:29:47 -08:00
Zack 508e0be335
Merge pull request #662 from qk-santi/ports-and-transfers
define ports by amount, not individually - v2
2024-02-17 10:28:58 -08:00
qk-santi e1644401da version compatible basePort and transfers 2024-02-17 19:09:53 +01:00
qk-santi c83eb59963 Revert "define ports by amount, not individually"
This reverts commit 87152f8706.
2024-02-17 18:41:41 +01:00
Zack f874e30151 revert go version back to go.1.21 because of glibc errors 2024-02-16 06:56:33 -08:00
Zack b278f5a41d bump version 2024-02-16 06:56:06 -08:00
Zack ce91e3b420
Merge pull request #660 from qk-santi/ports-and-transfers
define ports by amount, not individually
2024-02-12 08:08:01 -07:00
Zack 30a6b14443
Merge pull request #659 from qk-santi/hide-relay-not-used
hide relay param if not going to be used
2024-02-12 06:37:28 -07:00
qk-santi 87152f8706 define ports by amount, not individually 2024-02-12 09:58:51 +01:00
qk-santi 48eb2a2a7c hide relay param if not going to be used 2024-02-12 09:30:20 +01:00
dependabot[bot] 816ad09a50
Bump actions/stale from 5 to 9
Bumps [actions/stale](https://github.com/actions/stale) from 5 to 9.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v5...v9)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-09 09:01:53 +00:00
Zack a2228e80c2
Create stale.yml 2024-02-08 13:43:05 -07:00
Zack Scholl 230de9184d bump version 2024-02-08 13:39:45 -07:00
Zack 3c781069ca
Merge pull request #653 from schollz/dependabot/go_modules/golang.org/x/crypto-0.19.0
Bump golang.org/x/crypto from 0.18.0 to 0.19.0
2024-02-08 13:38:12 -07:00
Zack 7274a8bd4b
Merge pull request #655 from schollz/schollz/issue650
add build for windows 7
2024-02-08 13:37:54 -07:00
Zack Scholl 3382306342 add build for windows 7 2024-02-08 13:37:10 -07:00
dependabot[bot] ad47739c8f
Bump golang.org/x/crypto from 0.18.0 to 0.19.0
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.18.0 to 0.19.0.
- [Commits](https://github.com/golang/crypto/compare/v0.18.0...v0.19.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-08 08:07:15 +00:00
Zack 2f33b14b3d
Merge pull request #581 from sitiom/patch-1
switch winget releaser runner to `ubuntu-latest`
2024-02-06 18:12:51 -08:00
Zack 4025efcd48 bump the default.txt 2024-02-06 15:58:18 -08:00
Zack f41a2afead bump version and fix installer 2024-02-06 15:51:07 -08:00
Zack ba75f7badb add release workflow for generating binaries 2024-02-06 15:37:28 -08:00
Zack 55c954117a update deps 2024-02-06 14:33:01 -08:00
Zack 4d083f8d10
Merge pull request #646 from rehanone/fix-docker-deplyment
Fix for the failing CD build
2024-02-06 08:05:08 -08:00
Rehan Mahmood 9ad2af18bd Added the `gcc` and `musl-dev` packages in the builder layer of the Dockerfile. 2024-01-28 14:38:01 -05:00
Zack 47fc96b98f
Merge pull request #645 from rehanone/fix-docker-deplyment
Update and fix the docker image deplyment build
2024-01-25 07:59:36 -08:00
Rehan Mahmood d4bba88fb1 Update and fix the docker image deplyment build 2024-01-25 10:02:01 -05:00
Zack Scholl c1367671b6 bump 9.6.6 2023-11-09 06:56:42 -08:00
Zack Scholl 1e572067ec bump 9.6.6 2023-11-09 06:56:29 -08:00
Zack Scholl 8aa9f040f6 bump 9.6.6 2023-11-09 06:53:42 -08:00
Zack Scholl 96bb34485e update deps 2023-11-09 06:51:31 -08:00
Zack 159f0f8d9b
Merge pull request #625 from gravetii/patch-1
Fix minor error in README
2023-11-05 07:30:14 -08:00
Sandeep c4d5c89e5f
Fix minor error in README 2023-11-03 11:20:41 +05:30
Zack 6ac67b68fc
Merge pull request #570 from PThorpe92/main
.gitignore support
2023-09-23 07:09:30 -07:00
PThorpe92 0af35d7149
feat: add support to respect .gitignore files 2023-09-22 21:15:27 -04:00
Zack f91c7a9948
Merge pull request #587 from ferebee/main
fix architecture detection for Apple Silicon
2023-09-03 19:35:53 -07:00
Zack cff8cddd13
Merge pull request #589 from zx9597446/main
zip file bug on windows and linux
2023-08-18 11:00:46 +02:00
zx9597446 d724f11297 Here is the English translation:
If there are directories in a zip file compressed on the Windows platform, the "\\" in the filepath will cause the files to be extracted normally on Linux, and ls will show filenames containing single quotes.

So when compressing, I replace "\\" with "/" so that it seems there are no issues on both Windows and Linux.
2023-08-17 12:07:07 +08:00
ferebee 80aabea29b fix architecture detection for Apple Silicon
fix auto-install on macOS Apple Silicon, which reports architecture "arm64" on uname -a rather than "aarch64"
2023-08-09 11:42:23 +02:00
sitiom f8bb011eac
switch winget releaser runner to `ubuntu-latest` 2023-07-07 08:52:14 +08:00
Zack Scholl ef68dfa54c bump 9.6.5 2023-07-06 10:10:57 -07:00
Zack Scholl 8ab65d06b5 bump 9.6.5 2023-07-06 10:10:39 -07:00
Zack Scholl 9c82914e7c update deps 2023-07-06 10:00:05 -07:00
Zack 95717f16c9
Merge pull request #579 from glitsj16/systemd-unit
croc.service: use DynamicUser
2023-06-21 05:58:58 -07:00
glitsj16 5a58ae294b
croc.service: use DynamicUser 2023-06-21 01:46:47 +00:00
Zack Scholl 0aa5c80393 upgrade dependencies 2023-05-08 17:39:18 +00:00
Zack 23a8904193
Merge pull request #563 from N0mansky/main
Feat: support http proxy as a complementary way to use in network limited environments.
2023-04-12 09:03:53 -07:00
N0mansky d5e63cd0bf Update: update error messages for http proxy 2023-04-12 18:17:25 +08:00
N0mansky 1b1dc5cdfe Feat: support http proxy as a complementary way to use in network limited environments. 2023-04-12 18:04:15 +08:00
Zack cd1162f85c
Merge pull request #553 from goggle/typos01
Fix some typos
2023-03-27 08:36:56 -07:00
Alexander Seiler ad7a22b218
Fix some typos
Signed-off-by: Alexander Seiler <seileralex@gmail.com>
2023-03-27 17:13:09 +02:00
Zack e3a18cd7a7
Merge pull request #547 from schollz/dependabot/github_actions/docker/setup-buildx-action-2
Bump docker/setup-buildx-action from 1 to 2
2023-03-27 07:43:21 -07:00
Zack 8611bfa44a
Merge pull request #550 from schollz/dependabot/github_actions/actions/setup-go-4
Bump actions/setup-go from 2 to 4
2023-03-27 07:42:58 -07:00
Zack Scholl b3c0625659 localhost -> 127.0.0.1 Fixes #513 2023-03-20 09:16:07 -07:00
dependabot[bot] 40e5893bb8
Bump actions/setup-go from 2 to 4
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 2 to 4.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v2...v4)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-16 09:12:12 +00:00
Zack e1b49e6d1c
Merge pull request #549 from BayLee4/main
Enhance tab completion
2023-03-15 08:11:00 -07:00
BayLee4 fae2e81b4a
Enhance tab completion 2023-03-15 10:03:38 +01:00
BayLee4 f5a02df17b
Merge pull request #1 from schollz/main
Merge upstream
2023-03-15 07:40:29 +00:00
dependabot[bot] d813aa2fa9
Bump docker/setup-buildx-action from 1 to 2
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 1 to 2.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-14 12:01:02 +00:00
Zack 8d8d06557e
Merge pull request #534 from sitiom/winget-releaser
add winget releaser workflow
2023-03-14 05:00:19 -07:00
Zack Scholl 3ae46c3c18 bump 9.6.4 2023-03-14 04:52:15 -07:00
Zack Scholl 1fce28e72f remove twitter 2023-03-14 04:51:47 -07:00
Zack Scholl ac3caa5564 bump 9.6.4 2023-03-14 04:50:55 -07:00
Zack Scholl 790ee9e6eb bump 9.6.4 2023-03-14 04:50:29 -07:00
Zack Scholl 0656bb7851 bump 9.6.4 2023-03-14 04:50:10 -07:00
Zack Scholl 5ed8204cb1 bump 9.6.4 2023-03-14 04:50:00 -07:00
Zack Scholl 1220d54a65 bump 9.6.4 2023-03-14 04:41:22 -07:00
Zack Scholl 642d20b48d update deps 2023-03-14 04:39:05 -07:00
Zack 58bb226ba5
Merge pull request #542 from stefins/go-version
Upgrade Go version to 1.20 and dependencies to latest
2023-03-14 04:36:56 -07:00
stefins 080c21b66b
Change go version to 1.20 in CI 2023-03-10 20:59:45 +05:30
stefins 4944355b75
Upgrade Go version to 1.20 and dependencies to latest 2023-03-10 20:59:33 +05:30
Zack Scholl 3c1d60d6d2 bump 9.6.3 2023-02-20 07:34:32 -08:00
Zack Scholl 5bdd4453cd bump 9.6.3 2023-02-20 07:34:04 -08:00
Zack Scholl 5b333fc85c bump 9.6.3 2023-02-20 07:33:52 -08:00
Zack Scholl 90e4e33dcd bump 9.6.3 2023-02-20 07:33:34 -08:00
Zack Scholl 3135bd74e3 bump 9.6.3 2023-02-20 07:21:24 -08:00
Zack Scholl 7c98ae3d5a deps 2023-02-20 07:19:47 -08:00
sitiom 908f33cd61
add dependabot 2023-02-13 11:52:34 +08:00
sitiom 9eaba7be7c
add Winget installation instructions 2023-02-12 23:45:11 +08:00
Ryan Caezar Itang b3db9d88c1
add winget releaser workflow 2023-02-12 23:44:34 +08:00
Zack Scholl 9006cde1b3 update deps 2023-02-10 11:59:48 -08:00
Zack 8f75bb8299
Merge pull request #533 from stefins/patch-1
Update CI to run on main branch events
2023-02-10 11:59:21 -08:00
Zack faf64aadf1
Merge pull request #532 from stefins/chmod-file
Chmod new file based on the source file mode
2023-02-10 11:58:59 -08:00
stefins 65760b1189
Update CI to run on main branch events 2023-02-11 01:18:43 +05:30
stefins 24679d4e02
Chmod new file based on the source file mode 2023-02-10 14:53:06 +05:30
Zack Scholl 8b9977a7c4 update 2023-02-07 05:46:10 -08:00
Zack ae71b4b63b
Merge pull request #528 from chncaption/oscs_fix_cfds588au51u2n4fthm0
fix(sec): upgrade gopkg.in/yaml.v3 to 3.0.0
2023-02-07 05:45:44 -08:00
Zack Scholl c462b5948f update go.mod/go.sum 2023-02-07 05:44:17 -08:00
Zack a2c1dc6a89
Merge pull request #526 from BayLee4/main
Implement tab completion for words
2023-02-07 05:40:41 -08:00
chncaption 98391bff63 update gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c to 3.0.0 2023-02-02 22:03:21 +08:00
BayLee4 adadaba75e
Small optimization + consistent variable names style 2023-01-13 16:29:11 +01:00
BayLee4 0024beaedc
Implement tab completion for words 2023-01-12 19:23:50 +01:00
Zack Scholl 63feece074 add testing 2023-01-08 08:11:55 -08:00
Zack Scholl 9e280d7f48 update deps 2023-01-03 18:40:31 +00:00
Zack Scholl 7c7be95d6b update deps 2023-01-03 18:40:20 +00:00
Zack c20beb1be7
not reachable by twitter anymore 2022-12-16 16:35:06 -08:00
Zack Scholl e08c5e7f38 bump 9.6.2 2022-12-06 07:59:30 -08:00
Zack Scholl 3b819346fa bump 9.6.2 2022-12-06 07:58:30 -08:00
Zack Scholl 2467411bae fix install tests 2022-12-06 07:58:15 -08:00
Zack Scholl b436b31970 update deps 2022-12-06 07:45:07 -08:00
Zack Scholl e3ce565ca6 fix: allow remembering hash algorithm 2022-12-05 15:28:25 -08:00
Zack Scholl e04981698c update deps 2022-12-05 15:25:10 -08:00
Zack Scholl 07a67ed54e path -> fpath 2022-12-05 15:24:47 -08:00
Zack 9a8e584aca
Merge pull request #520 from taigrr/gofumpt
run through gofumpt
2022-12-05 15:22:10 -08:00
Tai Groot fa7ae114f5
run through gofumpt 2022-12-05 11:21:04 -08:00
Zack 8a4326bc0d
Merge pull request #519 from taigrr/workflow
update dockerfile to v1.19
2022-12-04 09:37:17 -08:00
Tai Groot ae20f2b5ac
update dockerfile 2022-12-01 21:45:10 -08:00
Zack Scholl cd6eb1ba53 update deps 2022-11-18 20:55:07 -08:00
Zack Scholl 8454008b45 update deps 2022-11-18 20:52:55 -08:00
Zack fce4629120
Merge pull request #515 from taigrr/workflow
Github CI go 1.18 -> 1.19
2022-11-18 20:47:36 -08:00
Tai Groot fd0db2ad55
upgrade github ci workflow 2022-10-30 20:43:51 -07:00
Zack 7f9688c7a1
Merge pull request #512 from IrishMaestro/revision
Typo fix
2022-10-23 10:29:05 -07:00
IrishMaestro f1e15a54ee
Typo fix
typo fix for the word relative
2022-10-22 17:18:16 -05:00
Zack Scholl 0f7f449d7f bump 9.6.1 2022-10-17 13:44:09 -07:00
Zack Scholl b27982a742 update deps 2022-10-17 13:42:39 -07:00
Zack Scholl 30f5a3e84e revert back to flate instead of zstd 2022-09-16 09:19:58 -07:00
Zack Scholl 786fc8d34f update mods 2022-09-16 09:10:08 -07:00
Zack 8de4508876
Merge pull request #506 from V-R-Dighe/develop
Added zstd as a compression algorithm
2022-09-16 09:08:14 -07:00
VRDighe e640e4fce0 Replaced zstd package 2022-09-16 10:19:44 +05:30
VRDighe 4f8b2aba9b Added zstd as a compression algorithm 2022-09-13 20:08:07 +05:30
Zack 1517767129
addresses #496 gettings ports doing LAN 2022-08-12 12:00:26 -07:00
Zack Scholl 3dedd41557 update 2022-08-06 09:32:46 -07:00
Zack 69f939c0cd
Merge pull request #494 from chavacava/fix-493
fix #493: data race in cli.relay
2022-08-05 08:38:07 -07:00
Zack cd5872bd2d
Merge pull request #497 from cuishuang/main
fix some typos
2022-08-05 08:37:36 -07:00
cui fliter 1c6583f925 fix some typos
Signed-off-by: cui fliter <imcusg@gmail.com>
2022-08-05 20:41:18 +08:00
chavacava 40ac320261
fix #493: data race in cli.relay 2022-07-17 10:40:49 +02:00
Zack Scholl 1851327df7 bump 9.6.0 2022-07-08 16:41:04 -07:00
Zack Scholl 0e93f1e285 println -> print os.stderr 2022-07-07 10:46:49 -07:00
Zack Scholl 7e0814a57e update deps 2022-07-07 10:34:20 -07:00
Zack Scholl c6bcb79928 remove zip compression and add --zip to send command 2022-07-07 10:32:23 -07:00
Zack 134673691e
Merge pull request #488 from stefins/zip-folder
Added ability to zip a directory
2022-07-07 10:14:23 -07:00
Stefin d226ba536e Fixed relative path / bug 2022-07-07 18:56:37 +05:30
Stefin b50fe88474 Added support for sending relative folder 2022-07-07 02:58:49 +05:30
Stefin 37ae453ff7 Unzipping file at the reciever end 2022-07-07 00:06:11 +05:30
Stefin ee772c4cec Added UnzipDirectory function 2022-07-07 00:05:56 +05:30
Stefin ed030375e5 Modified the argument for GetFilesInfo in tests 2022-07-06 18:49:32 +05:30
Stefin ad36e21051 Handling the --zip flag 2022-07-06 18:48:19 +05:30
Stefin 4ea9a96d88 Added --zip CLI argument for zipping all the dir specified 2022-07-06 18:47:34 +05:30
Stefin f0f9b80bdf added ZipDirectory function 2022-07-06 18:46:02 +05:30
Zack 7a0c0a8200
Merge pull request #474 from tjanez/fedora-package
add Fedora instructions to README
2022-05-20 09:50:31 -07:00
Zack Scholl 5270755c15 bump 9.5.6 2022-05-18 16:57:22 -07:00
Zack Scholl b7e4a73c27 don't show number of folders if the number is 0 2022-05-18 16:57:00 -07:00
Zack Scholl da5d19ef28 update deps and ui 2022-05-18 16:53:28 -07:00
Zack c68cfcea8a
Merge pull request #478 from DasSkelett/fix/relay-address-behind-dns64
Fix relay IPv4 address resolution behind DNS64
2022-05-18 16:48:51 -07:00
DasSkelett 38ed8ecc3c
Fix relay IPv4 address resolution behind DNS64 2022-05-16 22:04:55 +02:00
Tadej Janež a5d3e00f2b
add Fedora instructions to README 2022-04-29 22:31:59 +02:00
Zack Scholl 9de06a6bf9 bump 9.5.5 2022-04-28 14:30:03 -07:00
Zack Scholl a6a3a57361 update deps 2022-04-28 14:29:42 -07:00
Zack 148c1a6cdd
Merge pull request #470 from iulius98/master
Fixed #463 issue
2022-04-27 16:23:10 -07:00
Zack Scholl 817905cf5a bump 9.5.4 2022-04-27 08:25:06 -07:00
Zack Scholl 6158b42ad1 update deps 2022-04-27 08:23:43 -07:00
Zack Scholl 80539f27c3 avoid deadlock 2022-04-25 06:25:25 -07:00
Zack 35652e60a3
new support system 2022-04-13 06:42:08 -07:00
RCL98 2ad8b1f1ce #463 fixed display at receiving end 2022-04-13 02:23:10 +03:00
RCL98 b316c0159f #463 fixed croc tests for empty folders, and to work in Windows 2022-04-11 00:02:26 +03:00
RCL98 f78ee15605 #463 fixed display for empty folders 2022-04-11 00:00:47 +03:00
iulius98 15d0209a29 #463 added capability to send/receive empty folders 2022-04-09 01:38:22 +03:00
Zack 386c99d057
Merge pull request #462 from davide125/completion
Drop shebang for bash completion
2022-04-07 07:14:20 -07:00
Zack Scholl fd99a405fd bump 9.5.3 2022-04-07 06:05:16 -07:00
Zack Scholl 54f52e5427 bump 9.5.3 2022-04-07 06:04:46 -07:00
Zack Scholl ec949888d8 Merge branch 'master' of github.com:schollz/croc 2022-04-07 06:01:08 -07:00
Zack Scholl 0d52ead66e update default curve 2022-04-07 06:01:02 -07:00
Zack Scholl b715993435 bump 9.5.3 2022-04-07 05:59:24 -07:00
Zack Scholl 7e817e1cbf default to P-256 2022-04-07 05:52:54 -07:00
Zack 4abdbf1ad2
update to go 1.18 2022-04-06 21:48:39 -07:00
Zack Scholl 087c22d833 update readme 2022-04-03 15:21:35 -07:00
Zack Scholl 789b5bf607 update deps 2022-03-30 11:30:36 -07:00
Davide Cavalca e42f81a404 Drop shebang for bash completion 2022-02-27 08:40:56 -08:00
Zack Scholl 20bf7dd91d bump 9.5.2 2022-02-23 08:19:02 -08:00
Zack Scholl 4a8c19b115 bump 9.5.2 2022-02-23 08:16:50 -08:00
Zack Scholl a1a17ce6f7 bump 9.5.2 2022-02-23 08:09:02 -08:00
Zack Scholl 00c4d248fd bump 9.5.2 2022-02-23 08:08:43 -08:00
Zack Scholl 073196ccd2 bump 9.5.2 2022-02-23 08:07:23 -08:00
Zack Scholl 635b362ca0 tcp: send error on fail 2022-02-23 08:03:45 -08:00
Zack Scholl 53f35c1da0 fix ui when sending text 2022-02-23 07:57:40 -08:00
Zack 030ed2a03d
Merge pull request #456 from abhi12299/filenamePrefix
Fix renaming of file with prefix "croc-stdin" on receiver end
2022-02-23 07:52:27 -08:00
Zack Scholl c28d731a66 update deps 2022-02-23 07:31:45 -08:00
Zack Scholl ef6683b550 add more tests 2022-02-23 07:25:13 -08:00
Zack f6a75c8f53
Merge pull request #460 from iulius98/master
#431 fixed remote path
2022-02-23 07:14:46 -08:00
RCL98 7c1a59c102 #431 fixed remote folder name for Windows 2022-02-21 21:50:24 +02:00
iulius98 32a188fa85 #431 Integrate GetFilesInfo function with the code 2022-02-21 20:41:51 +02:00
RCL98 ce8fb796b3 #431 added file informations retrival functions to replace getPaths 2022-02-21 20:16:27 +02:00
Zack 1bd705d2e1
Merge pull request #459 from iulius98/master
#454 fixed local transfer
2022-02-20 07:57:34 -08:00
iulius98 1a635de69c #454 fixed local transfer 2022-02-20 17:40:50 +02:00
Zack 353ae0db16
add more information 2022-02-07 14:06:49 -08:00
Abhishek 9f66842322 fix sending file with prefix "croc-stdin" renaming on receiver end 2022-02-03 23:09:37 +05:30
Zack Scholl 94c0f66a26 bump 9.5.1 2022-02-03 08:51:19 -08:00
Zack Scholl b0e7d4d5df fix tests 2022-02-03 08:45:50 -08:00
Zack Scholl 9b5252d54c update deps 2022-02-03 08:40:49 -08:00
Zack Scholl 1d3c822ef3 allow remembering --internal-dns flag 2022-02-03 08:34:03 -08:00
Zack df78f3333d
Merge pull request #451 from voocel/fix_hash_err
fix hash file error
2022-01-06 04:43:50 -08:00
voocel b45e625298 fix hash file error 2022-01-06 17:44:43 +08:00
Zack Scholl 7390e7ed45 bump 9.5.0 2021-11-18 07:03:47 -08:00
Zack f210ef8877
Merge pull request #435 from AmeyShrivastava/fix-typos
Fix Typos
2021-11-17 10:52:29 -08:00
Amey Shrivastava 2964ede174 Fix Typos (revised)
This commit fixes spelling mistakes (typos) at a few places in the codebase.
(Includes requested corrections)
2021-11-17 23:50:32 +05:30
Zack Scholl cc837fa863 fix ports for tests 2021-11-17 10:11:35 -08:00
Zack Scholl 87bfdf11a8 update deps 2021-11-17 09:40:59 -08:00
Zack c30492609e
Merge pull request #432 from mbattista/master
added throttle upload feature
2021-11-17 09:37:50 -08:00
Zack 2f733891db
Merge pull request #440 from Juneezee/go1.17
build: upgrade to Go 1.17
2021-11-17 09:35:25 -08:00
Zack 3eb66284e0
Merge pull request #434 from HinWaei/fix4
Fixed an error
2021-11-17 09:33:48 -08:00
Eng Zer Jun 1645759742
refactor: move from io/ioutil to io and os packages
The io/ioutil package has been deprecated as of Go 1.16, see
https://golang.org/doc/go1.16#ioutil. This commit replaces the existing
io/ioutil functions with their new definitions in io and os packages.

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
2021-11-17 11:39:11 +08:00
Eng Zer Jun da8beb65bf
build: upgrade to Go 1.17
Go 1.17 introduces compiler improvement
(https://golang.org/doc/go1.17#compiler) and supports module graph
pruning (https://golang.org/ref/mod#graph-pruning) and lazy module
loading (https://golang.org/ref/mod#lazy-loading).

This commit applies the changes by running `go mod tidy -go=1.17` to
enable module graph pruning and lazy module loading supported by Go 1.17
or higher.

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
2021-11-17 11:39:01 +08:00
Hinux Chau d30433658b
Fixed an error
Fixed an error caused by nonexistence of the directory /etc/bash_completion.d/croc
2021-10-27 22:21:31 +08:00
Marcel Battista d372fa1fa4 fix panic on single digit throttles values 2021-10-19 13:10:43 +02:00
Marcel Battista 8ff3fb9b89 added throttle upload feature 2021-10-19 02:46:54 +02:00
Zack 696479024e
Update ci.yml 2021-10-08 09:43:30 -07:00
Zack 9dfa0284fa update with setup 2021-10-08 09:39:20 -07:00
Zack Scholl a12f374aba can't use the github ci 8084 2021-10-04 08:02:27 -07:00
Zack 8ee1825f84
Merge pull request #424 from jolheiser/fix-const
Fix TCP constant
2021-10-04 07:29:27 -07:00
Zack f99c33d794
Merge pull request #426 from maximbaz/ci
Run tests via Github Actions
2021-10-04 07:26:53 -07:00
Maxim Baz 417b371454
Add CI 2021-10-04 00:16:49 +02:00
jolheiser 2ffb20201c
Fix TCP constant
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2021-10-03 16:23:29 -05:00
Zack Scholl 89efd38c10 bump 9.4.2 2021-10-02 12:38:32 -07:00
Zack Scholl 49f50a53d5 need to listen on all ports 2021-10-02 12:37:16 -07:00
Zack Scholl 5d9afe03ef bump 9.4.1 2021-10-02 12:29:05 -07:00
Zack Scholl 1637765aad debugging 2021-10-02 12:23:36 -07:00
Zack Scholl ce628ea604 debugging 2021-10-02 12:20:18 -07:00
Zack Scholl ff4307c3c6 debugging 2021-10-02 12:18:50 -07:00
Zack Scholl e5f59fa0f9 fix local 2021-10-02 12:02:25 -07:00
Zack Scholl 04662df347 fix local 2021-10-02 11:55:43 -07:00
Zack Scholl 4ea66fbd18 upgrade peerdiscovery 2021-10-02 10:55:12 -07:00
Zack Scholl d96c98f4ce bump 9.4.0 2021-10-02 10:45:00 -07:00
Zack Scholl 31db6a76e5 bump 9.4.0 2021-10-02 10:44:48 -07:00
Zack Scholl a996f3c4f4 bump 9.4.0 2021-10-02 10:44:34 -07:00
Zack Scholl 4334c870f5 bump 9.4.0 2021-10-02 10:44:17 -07:00
Zack Scholl 2b1367a09b bump 9.4.0 2021-10-02 10:44:05 -07:00
Zack Scholl add1650cbd bump 9.4.0 2021-10-02 10:43:14 -07:00
Zack Scholl 04f2dfac97 bump 9.4.0 2021-10-02 10:41:46 -07:00
Zack Scholl 060ce516b1 bump 9.4.0 2021-10-02 10:41:26 -07:00
Zack Scholl 78b6f2d858 update deps 2021-10-02 10:37:20 -07:00
Zack d77c83ce09
Merge pull request #419 from kallydev/patch
Add host flag for relay
2021-10-02 10:35:00 -07:00
Zack a34d29befc
Merge pull request #420 from jolheiser/const
Constants and Message Types
2021-10-02 10:33:52 -07:00
Zack 914d0c98a8
Merge pull request #421 from jolheiser/wildcard
Add wildcard support for files
2021-10-02 10:33:15 -07:00
Zack 55cb35d12b
Merge pull request #422 from BrandonIngalls/gh-405-config-defaults
Do not override defaults with empty values
2021-10-02 10:29:40 -07:00
Brandon Ingalls 860a75fee6 Do not override defaults with empty values
This change will make it so a user who used the -remember
option on an older version of the application will be able
to use the latest version of the software without deleting
their saved config.

fixes schollz/croc#405
relates to schollz/croc#417
2021-10-02 11:12:34 -05:00
jolheiser e380c7b1f1
Add wildcard support
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2021-10-01 16:49:21 -05:00
jolheiser 2381f26c61
Move to consts and "enum"
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2021-10-01 16:24:28 -05:00
KallyDev de454bbf5a
add host flag for relay 2021-10-01 12:55:28 +08:00
Zack Scholl e19e06a652 update deps 2021-09-14 10:44:33 -07:00
Zack 6deafaadae
Merge pull request #412 from adworacz/sendMultifileDocs
Clarify croc's ability to send multiple files/folder
2021-08-29 10:51:04 -07:00
Austin Dworaczyk Wiltshire ef3953a586 Clarify croc's ability to send multiple files/folder
I was personally shocked that I could send multiple files via croc
recently, having done it purely on a whim. The existing CLI
documentation makes no mention of croc's ability to send multiple
files/folders.

This adds it.
2021-08-29 10:16:51 -07:00
Zack Scholl 1d3fdffed6 bump 9.3.0 2021-08-16 12:29:43 -07:00
Zack Scholl 94b2aff637 update deps 2021-08-16 12:28:26 -07:00
Zack 9ce2321d01
Merge pull request #409 from CHTJonas/master
Make internal DNS resolution opt-in
2021-08-16 12:27:57 -07:00
Charlie Jonas d75530b78b Improve built-in list of public DNS recursors 2021-08-16 18:48:03 +01:00
Charlie Jonas f64f68d5a9 Tidy up code slightly 2021-08-16 18:47:25 +01:00
Charlie Jonas be7705efc3 Remove DNS lookup timeouts 2021-08-16 18:32:55 +01:00
Charlie Jonas df2e29b74d Add --internal-dns flag 2021-08-16 18:25:34 +01:00
Zack Scholl b73fdff702 mv goreleaser 2021-08-06 14:35:53 -07:00
Zack Scholl 664936feb2 bump 9.2.1 2021-08-06 13:46:23 -07:00
Zack Scholl 4b1eb6519c update deps 2021-08-06 13:45:23 -07:00
Zack Scholl 86aeed93db move mutex to avoid race condition #407 2021-08-06 09:48:26 -07:00
Zack Scholl 7993e73ac2 update deps 2021-07-29 13:43:21 -07:00
Zack Scholl d922808fd8 change install cmd 2021-06-25 13:19:23 -07:00
Zack Scholl 8d22737fd3 bump 9.2.0 2021-06-21 11:54:11 -07:00
Zack Scholl d442755814 show preparing progress 2021-06-21 11:11:44 -07:00
Zack Scholl 0afdf71305 update deps 2021-06-21 07:43:20 -07:00
Zack Scholl ecf3eb872e allow selecting hash 2021-06-21 07:34:28 -07:00
Zack Scholl 646c879edc bump 9.1.6 2021-06-15 15:08:32 -07:00
Zack Scholl cbe9cbe32a update deps 2021-06-15 14:54:22 -07:00
Zack Scholl 4796404b7e show resume message if resuming
Fixes #402
2021-06-15 14:53:16 -07:00
Zack Scholl 3e2c88c5bc bump 9.1.5 2021-06-10 14:45:24 -07:00
Zack Scholl 0124356cd7 update deps 2021-06-10 14:44:49 -07:00
Zack f2ef6f19a5
Merge pull request #401 from nikoksr/refactor/accept-enter-in-prompts
refactor: Accept enter in prompts
2021-06-10 14:43:11 -07:00
Niko Köser 5e0d6522b0
refactor: accept enter in user prompts
Until now, the process of receiving a file was aborted when an
empty entry (Enter) was made. It is common under *nix that
pressing Enter without prior input of other characters selects
the default answer. This would also make the process more
fluid for croc.

In most usecases the default choice will be 'Y'/'Yes'. The only
exception is the prompt for overwriting existing files. We default
to 'N'/'No' in this prompt to prevent accidental overwriting of
files.
2021-06-10 14:12:05 +02:00
Niko Köser c72aaf63cb
chore(git): ignore .idea and .vscode folders 2021-06-09 16:00:09 +02:00
Zack Scholl a9e77673f4 update deps 2021-05-12 12:04:30 -07:00
Zack Scholl aa93d3e30f Merge branch 'master' of github.com:schollz/croc 2021-05-12 07:19:09 -07:00
Zack Scholl 15a19e1998 use all the config options 2021-05-12 07:19:02 -07:00
Zack Scholl e1ccb58d8f bump 9.1.4 2021-05-12 07:04:38 -07:00
Zack Scholl d0ebb7ad38 longer time for local connections 2021-05-12 07:04:10 -07:00
Zack Scholl 2bfbacf972 bump 9.1.3 2021-05-11 10:06:14 -07:00
Zack Scholl e29b4c47fd update deps 2021-05-11 10:05:37 -07:00
Zack Scholl b4deedf367 upgrade peerdiscovery 2021-05-11 10:04:21 -07:00
Zack Scholl 68e507dbba update peerdiscovery 2021-05-11 07:09:56 -07:00
Zack Scholl 66f30c0565 skip autocomplete installation on fish, Fixes #393 2021-05-10 13:47:17 -07:00
Zack Scholl 340bafba3d bump 9.1.2 2021-05-07 10:23:45 -07:00
Zack Scholl e47776bb10 fix 2021-05-07 10:21:24 -07:00
Zack 422f099e5e
Merge pull request #390 from wamserma/patch-1
Distinguish text message from file in receipient dialog
2021-05-07 10:20:53 -07:00
Zack Scholl bd4886ae3c update deps 2021-05-07 10:18:40 -07:00
Markus Wamser d5fd2060dd
Distinguish text message from file in receipient dialog
Fixes https://github.com/schollz/croc/issues/388
2021-05-01 21:27:44 +02:00
Zack Scholl 7c28279a58 bump 9.1.1 2021-04-29 09:43:50 -07:00
Zack Scholl 27b7cdbf12 bug fix: doesn't ask overwrite text Fixes #384 2021-04-29 09:16:22 -07:00
Zack Scholl 24fb8746a4 fix deadlock 2021-04-29 09:11:29 -07:00
Zack 45cb545a82
Merge pull request #383 from oxzi/dns-prefer-local
Prefer local DNS resolver over public DNS servers
Fixes #301
2021-04-26 10:45:07 -07:00
Alvar Penning 8f5c73837a Prefer local DNS resolver over public DNS servers
The changes cause the local DNS resolver to be used exclusively at
first. If this fails, the public DNS servers are queried as before.

This feature was previously requested. Merging should close #301.

Along the way, three other changes are introduced:

1. A public IPv6 DNS server was added.

2. The lookup returns the first result from a public DNS server and does
   not wait for all queries to be answered.

3. In the unlikely case that no public DNS server is able to answer, an
   error will be returned.
2021-04-26 11:43:45 +02:00
Zack b90f9329ca
Merge pull request #376 from Craeckie/master
Use unprivileged user in docker
2021-04-23 10:28:22 -07:00
Craeckie 968950f783
Use unprivileged user in docker
See 
https://americanexpress.io/do-not-run-dockerized-applications-as-root/
and 
https://engineering.bitnami.com/articles/why-non-root-containers-are-important-for-security.html
2021-04-22 09:53:49 +00:00
Zack Scholl 5b0883e1fe generate key once 2021-04-21 16:57:18 -07:00
Zack Scholl 420030998f add chacha20 2021-04-21 16:53:29 -07:00
Zack Scholl de2bcf114c upgrade imohash 2021-04-21 14:36:50 -07:00
Zack Scholl ab5ae5cbb6 add more benchmarks 2021-04-21 12:40:41 -07:00
Zack Scholl 94b3dba034 update readme 2021-04-20 16:01:44 -07:00
Zack 1a47543be9
Merge pull request #344 from k3b/patch-1
Added reference to croc android-version to README.md
2021-04-20 15:59:44 -07:00
Zack Scholl 407e162ec2 bump 9.1.0 2021-04-20 15:57:46 -07:00
Zack 35106d4dbe
Merge pull request #374 from schollz/v91
V91
2021-04-20 15:55:19 -07:00
Zack Scholl d6af319ad8 fix tests 2021-04-20 15:48:13 -07:00
Zack Scholl 85e7576311 fix 2021-04-20 15:44:28 -07:00
Zack Scholl 7ac7be37af check if file exists 2021-04-20 15:36:46 -07:00
Zack Scholl 669aeb377a check if file exists 2021-04-20 15:35:38 -07:00
Zack Scholl b655afb533 choose hash algorithm 2021-04-20 15:32:05 -07:00
Zack Scholl e9949ce3d7 check file size firsty 2021-04-20 09:08:02 -07:00
Zack Scholl 91a3dd5866 Merge branch 'master' of github.com:schollz/croc 2021-04-17 20:42:20 -07:00
Zack Scholl 026487a833 update docker 2021-04-17 20:40:56 -07:00
Zack Scholl f8ef096784 bump 9.0.0 2021-04-17 20:33:18 -07:00
Zack Scholl 0c2089bd4c update deps 2021-04-17 20:32:55 -07:00
Zack Scholl 5ad68b9ced update readme 2021-04-17 20:31:17 -07:00
Zack Scholl 9286b3c965 show folders when receiving 2021-04-17 20:27:51 -07:00
Zack Scholl c1edf24338 fix race condition 2021-04-17 20:07:50 -07:00
Zack Scholl d38fc18390 update deps 2021-04-17 14:31:32 -07:00
Zack Scholl f4cedd1e91 Merge branch 'master' of github.com:schollz/croc 2021-04-17 11:27:25 -07:00
Zack Scholl fc66c3b91f improve readme 2021-04-17 11:27:20 -07:00
Zack Scholl 2ac7d4f31f fix tests 2021-04-17 11:12:15 -07:00
Zack Scholl a96762b942 fix room deletion if room is full 2021-04-17 10:44:10 -07:00
Zack Scholl 0a0f7a03d7 update version 2021-04-17 10:33:38 -07:00
Zack Scholl 8148e191ae bump 2021-04-17 17:31:44 +00:00
Zack Scholl 25a985464a Merge branch 'master' of github.com:schollz/croc 2021-04-17 17:15:02 +00:00
Zack 333ece706e
Merge pull request #369 from schollz/v9
V9
2021-04-17 10:12:42 -07:00
Zack Scholl daf10395a3 update deps 2021-04-17 09:42:11 -07:00
Zack Scholl 9231b1a661 update utils benchmark 2021-04-17 09:39:47 -07:00
Zack Scholl 3e56d4cdb9 use magic bytes instead of checking max 2021-04-17 09:05:27 -07:00
Zack Scholl cec39ba2ce allow changing curve 2021-04-17 09:01:58 -07:00
Zack Scholl 7a997156ed minor 2021-04-16 17:17:32 -07:00
Zack Scholl c02b4f1256 fix: make sure that only pake messages are unencrypted 2021-04-16 17:15:51 -07:00
Zack Scholl babfd5f35f add option to overwrite automatically 2021-04-16 15:14:21 -07:00
Zack Scholl be5ceae8c7 prompt to overwrite 2021-04-16 15:12:11 -07:00
Zack Scholl 6be4080f05 remove hash exchange 2021-04-16 14:25:57 -07:00
Zack Scholl b0693751c1 fix 2021-04-16 14:01:48 -07:00
Zack Scholl 8250a39534 fix: delete room if full and third-party tries to enter 2021-04-16 09:48:11 -07:00
Zack Scholl 2131e99826 use new pake 2021-04-16 09:20:13 -07:00
Zack Scholl 628043b228 fix: do not use part of secret as room name 2021-04-16 08:13:43 -07:00
Zack Scholl 362a30e5e7 Merge branch 'master' of github.com:schollz/croc 2021-04-15 22:05:04 +00:00
Zack 828de41d6c
Merge pull request #361 from tdussa/BrokenSymlink
Transfer symlinks without touching their targets.
2021-04-15 15:01:49 -07:00
Tobias Dussa 876ce5764b Transfer symlinks without touching their targets. 2021-04-15 17:07:23 +02:00
Zack Scholl 59b287df7f Merge branch 'master' of github.com:schollz/croc 2021-04-13 22:40:03 +00:00
Zack 3fd125178f
Merge pull request #341 from MatejKafka/master
Added CROC_CONFIG_DIR env var to support custom config dir path
2021-04-13 15:38:38 -07:00
Zack 136faac448
Merge pull request #355 from stingalleman/patch-1
Remove dollar icons from commands without output
2021-04-13 15:37:22 -07:00
Zack 85a0bfb898
Merge pull request #359 from mizzunet/patch-1
Enhancements to bug_report.md
2021-04-13 15:36:39 -07:00
Missu 4718f3897c
Commented, added bug label
Commented lines need to be manually removed by the user, so no need to remove those anymore
Added "big" label for this, so easily discoverable from the Issues list
2021-04-08 11:42:19 +05:30
Sting Alleman 068d5c1031
Remove dollar icons from commands without output 2021-04-04 22:57:14 +02:00
Zack Scholl 4dfa1a9236 Merge branch 'master' of github.com:schollz/croc 2021-03-26 23:05:01 +00:00
Zack Scholl 6ba6ec9d32 bump 8.6.12 2021-03-26 16:03:51 -07:00
Zack Scholl c373b38b59 bump 8.6.12 2021-03-26 16:03:31 -07:00
Zack Scholl f2af5b7256 don't know why , but won't compile for freebsd/arm
⨯ release failed after 348.00s error=failed to build for freebsd_arm_7: # golang.org/x/net/ipv4
../../../../pkg/mod/golang.org/x/net@v0.0.0-20210326220855-61e056675ecf/ipv4/sys_freebsd.go:37:79: undefined: unix.MCAST_JOIN_GROUP
../../../../pkg/mod/golang.org/x/net@v0.0.0-20210326220855-61e056675ecf/ipv4/sys_freebsd.go:38:79: undefined: unix.MCAST_LEAVE_GROUP
../../../../pkg/mod/golang.org/x/net@v0.0.0-20210326220855-61e056675ecf/ipv4/sys_freebsd.go:39:79: undefined: unix.MCAST_JOIN_SOURCE_GROUP
../../../../pkg/mod/golang.org/x/net@v0.0.0-20210326220855-61e056675ecf/ipv4/sys_freebsd.go:40:79: undefined: unix.MCAST_LEAVE_SOURCE_GROUP
../../../../pkg/mod/golang.org/x/net@v0.0.0-20210326220855-61e056675ecf/ipv4/sys_freebsd.go:41:79: undefined: unix.MCAST_BLOCK_SOURCE
../../../../pkg/mod/golang.org/x/net@v0.0.0-20210326220855-61e056675ecf/ipv4/sys_freebsd.go:42:79: undefined: unix.MCAST_UNBLOCK_SOURCE
2021-03-26 16:02:39 -07:00
Zack Scholl 483f840401 Merge branch 'master' of github.com:schollz/croc 2021-03-26 22:45:03 +00:00
Zack Scholl ff12c33e7f bump 8.6.12 2021-03-26 15:41:45 -07:00
Zack Scholl e4cecf670b update deps 2021-03-26 15:41:13 -07:00
Zack Scholl 94e0e3ca67 Merge branch 'master' of github.com:schollz/croc 2021-03-26 22:40:03 +00:00
Zack Scholl a9d582cc6a lookup using standard dns 2021-03-26 15:39:33 -07:00
k3b ab9396937c
Added reference to croc android-version to README.md
See https://f-droid.org/en/packages/com.github.howeyc.crocgui/ for details
2021-03-25 12:32:17 +01:00
Matej Kafka c1e546ede6
Added CROC_CONFIG_DIR env var to support custom config dir path 2021-03-20 00:50:50 +01:00
Zack Scholl 63ba28c9b0 Merge branch 'master' of github.com:schollz/croc 2021-03-17 17:20:04 +00:00
Zack 6caf72df82
Merge pull request #340 from jfaltis/xdg-basedir-spec-compliance
Add compliance with XDG Base Directory Specification (XDG_CONFIG_HOME)
2021-03-17 10:17:52 -07:00
Jona 2273438373 add compliance with xdg base directory specification in regards to XDG_CONFIG_HOME 2021-03-17 17:45:07 +01:00
Zack Scholl 50a0d86e3d Merge branch 'master' of github.com:schollz/croc 2021-03-15 19:40:02 +00:00
Zack Scholl 50aa24d86d bump 8.6.11 2021-03-15 12:39:04 -07:00
Zack Scholl 674bff7a13 Merge branch 'master' of github.com:schollz/croc 2021-03-15 19:35:03 +00:00
Zack Scholl 757ed180fb update deps 2021-03-15 12:31:07 -07:00
Zack Scholl 76648a2926 Merge branch 'master' of github.com:schollz/croc 2021-03-15 19:05:04 +00:00
Zack Scholl 0b76edc362 update deps 2021-03-15 12:04:48 -07:00
Zack Scholl c39061c7fc Merge branch 'master' of github.com:schollz/croc 2021-03-15 18:55:03 +00:00
Zack Scholl fb2723d80b don't show description if only sending one file 2021-03-15 11:50:30 -07:00
Zack Scholl f84341a197 Merge branch 'master' of github.com:schollz/croc 2021-03-10 16:20:03 +00:00
Zack 6e9156d49c
Merge pull request #337 from alrs/alrs-fix-server-nil-salt-and-keys
src/tcp: fix dropped errors
2021-03-10 08:16:19 -08:00
Zack cd6d9a5aa0
Merge pull request #338 from alrs/alrs-fix-client-swallowed-errs
src/croc: fix dropped errors
2021-03-10 08:16:06 -08:00
Lars Lehtonen 3e5b876a32
src/croc: fix dropped errors 2021-03-09 16:55:42 -08:00
Lars Lehtonen a9487a332c
src/tcp: fix dropped errors 2021-03-09 16:48:38 -08:00
Zack Scholl de924f6a4f Merge branch 'master' of github.com:schollz/croc 2021-03-08 16:45:04 +00:00
Zack Scholl 03a27b6683 bump 8.6.10 2021-03-08 08:41:54 -08:00
Zack Scholl 0b719b9b77 update deps 2021-03-08 08:41:17 -08:00
Zack Scholl fc34d21cb8 thanks 2021-03-08 08:41:00 -08:00
Zack Scholl bb05d48fe9 Merge branch 'master' of github.com:schollz/croc 2021-03-08 16:40:02 +00:00
Zack 949480517f
Merge pull request #336 from hreese/master
Added support for SOCKS5 authentication (fixes #333)
2021-03-08 08:38:27 -08:00
Heiko Reese a20ebd7120 Added support for SOCKS5 authentication (fixes #333) 2021-03-06 11:55:16 +01:00
Zack Scholl d49bb8632b Merge branch 'master' of github.com:schollz/croc 2021-03-05 19:05:02 +00:00
Zack Scholl 10e57c3f97 bump 8.6.9 2021-03-05 11:02:51 -08:00
Zack Scholl be95662e35 update deps 2021-03-05 11:01:51 -08:00
Zack Scholl 105fb9a3ce Merge branch 'master' of github.com:schollz/croc 2021-03-05 17:05:02 +00:00
Zack Scholl 30783ce79c overwrite symlinks on transfer, like files, fixes #334 2021-03-05 09:00:15 -08:00
Zack Scholl a46f09ee1c Merge branch 'master' of github.com:schollz/croc 2021-02-23 20:15:02 +00:00
Zack Scholl cdabf629b6 bump 8.6.8 2021-02-23 12:10:30 -08:00
Zack Scholl 40cda1bed7 Merge branch 'master' of github.com:schollz/croc 2021-02-23 20:10:04 +00:00
Zack Scholl 92ab62d03e bump 8.6.8 2021-02-23 12:09:50 -08:00
Zack Scholl 31012b8f7d fix goreleaser 2021-02-23 12:09:42 -08:00
Zack Scholl 4b0d01d8f0 bump 8.6.8 2021-02-23 12:06:59 -08:00
Zack Scholl 648eb6c71d update deps 2021-02-23 12:03:29 -08:00
Zack Scholl b19a028aea Merge branch 'master' of github.com:schollz/croc 2021-02-19 18:30:03 +00:00
Zack 9588f2b4a4
Merge pull request #331 from schollz/dns
Dns
2021-02-19 10:25:32 -08:00
Zack Scholl cd2802b8b5 shorter dns fail time 2021-02-19 10:18:13 -08:00
Zack Scholl c5ff55a193 find dns from any number of providers 2021-02-19 10:16:58 -08:00
Zack Scholl 1cf309faf2 Merge branch 'master' of github.com:schollz/croc 2021-02-11 22:10:05 +00:00
Zack 8dc5bd6e04
Merge pull request #328 from lekoOwO/patch-1
Add alpine linux installation instructions
2021-02-11 14:06:29 -08:00
leko 37f09049a4
Update README.md 2021-02-11 15:19:11 +08:00
Zack Scholl eaa18cd502 Merge branch 'master' of github.com:schollz/croc 2021-02-10 17:40:04 +00:00
Zack Scholl b9d461e5df update deps 2021-02-10 09:36:42 -08:00
Zack Scholl 89ea0166fa Merge branch 'master' of github.com:schollz/croc 2021-02-03 18:10:04 +00:00
Zack Scholl 77fd78e408 Merge branch 'master' of github.com:schollz/croc 2021-02-03 10:08:40 -08:00
Zack Scholl edeb7c8886 update deps 2021-02-03 10:08:30 -08:00
Zack Scholl 4481fe2336 Merge branch 'master' of github.com:schollz/croc 2021-02-02 14:50:03 +00:00
Zack ef43873c3b
Merge pull request #325 from nikoksr/fix/missing-code-too-short-error
fix(cli): make 'code too short' error symmetric on both sender and receiver side
2021-02-02 06:48:21 -08:00
Zack Scholl 0bec0b26ab Merge branch 'master' of github.com:schollz/croc 2021-02-02 14:45:04 +00:00
Zack 681c824ef4
remove snap, it just doesn't work 2021-02-02 06:43:12 -08:00
Zack Scholl 950b6f83d9 Merge branch 'master' of github.com:schollz/croc 2021-02-01 15:00:03 +00:00
Zack Scholl 7f5d704a26 change name 2021-02-01 06:58:27 -08:00
Zack a6a8ab71ce
Merge pull request #315 from PeterEve/master
Added an option to ignore attached stdin.
2021-02-01 06:56:45 -08:00
Zack de56d2f6dd
Merge pull request #321 from Spaceface16518/docker-min
Reduce size of Docker image by stripping debug symbols
2021-02-01 06:55:08 -08:00
Zack Scholl 2f96b77b73 Merge branch 'master' of github.com:schollz/croc 2021-02-01 14:55:02 +00:00
Zack 0548c2e45f
Merge pull request #322 from benjamin-wen/patch-1
Update year
2021-02-01 06:54:42 -08:00
Niko Köser 0b60fef246
refactor: write errors into stderr and add exit code
Instead of writing errors into stdout and alway returning exit code 0,
we now write into stderr and return exit code 1 in case that an error
occured.
2021-02-01 10:48:34 +01:00
Niko Köser 3ccd4d07e9
fix: accidentally overwritten error value
In function _cli.send_ the named return value 'err' gets accidentally
overwritten in the deferred anonymous function that removes the
files/directories. Renamed the error variable inside the deferred
function so that it does not overwrite the original error anymore.

Closes #296
2021-02-01 10:34:06 +01:00
Benjamin Wen b5f1b35213
Update year 2021-01-28 11:27:27 +08:00
Spaceface16518 90eda5639f Strip go binary in docker build 2021-01-27 12:30:45 -06:00
Zack Scholl 77d0c7ae2e Merge branch 'master' of github.com:schollz/croc 2021-01-26 21:20:03 +00:00
Zack 493eb075f1
Merge pull request #318 from Spaceface16518/master
Docker deployment configuration
2021-01-26 13:16:23 -08:00
Spaceface16518 247d2b18ec Remove linux/ppc64le platform
gcc not found in $PATH?
2021-01-22 00:00:20 -06:00
Spaceface16518 6b8a14d831 Remove linux/s390x platform
Breaking the docker buildx build due to some signature verification
error
2021-01-22 00:00:20 -06:00
Amrit 743b2c1bf4
Create deploy.yml 2021-01-21 23:32:51 -06:00
Peter 17f3df7e36 Added an option to ignore attached stdin, for compatibility with node child_process 2021-01-10 13:17:43 +00:00
Zack Scholl dab683c9dc Merge branch 'master' of github.com:schollz/croc 2020-12-29 17:35:03 +00:00
Zack e829ca0ff4
thank you digital ocean 2020-12-29 09:34:57 -08:00
Zack Scholl e27c32cf6e Merge branch 'master' of github.com:schollz/croc 2020-12-28 19:05:03 +00:00
Zack Scholl a2b243ad94 bump 8.6.7 2020-12-28 11:01:27 -08:00
Zack Scholl 05640cd49f update deps 2020-12-28 11:00:44 -08:00
Zack Scholl 037dbbd4e9 Merge branch 'master' of github.com:schollz/croc 2020-12-28 18:50:06 +00:00
Zack 0994e4eda5
Merge pull request #307 from hillmarcus/306-file-size
Issue #306, File Size Mismatch
2020-12-28 10:46:39 -08:00
Zack 235f065a9c
Merge pull request #310 from vzlcn0/master
add new cmd option to set sender ip
2020-12-28 10:46:14 -08:00
vzlcn0 52bc6312e1 add new cmd option to set sender ip 2020-12-17 18:37:48 +03:00
Marcus d735cca970 Issue #306, File Size Mismatch
Updated utils.go to use a `1024` grouping instead of `1000` for file
sizes. This brings it inline with the progress bar project being used.

Updated utils_test.go to match the changes to utils.go
2020-12-07 18:44:12 -06:00
Zack Scholl af5ba6ead8 Merge branch 'master' of github.com:schollz/croc 2020-11-18 00:15:04 +00:00
Zack Scholl 5978896936 bump 8.6.6 2020-11-17 16:10:57 -08:00
Zack Scholl 2ffafd4607 Merge branch 'master' of github.com:schollz/croc 2020-11-18 00:10:04 +00:00
Zack Scholl e7ed4fc05f update deps 2020-11-17 16:09:29 -08:00
Zack Scholl 1da2f58a53 faster dns resolution on startup 2020-11-17 10:46:49 -08:00
Zack Scholl 284af7fc7a hm 2020-11-17 10:35:57 -08:00
Zack Scholl dbc4a08ad0 use google for lookup 2020-11-17 10:29:52 -08:00
Zack Scholl c55e9be0ef Merge branch 'master' of github.com:schollz/croc 2020-10-23 15:30:05 +00:00
Zack Scholl b740e491e6 bump 8.6.5 2020-10-23 08:26:15 -07:00
Zack Scholl 10ed62cfd5 Merge branch 'master' of github.com:schollz/croc 2020-10-23 15:05:03 +00:00
Zack Scholl 8d430b6cb1 update progressbar 2020-10-23 07:59:56 -07:00
Zack Scholl cdb1981358 Merge branch 'master' of github.com:schollz/croc 2020-10-23 00:05:04 +00:00
Zack Scholl f51ea8bfdc show progress 2020-10-22 17:03:46 -07:00
Zack Scholl a45e66733b Merge branch 'master' of github.com:schollz/croc 2020-10-22 17:20:05 +00:00
Zack Scholl 23f97c61ac bump 8.6.4 2020-10-22 10:18:40 -07:00
Zack Scholl cbb728b9a2 bump 8.6.4 2020-10-22 10:17:58 -07:00
Zack Scholl 9bb2d2b7cc bump 8.6.4 2020-10-22 10:17:33 -07:00
Zack Scholl 3f10a147dd bump 8.6.4 2020-10-22 10:16:55 -07:00
Zack Scholl d112f43f63 Merge branch 'master' of github.com:schollz/croc 2020-10-22 17:15:04 +00:00
Zack Scholl bf9ebfc4b4 show ping 2020-10-22 10:13:41 -07:00
Zack Scholl d3aa2be9ab ping server from discoveries 2020-10-22 10:11:11 -07:00
Zack Scholl 034e012227 allow pinging 2020-10-22 10:09:04 -07:00
Zack Scholl 05c82809c6 Merge branch 'master' of github.com:schollz/croc 2020-10-22 17:05:04 +00:00
Zack Scholl 79f85fda9b bug fix: return if found error 2020-10-22 09:59:55 -07:00
Zack Scholl 6ad8e08b0c Merge branch 'master' of github.com:schollz/croc 2020-10-22 16:55:03 +00:00
Zack Scholl 3bcc83a8fc gather all discoveries 2020-10-22 09:53:27 -07:00
Zack Scholl 6c86188564 Merge branch 'master' of github.com:schollz/croc 2020-10-22 14:45:05 +00:00
Zack Scholl 1d9393d39b bump 8.6.3 2020-10-22 07:40:56 -07:00
Zack Scholl 4663df1059 Merge branch 'master' of github.com:schollz/croc 2020-10-22 14:40:04 +00:00
Zack 817e0b78f6
Merge pull request #293 from nkhang/features/show-passphrase-issue
fix(cli): show passphrase when user indicate --pass
2020-10-22 07:40:01 -07:00
Khang. Nguyen Khac Nguyen 4070f12cbf change(croc): shorten flag with builder 2020-10-22 14:06:54 +07:00
Khang. Nguyen Khac Nguyen 8e50b59671 fix(cli): show passphrase when user indicate --pass
+ when user indicate --pass when sending file, indicate --pass flag in
recommended receive command.
2020-10-22 13:37:32 +07:00
Zack Scholl 61ffdc61f3 Merge branch 'master' of github.com:schollz/croc 2020-10-21 19:55:03 +00:00
Zack Scholl ff45ccd346 bump 8.6.2 2020-10-21 12:52:53 -07:00
Zack Scholl 5a791e98af bump 8.6.2 2020-10-21 12:51:47 -07:00
Zack Scholl 0d767af80a fix makefile 2020-10-21 12:51:43 -07:00
Zack Scholl bb971a9937 bump 8.6.1 2020-10-21 12:50:30 -07:00
Zack Scholl c88d3ad62a update makefile 2020-10-21 12:50:25 -07:00
Zack Scholl 1a242711cc Merge branch 'master' of github.com:schollz/croc 2020-10-21 17:30:05 +00:00
Zack Scholl 77732c49a0 bump 8.6.0 2020-10-21 10:28:28 -07:00
Zack Scholl b9b22ad041 bump 8.6.0 2020-10-21 10:28:27 -07:00
Zack Scholl 7a73e4912c allow using only local with --local flag 2020-10-21 18:25:56 +01:00
Zack Scholl 3129b097af use only local 2020-10-21 10:23:12 -07:00
Zack Scholl 1967ef57be bump 8.5.3 2020-10-21 09:41:08 -07:00
Zack Scholl b95c2c781b bump 8.5.3 2020-10-21 09:41:07 -07:00
Zack Scholl ea0e334feb add back ipv6 broadcast 2020-10-21 08:17:39 -07:00
Zack de03a5167a
Merge pull request #292 from nkhang/chore/cleanup
cleanup: cleanup dependencies and remove unused code
2020-10-21 08:16:52 -07:00
Khang. Nguyen Khac Nguyen 12e09020d1 chore(mod): cleanup dependencies
+ cleanup dependencies since we do not use spinner anymore.
2020-10-21 15:56:28 +07:00
Khang. Nguyen Khac Nguyen e85ac9f8bf chore(croc): remove redundant code
+ remove redundant return of func that does not return
+ remove func that is not used
2020-10-21 15:52:04 +07:00
Khang. Nguyen Khac Nguyen 9f54f2d08f chore(comm): cleanup comm Write func
+ better handling error.
+ use Send instead of Write since we do not need number of bytes sent.
2020-10-21 15:16:42 +07:00
Zack Scholl f5624007c8 bump 8.5.2 2020-10-19 11:04:43 -07:00
Zack Scholl 9b6c33c300 bump 8.5.2 2020-10-19 11:04:42 -07:00
Zack Scholl b66cfb4cc1 disable ipv6 for peer-to-peer discovery since it causes issues 2020-10-19 11:02:48 -07:00
Zack Scholl a5bcf382e0 update deps 2020-10-19 09:45:49 -07:00
Zack Scholl 539d66806a bump 8.5.1 2020-10-13 15:48:43 -07:00
Zack Scholl 768f3e1318 bump 8.5.1 2020-10-13 15:48:43 -07:00
Zack Scholl a968f494fa better help 2020-10-13 15:47:53 -07:00
Zack Scholl 911bb22b2d better environmental variable 2020-10-13 15:47:00 -07:00
Zack Scholl 58796824bb update deps 2020-10-13 15:45:54 -07:00
Zack Scholl f3697f6aad reduce packets sent for peer discovery 2020-10-13 13:47:43 -07:00
Zack Scholl 5374be1a0f use dns to determine relay 2020-10-13 12:26:11 -07:00
Zack Scholl 1d874b5dbe bump 8.5.0 2020-10-12 12:34:47 -07:00
Zack Scholl 586fc08768 bump 8.5.0 2020-10-12 12:34:47 -07:00
Zack Scholl fa1359f1b8 dos2unix 2020-10-12 12:33:56 -07:00
Zack Scholl b12fc47951 update deps 2020-10-12 12:31:54 -07:00
Zack 5a2d51c060
bash continues if autocompletion fails to install
Fixes #286
2020-10-09 07:16:17 -07:00
Zack 3396743d73
allow proxying connection (#283) 2020-10-05 08:30:45 -07:00
Zack Scholl e75b75164f bump 8.4.0 2020-10-04 13:16:36 -07:00
Zack Scholl 224c442567 bump 8.4.0 2020-10-04 13:16:35 -07:00
Zack 669920d4b5
Merge pull request #281 from TheQueasle/253-autocomplete-install
First pass at adding in the autocomplete files to the installer script
2020-10-04 13:12:04 -07:00
Zack 626490545a
Merge pull request #280 from fooofei/bug/review
CodeReview: fix resource leak && shorter code
2020-10-04 08:09:06 -07:00
fooofei 5a0ec9431f fix resource leak of *os.File 2020-10-04 10:38:30 +08:00
fooofei bc8c5db898 fix possible panic of nil compressor 2020-10-04 10:38:04 +08:00
fooofei c877497cc9 user io.ReadFull for shorter connection read code 2020-10-04 10:37:36 +08:00
Micheal Quinn 4675976f08 First pass at adding in the autocomplete files to the installer script 2020-09-29 22:19:10 -05:00
Zack f484635321
Merge pull request #276 from 0mp/patch-1
Add FreeBSD installation instructions
2020-09-26 05:39:05 -07:00
Mateusz Piotrowski d0f3bad818
Add FreeBSD installation instructions 2020-09-26 13:01:29 +02:00
Zack 4e6efc2678
Merge pull request #273 from abdulniyaspm/typo-fix
Fixed a typo in cli.go
2020-09-23 05:33:23 -07:00
ABDUL NIYAS P M 4ce170e73d
Fix a typo in cli.go 2020-09-23 16:28:00 +05:30
Zack 04e92a4ccd
Merge pull request #271 from tuxuser/readme/gentoo_portage
README: Add install instructions for gentoo via portage
2020-09-21 06:12:51 -07:00
Zack Scholl 43d2ff0a09 find open ports to open local relay 2020-09-21 06:02:13 -07:00
Zack Scholl 78e4d5e179 add util to find open ports 2020-09-21 05:51:50 -07:00
tuxuser 3d0b5b9d34 README: Add install instructions for gentoo via portage 2020-09-21 03:16:15 +02:00
Zack dab52b4af7
Merge pull request #268 from theStack/fix_send_without_argument
fix send without argument (trigger intended error message)
2020-09-20 15:32:34 -07:00
Sebastian Falbesoner a313a96a8e fix send without argument (trigger intended error message) 2020-09-19 21:48:11 +02:00
Zack a507b98cbe
Merge pull request #266 from theStack/show_all_files_when_sending_without_send
Show all files when sending without send command
2020-09-19 09:35:14 -07:00
Sebastian Falbesoner 2de73cb138 show all files when sending without send command 2020-09-19 17:52:32 +02:00
Zack 20a8603ffe
Merge pull request #265 from TheChiefMeat/patch-1
Added Chocolatey installation information
2020-09-19 06:53:24 -07:00
TheChiefMeat ebe713e881
Added Chocolatey installation information 2020-09-19 12:35:35 +01:00
Zack 28c38a4b9e
doh 2020-09-18 17:07:55 -07:00
Zack 1faebcf2e2
Fixes #262 2020-09-18 17:07:41 -07:00
Zack db388f47a6
Merge pull request #263 from sa3dany/patch-1
fix typo in readme
2020-09-18 10:58:31 -07:00
sa3dany a0cc9e943b
fix typo in readme 2020-09-18 20:42:34 +03:00
Zack Scholl 9ac64f5c75 fast 2020-09-18 06:38:18 -07:00
Zack Scholl 7b15dcd2dc fork urfave/cli 2020-09-17 13:04:33 -07:00
Zack Scholl fda0bf7fd4 bump 8.3.2 2020-09-16 14:54:02 -07:00
Zack Scholl 7d155adcf1 bump 8.3.2 2020-09-16 14:54:02 -07:00
Zack Scholl ebc2cb2d03 update progressbar and peerdiscovery 2020-09-16 14:28:11 -07:00
Zack b144fa28e7
Merge pull request #260 from masterZSH/master
Use hex.EncodeToString to encode to hex
2020-09-16 11:00:09 -07:00
masterZSH f9f32a4b0e Use hex.EncodeToString to encode to hex 2020-09-16 16:37:21 +08:00
Zack Scholl b916b89f7e include files as they are 2020-09-15 12:46:42 -07:00
Zack Scholl 32bb98fd4f fix making publish 2020-09-15 12:46:07 -07:00
Zack Scholl ad6e7dff43 add autocomplete files to goreleaser 2020-09-15 12:30:53 -07:00
Zack Scholl a48bf7bbe0 hook happens in make file 2020-09-15 12:29:36 -07:00
Zack de8dfb10aa
Merge pull request #259 from masterZSH/master
Add error reporting
2020-09-15 09:23:42 -07:00
masterZSH 833668e8f2 Add error reporting 2020-09-15 09:33:43 +08:00
Zack Scholl 8a0800ca90 better error 2020-09-13 12:15:05 -07:00
Zack Scholl 4fc40274db use default bash complete 2020-09-13 12:11:18 -07:00
Zack Scholl 8c116cf66a add autocompletion 2020-09-12 08:42:19 -07:00
Zack acda80d35c
Merge pull request #254 from Naramsim/patch-1
docs(readme): shorten docker command for the relay
2020-09-09 13:18:12 -07:00
Alessandro Pezzè 1534e913a3
docs(readme): shorten docker command for the relay 2020-09-09 21:53:15 +02:00
Zack b9e834104a
Merge pull request #252 from jolheiser/env
Add environment variables to CLI
2020-09-09 09:35:07 -07:00
Zack 0aabd23c61
Merge pull request #251 from jolheiser/gitignore
Simple gitignore
2020-09-09 09:34:27 -07:00
jolheiser ccba416e85
Env vars for a few CLI options
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2020-09-09 10:25:13 -05:00
jolheiser 8258222cc5
Simple gitignore
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2020-09-09 10:22:53 -05:00
Zack f70eb17afb
Merge pull request #249 from jolheiser/cli
Update CLI to v2
2020-09-09 08:12:25 -07:00
jolheiser 5ad8bd8e2c
Fix aliases
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2020-09-09 10:06:13 -05:00
jolheiser 9a20d507a7
Update CLI to v2
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2020-09-09 10:05:57 -05:00
Zack f2c5ca820a
Merge pull request #246 from herbygillot/readme-macports
README: add instructions for installing with MacPorts
2020-09-07 22:16:38 -07:00
Herby Gillot ce7c497c09 README: add instructions for installing with MacPorts 2020-09-08 00:15:07 -04:00
Zack 1226a802e4
Merge pull request #244 from astrophena/patch-1
Add Termux installation instructions to README.md
2020-09-06 15:42:49 -07:00
Ilya Mateyko f20c42319b
Add Termux installation instructions to README.md 2020-09-07 01:03:24 +03:00
Zack Scholl a5e882ec25 bump 8.3.1 2020-09-06 08:47:32 -07:00
Zack Scholl 9d5302b1b7 bump 8.3.1 2020-09-06 08:47:31 -07:00
Zack Scholl bdb859c15c use version 2020-09-06 08:45:59 -07:00
Zack Scholl 22c35412ac bump 8.3.1 2020-09-06 08:44:04 -07:00
Zack Scholl f2af0b7ed5 bump 8.3.1 2020-09-06 08:44:03 -07:00
Zack Scholl 5d6546ba58 tag 2020-09-06 08:43:14 -07:00
Zack Scholl f4fe211bbe bump 8.3.2 2020-09-06 08:42:51 -07:00
Zack Scholl f950633a86 bump 8.3.2 2020-09-06 08:37:37 -07:00
Zack Scholl 65b6111512 push before prepare 2020-09-06 08:37:10 -07:00
Zack Scholl 2db2a914f2 bump 8.3.1 2020-09-06 08:33:14 -07:00
Zack Scholl 345ef0567e compute filename and deliver without overwriting 2020-09-05 17:23:07 -07:00
Zack 189890259e
Update README.md 2020-09-04 09:00:30 -07:00
Zack Scholl e771e20ac4 fix version 2020-09-04 06:08:38 -07:00
Zack Scholl 5e78725afa Fixes #240 2020-09-04 06:06:48 -07:00
Zack Scholl fc14ef25ed version with v 2020-09-03 15:55:52 -07:00
Zack Scholl b48c96fc37 bump 8.3.0 2020-09-03 15:51:13 -07:00
Zack Scholl 87e54acd8a add option to disable compression Fixes #239 2020-09-03 15:09:23 -07:00
Zack Scholl 555ddec5e3 handle symlinks Fix #238 2020-09-03 14:57:09 -07:00
Zack Scholl ff99b07ef1 gather symlink info 2020-09-03 14:49:08 -07:00
Zack Scholl 26056a8366 test release 2020-09-03 14:21:43 -07:00
Zack Scholl 3692e32dfb don't tag version before commiting 2020-09-03 14:19:32 -07:00
Zack Scholl 11efb6be5e get version from env varaible 2020-09-03 14:17:12 -07:00
Zack Scholl 900424ca66 update go in docker 2020-09-03 13:34:10 -07:00
Zack Scholl bd2376e920 allow getting password through file Fix #226 2020-09-03 13:31:01 -07:00
Zack Scholl def4f94ffd Merge branch 'master' of github.com:schollz/croc into master 2020-09-03 12:45:47 -07:00
Zack Scholl bbc0ce4e9c better info about incorrect passwords Fixes 237 2020-09-03 12:45:40 -07:00
Zack Scholl 8b6c0d1c39 bump 8.2.1 2020-09-03 11:40:29 -07:00
Zack Scholl d55327d344 bump 8.2.1 2020-09-03 11:40:23 -07:00
Zack Scholl c7ba55fc83 use default port of 9009 if none found #236 2020-09-03 09:53:14 -07:00
Zack Scholl 85b370291d update readme about sending text Fixes #233 2020-09-03 09:42:56 -07:00
Zack Scholl 81ad30c633 bump 8.2.0 2020-09-02 17:37:17 -07:00
Zack ba2c46c1cb
Merge pull request #234 from schollz/text
send and receive text
2020-09-02 17:36:33 -07:00
Zack Scholl 0eb095bf76 println 2020-09-02 17:35:36 -07:00
Zack Scholl 8fbb7e5019 send and receive text 2020-09-02 17:33:53 -07:00
Zack Scholl 48d63e4854 text works 2020-09-02 17:24:32 -07:00
Zack Scholl ea781e569b bug fix: propogate error when connecting 2020-09-02 09:46:31 -07:00
Zack Scholl a8c5bef7c0 raise max bytes to allow huge files #231 2020-09-01 09:32:03 -07:00
Zack Scholl b188a2691e bump 8.1.3 2020-08-31 11:58:07 -07:00
Zack Scholl 20967519fd update deps 2020-08-31 11:56:25 -07:00
Zack Scholl 09a37a2be4 update readme 2020-08-30 08:54:07 -07:00
Zack Scholl 7bc9dc1826 bump 8.1.2 2020-08-27 10:49:30 -07:00
Zack Scholl 2345148fde make sure conn is not nil 2020-08-27 10:13:47 -07:00
Zack Scholl 50bf003022 try ipv6 first 2020-08-27 09:40:41 -07:00
Zack Scholl 695444159e add default ipv6 relay 2020-08-27 09:24:19 -07:00
Zack Scholl 0533f0c96e release auto 2020-08-27 08:15:01 -07:00
Zack Scholl 52182099eb bump 8.1.1 2020-08-27 08:13:07 -07:00
Zack Scholl e250eeede6 add makefile for releases 2020-08-27 08:12:47 -07:00
Zack Scholl 4aa7f05630 slightly more debugging 2020-08-27 08:10:44 -07:00
Zack Scholl 3a805f8be3 bump 8.1.0 2020-08-26 19:16:25 -07:00
Zack Scholl 588e650d80 don't split host if localhost 2020-08-26 17:46:35 -07:00
Zack Scholl baddb93c4e local ipv6 works 2020-08-26 14:56:57 -07:00
Zack Scholl c9a58513e1 attempt to use ipv6 discoveries 2020-08-26 14:42:49 -07:00
Zack Scholl 8f13aedc19 thanks 2020-08-26 10:00:56 -07:00
Zack Scholl c0a05401c9 update deps 2020-08-26 09:58:06 -07:00
Zack Scholl ae384490d6 don't create folder if its a . 2020-08-26 09:55:59 -07:00
Zack e3ed4ba998
Merge pull request #228 from lpar/cleanup
Improve error reporting
2020-08-26 09:50:24 -07:00
Zack 43480dd997
Merge pull request #227 from lpar/master
Initial IPv6 fixes
2020-08-26 09:49:16 -07:00
mathew 6874d9eede Improve error reporting 2020-08-22 18:12:09 -05:00
mathew 1b646d5528 Improve error reporting 2020-08-22 18:05:00 -05:00
mathew 827b5d3a86 Initial IPv6 fixes 2020-08-22 14:51:32 -05:00
Zack Scholl 0beeebc351 bump 8.0.13 2020-08-12 09:59:07 -07:00
Zack Scholl f4047d5500 remove snap 2020-08-12 09:59:00 -07:00
Zack Scholl 4deced8827 bump 8.0.13 2020-08-12 09:58:13 -07:00
Zack Scholl c260147714 ignore darwin386 2020-08-12 09:58:11 -07:00
Zack Scholl 81e9f772a1 bump 8.0.13 2020-08-12 09:57:18 -07:00
Zack Scholl 8b11c5b661 ignore darwin386 2020-08-12 09:57:06 -07:00
Zack Scholl 009f36f16c bump 8.0.13 2020-08-12 09:49:29 -07:00
Zack Scholl 73dec72a74 update deps 2020-08-12 09:49:06 -07:00
Zack Scholl ee9188b082
signed commit 2020-07-17 12:54:10 -07:00
Zack Scholl fdf383b2d7 bump 8.0.12 2020-07-15 10:48:52 -07:00
Zack Scholl 7fd8fda107 default to port 9009 if port is lost during discovery
fixes #222
2020-07-15 10:47:56 -07:00
Zack Scholl 1255a79a57 update deps 2020-07-14 15:34:57 -07:00
Zack Scholl b4e1ed2697 update deps 2020-06-19 13:23:32 -07:00
Zack Scholl 0377223a67 fix tests: generate file in reproducible way #218 2020-05-18 07:20:51 -07:00
Zack dd9cd82732
Create FUNDING.yml 2020-05-13 14:08:02 -07:00
Zack 91468709aa
update readme with number of ports for relay 2020-05-12 12:04:08 -07:00
Zack Scholl 23c21bcafd bump 8.0.11 2020-05-12 11:33:03 -07:00
Zack Scholl 78b643792e revert 2020-05-12 11:30:00 -07:00
Zack Scholl 532cfa9cd9 bump 8.0.11 2020-05-12 05:41:57 -07:00
Zack Scholl cf6b13d156 add personal files to plugs #190 2020-05-12 12:39:15 +00:00
Zack 9440d8eb04
add gif 2020-05-08 11:00:07 -07:00
Zack Scholl 14f6a4a8be add example gif 2020-05-08 10:58:51 -07:00
Zack Scholl 93e45c6942 bump 8.0.10 2020-05-06 10:55:14 -07:00
Zack Scholl 6dc44ec002 faster pake 2020-05-06 10:50:57 -07:00
Zack Scholl 4211cea92e add benchmark for tcp connection 2020-05-06 10:18:39 -07:00
Zack Scholl 1740bda985 bump 8.0.9 2020-05-01 07:00:17 -07:00
Zack Scholl 189d1f7b2a update deps 2020-05-01 06:59:09 -07:00
Zack Scholl 86ebbaa618 bump 8.0.8 2020-04-24 08:17:24 -07:00
Zack Scholl 2e7708e3cd whoops 2020-04-22 07:08:08 -07:00
Zack Scholl cb522f2f06 debugging the comm 2020-04-22 06:24:47 -07:00
Zack Scholl 97f7f28f6e update deps 2020-04-20 12:33:16 -07:00
Zack Scholl 3ed036b51d bug fix: increase deadline for reading in channels, addresses #211 2020-04-20 12:30:07 -07:00
Zack Scholl a3e81e1d87 bump 8.0.7 2020-04-09 10:12:30 -07:00
Zack Scholl e56e65207f bump 8.0.7 2020-04-09 09:55:36 -07:00
Zack Scholl f6ea7243ea update readme 2020-04-09 09:54:58 -07:00
Zack Scholl f9f4f291da use debug instead of warn/error addresses #205 2020-04-09 09:54:04 -07:00
Zack d1c2777906
Merge pull request #209 from maximbaz/relay-show-version-on-startup
relay: show version on startup
2020-04-09 09:50:21 -07:00
Zack 0860283407
Merge pull request #210 from maximbaz/add-systemd-service
Add systemd service
2020-04-09 09:49:55 -07:00
Maxim Baz cb025ae8d4
Add systemd service
A while ago a user contributed this systemd service to Arch package, I thought it would make sense to have it available in the repo itself, so that (a) other people can find it easier and (b) if there are any improvements, the entire community will benefit of them.
2020-04-09 18:14:00 +02:00
Maxim Baz c058bcbb6b
relay: show version on startup
Since relay is a long-running process, I find myself in situations where I dont know which version of croc I have running.

This simple startup log will make it obvious.
2020-04-09 17:44:19 +02:00
Zack Scholl 9bf470ef29 bump 8.0.6 2020-04-09 08:02:10 -07:00
Zack Scholl 11d4fead2c update deps 2020-04-09 08:01:20 -07:00
Zack Scholl 9c0bc3efc3 bug fix: two read deadlines to prevent memory leak
addresses #205
2020-04-09 07:40:39 -07:00
Zack Scholl 386f4ff958 bump 8.0.5 2020-03-31 13:43:13 -07:00
Zack Scholl 97bf35bf93 fix debug 2020-03-31 13:42:52 -07:00
Zack Scholl f8fd239eec bump 8.0.5 2020-03-31 13:34:10 -07:00
Zack Scholl 72378947b5 update progressbar, show external ip on receiver 2020-03-31 13:33:27 -07:00
Zack Scholl b0125b63e7 test should not exceed max bytes 2020-03-27 09:38:09 -07:00
Zack Scholl b60a841044 bug fix: prevent crazy number of bytes getting into comm 2020-03-27 09:32:41 -07:00
Zack Scholl 44c3d43fa0 bump 8.0.4 2020-03-24 08:37:14 -07:00
Zack Scholl 7a605dd5c8 update deps 2020-03-24 08:36:52 -07:00
Zack Scholl aae56043cf bug fix: lock the chunk map
addresses #204
2020-03-18 03:06:50 +00:00
Zack Scholl 09d35d248f bump 8.0.3 2020-03-08 07:15:32 -07:00
Zack Scholl 03fe1c770a bump 8.0.2 2020-03-06 07:15:04 -08:00
Zack Scholl 1dd75c4bc3 better error messages 2020-03-06 07:12:08 -08:00
Zack Scholl 8b6500adfd hide most of the code phrase to use as authentication 2020-03-06 07:05:04 -08:00
Zack Scholl 3cf474e6e8 more tests 2020-03-02 10:10:17 -08:00
Zack Scholl 820225b684 more tests 2020-03-02 10:06:20 -08:00
Zack Scholl eddf361893 bump 8.0.1 2020-03-02 09:42:34 -08:00
Zack Scholl 2d6206b84f bump 8.0.1 2020-03-02 09:35:35 -08:00
Zack Scholl 074a869d6e bump 8.0.0 2020-03-02 09:04:25 -08:00
Zack 0c305fee08
Merge pull request #201 from schollz/v8
V8
2020-03-02 09:03:28 -08:00
Zack Scholl 5e37a308fe throw error when submitting bad passphrase to relay 2020-02-28 17:05:03 -08:00
Zack Scholl bc1f89ff68 bump 8.0.0 2020-02-28 16:57:46 -08:00
Zack Scholl 788a63cfa6 update deps 2020-02-28 13:31:04 -08:00
Zack Scholl a87b571376 update dockerifle 2020-02-28 13:30:39 -08:00
Zack Scholl 0b99be5b30 update year 2020-02-28 13:27:44 -08:00
Zack Scholl c3adc2981f encrypt external ip 2020-02-28 13:02:23 -08:00
Zack Scholl 5fce2a2e27 encrypt external ip 2020-02-28 12:58:46 -08:00
Zack Scholl d5846bc88d encrypt all communication with relay 2020-02-28 11:59:56 -08:00
Zack 2217f7ca61
Thanks! 2020-02-18 11:44:15 -08:00
Zack Scholl 4c56ec283d bump 6.4.11 2020-02-18 11:28:36 -08:00
Zack Scholl bc0841d8a1 update deps 2020-02-18 11:25:02 -08:00
Zack d4cbe03d0d
Merge pull request #198 from rkuprov/shared-secret-update
croc: secret phrase parsing
2020-02-18 10:51:29 -08:00
Roman df79b2ed8e croc: secret phrase parsing
what:
- `croc alpha beta gamma` is now properly understood as
 `croc alpha-beta-gamma`.

why:
- to increase convenience.
2020-02-17 21:31:56 -07:00
Zack Scholl 29882db39b bump 6.4.10 2020-01-15 09:14:37 -08:00
Zack Scholl 073569f292 need to add network bind to snap 2020-01-15 09:14:06 -08:00
Zack Scholl d6694a9b41 bump 6.4.9 2020-01-15 08:07:22 -08:00
Zack Scholl 5369fbc3aa bump 6.4.9 2020-01-15 08:06:28 -08:00
Zack Scholl 03d9785408 update deps, add snapcraft plugs 2020-01-15 08:06:08 -08:00
Zack Scholl fbcad738bb bump 6.4.8 2019-12-23 14:49:22 -08:00
Zack Scholl fd20b25a30 update deps 2019-12-23 14:48:44 -08:00
Zack Scholl aa54ff18e5 add snap install directions 2019-12-23 07:57:44 -08:00
Zack Scholl 44286ce473 thanks! 2019-12-23 07:56:44 -08:00
Zack Scholl 4824033619 clearly specify password 2019-12-23 07:55:10 -08:00
Zack 493ae9306d
Merge pull request #185 from xenrox/docker-pass-support
Support relay password for docker
2019-12-23 07:53:04 -08:00
Zack Scholl 25902edf5b bump 6.4.7 2019-12-16 07:38:56 -08:00
Zack Scholl 3d9bbff7a7 bump 6.4.7 2019-12-16 07:38:18 -08:00
Zack Scholl 02be7abe32 bump 6.4.7 2019-12-16 07:37:57 -08:00
Zack Scholl 4dd2922b5f fix snapcraft 2019-12-16 07:37:30 -08:00
Thorben Günther 06dd3ba62f
Don't force users to set $CROC_PASS 2019-12-07 02:06:01 +01:00
Thorben Günther 1ae85758f0
Support relay password for docker 2019-12-06 12:31:26 +01:00
Zack f12940bbcd
Merge pull request #183 from TheQueasle/fresh-mac-path-missing
Adding a function that creates the prefix
2019-11-26 12:50:33 -08:00
Micheal Quinn 247a698757 Adding in EUID check to create_prefix. Also adding in more checks to that function to make sure the tools needed are available. 2019-11-26 14:18:30 -06:00
Micheal Quinn 47d84b9947 Adding rcode for completness sake on the create_prefix function. 2019-11-26 13:50:31 -06:00
Micheal Quinn f6ad8f57cf Adding a function that creates a prefix and logic surrounding it to only create it if it does not already exist 2019-11-26 13:41:38 -06:00
Zack 24cb8f0103
Update README.md 2019-11-26 09:50:16 -08:00
Zack Scholl f52447acd9 bump 6.4.6 2019-11-21 15:24:25 -08:00
Zack Scholl 3c03719863 need to close goroutine corrrectly 2019-11-21 15:10:21 -08:00
Zack Scholl 5bafc99741 check if the purported IP is really local #168 2019-11-21 14:58:48 -08:00
Zack Scholl 20061b484e bump 6.4.5 2019-11-19 16:39:38 -08:00
Zack 88c4257816
Merge pull request #180 from maximbaz/support-default-port-receiver
Support default port on receiver side
2019-11-19 16:38:40 -08:00
Maxim Baz 1a544e4624
Support default port on receiver side 2019-11-20 01:11:52 +01:00
Zack Scholl eb85477086 bump 6.4.4 2019-11-19 15:25:33 -08:00
Zack Scholl 5faacd3328 try 9009 port by default #178 2019-11-19 15:19:53 -08:00
Zack 04cad7b9a5
thanks! 2019-11-19 14:05:05 -08:00
Zack Scholl 60d6489c69 bump 6.4.3 2019-11-19 14:01:57 -08:00
Zack 0e555179f8
Merge pull request #176 from maximbaz/patch-2
Add version to the dir name in the source tarball
2019-11-19 14:01:20 -08:00
Zack 3d672d6ac2
Merge pull request #179 from maximbaz/remember-relay-password-receive
Remember relay password on receive too #177
2019-11-19 14:00:34 -08:00
Maxim Baz b27b814b49
Switch to GlobalIsSet 2019-11-19 22:58:35 +01:00
Maxim Baz cc6af6e5e8
Checkout the version tag when cloning repo 2019-11-19 22:57:24 +01:00
Maxim Baz 252475f72e
Remember relay password on receive too #177 2019-11-19 21:06:12 +01:00
Zack Scholl e3ba938582 set relay password when remembering #177 2019-11-19 11:47:04 -08:00
Maxim Baz 1cdccfa884
Add version to the dir name in the source tarball 2019-11-19 19:38:29 +01:00
Zack Scholl e84e89b786 bump 6.4.2 2019-11-19 10:15:44 -08:00
Zack Scholl fb35da42ed upload separately 2019-11-19 10:15:02 -08:00
Zack Scholl d91ce7e469 bump 6.4.2 2019-11-19 10:12:18 -08:00
Zack Scholl cbc55a84a7 add snapcraft back 2019-11-19 10:12:07 -08:00
Zack Scholl 0694d61294 add upload asset to goreleaser #172 2019-11-19 09:24:13 -08:00
Zack f102195354
Merge pull request #175 from apeyrat/master
croc is now available in the main scoop bucket
2019-11-19 07:05:29 -08:00
Alain a5571306c2
croc is now available in the main bucket
No need to add dedicated channel as it is available in the main bucket.
See: https://github.com/ScoopInstaller/Main/blob/master/bucket/croc.json
2019-11-19 13:24:54 +01:00
Zack Scholl 60030cdfbb bump 6.4.1 2019-11-18 14:31:29 -08:00
Zack Scholl 181dee9991 quit on bad password 2019-11-18 14:26:01 -08:00
Zack Scholl bcb2b5d783 fix tests 2019-11-18 13:27:22 -08:00
Zack Scholl af95cddd8d fix tests 2019-11-18 13:25:51 -08:00
Zack Scholl 6b26af4dca bump 6.4.0 2019-11-18 13:15:51 -08:00
Zack Scholl b9b3995f02 exit on EOF 2019-11-18 13:15:41 -08:00
Zack Scholl d0c2dc1be8 use one-byte pings 2019-11-18 13:09:17 -08:00
Zack 544d3e0144 Update issue templates 2019-11-18 12:07:35 -08:00
Zack Scholl c369f67745 fix src bundle 2019-11-18 12:02:54 -08:00
Zack Scholl 76fc3f1a77 fix tests 2019-11-18 11:13:36 -08:00
Zack Scholl baf5d6f27f bump 6.3.0 2019-11-18 10:43:28 -08:00
Zack Scholl 497ffb8c2f update deps 2019-11-18 10:43:14 -08:00
Zack Scholl 7b5acc89a4 remove snapcraft for now 2019-11-18 10:42:42 -08:00
Zack Scholl eb22400db0 bump 6.3.0 2019-11-18 10:23:29 -08:00
Zack Scholl 79e5f4445b fix goreleaser 2019-11-18 10:23:27 -08:00
Zack Scholl 0f15698970 bump 6.3.0 2019-11-18 10:21:13 -08:00
Zack Scholl 419a766c6f fix goreleaser 2019-11-18 10:21:10 -08:00
Zack Scholl 19b5923f48 bump 6.3.0 2019-11-18 10:20:29 -08:00
Zack Scholl 2f2e19aa91 add snap to croc 2019-11-18 10:15:57 -08:00
Zack Scholl ae412375ef Merge branch 'master' of github.com:schollz/croc 2019-11-18 08:18:37 -08:00
Zack Scholl 21c1efe319 fix tests 2019-11-18 08:18:30 -08:00
Zack 4206605a2d
Merge pull request #174 from schollz/pass
implement password addresses #173
2019-11-18 08:17:03 -08:00
Zack Scholl 9d5eec4246 implement password addresses #173 2019-11-18 08:16:19 -08:00
Zack Scholl 3941762bf3 allow disabling multiplexing 2019-11-18 07:57:12 -08:00
Zack Scholl 648c41d707 use siec 2019-11-18 07:53:57 -08:00
Zack Scholl c7f419ca2d use functional encryption 2019-11-18 07:50:43 -08:00
Zack Scholl fe8dad42f7 bump 6.2.4 2019-11-18 07:42:09 -08:00
Zack Scholl 6a036d68f6 update releaser 2019-11-18 07:36:49 -08:00
rain1 b755d3f827 Update README.md
remove link to release
2019-11-18 07:36:49 -08:00
rain1 25776a1d96 Update README.md 2019-11-18 07:36:49 -08:00
rain1 9ec23ae367 Update README.md
remove curl | bash recommendation
2019-11-18 07:36:49 -08:00
Zack 43927a6dbb
Merge pull request #152 from HugoReeves/master
readme: add nix install instructions
2019-11-17 13:23:55 -08:00
Zack Scholl b8bcbb3ecc bump 6.2.3 2019-11-17 13:20:45 -08:00
Zack Scholl b7625ef55c add more info on how to send 2019-11-17 13:19:27 -08:00
Zack Scholl b7565177be fix tests 2019-11-17 13:05:43 -08:00
Zack Scholl a7aed67c65 bump 6.2.2 2019-11-17 13:00:41 -08:00
Zack Scholl b4f8fafb63 don't hang it no acceptance
Fixes #171
2019-11-17 12:59:29 -08:00
Zack Scholl 04724f4900 bump 6.2.1 2019-11-17 09:44:02 -08:00
Zack Scholl b2e81fb50d update deps 2019-11-17 09:41:50 -08:00
Zack 1754333ac0
Merge pull request #170 from maximbaz/patch-1
Add Arch Linux installation to README
2019-11-13 08:15:21 -08:00
Maxim Baz f3799213b6
Add Arch Linux installation to README 2019-11-13 01:41:41 +01:00
Zack bfa7768781
Update README.md 2019-11-12 12:14:42 -08:00
Zack Scholl acd7d8d8ec add profiling lines 2019-11-11 11:26:32 -08:00
Zack Scholl bdb8bf3ac4 addresing CPU usage #168 2019-11-11 11:26:12 -08:00
Zack a0d9d74d5d
Merge pull request #166 from taigrr/master
Update README.md
2019-11-03 17:18:39 -07:00
Tai Groot 68f039fbb0
Update README.md
Removed v6 that causes error from build from source instructions
2019-11-03 16:09:07 -08:00
Zack 9afae3b6b0
Merge pull request #164 from schollz/prepend
Prepend payload with 'croc' so no interference from other broadcasts
2019-10-28 13:15:47 -07:00
Zack Scholl c7624535e9 skip discovery 2019-10-28 13:13:03 -07:00
Zack Scholl da626334e0 check discoveries for right prefix 2019-10-28 12:46:24 -07:00
Zack Scholl aaeda77af4 bump 6.2.0 2019-10-24 07:22:57 -07:00
Zack Scholl ffddd3e989 prompt if sender wants to ask 2019-10-24 06:58:12 -07:00
Zack 4b8d32ff75
Merge pull request #161 from schollz/ask
ask using the machine ID for extra secure layer Fixes #159
2019-10-23 15:01:55 -07:00
Hugo Reeves 53328fa58b
readme: add nix install instructions 2019-08-14 11:09:13 +12:00
52 changed files with 5443 additions and 1220 deletions

3
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,3 @@
# These are supported funding model platforms
github: schollz

9
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,9 @@
---
name: New issue
about: Create an issue
title: ''
assignees: ''
---
*Read this and delete before submitting:* Thanks for starting a discussion! Please provide as much context as possible so that others can understand your thoughts. If you have a specific change in mind, consider submitting a pull request instead.

10
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "daily"

52
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,52 @@
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
unit-tests:
name: Go unit tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.23'
- run: go version
- run: go test -v ./...
- name: Build files
run: |
go version
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags '-extldflags "-static"' -o croc.exe
CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags '-extldflags "-static"' -o croc.exe
CGO_ENABLED=0 GOOS=windows GOARCH=arm go build -ldflags '-extldflags "-static"' -o croc.exe
CGO_ENABLED=0 GOOS=windows GOARCH=arm64 go build -ldflags '-extldflags "-static"' -o croc.exe
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags '-extldflags "-static"' -o croc
CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags '-extldflags "-static"' -o croc
CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags '-extldflags "-static"' -o croc
GOARM=5 CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags '-extldflags "-static"' -o croc
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags '-extldflags "-static"' -o croc
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags '-s -extldflags "-sectcreate __TEXT __info_plist Info.plist"' -o croc
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags '-s -extldflags "-sectcreate __TEXT __info_plist Info.plist"' -o croc
CGO_ENABLED=0 GOOS=dragonfly GOARCH=amd64 go build -ldflags '' -o croc
CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags '' -o croc
CGO_ENABLED=0 GOOS=freebsd GOARCH=arm64 go build -ldflags '' -o croc
CGO_ENABLED=0 GOOS=netbsd GOARCH=386 go build -ldflags '' -o croc
CGO_ENABLED=0 GOOS=netbsd GOARCH=amd64 go build -ldflags '' -o croc
CGO_ENABLED=0 GOOS=netbsd GOARCH=arm64 go build -ldflags '' -o croc
CGO_ENABLED=0 GOOS=openbsd GOARCH=amd64 go build -ldflags '' -o croc
CGO_ENABLED=0 GOOS=openbsd GOARCH=arm64 go build -ldflags '' -o croc
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.20.7' # go1.20.8+ refuses to build go1.22 code...
- name: Build Windows 7
run: |
go version
rm go.mod go.sum
go mod init github.com/schollz/croc/v10
go mod tidy
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags '-extldflags "-static"' -o croc.exe
CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags '-extldflags "-static"' -o croc.exe

64
.github/workflows/deploy.yml vendored Normal file
View File

@ -0,0 +1,64 @@
# This is a basic workflow to help you get started with Actions
name: CD
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the main branch
push:
branches:
- '*'
tags:
- 'v*'
pull_request:
branches:
- '*'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
docker:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Docker meta
id: docker_meta
uses: docker/metadata-action@v5
with:
images: schollz/croc
# generate Docker tags based on the following events/attributes
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
-
name: Set up QEMU
uses: docker/setup-qemu-action@v3
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
-
name: Login to DockerHub
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm,linux/arm64,linux/386
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.docker_meta.outputs.tags }}
labels: ${{ steps.docker_meta.outputs.labels }}

131
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,131 @@
name: Make release
on:
release:
types: [created]
workflow_dispatch:
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout project
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.23'
- name: Prepare source tarball
run: |
git clone -b ${{ github.event.release.name }} --depth 1 https://github.com/schollz/croc croc-${{ github.event.release.name }}
cd croc-${{ github.event.release.name }} && go mod tidy && go mod vendor
cd .. && tar -czvf croc_${{ github.event.release.name }}_src.tar.gz croc-${{ github.event.release.name }}
- name: Build files
run: |
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags '-extldflags "-static"' -o croc.exe
zip croc_${{ github.event.release.name }}_Windows-64bit.zip croc.exe LICENSE
CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags '-extldflags "-static"' -o croc.exe
zip croc_${{ github.event.release.name }}_Windows-32bit.zip croc.exe LICENSE
CGO_ENABLED=0 GOOS=windows GOARCH=arm go build -ldflags '-extldflags "-static"' -o croc.exe
zip croc_${{ github.event.release.name }}_Windows-ARM.zip croc.exe LICENSE
CGO_ENABLED=0 GOOS=windows GOARCH=arm64 go build -ldflags '-extldflags "-static"' -o croc.exe
zip croc_${{ github.event.release.name }}_Windows-ARM64.zip croc.exe LICENSE
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags '-extldflags "-static"' -o croc
tar -czvf croc_${{ github.event.release.name }}_Linux-64bit.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags '-extldflags "-static"' -o croc
tar -czvf croc_${{ github.event.release.name }}_Linux-32bit.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags '-extldflags "-static"' -o croc
tar -czvf croc_${{ github.event.release.name }}_Linux-ARM.tar.gz croc LICENSE
GOARM=5 CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags '-extldflags "-static"' -o croc
tar -czvf croc_${{ github.event.release.name }}_Linux-ARMv5.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags '-extldflags "-static"' -o croc
tar -czvf croc_${{ github.event.release.name }}_Linux-ARM64.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags '-s -extldflags "-sectcreate __TEXT __info_plist Info.plist"' -o croc
tar -czvf croc_${{ github.event.release.name }}_macOS-64bit.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags '-s -extldflags "-sectcreate __TEXT __info_plist Info.plist"' -o croc
tar -czvf croc_${{ github.event.release.name }}_macOS-ARM64.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=dragonfly GOARCH=amd64 go build -ldflags '' -o croc
tar -czvf croc_${{ github.event.release.name }}_DragonFlyBSD-64bit.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags '' -o croc
tar -czvf croc_${{ github.event.release.name }}_FreeBSD-64bit.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=freebsd GOARCH=arm64 go build -ldflags '' -o croc
tar -czvf croc_${{ github.event.release.name }}_FreeBSD-ARM64.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=netbsd GOARCH=386 go build -ldflags '' -o croc
tar -czvf croc_${{ github.event.release.name }}_NetBSD-32bit.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=netbsd GOARCH=amd64 go build -ldflags '' -o croc
tar -czvf croc_${{ github.event.release.name }}_NetBSD-64bit.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=netbsd GOARCH=arm64 go build -ldflags '' -o croc
tar -czvf croc_${{ github.event.release.name }}_NetBSD-ARM64.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=openbsd GOARCH=amd64 go build -ldflags '' -o croc
tar -czvf croc_${{ github.event.release.name }}_OpenBSD-64bit.tar.gz croc LICENSE
CGO_ENABLED=0 GOOS=openbsd GOARCH=arm64 go build -ldflags '' -o croc
tar -czvf croc_${{ github.event.release.name }}_OpenBSD-ARM64.tar.gz croc LICENSE
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.20.7' # go1.20.8+ refuses to build go1.22 code...
- name: Build Windows 7
run: |
go version
rm go.mod go.sum
go mod init github.com/schollz/croc/v10
go mod tidy
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags '-extldflags "-static"' -o croc.exe
zip croc_${{ github.event.release.name }}_Windows7-64bit.zip croc.exe
CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags '-extldflags "-static"' -o croc.exe
zip croc_${{ github.event.release.name }}_Windows7-32bit.zip croc.exe
- name: Create checksums.txt
run: |
touch croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_src.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Windows-64bit.zip >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Windows-32bit.zip >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Windows-ARM.zip >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Windows-ARM64.zip >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Windows7-64bit.zip >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Windows7-32bit.zip >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Linux-64bit.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Linux-32bit.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Linux-ARM.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Linux-ARMv5.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_Linux-ARM64.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_macOS-64bit.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_macOS-ARM64.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_DragonFlyBSD-64bit.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_FreeBSD-64bit.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_FreeBSD-ARM64.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_NetBSD-32bit.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_NetBSD-64bit.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_NetBSD-ARM64.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_OpenBSD-64bit.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
sha256sum croc_${{ github.event.release.name }}_OpenBSD-ARM64.tar.gz >> croc_${{ github.event.release.name }}_checksums.txt
- name: Release
uses: softprops/action-gh-release@v2
with:
files: |
croc_${{ github.event.release.name }}_checksums.txt
croc_${{ github.event.release.name }}_src.tar.gz
croc_${{ github.event.release.name }}_Windows-64bit.zip
croc_${{ github.event.release.name }}_Windows-32bit.zip
croc_${{ github.event.release.name }}_Windows-ARM.zip
croc_${{ github.event.release.name }}_Windows-ARM64.zip
croc_${{ github.event.release.name }}_Windows7-64bit.zip
croc_${{ github.event.release.name }}_Windows7-32bit.zip
croc_${{ github.event.release.name }}_Linux-64bit.tar.gz
croc_${{ github.event.release.name }}_Linux-32bit.tar.gz
croc_${{ github.event.release.name }}_Linux-ARM.tar.gz
croc_${{ github.event.release.name }}_Linux-ARMv5.tar.gz
croc_${{ github.event.release.name }}_Linux-ARM64.tar.gz
croc_${{ github.event.release.name }}_macOS-64bit.tar.gz
croc_${{ github.event.release.name }}_macOS-ARM64.tar.gz
croc_${{ github.event.release.name }}_DragonFlyBSD-64bit.tar.gz
croc_${{ github.event.release.name }}_FreeBSD-64bit.tar.gz
croc_${{ github.event.release.name }}_FreeBSD-ARM64.tar.gz
croc_${{ github.event.release.name }}_NetBSD-32bit.tar.gz
croc_${{ github.event.release.name }}_NetBSD-64bit.tar.gz
croc_${{ github.event.release.name }}_NetBSD-ARM64.tar.gz
croc_${{ github.event.release.name }}_OpenBSD-64bit.tar.gz
croc_${{ github.event.release.name }}_OpenBSD-ARM64.tar.gz

27
.github/workflows/stale.yml vendored Normal file
View File

@ -0,0 +1,27 @@
# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
#
# You can adjust the behavior by modifying this file.
# For more information, see:
# https://github.com/actions/stale
name: Mark stale issues and pull requests
on:
schedule:
- cron: '19 12 * * *'
jobs:
stale:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'Stale issue message'
stale-pr-message: 'Stale pull request message'
stale-issue-label: 'no-issue-activity'
stale-pr-label: 'no-pr-activity'

14
.github/workflows/winget.yml vendored Normal file
View File

@ -0,0 +1,14 @@
name: Publish to Winget
on:
release:
types: [released]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: vedantmgoyal2009/winget-releaser@v2
with:
identifier: schollz.croc
installers-regex: '_Windows-\w+\.zip$'
token: ${{ secrets.WINGET_TOKEN }}

13
.gitignore vendored Normal file
View File

@ -0,0 +1,13 @@
# Binaries
/croc
/croc.exe
zsh_autocomplete
bash_autocomplete
dist
bin
croc-stdin*
.idea/
.vscode/
src/utils/bigfile.test
test1/

100
.goreleaser.yml Normal file
View File

@ -0,0 +1,100 @@
project_name: croc
build:
main: main.go
binary: croc
ldflags: -s -w -X main.Version="v{{.Version}}-{{.Date}}"
env:
- CGO_ENABLED=0
goos:
- darwin
- linux
- windows
- freebsd
- netbsd
- openbsd
- dragonfly
goarch:
- amd64
- 386
- arm
- arm64
ignore:
- goos: darwin
goarch: 386
- goos: freebsd
goarch: arm
goarm:
- 7
nfpms:
-
formats:
- deb
vendor: "schollz.com"
homepage: "https://schollz.com/software/croc/"
maintainer: "Zack Scholl <zack.scholl@gmail.com>"
description: "A simple, secure, and fast way to transfer data."
license: "MIT"
file_name_template: "{{.ProjectName}}_{{.Version}}_{{.Os}}-{{.Arch}}"
replacements:
amd64: 64bit
386: 32bit
arm: ARM
arm64: ARM64
darwin: macOS
linux: Linux
windows: Windows
openbsd: OpenBSD
netbsd: NetBSD
freebsd: FreeBSD
dragonfly: DragonFlyBSD
archives:
-
format: tar.gz
format_overrides:
- goos: windows
format: zip
name_template: "{{.ProjectName}}_{{.Version}}_{{.Os}}-{{.Arch}}"
replacements:
amd64: 64bit
386: 32bit
arm: ARM
arm64: ARM64
darwin: macOS
linux: Linux
windows: Windows
openbsd: OpenBSD
netbsd: NetBSD
freebsd: FreeBSD
dragonfly: DragonFlyBSD
files:
- README.md
- LICENSE
- zsh_autocomplete
- bash_autocomplete
brews:
-
tap:
owner: schollz
name: homebrew-tap
folder: Formula
description: "croc is a tool that allows any two computers to simply and securely transfer files and folders."
homepage: "https://schollz.com/software/croc/"
install: |
bin.install "croc"
test: |
system "#{bin}/croc --version"
scoop:
bucket:
owner: schollz
name: scoop-bucket
homepage: "https://schollz.com/software/croc/"
description: "croc is a tool that allows any two computers to simply and securely transfer files and folders."
license: MIT
announce:
twitter:
# Wether its enabled or not.
# Defaults to false.
enabled: false

View File

@ -10,12 +10,12 @@ install: true
script: script:
- env GO111MODULE=on go build -v - env GO111MODULE=on go build -v
- env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/compress - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v10/src/compress
- env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/croc - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v10/src/croc
- env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/crypt - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v10/src/crypt
- env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/tcp - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v10/src/tcp
- env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/utils - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v10/src/utils
- env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/comm - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v10/src/comm
branches: branches:
except: except:

View File

@ -1,15 +1,16 @@
FROM golang:1.12-alpine as builder FROM golang:1.22-alpine as builder
RUN apk add --no-cache git RUN apk add --no-cache git gcc musl-dev
WORKDIR /go/croc WORKDIR /go/croc
COPY . . COPY . .
RUN go build -v RUN go build -v -ldflags="-s -w"
FROM alpine:latest FROM alpine:latest
EXPOSE 9009 EXPOSE 9009
EXPOSE 9010 EXPOSE 9010
EXPOSE 9011 EXPOSE 9011
EXPOSE 9012 EXPOSE 9012
EXPOSE 9013 EXPOSE 9013
COPY --from=builder /go/croc/croc /croc COPY --from=builder /go/croc/croc /go/croc/croc-entrypoint.sh /
ENTRYPOINT ["/croc"] USER nobody
ENTRYPOINT ["/croc-entrypoint.sh"]
CMD ["relay"] CMD ["relay"]

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2017 Zack Copyright (c) 2017-2024 Zack
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

419
README.md
View File

@ -1,138 +1,281 @@
<p align="center"> <p align="center">
<img <img
src="https://user-images.githubusercontent.com/6550035/46709024-9b23ad00-cbf6-11e8-9fb2-ca8b20b7dbec.jpg" src="https://user-images.githubusercontent.com/6550035/46709024-9b23ad00-cbf6-11e8-9fb2-ca8b20b7dbec.jpg"
width="408px" border="0" alt="croc"> width="408px" border="0" alt="croc">
<br> <br>
<a href="https://github.com/schollz/croc/releases/latest"><img src="https://img.shields.io/badge/version-v6.1.5-brightgreen.svg?style=flat-square" alt="Version"></a> <a href="https://github.com/schollz/croc/releases/latest"><img src="https://img.shields.io/badge/version-v10.1.1-brightgreen.svg?style=flat-square" alt="Version"></a>
<a href="https://coveralls.io/github/schollz/croc"><img src="https://img.shields.io/badge/coverage-80%25-green.svg?style=flat-square" alt="Coverage"></a> <a href="https://github.com/schollz/croc/actions/workflows/ci.yml"><img
<a href="https://travis-ci.org/schollz/croc"><img src="https://github.com/schollz/croc/actions/workflows/ci.yml/badge.svg" alt="Build
src="https://img.shields.io/travis/schollz/croc.svg?style=flat-square" alt="Build Status"></a>
Status"></a> <p align="center">This project is supported by <a href="https://github.com/sponsors/schollz">Github sponsors</a>.</p>
<a href="https://saythanks.io/to/schollz"><img src="https://img.shields.io/badge/Say%20Thanks-!-brightgreen.svg?style=flat-square" alt="Say thanks"></a>
</p> `croc` is a tool that allows any two computers to simply and securely transfer files and folders. AFAIK, *croc* is the only CLI file-transfer tool that does **all** of the following:
- allows **any two computers** to transfer data (using a relay)
<p align="center"><code>curl https://getcroc.schollz.com | bash</code></p> - provides **end-to-end encryption** (using PAKE)
- enables easy **cross-platform** transfers (Windows, Linux, Mac)
`croc` is a tool that allows any two computers to simply and securely transfer files and folders. AFAIK, *croc* is the only CLI file-transfer tool does **all** of the following: - allows **multiple file** transfers
- allows **resuming transfers** that are interrupted
- allows **any two computers** to transfer data (using a relay) - local server or port-forwarding **not needed**
- provides **end-to-end encryption** (using PAKE) - **ipv6-first** with ipv4 fallback
- enables easy **cross-platform** transfers (Windows, Linux, Mac) - can **use proxy**, like tor
- allows **multiple file** transfers
- allows **resuming transfers** that are interrupted For more information about `croc`, see [my blog post](https://schollz.com/software/croc6) or read a [recent interview I did](https://console.substack.com/p/console-91).
- local server or port-forwarding **not needed**
- **faster** than [wormhole](https://github.com/warner/magic-wormhole), [rsync](https://linux.die.net/man/1/rsync), [scp](https://linux.die.net/man/1/scp) through compression and multiplexing (speedups 1.5x to 4x) ![Example](src/install/customization.gif)
For more information about `croc`, see [my blog post](https://schollz.com/software/croc6). ## Install
Download [the latest release for your system](https://github.com/schollz/croc/releases/latest), or install a release from the command-line:
## Install
```
Download [the latest release for your system](https://github.com/schollz/croc/releases/latest), or install a release from the command-line: curl https://getcroc.schollz.com | bash
```
```
$ curl https://getcroc.schollz.com | bash
``` On macOS you can install the latest release with [Homebrew](https://brew.sh/):
```
On macOS you can install the latest release with [Homebrew](https://brew.sh/): brew install croc
```
```
$ brew install schollz/tap/croc On macOS you can also install the latest release with [MacPorts](https://macports.org/):
```
```
sudo port selfupdate
On Windows you can install the latest release with [Scoop](https://scoop.sh/): sudo port install croc
```
```
$ scoop bucket add schollz-bucket https://github.com/schollz/scoop-bucket.git On Windows you can install the latest release with [Scoop](https://scoop.sh/), [Chocolatey](https://chocolatey.org), or [Winget](https://learn.microsoft.com/en-us/windows/package-manager/):
$ scoop install croc
``` ```
scoop install croc
```
Or, you can [install Go](https://golang.org/dl/) and build from source (requires Go 1.12+):
```
``` choco install croc
$ go get -v github.com/schollz/croc/v6 ```
```
```
winget install schollz.croc
```
## Usage
On Unix you can install the latest release with [Nix](https://nixos.org/nix):
To send a file, simply do:
```
``` nix-env -i croc
$ croc send [file(s)-or-folder] ```
Sending 'file-or-folder' (X MB)
Code is: code-phrase
``` On Alpine Linux you have to install dependencies first:
Then to receive the file (or folder) on another computer, you can just do ```
apk add bash coreutils
``` wget -qO- https://getcroc.schollz.com | bash
$ croc code-phrase ```
```
On Arch Linux you can install the latest release with `pacman`:
The code phrase is used to establish password-authenticated key agreement ([PAKE](https://en.wikipedia.org/wiki/Password-authenticated_key_agreement)) which generates a secret key for the sender and recipient to use for end-to-end encryption.
```
There are a number of configurable options (see `--help`). A set of options (like custom relay, ports, and code phrase) can be set using `--remember`. pacman -S croc
```
### Custom code phrase
On Fedora you can install with `dnf`:
You can send with your own code phrase (must be more than 4 characters).
```
``` dnf install croc
$ croc send --code [code-phrase] [file(s)-or-folder] ```
```
On Gentoo you can install with `portage`:
### Use pipes - stdin and stdout ```
emerge net-misc/croc
You can pipe to `croc`: ```
``` On Termux you can install with `pkg`:
$ cat [filename] | croc send
``` ```
pkg install croc
In this case `croc` will automatically use the stdin data and send and assign a filename like "croc-stdin-123456789". To receive to `stdout` at you can always just use the `--yes` will automatically approve the transfer and pipe it out to `stdout`. ```
``` On FreeBSD you can install with `pkg`:
$ croc --yes [code-phrase] > out
``` ```
pkg install croc
All of the other text printed to the console is going to `stderr` so it will not interfere with the message going to `stdout`. ```
### Self-host relay On Linux, macOS, and Windows you can install from [conda-forge](https://github.com/conda-forge/croc-feedstock/) globally with [`pixi`](https://pixi.sh/):
The relay is needed to staple the parallel incoming and outgoing connections. By default, `croc` uses a public relay but you can also run your own relay: ```
pixi global install croc
``` ```
$ croc relay
``` or into a particular environment with [`conda`](https://docs.conda.io/projects/conda/):
Make sure to open up TCP ports (see `croc relay --help` for which ports to open). ```
conda install --channel conda-forge croc
You can send files using your relay by entering `--relay` to change the relay that you are using if you want to custom host your own. ```
``` Or, you can [install Go](https://golang.org/dl/) and build from source (requires Go 1.17+):
$ croc --relay "myrelay.example.com:9009" send [filename]
``` ```
go install github.com/schollz/croc/v10@latest
If it's easier you can also run a relay with Docker: ```
On Android there is a 3rd party F-Droid app [available to download](https://f-droid.org/en/packages/com.github.howeyc.crocgui/).
```
$ docker run -d -p 9009:9009 -p 9010:9010 -p 9011:9011 -p 9012:9012 -p 9013:9013 schollz/croc
``` ## Usage
## License To send a file, simply do:
MIT ```
$ croc send [file(s)-or-folder]
## Acknowledgements Sending 'file-or-folder' (X MB)
Code is: code-phrase
`croc` has been through many iterations, and I am awed by all the great contributions! If you feel like contributing, in any way, by all means you can send an Issue, a PR, ask a question, or tweet me ([@yakczar](http://ctt.ec/Rq054)). ```
Thanks [@warner](https://github.com/warner) for the [idea](https://github.com/warner/magic-wormhole), [@tscholl2](https://github.com/tscholl2) for the [encryption gists](https://gist.github.com/tscholl2/dc7dc15dc132ea70a98e8542fefffa28), [@skorokithakis](https://github.com/skorokithakis) for [code on proxying two connections](https://www.stavros.io/posts/proxying-two-connections-go/). Finally thanks for making pull requests [@meyermarcel](https://github.com/meyermarcel), [@Girbons](https://github.com/Girbons), [@techtide](https://github.com/techtide), [@heymatthew](https://github.com/heymatthew), [@Lunsford94](https://github.com/Lunsford94), [@lummie](https://github.com/lummie), [@jesuiscamille](https://github.com/jesuiscamille), [@threefjord](https://github.com/threefjord), [@marcossegovia](https://github.com/marcossegovia), [@csleong98](https://github.com/csleong98), [@afotescu](https://github.com/afotescu), [@callmefever](https://github.com/callmefever), [@El-JojA](https://github.com/El-JojA), [@anatolyyyyyy](https://github.com/anatolyyyyyy), [@goggle](https://github.com/goggle), [@smileboywtu](https://github.com/smileboywtu), [@nicolashardy](https://github.com/nicolashardy)! Then to receive the file (or folder) on another computer, you can just do
```
croc code-phrase
```
The code phrase is used to establish password-authenticated key agreement ([PAKE](https://en.wikipedia.org/wiki/Password-authenticated_key_agreement)) which generates a secret key for the sender and recipient to use for end-to-end encryption.
There are a number of configurable options (see `--help`). A set of options (like custom relay, ports, and code phrase) can be set using `--remember`.
### Using `croc` on Linux or Mac OS
On Linux and Mac OS, the sending & receiving is slightly different to avoid [leaking the secret via the process name](https://nvd.nist.gov/vuln/detail/CVE-2023-43621). On these systems you will need to run `croc` with the secret as an environment variable. For example, to receive with the secret `***`:
```
CROC_SECRET=*** croc
```
This will show only `croc` in the process list of a multi-user system and not leak the secret.
For a single-user system the default behavior can be permanently enabled by running
```
croc --classic
```
and confirming.
Run this command again to disable classic mode.
### Custom code phrase
You can send with your own code phrase (must be more than 6 characters).
```
croc send --code [code-phrase] [file(s)-or-folder]
```
### Allow overwriting without prompt
By default, croc will prompt whether to overwrite a file. You can automatically overwrite files by using the `--overwrite` flag (recipient only). For example, receive a file to automatically overwrite:
```
croc --yes --overwrite <code>
```
### Use pipes - stdin and stdout
You can pipe to `croc`:
```
cat [filename] | croc send
```
In this case `croc` will automatically use the stdin data and send and assign a filename like "croc-stdin-123456789". To receive to `stdout` at you can always just use the `--yes` will automatically approve the transfer and pipe it out to `stdout`.
```
croc --yes [code-phrase] > out
```
All of the other text printed to the console is going to `stderr` so it will not interfere with the message going to `stdout`.
### Send text
Sometimes you want to send URLs or short text. In addition to piping, you can easily send text with `croc`:
```
croc send --text "hello world"
```
This will automatically tell the receiver to use `stdout` when they receive the text so it will be displayed.
### Use a proxy
You can use a proxy as your connection to the relay by adding a proxy address with `--socks5`. For example, you can send via a tor relay:
```
croc --socks5 "127.0.0.1:9050" send SOMEFILE
```
### Change encryption curve
You can choose from several different elliptic curves to use for encryption by using the `--curve` flag. Only the recipient can choose the curve. For example, receive a file using the P-521 curve:
```
croc --curve p521 <codephrase>
```
Available curves are P-256, P-348, P-521 and SIEC. P-256 is the default curve.
### Change hash algorithm
You can choose from several different hash algorithms. The default is the `xxhash` algorithm which is fast and thorough. If you want to optimize for speed you can use the `imohash` algorithm which is even faster, but since it samples files (versus reading the whole file) it can mistakenly determine that a file is the same on the two computers transferring - though this is only a problem if you are syncing files versus sending a new file to a computer.
```
croc send --hash imohash SOMEFILE
```
### Self-host relay
The relay is needed to staple the parallel incoming and outgoing connections. By default, `croc` uses a public relay but you can also run your own relay:
```
croc relay
```
By default it uses TCP ports 9009-9013. Make sure to open those up. You can customize the ports (e.g. `croc relay --ports 1111,1112`), but you must have a minimum of **2** ports for the relay. The first port is for communication and the subsequent ports are used for the multiplexed data transfer.
You can send files using your relay by entering `--relay` to change the relay that you are using if you want to custom host your own.
```
croc --relay "myrelay.example.com:9009" send [filename]
```
Note, when sending, you only need to include the first port (the communication port). The subsequent ports for data transfer will be transmitted back to the user from the relay.
#### Self-host relay (docker)
If it's easier you can also run a relay with Docker:
```
docker run -d -p 9009-9013:9009-9013 -e CROC_PASS='YOURPASSWORD' schollz/croc
```
Be sure to include the password for the relay otherwise any requests will be rejected.
```
croc --pass YOURPASSWORD --relay "myreal.example.com:9009" send [filename]
```
Note: when including `--pass YOURPASSWORD` you can instead pass a file with the password, e.g. `--pass FILEWITHPASSWORD`.
## License
MIT
## Acknowledgements
`croc` has gone through many iterations, and I am awed by all the great contributions! If you feel like contributing, in any way, by all means you can send an Issue, a PR, or ask a question.
Thanks [@warner](https://github.com/warner) for the [idea](https://github.com/warner/magic-wormhole), [@tscholl2](https://github.com/tscholl2) for the [encryption gists](https://gist.github.com/tscholl2/dc7dc15dc132ea70a98e8542fefffa28), [@skorokithakis](https://github.com/skorokithakis) for [code on proxying two connections](https://www.stavros.io/posts/proxying-two-connections-go/). Finally thanks for making pull requests [@maximbaz](https://github.com/maximbaz), [@meyermarcel](https://github.com/meyermarcel), [@Girbons](https://github.com/Girbons), [@techtide](https://github.com/techtide), [@heymatthew](https://github.com/heymatthew), [@Lunsford94](https://github.com/Lunsford94), [@lummie](https://github.com/lummie), [@jesuiscamille](https://github.com/jesuiscamille), [@threefjord](https://github.com/threefjord), [@marcossegovia](https://github.com/marcossegovia), [@csleong98](https://github.com/csleong98), [@afotescu](https://github.com/afotescu), [@callmefever](https://github.com/callmefever), [@El-JojA](https://github.com/El-JojA), [@anatolyyyyyy](https://github.com/anatolyyyyyy), [@goggle](https://github.com/goggle), [@smileboywtu](https://github.com/smileboywtu), [@nicolashardy](https://github.com/nicolashardy), [@fbartels](https://github.com/fbartels), [@rkuprov](https://github.com/rkuprov), [@hreese](https://github.com/hreese), [@xenrox](https://github.com/xenrox) and [Ipar](https://github.com/lpar)!

6
croc-entrypoint.sh Executable file
View File

@ -0,0 +1,6 @@
#!/bin/sh
set -e
if [ -n "$CROC_PASS" ]; then
set -- --pass "$CROC_PASS" "$@"
fi
exec /croc "$@"

12
croc.service Normal file
View File

@ -0,0 +1,12 @@
[Unit]
Description=croc relay
After=network.target
[Service]
Type=simple
DynamicUser=yes
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/croc relay
[Install]
WantedBy=multi-user.target

57
go.mod
View File

@ -1,30 +1,39 @@
module github.com/schollz/croc/v6 module github.com/schollz/croc/v10
go 1.13 go 1.22
toolchain go1.23.1
require ( require (
github.com/OneOfOne/xxhash v1.2.5 // indirect
github.com/cespare/xxhash v1.1.0 github.com/cespare/xxhash v1.1.0
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/chzyer/readline v1.5.1
github.com/denisbrodbeck/machineid v1.0.1 github.com/denisbrodbeck/machineid v1.0.1
github.com/fatih/color v1.7.0 // indirect github.com/kalafut/imohash v1.1.0
github.com/kalafut/imohash v1.0.0 github.com/magisterquis/connectproxy v0.0.0-20200725203833-3582e84f0c9b
github.com/kr/pretty v0.1.0 // indirect github.com/minio/highwayhash v1.0.3
github.com/mattn/go-colorable v0.1.4 // indirect github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06
github.com/mattn/go-isatty v0.0.9 // indirect github.com/schollz/cli/v2 v2.2.1
github.com/pkg/errors v0.8.1 github.com/schollz/logger v1.2.0
github.com/schollz/logger v1.0.1 github.com/schollz/pake/v3 v3.0.5
github.com/schollz/mnemonicode v1.0.1 github.com/schollz/peerdiscovery v1.7.5
github.com/schollz/pake v1.1.1 github.com/schollz/progressbar/v3 v3.17.1
github.com/schollz/peerdiscovery v1.4.1 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
github.com/schollz/progressbar/v2 v2.14.0 github.com/stretchr/testify v1.9.0
github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 golang.org/x/crypto v0.29.0
github.com/spaolacci/murmur3 v1.1.0 // indirect golang.org/x/net v0.31.0
github.com/stretchr/testify v1.4.0 golang.org/x/sys v0.27.0
github.com/urfave/cli v1.22.1 golang.org/x/term v0.26.0
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc golang.org/x/time v0.8.0
golang.org/x/net v0.0.0-20191003171128-d98b1b443823 // indirect )
golang.org/x/sys v0.0.0-20191023151326-f89234f9a2c2 // indirect
golang.org/x/text v0.3.2 // indirect require (
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/tscholl2/siec v0.0.0-20240310163802-c2c6f6198406 // indirect
github.com/twmb/murmur3 v1.1.8 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
) )

198
go.sum
View File

@ -1,102 +1,148 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/OneOfOne/xxhash v1.2.5 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI=
github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM=
github.com/chengxilo/virtualterm v1.0.4/go.mod h1:DyxxBZz/x1iqJjFxTFcr6/x+jSpqN0iwWCOK1q10rlY=
github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM=
github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI=
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04=
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ=
github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI=
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/kalafut/imohash v1.1.0 h1:Lldcmx0SXgMSoABB2WBD8mTgf0OlVnISn2Dyrfg2Ep8=
github.com/kalafut/imohash v1.0.0 h1:LgCJ+p/BwM2HKpOxFopkeddpzVCfm15EtXMroXD1SYE= github.com/kalafut/imohash v1.1.0/go.mod h1:6cn9lU0Sj8M4eu9UaQm1kR/5y3k/ayB68yntRhGloL4=
github.com/kalafut/imohash v1.0.0/go.mod h1:c3RHT80ZAp5C/aYgQI92ZlrOymqkZnRDprU87kg75HI= github.com/magisterquis/connectproxy v0.0.0-20200725203833-3582e84f0c9b h1:xZ59n7Frzh8CwyfAapUZLSg+gXH5m63YEaFCMpDHhpI=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/magisterquis/connectproxy v0.0.0-20200725203833-3582e84f0c9b/go.mod h1:uDd4sYVYsqcxAB8j+Q7uhL6IJCs/r1kxib1HV4bgOMg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ=
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg=
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/schollz/logger v1.0.1 h1:BuBAU+euqphM0Ny9qFVScl4RSxatis4nCHIkOxO2cUU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/schollz/logger v1.0.1/go.mod h1:P6F4/dGMGcx8wh+kG1zrNEd4vnNpEBY/mwEMd/vn6AM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/schollz/mnemonicode v1.0.1 h1:LiH5hwADZwjwnfXsaD4xgnMyTAtaKHN+e5AyjRU6WSU= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI=
github.com/schollz/mnemonicode v1.0.1/go.mod h1:cl4UAOhUV0mkdjMj/QYaUZbZZdF8BnOqoz8rHMzwboY= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs=
github.com/schollz/pake v1.1.1 h1:QKeojDWzdAdtRC4m89b6HAxw/8gjqrVu7r4SAOxOFg8= github.com/schollz/cli/v2 v2.2.1 h1:ou22Mj7ZPjrKz+8k2iDTWaHskEEV5NiAxGrdsCL36VU=
github.com/schollz/pake v1.1.1/go.mod h1:aWMxQ1jwqZRwk3StflHcdyzPR+CyW5W7+WIZD6Y3dEY= github.com/schollz/cli/v2 v2.2.1/go.mod h1:My6bfphRLZUhZdlFUK8scAxMWHydE7k4s2ed2Dtnn+s=
github.com/schollz/peerdiscovery v1.4.1 h1:xtZ/D8/4eq9O6UEhRupZZiJm4BA8+u1IVUgeHo5VPm4= github.com/schollz/logger v1.2.0 h1:5WXfINRs3lEUTCZ7YXhj0uN+qukjizvITLm3Ca2m0Ho=
github.com/schollz/peerdiscovery v1.4.1/go.mod h1:WDdk0/JVyVHVIA/bmhzTkUg32dhJ20O4tExNqV1u6sk= github.com/schollz/logger v1.2.0/go.mod h1:P6F4/dGMGcx8wh+kG1zrNEd4vnNpEBY/mwEMd/vn6AM=
github.com/schollz/progressbar/v2 v2.13.2 h1:3L9bP5KQOGEnFP8P5V8dz+U0yo5I29iY5Oa9s9EAwn0= github.com/schollz/pake/v3 v3.0.5 h1:MnZVdI987lkjln9BSx/zUb724TZISa2jbO+dPj6BvgQ=
github.com/schollz/progressbar/v2 v2.13.2/go.mod h1:6YZjqdthH6SCZKv2rqGryrxPtfmRB/DWZxSMfCXPyD8= github.com/schollz/pake/v3 v3.0.5/go.mod h1:OGbG6htRwSKo6V8R5tg61ufpFmZM1b/PrrSp6g2ZLLc=
github.com/schollz/progressbar/v2 v2.14.0 h1:vo7bdkI9E4/CIk9DnL5uVIaybLQiVtiCC2vO+u9j5IM= github.com/schollz/peerdiscovery v1.7.5 h1:0cEhO+o8i4fpeKBwl7u0UY3Kt3XVt5fSzS4rg17ZPb4=
github.com/schollz/progressbar/v2 v2.14.0/go.mod h1:6YZjqdthH6SCZKv2rqGryrxPtfmRB/DWZxSMfCXPyD8= github.com/schollz/peerdiscovery v1.7.5/go.mod h1:Crht2FOfD1/eL3U/AIM0vvwVZDPePlBgSX3Xw+TnJoE=
github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 h1:y08o5oQ/slxXE/F0uh5dd8mdVvb+w4NLcNSDSq4c2F0= github.com/schollz/progressbar/v3 v3.17.1 h1:bI1MTaoQO+v5kzklBjYNRQLoVpe0zbyRZNK6DFkVC5U=
github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9/go.mod h1:kCMoQsqzx4MzGJWaALr6tKyCnlrY0kILGLkA1FOiLF4= github.com/schollz/progressbar/v3 v3.17.1/go.mod h1:RzqpnsPQNjUyIgdglUjRLgD7sVnxN1wpmBMV+UiEbL4=
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/tscholl2/siec v0.0.0-20210707234609-9bdfc483d499/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw=
github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937 h1:lhssCpSe3TjKcbvUoPzFMuv9oUyZDgI3Cmgolfw2C90= github.com/tscholl2/siec v0.0.0-20240310163802-c2c6f6198406 h1:sDWDZkwYqX0jvLWstKzFwh+pYhQNaVg65BgSkCP/f7U=
github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw= github.com/tscholl2/siec v0.0.0-20240310163802-c2c6f6198406/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw=
github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/twmb/murmur3 v1.1.5/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg=
github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
golang.org/x/net v0.0.0-20191003171128-d98b1b443823 h1:Ypyv6BNJh07T1pUSrehkLemqPKXhus2MkfktJ91kRh4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20191002091554-b397fe3ad8ed h1:5TJcLJn2a55mJjzYk0yOoqN8X1OdvBDUnaZaKKyQtkY= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20191002091554-b397fe3ad8ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20191023151326-f89234f9a2c2 h1:I7efaDQAsIQmkTF+WSdcydwVWzK07Yuz8IFF8rNkDe0= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.0.0-20191023151326-f89234f9a2c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e h1:FDhOuMEY4JVRztM/gsbk+IKUQ8kj74bxZrgw87eMMVc= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/tylerb/is.v1 v1.1.2 h1:AB/MANFml2ySf+adwcinvajyHvsYltAOD+rb/8njfSU=
gopkg.in/tylerb/is.v1 v1.1.2/go.mod h1:9yQB2tyIhZ5oph6Kk5Sq7cJMd9c5Jpa1p3hr9kxzPqo=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@ -1,86 +0,0 @@
project_name: croc
build:
main: main.go
binary: croc
ldflags: -s -w -X main.Version="v{{.Version}}-{{.Date}}"
env:
- CGO_ENABLED=0
goos:
- darwin
- linux
- windows
- freebsd
- netbsd
- openbsd
- dragonfly
goarch:
- amd64
- 386
- arm
- arm64
goarm:
- 7
nfpm:
formats:
- deb
vendor: "schollz.com"
homepage: "https://schollz.com/software/croc/"
maintainer: "Zack Scholl <zack.scholl@gmail.com>"
description: "A simple, secure, and fast way to transfer data."
license: "MIT"
name_template: "{{.ProjectName}}_{{.Version}}_{{.Os}}-{{.Arch}}"
replacements:
amd64: 64bit
386: 32bit
arm: ARM
arm64: ARM64
darwin: macOS
linux: Linux
windows: Windows
openbsd: OpenBSD
netbsd: NetBSD
freebsd: FreeBSD
dragonfly: DragonFlyBSD
archives:
-
format: tar.gz
format_overrides:
- goos: windows
format: zip
name_template: "{{.ProjectName}}_{{.Version}}_{{.Os}}-{{.Arch}}"
replacements:
amd64: 64bit
386: 32bit
arm: ARM
arm64: ARM64
darwin: macOS
linux: Linux
windows: Windows
openbsd: OpenBSD
netbsd: NetBSD
freebsd: FreeBSD
dragonfly: DragonFlyBSD
files:
- README.md
- LICENSE
brew:
github:
owner: schollz
name: homebrew-tap
folder: Formula
description: "croc is a tool that allows any two computers to simply and securely transfer files and folders."
homepage: "https://schollz.com/software/croc/"
install: |
bin.install "croc"
test: |
system "#{bin}/croc --version"
scoop:
bucket:
owner: schollz
name: scoop-bucket
homepage: "https://schollz.com/software/croc/"
description: "croc is a tool that allows any two computers to simply and securely transfer files and folders."
license: MIT

47
main.go
View File

@ -1,18 +1,55 @@
package main package main
//go:generate git tag -af v$VERSION -m "v$VERSION"
//go:generate go run src/install/updateversion.go //go:generate go run src/install/updateversion.go
//go:generate git commit -am "bump $VERSION" //go:generate git commit -am "bump $VERSION"
//go:generate git tag -af v$VERSION -m "v$VERSION" //go:generate git tag -af v$VERSION -m "v$VERSION"
import ( import (
"fmt" "fmt"
"os"
"os/signal"
"syscall"
"github.com/schollz/croc/v6/src/cli" "github.com/schollz/croc/v10/src/cli"
"github.com/schollz/croc/v10/src/utils"
) )
func main() { func main() {
if err := cli.Run(); err != nil { // "github.com/pkg/profile"
fmt.Println(err) // go func() {
} // for {
// f, err := os.Create("croc.pprof")
// if err != nil {
// panic(err)
// }
// runtime.GC() // get up-to-date statistics
// if err := pprof.WriteHeapProfile(f); err != nil {
// panic(err)
// }
// f.Close()
// time.Sleep(3 * time.Second)
// fmt.Println("wrote profile")
// }
// }()
// Create a channel to receive OS signals
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
if err := cli.Run(); err != nil {
fmt.Println(err)
os.Exit(1)
}
// Exit the program gracefully
utils.RemoveMarkedFiles()
os.Exit(0)
}()
// Wait for a termination signal
_ = <-sigs
utils.RemoveMarkedFiles()
// Exit the program gracefully
os.Exit(0)
} }

View File

@ -5,26 +5,30 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strconv"
"strings" "strings"
"time" "time"
"github.com/schollz/croc/v6/src/croc" "github.com/chzyer/readline"
"github.com/schollz/croc/v6/src/models" "github.com/schollz/cli/v2"
"github.com/schollz/croc/v6/src/tcp" "github.com/schollz/croc/v10/src/comm"
"github.com/schollz/croc/v6/src/utils" "github.com/schollz/croc/v10/src/croc"
"github.com/schollz/croc/v10/src/mnemonicode"
"github.com/schollz/croc/v10/src/models"
"github.com/schollz/croc/v10/src/tcp"
"github.com/schollz/croc/v10/src/utils"
log "github.com/schollz/logger" log "github.com/schollz/logger"
"github.com/urfave/cli" "github.com/schollz/pake/v3"
) )
// Version specifies the version // Version specifies the version
var Version string var Version string
// Run will run the command line proram // Run will run the command line program
func Run() (err error) { func Run() (err error) {
// use all of the processors // use all of the processors
runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(runtime.NumCPU())
@ -32,96 +36,197 @@ func Run() (err error) {
app := cli.NewApp() app := cli.NewApp()
app.Name = "croc" app.Name = "croc"
if Version == "" { if Version == "" {
Version = "v6.1.5-af39b8c" Version = "v10.1.0"
} }
app.Version = Version app.Version = Version
app.Compiled = time.Now() app.Compiled = time.Now()
app.Usage = "easily and securely transfer stuff from one computer to another" app.Usage = "easily and securely transfer stuff from one computer to another"
app.UsageText = "croc allows any two computers to directly and securely transfer files" app.UsageText = `croc [GLOBAL OPTIONS] [COMMAND] [COMMAND OPTIONS] [filename(s) or folder]
// app.ArgsUsage = "[args and such]"
app.Commands = []cli.Command{ USAGE EXAMPLES:
Send a file:
croc send file.txt
-git to respect your .gitignore
Send multiple files:
croc send file1.txt file2.txt file3.txt
or
croc send *.jpg
Send everything in a folder:
croc send example-folder-name
Send a file with a custom code:
croc send --code secret-code file.txt
Receive a file using code:
croc secret-code`
app.Commands = []*cli.Command{
{ {
Name: "send", Name: "send",
Usage: "send a file", Usage: "send file(s), or folder (see options with croc send -h)",
Description: "send a file over the relay", Description: "send file(s), or folder, over the relay",
ArgsUsage: "[filename]", ArgsUsage: "[filename(s) or folder]",
Flags: []cli.Flag{ Flags: []cli.Flag{
cli.StringFlag{Name: "code, c", Usage: "codephrase used to connect to relay"}, &cli.BoolFlag{Name: "zip", Usage: "zip folder before sending"},
cli.BoolFlag{Name: "no-local", Usage: "disable local relay when sending"}, &cli.StringFlag{Name: "code", Aliases: []string{"c"}, Usage: "codephrase used to connect to relay"},
cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013", Usage: "ports of the local relay (optional)"}, &cli.StringFlag{Name: "hash", Value: "xxhash", Usage: "hash algorithm (xxhash, imohash, md5)"},
&cli.StringFlag{Name: "text", Aliases: []string{"t"}, Usage: "send some text"},
&cli.BoolFlag{Name: "no-local", Usage: "disable local relay when sending"},
&cli.BoolFlag{Name: "no-multi", Usage: "disable multiplexing"},
&cli.BoolFlag{Name: "git", Usage: "enable .gitignore respect / don't send ignored files"},
&cli.IntFlag{Name: "port", Value: 9009, Usage: "base port for the relay"},
&cli.IntFlag{Name: "transfers", Value: 4, Usage: "number of ports to use for transfers"},
&cli.BoolFlag{Name: "qrcode", Aliases: []string{"qr"}, Usage: "show receive code as a qrcode"},
}, },
HelpName: "croc send", HelpName: "croc send",
Action: func(c *cli.Context) error { Action: send,
return send(c)
},
}, },
{ {
Name: "relay", Name: "relay",
Usage: "start your own relay (optional)",
Description: "start relay", Description: "start relay",
HelpName: "croc relay", HelpName: "croc relay",
Action: func(c *cli.Context) error { Action: relay,
return relay(c)
},
Flags: []cli.Flag{ Flags: []cli.Flag{
cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013", Usage: "ports of the relay"}, &cli.StringFlag{Name: "host", Usage: "host of the relay"},
&cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013", Usage: "ports of the relay"},
&cli.IntFlag{Name: "port", Value: 9009, Usage: "base port for the relay"},
&cli.IntFlag{Name: "transfers", Value: 5, Usage: "number of ports to use for relay"},
}, },
}, },
} }
app.Flags = []cli.Flag{ app.Flags = []cli.Flag{
cli.BoolFlag{Name: "remember", Usage: "save these settings to reuse next time"}, &cli.BoolFlag{Name: "internal-dns", Usage: "use a built-in DNS stub resolver rather than the host operating system"},
cli.BoolFlag{Name: "debug", Usage: "increase verbosity (a lot)"}, &cli.BoolFlag{Name: "classic", Usage: "toggle between the classic mode (insecure due to local attack vector) and new mode (secure)"},
cli.BoolFlag{Name: "yes", Usage: "automatically agree to all prompts"}, &cli.BoolFlag{Name: "remember", Usage: "save these settings to reuse next time"},
cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"}, &cli.BoolFlag{Name: "debug", Usage: "toggle debug mode"},
cli.BoolFlag{Name: "ask", Usage: "make sure sender and recipient are prompted"}, &cli.BoolFlag{Name: "yes", Usage: "automatically agree to all prompts"},
cli.StringFlag{Name: "relay", Value: models.DEFAULT_RELAY, Usage: "address of the relay"}, &cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"},
cli.StringFlag{Name: "out", Value: ".", Usage: "specify an output folder to receive the file"}, &cli.BoolFlag{Name: "no-compress", Usage: "disable compression"},
&cli.BoolFlag{Name: "ask", Usage: "make sure sender and recipient are prompted"},
&cli.BoolFlag{Name: "local", Usage: "force to use only local connections"},
&cli.BoolFlag{Name: "ignore-stdin", Usage: "ignore piped stdin"},
&cli.BoolFlag{Name: "overwrite", Usage: "do not prompt to overwrite or resume"},
&cli.BoolFlag{Name: "testing", Usage: "flag for testing purposes"},
&cli.StringFlag{Name: "multicast", Value: "239.255.255.250", Usage: "multicast address to use for local discovery"},
&cli.StringFlag{Name: "curve", Value: "p256", Usage: "choose an encryption curve (" + strings.Join(pake.AvailableCurves(), ", ") + ")"},
&cli.StringFlag{Name: "ip", Value: "", Usage: "set sender ip if known e.g. 10.0.0.1:9009, [::1]:9009"},
&cli.StringFlag{Name: "relay", Value: models.DEFAULT_RELAY, Usage: "address of the relay", EnvVars: []string{"CROC_RELAY"}},
&cli.StringFlag{Name: "relay6", Value: models.DEFAULT_RELAY6, Usage: "ipv6 address of the relay", EnvVars: []string{"CROC_RELAY6"}},
&cli.StringFlag{Name: "out", Value: ".", Usage: "specify an output folder to receive the file"},
&cli.StringFlag{Name: "pass", Value: models.DEFAULT_PASSPHRASE, Usage: "password for the relay", EnvVars: []string{"CROC_PASS"}},
&cli.StringFlag{Name: "socks5", Value: "", Usage: "add a socks5 proxy", EnvVars: []string{"SOCKS5_PROXY"}},
&cli.StringFlag{Name: "connect", Value: "", Usage: "add a http proxy", EnvVars: []string{"HTTP_PROXY"}},
&cli.StringFlag{Name: "throttleUpload", Value: "", Usage: "Throttle the upload speed e.g. 500k"},
} }
app.EnableBashCompletion = true app.EnableBashCompletion = true
app.HideHelp = false app.HideHelp = false
app.HideVersion = false app.HideVersion = false
app.BashComplete = func(c *cli.Context) {
fmt.Fprintf(c.App.Writer, "send\nreceive\relay")
}
app.Action = func(c *cli.Context) error { app.Action = func(c *cli.Context) error {
allStringsAreFiles := func(strs []string) bool {
for _, str := range strs {
if !utils.Exists(str) {
return false
}
}
return true
}
// check if "classic" is set
classicFile := getClassicConfigFile(true)
classicInsecureMode := utils.Exists(classicFile)
if c.Bool("classic") {
if classicInsecureMode {
// classic mode not enabled
fmt.Print(`Classic mode is currently ENABLED.
Disabling this mode will prevent the shared secret from being visible
on the host's process list when passed via the command line. On a
multi-user system, this will help ensure that other local users cannot
access the shared secret and receive the files instead of the intended
recipient.
Do you wish to continue to DISABLE the classic mode? (y/N) `)
choice := strings.ToLower(utils.GetInput(""))
if choice == "y" || choice == "yes" {
os.Remove(classicFile)
fmt.Print("\nClassic mode DISABLED.\n\n")
fmt.Print(`To send and receive, export the CROC_SECRET variable with the code phrase:
Send: CROC_SECRET=*** croc send file.txt
Receive: CROC_SECRET=*** croc` + "\n\n")
} else {
fmt.Print("\nClassic mode ENABLED.\n")
}
} else {
// enable classic mode
// touch the file
fmt.Print(`Classic mode is currently DISABLED.
Please note that enabling this mode will make the shared secret visible
on the host's process list when passed via the command line. On a
multi-user system, this could allow other local users to access the
shared secret and receive the files instead of the intended recipient.
Do you wish to continue to enable the classic mode? (y/N) `)
choice := strings.ToLower(utils.GetInput(""))
if choice == "y" || choice == "yes" {
fmt.Print("\nClassic mode ENABLED.\n\n")
os.WriteFile(classicFile, []byte("enabled"), 0o644)
fmt.Print(`To send and receive, use the code phrase:
Send: croc send --code *** file.txt
Receive: croc ***` + "\n\n")
} else {
fmt.Print("\nClassic mode DISABLED.\n")
}
}
os.Exit(0)
}
// if trying to send but forgot send, let the user know // if trying to send but forgot send, let the user know
if c.Args().First() != "" && utils.Exists(c.Args().First()) { if c.Args().Present() && allStringsAreFiles(c.Args().Slice()) {
_, fname := filepath.Split(c.Args().First()) fnames := []string{}
yn := utils.GetInput(fmt.Sprintf("Did you mean to send '%s'? (y/n) ", fname)) for _, fpath := range c.Args().Slice() {
if strings.ToLower(yn) == "y" { _, basename := filepath.Split(fpath)
fnames = append(fnames, "'"+basename+"'")
}
promptMessage := fmt.Sprintf("Did you mean to send %s? (Y/n) ", strings.Join(fnames, ", "))
choice := strings.ToLower(utils.GetInput(promptMessage))
if choice == "" || choice == "y" || choice == "yes" {
return send(c) return send(c)
} }
} }
return receive(c) return receive(c)
} }
return app.Run(os.Args) return app.Run(os.Args)
} }
func getConfigDir() (homedir string, err error) {
homedir, err = os.UserHomeDir()
if err != nil {
log.Error(err)
return
}
homedir = path.Join(homedir, ".config", "croc")
if _, err = os.Stat(homedir); os.IsNotExist(err) {
log.Debugf("creating home directory %s", homedir)
err = os.MkdirAll(homedir, 0700)
}
return
}
func setDebugLevel(c *cli.Context) { func setDebugLevel(c *cli.Context) {
if c.GlobalBool("debug") { if c.Bool("debug") {
log.SetLevel("debug") log.SetLevel("debug")
log.Debug("debug mode on") log.Debug("debug mode on")
// print the public IP address
ip, err := utils.PublicIP()
if err == nil {
log.Debugf("public IP address: %s", ip)
} else {
log.Debug(err)
}
} else { } else {
log.SetLevel("info") log.SetLevel("info")
} }
} }
func getConfigFile() string { func getSendConfigFile(requireValidPath bool) string {
configFile, err := getConfigDir() configFile, err := utils.GetConfigDir(requireValidPath)
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return "" return ""
@ -129,21 +234,85 @@ func getConfigFile() string {
return path.Join(configFile, "send.json") return path.Join(configFile, "send.json")
} }
func getClassicConfigFile(requireValidPath bool) string {
configFile, err := utils.GetConfigDir(requireValidPath)
if err != nil {
log.Error(err)
return ""
}
return path.Join(configFile, "classic_enabled")
}
func getReceiveConfigFile(requireValidPath bool) (string, error) {
configFile, err := utils.GetConfigDir(requireValidPath)
if err != nil {
log.Error(err)
return "", err
}
return path.Join(configFile, "receive.json"), nil
}
func determinePass(c *cli.Context) (pass string) {
pass = c.String("pass")
b, err := os.ReadFile(pass)
if err == nil {
pass = strings.TrimSpace(string(b))
}
return
}
func send(c *cli.Context) (err error) { func send(c *cli.Context) (err error) {
setDebugLevel(c) setDebugLevel(c)
crocOptions := croc.Options{ comm.Socks5Proxy = c.String("socks5")
SharedSecret: c.String("code"), comm.HttpProxy = c.String("connect")
IsSender: true,
Debug: c.GlobalBool("debug"), portParam := c.Int("port")
NoPrompt: c.GlobalBool("yes"), if portParam == 0 {
RelayAddress: c.GlobalString("relay"), portParam = 9009
Stdout: c.GlobalBool("stdout"),
DisableLocal: c.Bool("no-local"),
RelayPorts: strings.Split(c.String("ports"), ","),
Ask: c.GlobalBool("ask"),
} }
b, errOpen := ioutil.ReadFile(getConfigFile()) transfersParam := c.Int("transfers")
if errOpen == nil && !c.GlobalBool("remember") { if transfersParam == 0 {
transfersParam = 4
}
ports := make([]string, transfersParam+1)
for i := 0; i <= transfersParam; i++ {
ports[i] = strconv.Itoa(portParam + i)
}
crocOptions := croc.Options{
SharedSecret: c.String("code"),
IsSender: true,
Debug: c.Bool("debug"),
NoPrompt: c.Bool("yes"),
RelayAddress: c.String("relay"),
RelayAddress6: c.String("relay6"),
Stdout: c.Bool("stdout"),
DisableLocal: c.Bool("no-local"),
OnlyLocal: c.Bool("local"),
IgnoreStdin: c.Bool("ignore-stdin"),
RelayPorts: ports,
Ask: c.Bool("ask"),
NoMultiplexing: c.Bool("no-multi"),
RelayPassword: determinePass(c),
SendingText: c.String("text") != "",
NoCompress: c.Bool("no-compress"),
Overwrite: c.Bool("overwrite"),
Curve: c.String("curve"),
HashAlgorithm: c.String("hash"),
ThrottleUpload: c.String("throttleUpload"),
ZipFolder: c.Bool("zip"),
GitIgnore: c.Bool("git"),
ShowQrCode: c.Bool("qrcode"),
MulticastAddress: c.String("multicast"),
}
if crocOptions.RelayAddress != models.DEFAULT_RELAY {
crocOptions.RelayAddress6 = ""
} else if crocOptions.RelayAddress6 != models.DEFAULT_RELAY6 {
crocOptions.RelayAddress = ""
}
b, errOpen := os.ReadFile(getSendConfigFile(false))
if errOpen == nil && !c.Bool("remember") {
var rememberedOptions croc.Options var rememberedOptions croc.Options
err = json.Unmarshal(b, &rememberedOptions) err = json.Unmarshal(b, &rememberedOptions)
if err != nil { if err != nil {
@ -151,46 +320,105 @@ func send(c *cli.Context) (err error) {
return return
} }
// update anything that isn't explicitly set // update anything that isn't explicitly set
if !c.GlobalIsSet("relay") { if !c.IsSet("relay") && rememberedOptions.RelayAddress != "" {
crocOptions.RelayAddress = rememberedOptions.RelayAddress crocOptions.RelayAddress = rememberedOptions.RelayAddress
} }
if !c.IsSet("no-local") { if !c.IsSet("no-local") {
crocOptions.DisableLocal = rememberedOptions.DisableLocal crocOptions.DisableLocal = rememberedOptions.DisableLocal
} }
if !c.IsSet("ports") { if !c.IsSet("ports") && len(rememberedOptions.RelayPorts) > 0 {
crocOptions.RelayPorts = rememberedOptions.RelayPorts crocOptions.RelayPorts = rememberedOptions.RelayPorts
} }
if !c.IsSet("code") { if !c.IsSet("code") {
crocOptions.SharedSecret = rememberedOptions.SharedSecret crocOptions.SharedSecret = rememberedOptions.SharedSecret
} }
if !c.IsSet("pass") && rememberedOptions.RelayPassword != "" {
crocOptions.RelayPassword = rememberedOptions.RelayPassword
}
if !c.IsSet("relay6") && rememberedOptions.RelayAddress6 != "" {
crocOptions.RelayAddress6 = rememberedOptions.RelayAddress6
}
if !c.IsSet("overwrite") {
crocOptions.Overwrite = rememberedOptions.Overwrite
}
if !c.IsSet("curve") && rememberedOptions.Curve != "" {
crocOptions.Curve = rememberedOptions.Curve
}
if !c.IsSet("local") {
crocOptions.OnlyLocal = rememberedOptions.OnlyLocal
}
if !c.IsSet("hash") {
crocOptions.HashAlgorithm = rememberedOptions.HashAlgorithm
}
if !c.IsSet("git") {
crocOptions.GitIgnore = rememberedOptions.GitIgnore
}
} }
var fnames []string var fnames []string
stat, _ := os.Stdin.Stat() stat, _ := os.Stdin.Stat()
if (stat.Mode() & os.ModeCharDevice) == 0 { if ((stat.Mode() & os.ModeCharDevice) == 0) && !c.Bool("ignore-stdin") {
fnames, err = getStdin() fnames, err = getStdin()
if err != nil { if err != nil {
return return
} }
utils.MarkFileForRemoval(fnames[0])
defer func() { defer func() {
err = os.Remove(fnames[0]) e := os.Remove(fnames[0])
if err != nil { if e != nil {
log.Error(err) log.Error(e)
} }
}() }()
} else if c.String("text") != "" {
fnames, err = makeTempFileWithString(c.String("text"))
if err != nil {
return
}
utils.MarkFileForRemoval(fnames[0])
defer func() {
e := os.Remove(fnames[0])
if e != nil {
log.Error(e)
}
}()
} else { } else {
fnames = append([]string{c.Args().First()}, c.Args().Tail()...) fnames = c.Args().Slice()
} }
if len(fnames) == 0 { if len(fnames) == 0 {
return errors.New("must specify file: croc send [filename]") return errors.New("must specify file: croc send [filename(s) or folder]")
}
classicInsecureMode := utils.Exists(getClassicConfigFile(true))
if !classicInsecureMode {
// if operating system is UNIX, then use environmental variable to set the code
if (!(runtime.GOOS == "windows") && c.IsSet("code")) || os.Getenv("CROC_SECRET") != "" {
crocOptions.SharedSecret = os.Getenv("CROC_SECRET")
if crocOptions.SharedSecret == "" {
fmt.Printf(`On UNIX systems, to send with a custom code phrase,
you need to set the environmental variable CROC_SECRET:
CROC_SECRET=**** croc send file.txt
Or you can have the code phrase automatically generated:
croc send file.txt
Or you can go back to the classic croc behavior by enabling classic mode:
croc --classic
`)
os.Exit(0)
}
}
} }
if len(crocOptions.SharedSecret) == 0 { if len(crocOptions.SharedSecret) == 0 {
// generate code phrase // generate code phrase
crocOptions.SharedSecret = utils.GetRandomName() crocOptions.SharedSecret = utils.GetRandomName()
} }
minimalFileInfos, emptyFoldersToTransfer, totalNumberFolders, err := croc.GetFilesInfo(fnames, crocOptions.ZipFolder, crocOptions.GitIgnore)
paths, haveFolder, err := getPaths(fnames)
if err != nil { if err != nil {
return return
} }
@ -203,16 +431,13 @@ func send(c *cli.Context) (err error) {
// save the config // save the config
saveConfig(c, crocOptions) saveConfig(c, crocOptions)
err = cr.Send(croc.TransferOptions{ err = cr.Send(minimalFileInfos, emptyFoldersToTransfer, totalNumberFolders)
PathToFiles: paths,
KeepPathInRemote: haveFolder,
})
return return
} }
func getStdin() (fnames []string, err error) { func getStdin() (fnames []string, err error) {
f, err := ioutil.TempFile(".", "croc-stdin-") f, err := os.CreateTemp(".", "croc-stdin-")
if err != nil { if err != nil {
return return
} }
@ -228,40 +453,28 @@ func getStdin() (fnames []string, err error) {
return return
} }
func getPaths(fnames []string) (paths []string, haveFolder bool, err error) { func makeTempFileWithString(s string) (fnames []string, err error) {
haveFolder = false f, err := os.CreateTemp(".", "croc-stdin-")
paths = []string{} if err != nil {
for _, fname := range fnames { return
stat, errStat := os.Stat(fname)
if errStat != nil {
err = errStat
return
}
if stat.IsDir() {
haveFolder = true
err = filepath.Walk(fname,
func(pathName string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
paths = append(paths, filepath.ToSlash(pathName))
}
return nil
})
if err != nil {
return
}
} else {
paths = append(paths, filepath.ToSlash(fname))
}
} }
_, err = f.WriteString(s)
if err != nil {
return
}
err = f.Close()
if err != nil {
return
}
fnames = []string{f.Name()}
return return
} }
func saveConfig(c *cli.Context, crocOptions croc.Options) { func saveConfig(c *cli.Context, crocOptions croc.Options) {
if c.GlobalBool("remember") { if c.Bool("remember") {
configFile := getConfigFile() configFile := getSendConfigFile(true)
log.Debug("saving config file") log.Debug("saving config file")
var bConfig []byte var bConfig []byte
// if the code wasn't set, don't save it // if the code wasn't set, don't save it
@ -273,7 +486,7 @@ func saveConfig(c *cli.Context, crocOptions croc.Options) {
log.Error(err) log.Error(err)
return return
} }
err = ioutil.WriteFile(configFile, bConfig, 0644) err = os.WriteFile(configFile, bConfig, 0o644)
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return return
@ -282,53 +495,159 @@ func saveConfig(c *cli.Context, crocOptions croc.Options) {
} }
} }
func receive(c *cli.Context) (err error) { type TabComplete struct{}
crocOptions := croc.Options{
SharedSecret: c.String("code"), func (t TabComplete) Do(line []rune, pos int) ([][]rune, int) {
IsSender: false, var words = strings.SplitAfter(string(line), "-")
Debug: c.GlobalBool("debug"), var lastPartialWord = words[len(words)-1]
NoPrompt: c.GlobalBool("yes"), var nbCharacter = len(lastPartialWord)
RelayAddress: c.GlobalString("relay"), if nbCharacter == 0 {
Stdout: c.GlobalBool("stdout"), // No completion
Ask: c.GlobalBool("ask"), return [][]rune{[]rune("")}, 0
} }
if c.Args().First() != "" { if len(words) == 1 && nbCharacter == utils.NbPinNumbers {
// Check if word is indeed a number
_, err := strconv.Atoi(lastPartialWord)
if err == nil {
return [][]rune{[]rune("-")}, nbCharacter
}
}
var strArray [][]rune
for _, s := range mnemonicode.WordList {
if strings.HasPrefix(s, lastPartialWord) {
var completionCandidate = s[nbCharacter:]
if len(words) <= mnemonicode.WordsRequired(utils.NbBytesWords) {
completionCandidate += "-"
}
strArray = append(strArray, []rune(completionCandidate))
}
}
return strArray, nbCharacter
}
func receive(c *cli.Context) (err error) {
comm.Socks5Proxy = c.String("socks5")
comm.HttpProxy = c.String("connect")
crocOptions := croc.Options{
SharedSecret: c.String("code"),
IsSender: false,
Debug: c.Bool("debug"),
NoPrompt: c.Bool("yes"),
RelayAddress: c.String("relay"),
RelayAddress6: c.String("relay6"),
Stdout: c.Bool("stdout"),
Ask: c.Bool("ask"),
RelayPassword: determinePass(c),
OnlyLocal: c.Bool("local"),
IP: c.String("ip"),
Overwrite: c.Bool("overwrite"),
Curve: c.String("curve"),
TestFlag: c.Bool("testing"),
MulticastAddress: c.String("multicast"),
}
if crocOptions.RelayAddress != models.DEFAULT_RELAY {
crocOptions.RelayAddress6 = ""
} else if crocOptions.RelayAddress6 != models.DEFAULT_RELAY6 {
crocOptions.RelayAddress = ""
}
switch c.Args().Len() {
case 1:
crocOptions.SharedSecret = c.Args().First() crocOptions.SharedSecret = c.Args().First()
case 3:
fallthrough
case 4:
var phrase []string
phrase = append(phrase, c.Args().First())
phrase = append(phrase, c.Args().Tail()...)
crocOptions.SharedSecret = strings.Join(phrase, "-")
} }
// load options here // load options here
setDebugLevel(c) setDebugLevel(c)
configFile, err := getConfigDir()
if err != nil { doRemember := c.Bool("remember")
log.Error(err) configFile, err := getReceiveConfigFile(doRemember)
if err != nil && doRemember {
return return
} }
configFile = path.Join(configFile, "receive.json") b, errOpen := os.ReadFile(configFile)
b, errOpen := ioutil.ReadFile(configFile) if errOpen == nil && !doRemember {
if errOpen == nil && !c.GlobalBool("remember") {
var rememberedOptions croc.Options var rememberedOptions croc.Options
err = json.Unmarshal(b, &rememberedOptions) err = json.Unmarshal(b, &rememberedOptions)
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return return
} }
// update anything that isn't explicitly set // update anything that isn't explicitly Globally set
if !c.GlobalIsSet("relay") { if !c.IsSet("relay") && rememberedOptions.RelayAddress != "" {
crocOptions.RelayAddress = rememberedOptions.RelayAddress crocOptions.RelayAddress = rememberedOptions.RelayAddress
} }
if !c.GlobalIsSet("yes") { if !c.IsSet("yes") {
crocOptions.NoPrompt = rememberedOptions.NoPrompt crocOptions.NoPrompt = rememberedOptions.NoPrompt
} }
if crocOptions.SharedSecret == "" { if crocOptions.SharedSecret == "" {
crocOptions.SharedSecret = rememberedOptions.SharedSecret crocOptions.SharedSecret = rememberedOptions.SharedSecret
} }
if !c.IsSet("pass") && rememberedOptions.RelayPassword != "" {
crocOptions.RelayPassword = rememberedOptions.RelayPassword
}
if !c.IsSet("relay6") && rememberedOptions.RelayAddress6 != "" {
crocOptions.RelayAddress6 = rememberedOptions.RelayAddress6
}
if !c.IsSet("overwrite") {
crocOptions.Overwrite = rememberedOptions.Overwrite
}
if !c.IsSet("curve") && rememberedOptions.Curve != "" {
crocOptions.Curve = rememberedOptions.Curve
}
if !c.IsSet("local") {
crocOptions.OnlyLocal = rememberedOptions.OnlyLocal
}
} }
if crocOptions.SharedSecret == "" { classicInsecureMode := utils.Exists(getClassicConfigFile(true))
crocOptions.SharedSecret = utils.GetInput("Enter receive code: ") if crocOptions.SharedSecret == "" && os.Getenv("CROC_SECRET") != "" {
crocOptions.SharedSecret = os.Getenv("CROC_SECRET")
} else if !(runtime.GOOS == "windows") && crocOptions.SharedSecret != "" && !classicInsecureMode {
crocOptions.SharedSecret = os.Getenv("CROC_SECRET")
if crocOptions.SharedSecret == "" {
fmt.Printf(`On UNIX systems, to receive with croc you either need
to set a code phrase using your environmental variables:
CROC_SECRET=**** croc
Or you can specify the code phrase when you run croc without
declaring the secret on the command line:
croc
Enter receive code: ****
Or you can go back to the classic croc behavior by enabling classic mode:
croc --classic
`)
os.Exit(0)
}
} }
if c.GlobalString("out") != "" { if crocOptions.SharedSecret == "" {
os.Chdir(c.GlobalString("out")) l, err := readline.NewEx(&readline.Config{
Prompt: "Enter receive code: ",
AutoComplete: TabComplete{},
})
if err != nil {
return err
}
crocOptions.SharedSecret, err = l.Readline()
if err != nil {
return err
}
}
if c.String("out") != "" {
if err = os.Chdir(c.String("out")); err != nil {
return err
}
} }
cr, err := croc.New(crocOptions) cr, err := croc.New(crocOptions)
@ -337,7 +656,7 @@ func receive(c *cli.Context) (err error) {
} }
// save the config // save the config
if c.GlobalBool("remember") { if doRemember {
log.Debug("saving config file") log.Debug("saving config file")
var bConfig []byte var bConfig []byte
bConfig, err = json.MarshalIndent(crocOptions, "", " ") bConfig, err = json.MarshalIndent(crocOptions, "", " ")
@ -345,7 +664,7 @@ func receive(c *cli.Context) (err error) {
log.Error(err) log.Error(err)
return return
} }
err = ioutil.WriteFile(configFile, bConfig, 0644) err = os.WriteFile(configFile, bConfig, 0o644)
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return return
@ -358,22 +677,42 @@ func receive(c *cli.Context) (err error) {
} }
func relay(c *cli.Context) (err error) { func relay(c *cli.Context) (err error) {
log.Infof("starting croc relay version %v", Version)
debugString := "info" debugString := "info"
if c.GlobalBool("debug") { if c.Bool("debug") {
debugString = "debug" debugString = "debug"
} }
ports := strings.Split(c.String("ports"), ",") host := c.String("host")
var ports []string
if c.IsSet("ports") {
ports = strings.Split(c.String("ports"), ",")
} else {
portString := c.Int("port")
if portString == 0 {
portString = 9009
}
transfersString := c.Int("transfers")
if transfersString == 0 {
transfersString = 4
}
ports = make([]string, transfersString)
for i := range ports {
ports[i] = strconv.Itoa(portString + i)
}
}
tcpPorts := strings.Join(ports[1:], ",") tcpPorts := strings.Join(ports[1:], ",")
for i, port := range ports { for i, port := range ports {
if i == 0 { if i == 0 {
continue continue
} }
go func(portStr string) { go func(portStr string) {
err = tcp.Run(debugString, portStr) err := tcp.Run(debugString, host, portStr, determinePass(c))
if err != nil { if err != nil {
panic(err) panic(err)
} }
}(port) }(port)
} }
return tcp.Run(debugString, ports[0], tcpPorts) return tcp.Run(debugString, host, ports[0], determinePass(c), tcpPorts)
} }

View File

@ -4,12 +4,23 @@ import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"io"
"net" "net"
"net/url"
"strings"
"time" "time"
"github.com/pkg/errors" "github.com/magisterquis/connectproxy"
"github.com/schollz/croc/v10/src/utils"
log "github.com/schollz/logger"
"golang.org/x/net/proxy"
) )
var Socks5Proxy = ""
var HttpProxy = ""
var MAGIC_BYTES = []byte("croc")
// Comm is some basic TCP communication // Comm is some basic TCP communication
type Comm struct { type Comm struct {
connection net.Conn connection net.Conn
@ -21,19 +32,73 @@ func NewConnection(address string, timelimit ...time.Duration) (c *Comm, err err
if len(timelimit) > 0 { if len(timelimit) > 0 {
tlimit = timelimit[0] tlimit = timelimit[0]
} }
connection, err := net.DialTimeout("tcp", address, tlimit) var connection net.Conn
if Socks5Proxy != "" && !utils.IsLocalIP(address) {
var dialer proxy.Dialer
// prepend schema if no schema is given
if !strings.Contains(Socks5Proxy, `://`) {
Socks5Proxy = `socks5://` + Socks5Proxy
}
socks5ProxyURL, urlParseError := url.Parse(Socks5Proxy)
if urlParseError != nil {
err = fmt.Errorf("unable to parse socks proxy url: %s", urlParseError)
log.Debug(err)
return
}
dialer, err = proxy.FromURL(socks5ProxyURL, proxy.Direct)
if err != nil {
err = fmt.Errorf("proxy failed: %w", err)
log.Debug(err)
return
}
log.Debug("dialing with dialer.Dial")
connection, err = dialer.Dial("tcp", address)
} else if HttpProxy != "" && !utils.IsLocalIP(address) {
var dialer proxy.Dialer
// prepend schema if no schema is given
if !strings.Contains(HttpProxy, `://`) {
HttpProxy = `http://` + HttpProxy
}
HttpProxyURL, urlParseError := url.Parse(HttpProxy)
if urlParseError != nil {
err = fmt.Errorf("unable to parse http proxy url: %s", urlParseError)
log.Debug(err)
return
}
dialer, err = connectproxy.New(HttpProxyURL, proxy.Direct)
if err != nil {
err = fmt.Errorf("proxy failed: %w", err)
log.Debug(err)
return
}
log.Debug("dialing with dialer.Dial")
connection, err = dialer.Dial("tcp", address)
} else {
log.Debugf("dialing to %s with timelimit %s", address, tlimit)
connection, err = net.DialTimeout("tcp", address, tlimit)
}
if err != nil { if err != nil {
err = fmt.Errorf("comm.NewConnection failed: %w", err)
log.Debug(err)
return return
} }
c = New(connection) c = New(connection)
log.Debugf("connected to '%s'", address)
return return
} }
// New returns a new comm // New returns a new comm
func New(c net.Conn) *Comm { func New(c net.Conn) *Comm {
c.SetReadDeadline(time.Now().Add(3 * time.Hour)) if err := c.SetReadDeadline(time.Now().Add(3 * time.Hour)); err != nil {
c.SetDeadline(time.Now().Add(3 * time.Hour)) log.Warnf("error setting read deadline: %v", err)
c.SetWriteDeadline(time.Now().Add(3 * time.Hour)) }
if err := c.SetDeadline(time.Now().Add(3 * time.Hour)); err != nil {
log.Warnf("error setting overall deadline: %v", err)
}
if err := c.SetWriteDeadline(time.Now().Add(3 * time.Hour)); err != nil {
log.Errorf("error setting write deadline: %v", err)
}
comm := new(Comm) comm := new(Comm)
comm.connection = c comm.connection = c
return comm return comm
@ -46,65 +111,78 @@ func (c *Comm) Connection() net.Conn {
// Close closes the connection // Close closes the connection
func (c *Comm) Close() { func (c *Comm) Close() {
c.connection.Close() if err := c.connection.Close(); err != nil {
log.Warnf("error closing connection: %v", err)
}
} }
func (c *Comm) Write(b []byte) (int, error) { func (c *Comm) Write(b []byte) (n int, err error) {
header := new(bytes.Buffer) header := new(bytes.Buffer)
err := binary.Write(header, binary.LittleEndian, uint32(len(b))) err = binary.Write(header, binary.LittleEndian, uint32(len(b)))
if err != nil { if err != nil {
fmt.Println("binary.Write failed:", err) fmt.Println("binary.Write failed:", err)
} }
tmpCopy := append(header.Bytes(), b...) tmpCopy := append(header.Bytes(), b...)
n, err := c.connection.Write(tmpCopy) tmpCopy = append(MAGIC_BYTES, tmpCopy...)
if n != len(tmpCopy) { n, err = c.connection.Write(tmpCopy)
if err != nil { if err != nil {
err = errors.Wrap(err, fmt.Sprintf("wanted to write %d but wrote %d", len(b), n)) err = fmt.Errorf("connection.Write failed: %w", err)
} else { return
err = fmt.Errorf("wanted to write %d but wrote %d", len(b), n)
}
} }
// log.Printf("wanted to write %d but wrote %d", n, len(b)) if n != len(tmpCopy) {
return n, err err = fmt.Errorf("wanted to write %d but wrote %d", len(b), n)
return
}
return
} }
func (c *Comm) Read() (buf []byte, numBytes int, bs []byte, err error) { func (c *Comm) Read() (buf []byte, numBytes int, bs []byte, err error) {
// long read deadline in case waiting for file
if err = c.connection.SetReadDeadline(time.Now().Add(3 * time.Hour)); err != nil {
log.Warnf("error setting read deadline: %v", err)
}
// must clear the timeout setting
defer c.connection.SetDeadline(time.Time{})
// read until we get 4 bytes for the magic
header := make([]byte, 4)
_, err = io.ReadFull(c.connection, header)
if err != nil {
log.Debugf("initial read error: %v", err)
return
}
if !bytes.Equal(header, MAGIC_BYTES) {
err = fmt.Errorf("initial bytes are not magic: %x", header)
return
}
// read until we get 4 bytes for the header // read until we get 4 bytes for the header
var header []byte header = make([]byte, 4)
numBytes = 4 _, err = io.ReadFull(c.connection, header)
for { if err != nil {
tmp := make([]byte, numBytes-len(header)) log.Debugf("initial read error: %v", err)
n, errRead := c.connection.Read(tmp) return
if errRead != nil {
err = errRead
return
}
header = append(header, tmp[:n]...)
if numBytes == len(header) {
break
}
} }
var numBytesUint32 uint32 var numBytesUint32 uint32
rbuf := bytes.NewReader(header) rbuf := bytes.NewReader(header)
err = binary.Read(rbuf, binary.LittleEndian, &numBytesUint32) err = binary.Read(rbuf, binary.LittleEndian, &numBytesUint32)
if err != nil { if err != nil {
fmt.Println("binary.Read failed:", err) err = fmt.Errorf("binary.Read failed: %w", err)
log.Debug(err.Error())
return
} }
numBytes = int(numBytesUint32) numBytes = int(numBytesUint32)
buf = make([]byte, 0)
for { // shorten the reading deadline in case getting weird data
// log.Debugf("bytes: %d/%d",len(buf),numBytes) if err = c.connection.SetReadDeadline(time.Now().Add(10 * time.Second)); err != nil {
tmp := make([]byte, numBytes-len(buf)) log.Warnf("error setting read deadline: %v", err)
n, errRead := c.connection.Read(tmp) }
if errRead != nil { buf = make([]byte, numBytes)
err = errRead _, err = io.ReadFull(c.connection, buf)
return if err != nil {
} log.Debugf("consecutive read error: %v", err)
buf = append(buf, tmp[:n]...) return
if numBytes == len(buf) {
break
}
} }
return return
} }

View File

@ -11,8 +11,10 @@ import (
) )
func TestComm(t *testing.T) { func TestComm(t *testing.T) {
token := make([]byte, 40000000) token := make([]byte, 3000)
rand.Read(token) if _, err := rand.Read(token); err != nil {
t.Error(err)
}
port := "8001" port := "8001"
go func() { go func() {
@ -29,7 +31,7 @@ func TestComm(t *testing.T) {
log.Error(err) log.Error(err)
} }
log.Debugf("client %s connected", connection.RemoteAddr().String()) log.Debugf("client %s connected", connection.RemoteAddr().String())
go func(port string, connection net.Conn) { go func(_ string, connection net.Conn) {
c := New(connection) c := New(connection)
err = c.Send([]byte("hello, world")) err = c.Send([]byte("hello, world"))
assert.Nil(t, err) assert.Nil(t, err)
@ -47,7 +49,7 @@ func TestComm(t *testing.T) {
}() }()
time.Sleep(300 * time.Millisecond) time.Sleep(300 * time.Millisecond)
a, err := NewConnection("localhost:"+port, 10*time.Minute) a, err := NewConnection("127.0.0.1:"+port, 10*time.Minute)
assert.Nil(t, err) assert.Nil(t, err)
data, err := a.Receive() data, err := a.Receive()
assert.Equal(t, []byte("hello, world"), data) assert.Equal(t, []byte("hello, world"), data)
@ -61,5 +63,4 @@ func TestComm(t *testing.T) {
assert.NotNil(t, a.Send(token)) assert.NotNil(t, a.Send(token))
_, err = a.Write(token) _, err = a.Write(token)
assert.NotNil(t, err) assert.NotNil(t, err)
} }

View File

@ -4,6 +4,8 @@ import (
"bytes" "bytes"
"compress/flate" "compress/flate"
"io" "io"
log "github.com/schollz/logger"
) )
// CompressWithOption returns compressed data using the specified level // CompressWithOption returns compressed data using the specified level
@ -30,14 +32,22 @@ func Decompress(src []byte) []byte {
// compress uses flate to compress a byte slice to a corresponding level // compress uses flate to compress a byte slice to a corresponding level
func compress(src []byte, dest io.Writer, level int) { func compress(src []byte, dest io.Writer, level int) {
compressor, _ := flate.NewWriter(dest, level) compressor, err := flate.NewWriter(dest, level)
compressor.Write(src) if err != nil {
log.Debugf("error level data: %v", err)
return
}
if _, err := compressor.Write(src); err != nil {
log.Debugf("error writing data: %v", err)
}
compressor.Close() compressor.Close()
} }
// compress uses flate to decompress an io.Reader // compress uses flate to decompress an io.Reader
func decompress(src io.Reader, dest io.Writer) { func decompress(src io.Reader, dest io.Writer) {
decompressor := flate.NewReader(src) decompressor := flate.NewReader(src)
io.Copy(dest, decompressor) if _, err := io.Copy(dest, decompressor); err != nil {
log.Debugf("error copying data: %v", err)
}
decompressor.Close() decompressor.Close()
} }

View File

@ -51,7 +51,9 @@ func BenchmarkCompressLevelNine(b *testing.B) {
func BenchmarkCompressLevelMinusTwoBinary(b *testing.B) { func BenchmarkCompressLevelMinusTwoBinary(b *testing.B) {
data := make([]byte, 1000000) data := make([]byte, 1000000)
rand.Read(data) if _, err := rand.Read(data); err != nil {
b.Fatal(err)
}
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
CompressWithOption(data, -2) CompressWithOption(data, -2)
} }
@ -59,7 +61,9 @@ func BenchmarkCompressLevelMinusTwoBinary(b *testing.B) {
func BenchmarkCompressLevelNineBinary(b *testing.B) { func BenchmarkCompressLevelNineBinary(b *testing.B) {
data := make([]byte, 1000000) data := make([]byte, 1000000)
rand.Read(data) if _, err := rand.Read(data); err != nil {
b.Fatal(err)
}
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
CompressWithOption(data, 9) CompressWithOption(data, 9)
} }
@ -83,12 +87,16 @@ func TestCompress(t *testing.T) {
assert.True(t, len(compressedB) < len(fable)) assert.True(t, len(compressedB) < len(fable))
data := make([]byte, 4096) data := make([]byte, 4096)
rand.Read(data) if _, err := rand.Read(data); err != nil {
t.Fatal(err)
}
compressedB = CompressWithOption(data, -2) compressedB = CompressWithOption(data, -2)
dataRateSavings = 100 * (1.0 - float64(len(compressedB))/float64(len(data))) dataRateSavings = 100 * (1.0 - float64(len(compressedB))/float64(len(data)))
fmt.Printf("random, Level -2: %2.0f%% percent space savings\n", dataRateSavings) fmt.Printf("random, Level -2: %2.0f%% percent space savings\n", dataRateSavings)
rand.Read(data) if _, err := rand.Read(data); err != nil {
t.Fatal(err)
}
compressedB = CompressWithOption(data, 9) compressedB = CompressWithOption(data, 9)
dataRateSavings = 100 * (1.0 - float64(len(compressedB))/float64(len(data))) dataRateSavings = 100 * (1.0 - float64(len(compressedB))/float64(len(data)))

File diff suppressed because it is too large Load Diff

View File

@ -1,37 +1,48 @@
package croc package croc
import ( import (
"io/ioutil"
"os" "os"
"path"
"path/filepath"
"runtime"
"strings"
"sync" "sync"
"testing" "testing"
"time" "time"
"github.com/schollz/croc/v6/src/tcp" "github.com/schollz/croc/v10/src/tcp"
log "github.com/schollz/logger" log "github.com/schollz/logger"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestCroc(t *testing.T) { func init() {
log.SetLevel("trace") log.SetLevel("trace")
go tcp.Run("debug", "127.0.0.1", "8281", "pass123", "8282,8283,8284,8285")
go tcp.Run("debug", "127.0.0.1", "8282", "pass123")
go tcp.Run("debug", "127.0.0.1", "8283", "pass123")
go tcp.Run("debug", "127.0.0.1", "8284", "pass123")
go tcp.Run("debug", "127.0.0.1", "8285", "pass123")
time.Sleep(1 * time.Second)
}
func TestCrocReadme(t *testing.T) {
defer os.Remove("README.md") defer os.Remove("README.md")
go tcp.Run("debug", "8081", "8082,8083,8084,8085")
go tcp.Run("debug", "8082")
go tcp.Run("debug", "8083")
go tcp.Run("debug", "8084")
go tcp.Run("debug", "8085")
time.Sleep(300 * time.Millisecond)
log.Debug("setting up sender") log.Debug("setting up sender")
sender, err := New(Options{ sender, err := New(Options{
IsSender: true, IsSender: true,
SharedSecret: "test", SharedSecret: "8123-testingthecroc",
Debug: true, Debug: true,
RelayAddress: "localhost:8081", RelayAddress: "127.0.0.1:8281",
RelayPorts: []string{"8081"}, RelayPorts: []string{"8281"},
Stdout: false, RelayPassword: "pass123",
NoPrompt: true, Stdout: false,
DisableLocal: true, NoPrompt: true,
DisableLocal: true,
Curve: "siec",
Overwrite: true,
GitIgnore: false,
}) })
if err != nil { if err != nil {
panic(err) panic(err)
@ -39,13 +50,16 @@ func TestCroc(t *testing.T) {
log.Debug("setting up receiver") log.Debug("setting up receiver")
receiver, err := New(Options{ receiver, err := New(Options{
IsSender: false, IsSender: false,
SharedSecret: "test", SharedSecret: "8123-testingthecroc",
Debug: true, Debug: true,
RelayAddress: "localhost:8081", RelayAddress: "127.0.0.1:8281",
Stdout: false, RelayPassword: "pass123",
NoPrompt: true, Stdout: false,
DisableLocal: true, NoPrompt: true,
DisableLocal: true,
Curve: "siec",
Overwrite: true,
}) })
if err != nil { if err != nil {
panic(err) panic(err)
@ -54,20 +68,197 @@ func TestCroc(t *testing.T) {
var wg sync.WaitGroup var wg sync.WaitGroup
wg.Add(2) wg.Add(2)
go func() { go func() {
sender.Send(TransferOptions{ filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{"../../README.md"}, false, false)
PathToFiles: []string{"../../README.md"}, if errGet != nil {
}) t.Errorf("failed to get minimal info: %v", errGet)
}
err := sender.Send(filesInfo, emptyFolders, totalNumberFolders)
if err != nil {
t.Errorf("send failed: %v", err)
}
wg.Done() wg.Done()
}() }()
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
go func() { go func() {
receiver.Receive() err := receiver.Receive()
if err != nil {
t.Errorf("receive failed: %v", err)
}
wg.Done() wg.Done()
}() }()
wg.Wait() wg.Wait()
} }
func TestCrocEmptyFolder(t *testing.T) {
pathName := "../../testEmpty"
defer os.RemoveAll(pathName)
defer os.RemoveAll("./testEmpty")
os.MkdirAll(pathName, 0o755)
log.Debug("setting up sender")
sender, err := New(Options{
IsSender: true,
SharedSecret: "8123-testingthecroc",
Debug: true,
RelayAddress: "127.0.0.1:8281",
RelayPorts: []string{"8281"},
RelayPassword: "pass123",
Stdout: false,
NoPrompt: true,
DisableLocal: true,
Curve: "siec",
Overwrite: true,
})
if err != nil {
panic(err)
}
log.Debug("setting up receiver")
receiver, err := New(Options{
IsSender: false,
SharedSecret: "8123-testingthecroc",
Debug: true,
RelayAddress: "127.0.0.1:8281",
RelayPassword: "pass123",
Stdout: false,
NoPrompt: true,
DisableLocal: true,
Curve: "siec",
Overwrite: true,
})
if err != nil {
panic(err)
}
var wg sync.WaitGroup
wg.Add(2)
go func() {
filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{pathName}, false, false)
if errGet != nil {
t.Errorf("failed to get minimal info: %v", errGet)
}
err := sender.Send(filesInfo, emptyFolders, totalNumberFolders)
if err != nil {
t.Errorf("send failed: %v", err)
}
wg.Done()
}()
time.Sleep(100 * time.Millisecond)
go func() {
err := receiver.Receive()
if err != nil {
t.Errorf("receive failed: %v", err)
}
wg.Done()
}()
wg.Wait()
}
func TestCrocSymlink(t *testing.T) {
pathName := "../link-in-folder"
defer os.RemoveAll(pathName)
defer os.RemoveAll("./link-in-folder")
os.MkdirAll(pathName, 0o755)
os.Symlink("../../README.md", filepath.Join(pathName, "README.link"))
log.Debug("setting up sender")
sender, err := New(Options{
IsSender: true,
SharedSecret: "8124-testingthecroc",
Debug: true,
RelayAddress: "127.0.0.1:8281",
RelayPorts: []string{"8281"},
RelayPassword: "pass123",
Stdout: false,
NoPrompt: true,
DisableLocal: true,
Curve: "siec",
Overwrite: true,
GitIgnore: false,
})
if err != nil {
panic(err)
}
log.Debug("setting up receiver")
receiver, err := New(Options{
IsSender: false,
SharedSecret: "8124-testingthecroc",
Debug: true,
RelayAddress: "127.0.0.1:8281",
RelayPassword: "pass123",
Stdout: false,
NoPrompt: true,
DisableLocal: true,
Curve: "siec",
Overwrite: true,
})
if err != nil {
panic(err)
}
var wg sync.WaitGroup
wg.Add(2)
go func() {
filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{pathName}, false, false)
if errGet != nil {
t.Errorf("failed to get minimal info: %v", errGet)
}
err = sender.Send(filesInfo, emptyFolders, totalNumberFolders)
if err != nil {
t.Errorf("send failed: %v", err)
}
wg.Done()
}()
time.Sleep(100 * time.Millisecond)
go func() {
err = receiver.Receive()
if err != nil {
t.Errorf("receive failed: %v", err)
}
wg.Done()
}()
wg.Wait()
s, err := filepath.EvalSymlinks(path.Join(pathName, "README.link"))
if s != "../../README.md" && s != "..\\..\\README.md" {
log.Debug(s)
t.Errorf("symlink failed to transfer in folder")
}
if err != nil {
t.Errorf("symlink transfer failed: %s", err.Error())
}
}
func TestCrocIgnoreGit(t *testing.T) {
log.SetLevel("trace")
defer os.Remove(".gitignore")
time.Sleep(300 * time.Millisecond)
time.Sleep(1 * time.Second)
file, err := os.Create(".gitignore")
if err != nil {
log.Errorf("error creating file")
}
_, err = file.WriteString("LICENSE")
if err != nil {
log.Errorf("error writing to file")
}
time.Sleep(1 * time.Second)
// due to how files are ignored in this function, all we have to do to test is make sure LICENSE doesn't get included in FilesInfo.
filesInfo, _, _, errGet := GetFilesInfo([]string{"../../LICENSE", ".gitignore", "croc.go"}, false, true)
if errGet != nil {
t.Errorf("failed to get minimal info: %v", errGet)
}
for _, file := range filesInfo {
if strings.Contains(file.Name, "LICENSE") {
t.Errorf("test failed, should ignore LICENSE")
}
}
}
func TestCrocLocal(t *testing.T) { func TestCrocLocal(t *testing.T) {
log.SetLevel("trace") log.SetLevel("trace")
defer os.Remove("LICENSE") defer os.Remove("LICENSE")
@ -76,14 +267,18 @@ func TestCrocLocal(t *testing.T) {
log.Debug("setting up sender") log.Debug("setting up sender")
sender, err := New(Options{ sender, err := New(Options{
IsSender: true, IsSender: true,
SharedSecret: "test", SharedSecret: "8123-testingthecroc",
Debug: true, Debug: true,
RelayAddress: "localhost:8181", RelayAddress: "127.0.0.1:8181",
RelayPorts: []string{"8181", "8182"}, RelayPorts: []string{"8181", "8182"},
Stdout: true, RelayPassword: "pass123",
NoPrompt: true, Stdout: true,
DisableLocal: false, NoPrompt: true,
DisableLocal: false,
Curve: "siec",
Overwrite: true,
GitIgnore: false,
}) })
if err != nil { if err != nil {
panic(err) panic(err)
@ -92,13 +287,16 @@ func TestCrocLocal(t *testing.T) {
log.Debug("setting up receiver") log.Debug("setting up receiver")
receiver, err := New(Options{ receiver, err := New(Options{
IsSender: false, IsSender: false,
SharedSecret: "test", SharedSecret: "8123-testingthecroc",
Debug: true, Debug: true,
RelayAddress: "localhost:8181", RelayAddress: "127.0.0.1:8181",
Stdout: true, RelayPassword: "pass123",
NoPrompt: true, Stdout: true,
DisableLocal: false, NoPrompt: true,
DisableLocal: false,
Curve: "siec",
Overwrite: true,
}) })
if err != nil { if err != nil {
panic(err) panic(err)
@ -108,15 +306,22 @@ func TestCrocLocal(t *testing.T) {
os.Create("touched") os.Create("touched")
wg.Add(2) wg.Add(2)
go func() { go func() {
sender.Send(TransferOptions{ filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{"../../LICENSE", "touched"}, false, false)
PathToFiles: []string{"../../LICENSE", "touched"}, if errGet != nil {
KeepPathInRemote: false, t.Errorf("failed to get minimal info: %v", errGet)
}) }
err := sender.Send(filesInfo, emptyFolders, totalNumberFolders)
if err != nil {
t.Errorf("send failed: %v", err)
}
wg.Done() wg.Done()
}() }()
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
go func() { go func() {
receiver.Receive() err := receiver.Receive()
if err != nil {
t.Errorf("send failed: %v", err)
}
wg.Done() wg.Done()
}() }()
@ -125,37 +330,71 @@ func TestCrocLocal(t *testing.T) {
func TestCrocError(t *testing.T) { func TestCrocError(t *testing.T) {
content := []byte("temporary file's content") content := []byte("temporary file's content")
tmpfile, err := ioutil.TempFile("", "example") tmpfile, err := os.CreateTemp("", "example")
if err != nil { if err != nil {
panic(err) panic(err)
} }
defer os.Remove(tmpfile.Name()) // clean up defer os.Remove(tmpfile.Name()) // clean up
if _, err := tmpfile.Write(content); err != nil { if _, err = tmpfile.Write(content); err != nil {
panic(err) panic(err)
} }
if err := tmpfile.Close(); err != nil { if err = tmpfile.Close(); err != nil {
panic(err) panic(err)
} }
Debug(false) Debug(false)
log.SetLevel("warn") log.SetLevel("warn")
sender, _ := New(Options{ sender, _ := New(Options{
IsSender: true, IsSender: true,
SharedSecret: "test33", SharedSecret: "8123-testingthecroc2",
Debug: true, Debug: true,
RelayAddress: "doesntexistok.com:8381", RelayAddress: "doesntexistok.com:8381",
RelayPorts: []string{"8381", "8382"}, RelayPorts: []string{"8381", "8382"},
Stdout: true, RelayPassword: "pass123",
NoPrompt: true, Stdout: true,
DisableLocal: true, NoPrompt: true,
}) DisableLocal: true,
err = sender.Send(TransferOptions{ Curve: "siec",
PathToFiles: []string{tmpfile.Name()}, Overwrite: true,
KeepPathInRemote: true,
}) })
filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{tmpfile.Name()}, false, false)
if errGet != nil {
t.Errorf("failed to get minimal info: %v", errGet)
}
err = sender.Send(filesInfo, emptyFolders, totalNumberFolders)
log.Debug(err) log.Debug(err)
assert.NotNil(t, err) assert.NotNil(t, err)
}
func TestCleanUp(t *testing.T) {
// windows allows files to be deleted only if they
// are not open by another program so the remove actions
// from the above tests will not always do a good clean up
// This "test" will make sure
operatingSystem := runtime.GOOS
log.Debugf("The operating system is %s", operatingSystem)
if operatingSystem == "windows" {
time.Sleep(1 * time.Second)
log.Debug("Full cleanup")
var err error
for _, file := range []string{"README.md", "./README.md"} {
err = os.Remove(file)
if err == nil {
log.Debugf("Successfully purged %s", file)
} else {
log.Debugf("%s was already purged.", file)
}
}
for _, folder := range []string{"./testEmpty", "./link-in-folder"} {
err = os.RemoveAll(folder)
if err == nil {
log.Debugf("Successfully purged %s", folder)
} else {
log.Debugf("%s was already purged.", folder)
}
}
}
} }

View File

@ -5,56 +5,44 @@ import (
"crypto/cipher" "crypto/cipher"
"crypto/rand" "crypto/rand"
"crypto/sha256" "crypto/sha256"
"fmt"
"log"
"golang.org/x/crypto/argon2"
"golang.org/x/crypto/chacha20poly1305"
"golang.org/x/crypto/pbkdf2" "golang.org/x/crypto/pbkdf2"
) )
// Encryption is the basic type for storing // New generates a new key based on a passphrase and salt
// the key, passphrase and salt func New(passphrase []byte, usersalt []byte) (key []byte, salt []byte, err error) {
type Encryption struct { if len(passphrase) < 1 {
key []byte err = fmt.Errorf("need more than that for passphrase")
passphrase []byte
salt []byte
}
// New generates a new Encryption, using the supplied passphrase and
// an optional supplied salt.
// Passing nil passphrase will not use decryption.
func New(passphrase []byte, salt []byte) (e Encryption, err error) {
if passphrase == nil {
e = Encryption{nil, nil, nil}
return return
} }
e.passphrase = passphrase if usersalt == nil {
if salt == nil { salt = make([]byte, 8)
e.salt = make([]byte, 8)
// http://www.ietf.org/rfc/rfc2898.txt // http://www.ietf.org/rfc/rfc2898.txt
// Salt. // Salt.
rand.Read(e.salt) if _, err := rand.Read(salt); err != nil {
log.Fatalf("can't get random salt: %v", err)
}
} else { } else {
e.salt = salt salt = usersalt
} }
e.key = pbkdf2.Key([]byte(passphrase), e.salt, 100, 32, sha256.New) key = pbkdf2.Key(passphrase, salt, 100, 32, sha256.New)
return return
} }
// Salt returns the salt bytes // Encrypt will encrypt using the pre-generated key
func (e Encryption) Salt() []byte { func Encrypt(plaintext []byte, key []byte) (encrypted []byte, err error) {
return e.salt
}
// Encrypt will generate an Encryption, prefixed with the IV
func (e Encryption) Encrypt(plaintext []byte) (encrypted []byte, err error) {
if e.passphrase == nil {
encrypted = plaintext
return
}
// generate a random iv each time // generate a random iv each time
// http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf // http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf
// Section 8.2 // Section 8.2
ivBytes := make([]byte, 12) ivBytes := make([]byte, 12)
rand.Read(ivBytes) if _, err = rand.Read(ivBytes); err != nil {
b, err := aes.NewCipher(e.key) log.Fatalf("can't initialize crypto: %v", err)
}
b, err := aes.NewCipher(key)
if err != nil { if err != nil {
return return
} }
@ -67,13 +55,13 @@ func (e Encryption) Encrypt(plaintext []byte) (encrypted []byte, err error) {
return return
} }
// Decrypt an Encryption // Decrypt using the pre-generated key
func (e Encryption) Decrypt(encrypted []byte) (plaintext []byte, err error) { func Decrypt(encrypted []byte, key []byte) (plaintext []byte, err error) {
if e.passphrase == nil { if len(encrypted) < 13 {
plaintext = encrypted err = fmt.Errorf("incorrect passphrase")
return return
} }
b, err := aes.NewCipher(e.key) b, err := aes.NewCipher(key)
if err != nil { if err != nil {
return return
} }
@ -84,3 +72,54 @@ func (e Encryption) Decrypt(encrypted []byte) (plaintext []byte, err error) {
plaintext, err = aesgcm.Open(nil, encrypted[:12], encrypted[12:], nil) plaintext, err = aesgcm.Open(nil, encrypted[:12], encrypted[12:], nil)
return return
} }
// NewArgon2 generates a new key based on a passphrase and salt
// using argon2
// https://pkg.go.dev/golang.org/x/crypto/argon2
func NewArgon2(passphrase []byte, usersalt []byte) (aead cipher.AEAD, salt []byte, err error) {
if len(passphrase) < 1 {
err = fmt.Errorf("need more than that for passphrase")
return
}
if usersalt == nil {
salt = make([]byte, 8)
// http://www.ietf.org/rfc/rfc2898.txt
// Salt.
if _, err = rand.Read(salt); err != nil {
log.Fatalf("can't get random salt: %v", err)
}
} else {
salt = usersalt
}
aead, err = chacha20poly1305.NewX(argon2.IDKey(passphrase, salt, 1, 64*1024, 4, 32))
return
}
// EncryptChaCha will encrypt ChaCha20-Poly1305 using the pre-generated key
// https://pkg.go.dev/golang.org/x/crypto/chacha20poly1305
func EncryptChaCha(plaintext []byte, aead cipher.AEAD) (encrypted []byte, err error) {
nonce := make([]byte, aead.NonceSize(), aead.NonceSize()+len(plaintext)+aead.Overhead())
if _, err := rand.Read(nonce); err != nil {
panic(err)
}
// Encrypt the message and append the ciphertext to the nonce.
encrypted = aead.Seal(nonce, nonce, plaintext, nil)
return
}
// DecryptChaCha will encrypt ChaCha20-Poly1305 using the pre-generated key
// https://pkg.go.dev/golang.org/x/crypto/chacha20poly1305
func DecryptChaCha(encryptedMsg []byte, aead cipher.AEAD) (encrypted []byte, err error) {
if len(encryptedMsg) < aead.NonceSize() {
err = fmt.Errorf("ciphertext too short")
return
}
// Split nonce and ciphertext.
nonce, ciphertext := encryptedMsg[:aead.NonceSize()], encryptedMsg[aead.NonceSize():]
// Decrypt the message and check it wasn't tampered with.
encrypted, err = aead.Open(nil, nonce, ciphertext, nil)
return
}

View File

@ -1,60 +1,119 @@
package crypt package crypt
import ( import (
"fmt"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func BenchmarkEncryptionNew(b *testing.B) { func BenchmarkEncrypt(b *testing.B) {
bob, _, _ := New([]byte("password"), nil)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
bob, _ := New([]byte("password"), nil) Encrypt([]byte("hello, world"), bob)
bob.Encrypt([]byte("hello, world"))
} }
} }
func BenchmarkEncryption(b *testing.B) { func BenchmarkDecrypt(b *testing.B) {
bob, _ := New([]byte("password"), nil) key, _, _ := New([]byte("password"), nil)
msg := []byte("hello, world")
enc, _ := Encrypt(msg, key)
b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
bob.Encrypt([]byte("hello, world")) Decrypt(enc, key)
}
}
func BenchmarkNewPbkdf2(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
New([]byte("password"), nil)
}
}
func BenchmarkNewArgon2(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
NewArgon2([]byte("password"), nil)
}
}
func BenchmarkEncryptChaCha(b *testing.B) {
bob, _, _ := NewArgon2([]byte("password"), nil)
for i := 0; i < b.N; i++ {
EncryptChaCha([]byte("hello, world"), bob)
}
}
func BenchmarkDecryptChaCha(b *testing.B) {
key, _, _ := NewArgon2([]byte("password"), nil)
msg := []byte("hello, world")
enc, _ := EncryptChaCha(msg, key)
b.ResetTimer()
for i := 0; i < b.N; i++ {
DecryptChaCha(enc, key)
} }
} }
func TestEncryption(t *testing.T) { func TestEncryption(t *testing.T) {
bob, err := New([]byte("password"), nil) key, salt, err := New([]byte("password"), nil)
assert.Nil(t, err) assert.Nil(t, err)
jane, err := New([]byte("password"), bob.Salt()) msg := []byte("hello, world")
enc, err := Encrypt(msg, key)
assert.Nil(t, err) assert.Nil(t, err)
enc, err := bob.Encrypt([]byte("hello, world")) dec, err := Decrypt(enc, key)
assert.Nil(t, err) assert.Nil(t, err)
dec, err := jane.Decrypt(enc) assert.Equal(t, msg, dec)
assert.Nil(t, err)
assert.Equal(t, dec, []byte("hello, world"))
jane2, err := New([]byte("password"), nil) // check reusing the salt
key2, _, _ := New([]byte("password"), salt)
dec, err = Decrypt(enc, key2)
assert.Nil(t, err) assert.Nil(t, err)
dec, err = jane2.Decrypt(enc) assert.Equal(t, msg, dec)
// check reusing the salt
key2, _, _ = New([]byte("wrong password"), salt)
dec, err = Decrypt(enc, key2)
assert.NotNil(t, err) assert.NotNil(t, err)
assert.NotEqual(t, dec, []byte("hello, world")) assert.NotEqual(t, msg, dec)
jane3, err := New([]byte("passwordwrong"), bob.Salt()) // error with no password
assert.Nil(t, err) _, err = Decrypt([]byte(""), key)
dec, err = jane3.Decrypt(enc)
assert.NotNil(t, err) assert.NotNil(t, err)
assert.NotEqual(t, dec, []byte("hello, world"))
// error with small password
_, _, err = New([]byte(""), nil)
assert.NotNil(t, err)
} }
func TestNoEncryption(t *testing.T) { func TestEncryptionChaCha(t *testing.T) {
bob, err := New(nil, nil) key, salt, err := NewArgon2([]byte("password"), nil)
fmt.Printf("key: %x\n", key)
assert.Nil(t, err) assert.Nil(t, err)
jane, err := New(nil, nil) msg := []byte("hello, world")
enc, err := EncryptChaCha(msg, key)
assert.Nil(t, err) assert.Nil(t, err)
enc, err := bob.Encrypt([]byte("hello, world")) dec, err := DecryptChaCha(enc, key)
assert.Nil(t, err) assert.Nil(t, err)
dec, err := jane.Decrypt(enc) assert.Equal(t, msg, dec)
assert.Nil(t, err)
assert.Equal(t, dec, []byte("hello, world"))
assert.Equal(t, enc, []byte("hello, world"))
// check reusing the salt
key2, _, _ := NewArgon2([]byte("password"), salt)
dec, err = DecryptChaCha(enc, key2)
assert.Nil(t, err)
assert.Equal(t, msg, dec)
// check reusing the salt
key2, _, _ = NewArgon2([]byte("wrong password"), salt)
dec, err = DecryptChaCha(enc, key2)
assert.NotNil(t, err)
assert.NotEqual(t, msg, dec)
// error with no password
_, err = DecryptChaCha([]byte(""), key)
assert.NotNil(t, err)
// error with small password
_, _, err = NewArgon2([]byte(""), nil)
assert.NotNil(t, err)
} }

View File

@ -0,0 +1,49 @@
//go:build !windows
// +build !windows
package diskusage
import (
"golang.org/x/sys/unix"
)
// DiskUsage contains usage data and provides user-friendly access methods
type DiskUsage struct {
stat *unix.Statfs_t
}
// NewDiskUsage returns an object holding the disk usage of volumePath
// or nil in case of error (invalid path, etc)
func NewDiskUsage(volumePath string) *DiskUsage {
stat := unix.Statfs_t{}
err := unix.Statfs(volumePath, &stat)
if err != nil {
return nil
}
return &DiskUsage{&stat}
}
// Free returns total free bytes on file system
func (du *DiskUsage) Free() uint64 {
return uint64(du.stat.Bfree) * uint64(du.stat.Bsize)
}
// Available return total available bytes on file system to an unprivileged user
func (du *DiskUsage) Available() uint64 {
return uint64(du.stat.Bavail) * uint64(du.stat.Bsize)
}
// Size returns total size of the file system
func (du *DiskUsage) Size() uint64 {
return uint64(du.stat.Blocks) * uint64(du.stat.Bsize)
}
// Used returns total bytes used in file system
func (du *DiskUsage) Used() uint64 {
return du.Size() - du.Free()
}
// Usage returns percentage of use on the file system
func (du *DiskUsage) Usage() float32 {
return float32(du.Used()) / float32(du.Size())
}

View File

@ -0,0 +1,17 @@
package diskusage
import (
"fmt"
"testing"
)
var KB = uint64(1024)
func TestNewDiskUsage(t *testing.T) {
usage := NewDiskUsage(".")
fmt.Println("Free:", usage.Free()/(KB*KB))
fmt.Println("Available:", usage.Available()/(KB*KB))
fmt.Println("Size:", usage.Size()/(KB*KB))
fmt.Println("Used:", usage.Used()/(KB*KB))
fmt.Println("Usage:", usage.Usage()*100, "%")
}

View File

@ -0,0 +1,55 @@
package diskusage
import (
"unsafe"
"golang.org/x/sys/windows"
)
type DiskUsage struct {
freeBytes int64
totalBytes int64
availBytes int64
}
// NewDiskUsage returns an object holding the disk usage of volumePath
// or nil in case of error (invalid path, etc)
func NewDiskUsage(volumePath string) *DiskUsage {
h := windows.MustLoadDLL("kernel32.dll")
c := h.MustFindProc("GetDiskFreeSpaceExW")
du := &DiskUsage{}
c.Call(
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(volumePath))),
uintptr(unsafe.Pointer(&du.freeBytes)),
uintptr(unsafe.Pointer(&du.totalBytes)),
uintptr(unsafe.Pointer(&du.availBytes)))
return du
}
// Free returns total free bytes on file system
func (du *DiskUsage) Free() uint64 {
return uint64(du.freeBytes)
}
// Available returns total available bytes on file system to an unprivileged user
func (du *DiskUsage) Available() uint64 {
return uint64(du.availBytes)
}
// Size returns total size of the file system
func (du *DiskUsage) Size() uint64 {
return uint64(du.totalBytes)
}
// Used returns total bytes used in file system
func (du *DiskUsage) Used() uint64 {
return du.Size() - du.Free()
}
// Usage returns percentage of use on the file system
func (du *DiskUsage) Usage() float32 {
return float32(du.Used()) / float32(du.Size())
}

19
src/install/Makefile Normal file
View File

@ -0,0 +1,19 @@
# VERSION=8.X.Y make release
release:
cd ../../ && go run src/install/updateversion.go
git commit -am "bump ${VERSION}"
git tag -af v${VERSION} -m "v${VERSION}"
git push
git push --tags
cp zsh_autocomplete ../../
cp bash_autocomplete ../../
cd ../../ && goreleaser release
cd ../../ && ./src/install/prepare-sources-tarball.sh
cd ../../ && ./src/install/upload-src-tarball.sh
test:
cp zsh_autocomplete ../../
cp bash_autocomplete ../../
cd ../../ && go generate
cd ../../ && goreleaser release --skip-publish

View File

@ -0,0 +1,19 @@
: ${PROG:=$(basename ${BASH_SOURCE})}
_cli_bash_autocomplete() {
if [[ "${COMP_WORDS[0]}" != "source" ]]; then
local cur opts base
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
if [[ "$cur" == "-"* ]]; then
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} ${cur} --generate-bash-completion )
else
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion )
fi
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete $PROG
unset PROG

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 KiB

View File

@ -23,7 +23,7 @@
# Issues: https://github.com/schollz/croc/issues # Issues: https://github.com/schollz/croc/issues
# #
# CREATED: 08/10/2019 16:41 # CREATED: 08/10/2019 16:41
# REVISION: 0.9.1 # REVISION: 0.9.2
#=============================================================================== #===============================================================================
set -o nounset # Treat unset variables as an error set -o nounset # Treat unset variables as an error
@ -86,7 +86,7 @@ print_help() {
Default = /usr/local/bin ('\${PREFIX}/bin' on Termux for Android) Default = /usr/local/bin ('\${PREFIX}/bin' on Termux for Android)
-h -h
Prints this helpfull message and exit." Prints this helpful message and exit."
echo "${help_header}" echo "${help_header}"
echo "" echo ""
@ -156,10 +156,10 @@ make_tempdir() {
#--- FUNCTION ---------------------------------------------------------------- #--- FUNCTION ----------------------------------------------------------------
# NAME: determine_os # NAME: determine_os
# DESCRIPTION: Attempts to determin host os using uname # DESCRIPTION: Attempts to determine host os using uname
# PARAMETERS: none # PARAMETERS: none
# RETURNS: 0 = OS Detected. Also prints detected os to stdout # RETURNS: 0 = OS Detected. Also prints detected os to stdout
# 1 = Unkown OS # 1 = Unknown OS
# 20 = 'uname' not found in path # 20 = 'uname' not found in path
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
determine_os() { determine_os() {
@ -180,10 +180,10 @@ determine_os() {
#--- FUNCTION ---------------------------------------------------------------- #--- FUNCTION ----------------------------------------------------------------
# NAME: determine_arch # NAME: determine_arch
# DESCRIPTION: Attempt to determin architecture of host # DESCRIPTION: Attempt to determine architecture of host
# PARAMETERS: none # PARAMETERS: none
# RETURNS: 0 = Arch Detected. Also prints detected arch to stdout # RETURNS: 0 = Arch Detected. Also prints detected arch to stdout
# 1 = Unkown arch # 1 = Unknown arch
# 20 = 'uname' not found in path # 20 = 'uname' not found in path
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
determine_arch() { determine_arch() {
@ -238,7 +238,7 @@ download_file() {
#--- FUNCTION ---------------------------------------------------------------- #--- FUNCTION ----------------------------------------------------------------
# NAME: checksum_check # NAME: checksum_check
# DESCRIPTION: Attempt to verify checksum of downloaded file to ensure # DESCRIPTION: Attempt to verify checksum of downloaded file to ensure
# integrity. Tries multiple tools before faling. # integrity. Tries multiple tools before failing.
# PARAMETERS: $1 = path to checksum file # PARAMETERS: $1 = path to checksum file
# $2 = location of file to check # $2 = location of file to check
# $3 = working directory # $3 = working directory
@ -300,10 +300,10 @@ checksum_check() {
#--- FUNCTION ---------------------------------------------------------------- #--- FUNCTION ----------------------------------------------------------------
# NAME: extract_file # NAME: extract_file
# DESCRIPTION: Extracts a file into a location. Attempts to determine which # DESCRIPTION: Extracts a file into a location. Attempts to determine which
# tool to use by checking file extention. # tool to use by checking file extension.
# PARAMETERS: $1 = file to extract # PARAMETERS: $1 = file to extract
# $2 = location to extract file into # $2 = location to extract file into
# $3 = extention # $3 = extension
# RETURNS: Return code of the tool used to extract the file # RETURNS: Return code of the tool used to extract the file
# 20 = Failed to determine which tool to use # 20 = Failed to determine which tool to use
# 30 = Failed to find tool in path # 30 = Failed to find tool in path
@ -339,6 +339,42 @@ extract_file() {
return "${rcode}" return "${rcode}"
} }
#--- FUNCTION ----------------------------------------------------------------
# NAME: create_prefix
# DESCRIPTION: Creates the install prefix (and any parent directories). If
# EUID not 0, then attempt to use sudo.
# PARAMETERS: $1 = prefix
# RETURNS: Return code of the tool used to make the directory
# 0 = Created the directory
# >0 = Failed to create directory
# 20 = Could not find mkdir command
# 21 = Could not find sudo command
#-------------------------------------------------------------------------------
create_prefix() {
local prefix
local rcode
prefix="${1}"
if command -v mkdir >/dev/null 2>&1; then
if [[ "${EUID}" == "0" ]]; then
mkdir -p "${prefix}"
rcode="${?}"
else
if command -v sudo >/dev/null 2>&1; then
sudo mkdir -p "${prefix}"
rcode="${?}"
else
rcode="21"
fi
fi
else
rcode="20"
fi
return "${rcode}"
}
#--- FUNCTION ---------------------------------------------------------------- #--- FUNCTION ----------------------------------------------------------------
# NAME: install_file_freebsd # NAME: install_file_freebsd
# DESCRIPTION: Installs a file into a location using 'install'. If EUID not # DESCRIPTION: Installs a file into a location using 'install'. If EUID not
@ -377,7 +413,6 @@ install_file_freebsd() {
return "${rcode}" return "${rcode}"
} }
#--- FUNCTION ---------------------------------------------------------------- #--- FUNCTION ----------------------------------------------------------------
# NAME: install_file_linux # NAME: install_file_linux
# DESCRIPTION: Installs a file into a location using 'install'. If EUID not # DESCRIPTION: Installs a file into a location using 'install'. If EUID not
@ -485,12 +520,22 @@ main() {
local checksum_check_rcode local checksum_check_rcode
local extract_file_rcode local extract_file_rcode
local install_file_rcode local install_file_rcode
local create_prefix_rcode
local bash_autocomplete_file
local bash_autocomplete_prefix
local zsh_autocomplete_file
local zsh_autocomplete_prefix
local autocomplete_install_rcode
croc_bin_name="croc" croc_bin_name="croc"
croc_version="6.1.5" croc_version="10.1.1"
croc_dl_ext="tar.gz" croc_dl_ext="tar.gz"
croc_base_url="https://github.com/schollz/croc/releases/download" croc_base_url="https://github.com/schollz/croc/releases/download"
prefix="${1}" prefix="${1}"
bash_autocomplete_file="bash_autocomplete"
bash_autocomplete_prefix="/etc/bash_completion.d"
zsh_autocomplete_file="zsh_autocomplete"
zsh_autocomplete_prefix="/etc/zsh"
print_banner print_banner
print_message "== Install prefix set to ${prefix}" "info" print_message "== Install prefix set to ${prefix}" "info"
@ -532,6 +577,9 @@ main() {
case "${croc_os}" in case "${croc_os}" in
"Darwin" ) croc_os="macOS";; "Darwin" ) croc_os="macOS";;
*"BusyBox"* )
croc_os="Linux"
;;
"CYGWIN"* ) croc_os="Windows"; "CYGWIN"* ) croc_os="Windows";
croc_dl_ext="zip"; croc_dl_ext="zip";
print_message "== Cygwin is currently unsupported." "error"; print_message "== Cygwin is currently unsupported." "error";
@ -542,16 +590,19 @@ main() {
"x86_64" ) croc_arch="64bit";; "x86_64" ) croc_arch="64bit";;
"amd64" ) croc_arch="64bit";; "amd64" ) croc_arch="64bit";;
"aarch64" ) croc_arch="ARM64";; "aarch64" ) croc_arch="ARM64";;
"arm64" ) croc_arch="ARM64";;
"armv7l" ) croc_arch="ARM";; "armv7l" ) croc_arch="ARM";;
"armv8l" ) croc_arch="ARM";;
"armv9l" ) croc_arch="ARM";;
"i686" ) croc_arch="32bit";; "i686" ) croc_arch="32bit";;
* ) croc_arch="unknown";; * ) croc_arch="unknown";;
esac esac
croc_file="${croc_bin_name}_${croc_version}_${croc_os}-${croc_arch}.${croc_dl_ext}" croc_file="${croc_bin_name}_v${croc_version}_${croc_os}-${croc_arch}.${croc_dl_ext}"
croc_checksum_file="${croc_bin_name}_${croc_version}_checksums.txt" croc_checksum_file="${croc_bin_name}_v${croc_version}_checksums.txt"
croc_url="${croc_base_url}/v${croc_version}/${croc_file}" croc_url="${croc_base_url}/v${croc_version}/${croc_file}"
croc_checksum_url="${croc_base_url}/v${croc_version}/${croc_checksum_file}" croc_checksum_url="${croc_base_url}/v${croc_version}/${croc_checksum_file}"
echo "${croc_url}" "${tmpdir}" "${croc_file}"
download_file "${croc_url}" "${tmpdir}" "${croc_file}" download_file "${croc_url}" "${tmpdir}" "${croc_file}"
download_file_rcode="${?}" download_file_rcode="${?}"
if [[ "${download_file_rcode}" == "0" ]]; then if [[ "${download_file_rcode}" == "0" ]]; then
@ -620,6 +671,26 @@ main() {
exit 1 exit 1
fi fi
if [[ ! -d "${prefix}" ]]; then
create_prefix "${prefix}"
create_prefix_rcode="${?}"
if [[ "${create_prefix_rcode}" == "0" ]]; then
print_message "== Created install prefix at ${prefix}" "info"
elif [[ "${create_prefix_rcode}" == "20" ]]; then
print_message "== Failed to find mkdir in path" "error"
exit 1
elif [[ "${create_prefix_rcode}" == "21" ]]; then
print_message "== Failed to find sudo in path" "error"
exit 1
else
print_message "== Failed to create the install prefix: ${prefix}" "error"
exit 1
fi
else
print_message "== Install prefix already exists. No need to create it." "info"
fi
[ ! -d "${bash_autocomplete_prefix}/croc" ] && mkdir -p "${bash_autocomplete_prefix}/croc" >/dev/null 2>&1
case "${croc_os}" in case "${croc_os}" in
"Linux" ) install_file_linux "${tmpdir}/${croc_bin_name}" "${prefix}/"; "Linux" ) install_file_linux "${tmpdir}/${croc_bin_name}" "${prefix}/";
install_file_rcode="${?}";; install_file_rcode="${?}";;
@ -630,7 +701,8 @@ main() {
"Windows" ) install_file_cygwin "${tmpdir}/${croc_bin_name}" "${prefix}/"; "Windows" ) install_file_cygwin "${tmpdir}/${croc_bin_name}" "${prefix}/";
install_file_rcode="${?}";; install_file_rcode="${?}";;
esac esac
if [[ "${install_file_rcode}" == "0" ]]; then
if [[ "${install_file_rcode}" == "0" ]] ; then
print_message "== Installed ${croc_bin_name} to ${prefix}/" "ok" print_message "== Installed ${croc_bin_name} to ${prefix}/" "ok"
elif [[ "${install_file_rcode}" == "1" ]]; then elif [[ "${install_file_rcode}" == "1" ]]; then
print_message "== Failed to install ${croc_bin_name}" "error" print_message "== Failed to install ${croc_bin_name}" "error"
@ -646,6 +718,28 @@ main() {
exit 1 exit 1
fi fi
# case "$(basename ${SHELL})" in
# "bash" ) install_file_linux "${tmpdir}/${bash_autocomplete_file}" "${bash_autocomplete_prefix}/croc";
# autocomplete_install_rcode="${?}";;
# "zsh" ) install_file_linux "${tmpdir}/${zsh_autocomplete_file}" "${zsh_autocomplete_prefix}/zsh_autocomplete_croc";
# autocomplete_install_rcode="${?}";
# print_message "== You will need to add the following to your ~/.zshrc to enable autocompletion" "info";
# print_message "\nPROG=croc\n_CLI_ZSH_AUTOCOMPLETE_HACK=1\nsource /etc/zsh/zsh_autocomplete_croc\n" "info";;
# *) autocomplete_install_rcode="1";;
# esac
# if [[ "${autocomplete_install_rcode}" == "0" ]] ; then
# print_message "== Installed autocompletions for $(basename "${SHELL}")" "ok"
# elif [[ "${autocomplete_install_rcode}" == "1" ]]; then
# print_message "== Failed to install ${bash_autocomplete_file}" "error"
# elif [[ "${autocomplete_install_rcode}" == "20" ]]; then
# print_message "== Failed to locate 'install' command" "error"
# elif [[ "${autocomplete_install_rcode}" == "21" ]]; then
# print_message "== Failed to locate 'sudo' command" "error"
# else
# print_message "== Install attempt returned an unexpected value of ${autocomplete_install_rcode}" "error"
# fi
print_message "== Installation complete" "ok" print_message "== Installation complete" "ok"
exit 0 exit 0

View File

@ -0,0 +1,7 @@
#!/bin/bash
tmp=$(mktemp -d)
echo $VERSION
git clone -b v${VERSION} --depth 1 https://github.com/schollz/croc $tmp/croc-${VERSION}
(cd $tmp/croc-${VERSION} && go mod tidy && go mod vendor)
(cd $tmp && tar -cvzf croc_${VERSION}_src.tar.gz croc-${VERSION})
mv $tmp/croc_${VERSION}_src.tar.gz dist/

View File

@ -2,7 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"io/ioutil" "os"
"os/exec" "os/exec"
"strings" "strings"
) )
@ -15,11 +15,7 @@ func main() {
} }
func run() (err error) { func run() (err error) {
version, err := exec.Command("git", "describe", "--abbrev=0").Output() versionNew := "v" + os.Getenv("VERSION")
if err != nil {
return
}
versionNew := strings.TrimSpace(string(version))
versionHash, err := exec.Command("git", "rev-parse", "--short", "HEAD").Output() versionHash, err := exec.Command("git", "rev-parse", "--short", "HEAD").Output()
if err != nil { if err != nil {
return return
@ -46,7 +42,7 @@ func run() (err error) {
} }
func replaceInFile(fname, start, end, replacement string) (err error) { func replaceInFile(fname, start, end, replacement string) (err error) {
b, err := ioutil.ReadFile(fname) b, err := os.ReadFile(fname)
if err != nil { if err != nil {
return return
} }
@ -61,7 +57,7 @@ func replaceInFile(fname, start, end, replacement string) (err error) {
fmt.Sprintf("%s%s%s", start, replacement, end), fmt.Sprintf("%s%s%s", start, replacement, end),
1, 1,
) )
err = ioutil.WriteFile(fname, []byte(newF), 0644) err = os.WriteFile(fname, []byte(newF), 0o644)
return return
} }

View File

@ -0,0 +1,51 @@
#!/bin/bash
VERSION=$(cat ./src/cli/cli.go | grep 'Version = "v' | sed 's/[^0-9.]*\([0-9.]*\).*/\1/')
echo $VERSION
# Check dependencies.
set -e
xargs=$(which gxargs || which xargs)
# Validate settings.
[ "$TRACE" ] && set -x
CONFIG=$@
for line in $CONFIG; do
eval "$line"
done
owner="schollz"
repo="croc"
tag="v${VERSION}"
filename="dist/croc_${VERSION}_src.tar.gz"
# Define variables.
GH_API="https://api.github.com"
GH_REPO="$GH_API/repos/$owner/$repo"
GH_TAGS="$GH_REPO/releases/tags/$tag"
AUTH="Authorization: token $GITHUB_TOKEN"
WGET_ARGS="--content-disposition --auth-no-challenge --no-cookie"
CURL_ARGS="-LJO#"
if [[ "$tag" == 'LATEST' ]]; then
GH_TAGS="$GH_REPO/releases/latest"
fi
# Validate token.
curl -o /dev/null -sH "$AUTH" $GH_REPO || { echo "Error: Invalid repo, token or network issue!"; exit 1; }
# Read asset tags.
response=$(curl -sH "$AUTH" $GH_TAGS)
# Get ID of the asset based on given filename.
eval $(echo "$response" | grep -m 1 "id.:" | grep -w id | tr : = | tr -cd '[[:alnum:]]=')
[ "$id" ] || { echo "Error: Failed to get release id for tag: $tag"; echo "$response" | awk 'length($0)<100' >&2; exit 1; }
# Upload asset
echo "Uploading asset... "
# Construct url
GH_ASSET="https://uploads.github.com/repos/$owner/$repo/releases/$id/assets?name=$(basename $filename)"
curl "$GITHUB_OAUTH_BASIC" --data-binary @"$filename" -H "Authorization: token $GITHUB_TOKEN" -H "Content-Type: application/octet-stream" $GH_ASSET

View File

@ -0,0 +1,23 @@
#compdef $PROG
_cli_zsh_autocomplete() {
local -a opts
local cur
cur=${words[-1]}
if [[ "$cur" == "-"* ]]; then
opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}")
else
opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} --generate-bash-completion)}")
fi
if [[ "${opts[1]}" != "" ]]; then
_describe 'values' opts
else
_files
fi
return
}
compdef _cli_zsh_autocomplete $PROG

View File

@ -3,17 +3,32 @@ package message
import ( import (
"encoding/json" "encoding/json"
"github.com/schollz/croc/v6/src/comm" "github.com/schollz/croc/v10/src/comm"
"github.com/schollz/croc/v6/src/compress" "github.com/schollz/croc/v10/src/compress"
"github.com/schollz/croc/v6/src/crypt" "github.com/schollz/croc/v10/src/crypt"
log "github.com/schollz/logger" log "github.com/schollz/logger"
) )
// Type is a message type
type Type string
const (
TypePAKE Type = "pake"
TypeExternalIP Type = "externalip"
TypeFinished Type = "finished"
TypeError Type = "error"
TypeCloseRecipient Type = "close-recipient"
TypeCloseSender Type = "close-sender"
TypeRecipientReady Type = "recipientready"
TypeFileInfo Type = "fileinfo"
)
// Message is the possible payload for messaging // Message is the possible payload for messaging
type Message struct { type Message struct {
Type string `json:"t,omitempty"` Type Type `json:"t,omitempty"`
Message string `json:"m,omitempty"` Message string `json:"m,omitempty"`
Bytes []byte `json:"b,omitempty"` Bytes []byte `json:"b,omitempty"`
Bytes2 []byte `json:"b2,omitempty"`
Num int `json:"n,omitempty"` Num int `json:"n,omitempty"`
} }
@ -23,34 +38,47 @@ func (m Message) String() string {
} }
// Send will send out // Send will send out
func Send(c *comm.Comm, key crypt.Encryption, m Message) (err error) { func Send(c *comm.Comm, key []byte, m Message) (err error) {
mSend, err := Encode(key, m) mSend, err := Encode(key, m)
if err != nil { if err != nil {
return return
} }
log.Debugf("writing %s message (%d bytes)", m.Type, len(mSend)) err = c.Send(mSend)
_, err = c.Write(mSend)
return return
} }
// Encode will convert to bytes // Encode will convert to bytes
func Encode(key crypt.Encryption, m Message) (b []byte, err error) { func Encode(key []byte, m Message) (b []byte, err error) {
b, err = json.Marshal(m) b, err = json.Marshal(m)
if err != nil { if err != nil {
return return
} }
b = compress.Compress(b) b = compress.Compress(b)
b, err = key.Encrypt(b) if key != nil {
log.Debugf("writing %s message (encrypted)", m.Type)
b, err = crypt.Encrypt(b, key)
} else {
log.Debugf("writing %s message (unencrypted)", m.Type)
}
return return
} }
// Decode will convert from bytes // Decode will convert from bytes
func Decode(key crypt.Encryption, b []byte) (m Message, err error) { func Decode(key []byte, b []byte) (m Message, err error) {
b, err = key.Decrypt(b) if key != nil {
if err != nil { b, err = crypt.Decrypt(b, key)
return if err != nil {
return
}
} }
b = compress.Decompress(b) b = compress.Decompress(b)
err = json.Unmarshal(b, &m) err = json.Unmarshal(b, &m)
if err == nil {
if key != nil {
log.Debugf("read %s message (encrypted)", m.Type)
} else {
log.Debugf("read %s message (unencrypted)", m.Type)
}
}
return return
} }

View File

@ -7,17 +7,20 @@ import (
"testing" "testing"
"time" "time"
"github.com/schollz/croc/v6/src/comm" "github.com/schollz/croc/v10/src/comm"
"github.com/schollz/croc/v6/src/crypt" "github.com/schollz/croc/v10/src/crypt"
log "github.com/schollz/logger" log "github.com/schollz/logger"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
var TypeMessage Type = "message"
func TestMessage(t *testing.T) { func TestMessage(t *testing.T) {
m := Message{Type: "message", Message: "hello, world"} log.SetLevel("debug")
e, err := crypt.New(nil, nil) m := Message{Type: TypeMessage, Message: "hello, world"}
e, salt, err := crypt.New([]byte("pass"), nil)
assert.Nil(t, err) assert.Nil(t, err)
fmt.Println(e.Salt()) fmt.Println(string(salt))
b, err := Encode(e, m) b, err := Encode(e, m)
assert.Nil(t, err) assert.Nil(t, err)
fmt.Printf("%x\n", b) fmt.Printf("%x\n", b)
@ -26,6 +29,23 @@ func TestMessage(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, m, m2) assert.Equal(t, m, m2)
assert.Equal(t, `{"t":"message","m":"hello, world"}`, m.String()) assert.Equal(t, `{"t":"message","m":"hello, world"}`, m.String())
_, err = Decode([]byte("not pass"), b)
assert.NotNil(t, err)
_, err = Encode([]byte("0"), m)
assert.NotNil(t, err)
}
func TestMessageNoPass(t *testing.T) {
log.SetLevel("debug")
m := Message{Type: TypeMessage, Message: "hello, world"}
b, err := Encode(nil, m)
assert.Nil(t, err)
fmt.Printf("%x\n", b)
m2, err := Decode(nil, b)
assert.Nil(t, err)
assert.Equal(t, m, m2)
assert.Equal(t, `{"t":"message","m":"hello, world"}`, m.String())
} }
func TestSend(t *testing.T) { func TestSend(t *testing.T) {
@ -47,7 +67,7 @@ func TestSend(t *testing.T) {
log.Error(err) log.Error(err)
} }
log.Debugf("client %s connected", connection.RemoteAddr().String()) log.Debugf("client %s connected", connection.RemoteAddr().String())
go func(port string, connection net.Conn) { go func(_ string, connection net.Conn) {
c := comm.New(connection) c := comm.New(connection)
err = c.Send([]byte("hello, world")) err = c.Send([]byte("hello, world"))
assert.Nil(t, err) assert.Nil(t, err)
@ -64,11 +84,12 @@ func TestSend(t *testing.T) {
} }
}() }()
time.Sleep(300 * time.Millisecond) time.Sleep(800 * time.Millisecond)
a, err := comm.NewConnection("localhost:"+port, 10*time.Minute) a, err := comm.NewConnection("127.0.0.1:"+port, 10*time.Minute)
assert.Nil(t, err) assert.Nil(t, err)
m := Message{Type: "message", Message: "hello, world"} m := Message{Type: TypeMessage, Message: "hello, world"}
e, err := crypt.New(nil, nil) e, salt, err := crypt.New([]byte("pass"), nil)
log.Debug(salt)
assert.Nil(t, err) assert.Nil(t, err)
assert.Nil(t, Send(a, e, m)) assert.Nil(t, Send(a, e, m))

View File

@ -0,0 +1,88 @@
// From GitHub version/fork maintained by Stephen Paul Weber available at:
// https://github.com/singpolyma/mnemonicode
//
// Originally from:
// http://web.archive.org/web/20101031205747/http://www.tothink.com/mnemonic/
/*
Copyright (c) 2000 Oren Tirosh <oren@hishome.net>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
package mnemonicode
const base = 1626
// WordsRequired returns the number of words required to encode input
// data of length bytes using mnomonic encoding.
//
// Every four bytes of input is encoded into three words. If there
// is an extra one or two bytes they get an extra one or two words
// respectively. If there is an extra three bytes, they will be encoded
// into three words with the last word being one of a small set of very
// short words (only needed to encode the last 3 bits).
func WordsRequired(length int) int {
return ((length + 1) * 3) / 4
}
// EncodeWordList encodes src into mnemomic words which are appended to dst.
// The final wordlist is returned.
// There will be WordsRequired(len(src)) words appeneded.
func EncodeWordList(dst []string, src []byte) (result []string) {
if n := len(dst) + WordsRequired(len(src)); cap(dst) < n {
result = make([]string, len(dst), n)
copy(result, dst)
} else {
result = dst
}
var x uint32
for len(src) >= 4 {
x = uint32(src[0])
x |= uint32(src[1]) << 8
x |= uint32(src[2]) << 16
x |= uint32(src[3]) << 24
src = src[4:]
i0 := int(x % base)
i1 := int(x/base) % base
i2 := int(x/base/base) % base
result = append(result, WordList[i0], WordList[i1], WordList[i2])
}
if len(src) > 0 {
x = 0
for i := len(src) - 1; i >= 0; i-- {
x <<= 8
x |= uint32(src[i])
}
i := int(x % base)
result = append(result, WordList[i])
if len(src) >= 2 {
i = int(x/base) % base
result = append(result, WordList[i])
}
if len(src) == 3 {
i = base + int(x/base/base)%7
result = append(result, WordList[i])
}
}
return result
}

318
src/mnemonicode/wordlist.go Normal file
View File

@ -0,0 +1,318 @@
// From GitHub version/fork maintained by Stephen Paul Weber available at:
// https://github.com/singpolyma/mnemonicode
//
// Originally from:
// http://web.archive.org/web/20101031205747/http://www.tothink.com/mnemonic/
/*
Copyright (c) 2000 Oren Tirosh <oren@hishome.net>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
package mnemonicode
// WordListVersion is the version of compiled in word list.
const WordListVersion = "0.7"
var wordMap = make(map[string]int, len(WordList))
func init() {
for i, w := range WordList {
wordMap[w] = i
}
}
const longestWord = 7
var WordList = []string{
"academy", "acrobat", "active", "actor", "adam", "admiral",
"adrian", "africa", "agenda", "agent", "airline", "airport",
"aladdin", "alarm", "alaska", "albert", "albino", "album",
"alcohol", "alex", "algebra", "alibi", "alice", "alien",
"alpha", "alpine", "amadeus", "amanda", "amazon", "amber",
"america", "amigo", "analog", "anatomy", "angel", "animal",
"antenna", "antonio", "apollo", "april", "archive", "arctic",
"arizona", "arnold", "aroma", "arthur", "artist", "asia",
"aspect", "aspirin", "athena", "athlete", "atlas", "audio",
"august", "austria", "axiom", "aztec", "balance", "ballad",
"banana", "bandit", "banjo", "barcode", "baron", "basic",
"battery", "belgium", "berlin", "bermuda", "bernard", "bikini",
"binary", "bingo", "biology", "block", "blonde", "bonus",
"boris", "boston", "boxer", "brandy", "bravo", "brazil",
"bronze", "brown", "bruce", "bruno", "burger", "burma",
"cabinet", "cactus", "cafe", "cairo", "cake", "calypso",
"camel", "camera", "campus", "canada", "canal", "cannon",
"canoe", "cantina", "canvas", "canyon", "capital", "caramel",
"caravan", "carbon", "cargo", "carlo", "carol", "carpet",
"cartel", "casino", "castle", "castro", "catalog", "caviar",
"cecilia", "cement", "center", "century", "ceramic", "chamber",
"chance", "change", "chaos", "charlie", "charm", "charter",
"chef", "chemist", "cherry", "chess", "chicago", "chicken",
"chief", "china", "cigar", "cinema", "circus", "citizen",
"city", "clara", "classic", "claudia", "clean", "client",
"climax", "clinic", "clock", "club", "cobra", "coconut",
"cola", "collect", "colombo", "colony", "color", "combat",
"comedy", "comet", "command", "compact", "company", "complex",
"concept", "concert", "connect", "consul", "contact", "context",
"contour", "control", "convert", "copy", "corner", "corona",
"correct", "cosmos", "couple", "courage", "cowboy", "craft",
"crash", "credit", "cricket", "critic", "crown", "crystal",
"cuba", "culture", "dallas", "dance", "daniel", "david",
"decade", "decimal", "deliver", "delta", "deluxe", "demand",
"demo", "denmark", "derby", "design", "detect", "develop",
"diagram", "dialog", "diamond", "diana", "diego", "diesel",
"diet", "digital", "dilemma", "diploma", "direct", "disco",
"disney", "distant", "doctor", "dollar", "dominic", "domino",
"donald", "dragon", "drama", "dublin", "duet", "dynamic",
"east", "ecology", "economy", "edgar", "egypt", "elastic",
"elegant", "element", "elite", "elvis", "email", "energy",
"engine", "english", "episode", "equator", "escort", "ethnic",
"europe", "everest", "evident", "exact", "example", "exit",
"exotic", "export", "express", "extra", "fabric", "factor",
"falcon", "family", "fantasy", "fashion", "fiber", "fiction",
"fidel", "fiesta", "figure", "film", "filter", "final",
"finance", "finish", "finland", "flash", "florida", "flower",
"fluid", "flute", "focus", "ford", "forest", "formal",
"format", "formula", "fortune", "forum", "fragile", "france",
"frank", "friend", "frozen", "future", "gabriel", "galaxy",
"gallery", "gamma", "garage", "garden", "garlic", "gemini",
"general", "genetic", "genius", "germany", "global", "gloria",
"golf", "gondola", "gong", "good", "gordon", "gorilla",
"grand", "granite", "graph", "green", "group", "guide",
"guitar", "guru", "hand", "happy", "harbor", "harmony",
"harvard", "havana", "hawaii", "helena", "hello", "henry",
"hilton", "history", "horizon", "hotel", "human", "humor",
"icon", "idea", "igloo", "igor", "image", "impact",
"import", "index", "india", "indigo", "input", "insect",
"instant", "iris", "italian", "jacket", "jacob", "jaguar",
"janet", "japan", "jargon", "jazz", "jeep", "john",
"joker", "jordan", "jumbo", "june", "jungle", "junior",
"jupiter", "karate", "karma", "kayak", "kermit", "kilo",
"king", "koala", "korea", "labor", "lady", "lagoon",
"laptop", "laser", "latin", "lava", "lecture", "left",
"legal", "lemon", "level", "lexicon", "liberal", "libra",
"limbo", "limit", "linda", "linear", "lion", "liquid",
"liter", "little", "llama", "lobby", "lobster", "local",
"logic", "logo", "lola", "london", "lotus", "lucas",
"lunar", "machine", "macro", "madam", "madonna", "madrid",
"maestro", "magic", "magnet", "magnum", "major", "mama",
"mambo", "manager", "mango", "manila", "marco", "marina",
"market", "mars", "martin", "marvin", "master", "matrix",
"maximum", "media", "medical", "mega", "melody", "melon",
"memo", "mental", "mentor", "menu", "mercury", "message",
"metal", "meteor", "meter", "method", "metro", "mexico",
"miami", "micro", "million", "mineral", "minimum", "minus",
"minute", "miracle", "mirage", "miranda", "mister", "mixer",
"mobile", "model", "modem", "modern", "modular", "moment",
"monaco", "monica", "monitor", "mono", "monster", "montana",
"morgan", "motel", "motif", "motor", "mozart", "multi",
"museum", "music", "mustang", "natural", "neon", "nepal",
"neptune", "nerve", "neutral", "nevada", "news", "ninja",
"nirvana", "normal", "nova", "novel", "nuclear", "numeric",
"nylon", "oasis", "object", "observe", "ocean", "octopus",
"olivia", "olympic", "omega", "opera", "optic", "optimal",
"orange", "orbit", "organic", "orient", "origin", "orlando",
"oscar", "oxford", "oxygen", "ozone", "pablo", "pacific",
"pagoda", "palace", "pamela", "panama", "panda", "panel",
"panic", "paradox", "pardon", "paris", "parker", "parking",
"parody", "partner", "passage", "passive", "pasta", "pastel",
"patent", "patriot", "patrol", "patron", "pegasus", "pelican",
"penguin", "pepper", "percent", "perfect", "perfume", "period",
"permit", "person", "peru", "phone", "photo", "piano",
"picasso", "picnic", "picture", "pigment", "pilgrim", "pilot",
"pirate", "pixel", "pizza", "planet", "plasma", "plaster",
"plastic", "plaza", "pocket", "poem", "poetic", "poker",
"polaris", "police", "politic", "polo", "polygon", "pony",
"popcorn", "popular", "postage", "postal", "precise", "prefix",
"premium", "present", "price", "prince", "printer", "prism",
"private", "product", "profile", "program", "project", "protect",
"proton", "public", "pulse", "puma", "pyramid", "queen",
"radar", "radio", "random", "rapid", "rebel", "record",
"recycle", "reflex", "reform", "regard", "regular", "relax",
"report", "reptile", "reverse", "ricardo", "ringo", "ritual",
"robert", "robot", "rocket", "rodeo", "romeo", "royal",
"russian", "safari", "salad", "salami", "salmon", "salon",
"salute", "samba", "sandra", "santana", "sardine", "school",
"screen", "script", "second", "secret", "section", "segment",
"select", "seminar", "senator", "senior", "sensor", "serial",
"service", "sheriff", "shock", "sierra", "signal", "silicon",
"silver", "similar", "simon", "single", "siren", "slogan",
"social", "soda", "solar", "solid", "solo", "sonic",
"soviet", "special", "speed", "spiral", "spirit", "sport",
"static", "station", "status", "stereo", "stone", "stop",
"street", "strong", "student", "studio", "style", "subject",
"sultan", "super", "susan", "sushi", "suzuki", "switch",
"symbol", "system", "tactic", "tahiti", "talent", "tango",
"tarzan", "taxi", "telex", "tempo", "tennis", "texas",
"textile", "theory", "thermos", "tiger", "titanic", "tokyo",
"tomato", "topic", "tornado", "toronto", "torpedo", "total",
"totem", "tourist", "tractor", "traffic", "transit", "trapeze",
"travel", "tribal", "trick", "trident", "trilogy", "tripod",
"tropic", "trumpet", "tulip", "tuna", "turbo", "twist",
"ultra", "uniform", "union", "uranium", "vacuum", "valid",
"vampire", "vanilla", "vatican", "velvet", "ventura", "venus",
"vertigo", "veteran", "victor", "video", "vienna", "viking",
"village", "vincent", "violet", "violin", "virtual", "virus",
"visa", "vision", "visitor", "visual", "vitamin", "viva",
"vocal", "vodka", "volcano", "voltage", "volume", "voyage",
"water", "weekend", "welcome", "western", "window", "winter",
"wizard", "wolf", "world", "xray", "yankee", "yoga",
"yogurt", "yoyo", "zebra", "zero", "zigzag", "zipper",
"zodiac", "zoom", "abraham", "action", "address", "alabama",
"alfred", "almond", "ammonia", "analyze", "annual", "answer",
"apple", "arena", "armada", "arsenal", "atlanta", "atomic",
"avenue", "average", "bagel", "baker", "ballet", "bambino",
"bamboo", "barbara", "basket", "bazaar", "benefit", "bicycle",
"bishop", "blitz", "bonjour", "bottle", "bridge", "british",
"brother", "brush", "budget", "cabaret", "cadet", "candle",
"capitan", "capsule", "career", "cartoon", "channel", "chapter",
"cheese", "circle", "cobalt", "cockpit", "college", "compass",
"comrade", "condor", "crimson", "cyclone", "darwin", "declare",
"degree", "delete", "delphi", "denver", "desert", "divide",
"dolby", "domain", "domingo", "double", "drink", "driver",
"eagle", "earth", "echo", "eclipse", "editor", "educate",
"edward", "effect", "electra", "emerald", "emotion", "empire",
"empty", "escape", "eternal", "evening", "exhibit", "expand",
"explore", "extreme", "ferrari", "first", "flag", "folio",
"forget", "forward", "freedom", "fresh", "friday", "fuji",
"galileo", "garcia", "genesis", "gold", "gravity", "habitat",
"hamlet", "harlem", "helium", "holiday", "house", "hunter",
"ibiza", "iceberg", "imagine", "infant", "isotope", "jackson",
"jamaica", "jasmine", "java", "jessica", "judo", "kitchen",
"lazarus", "letter", "license", "lithium", "loyal", "lucky",
"magenta", "mailbox", "manual", "marble", "mary", "maxwell",
"mayor", "milk", "monarch", "monday", "money", "morning",
"mother", "mystery", "native", "nectar", "nelson", "network",
"next", "nikita", "nobel", "nobody", "nominal", "norway",
"nothing", "number", "october", "office", "oliver", "opinion",
"option", "order", "outside", "package", "pancake", "pandora",
"panther", "papa", "patient", "pattern", "pedro", "pencil",
"people", "phantom", "philips", "pioneer", "pluto", "podium",
"portal", "potato", "prize", "process", "protein", "proxy",
"pump", "pupil", "python", "quality", "quarter", "quiet",
"rabbit", "radical", "radius", "rainbow", "ralph", "ramirez",
"ravioli", "raymond", "respect", "respond", "result", "resume",
"retro", "richard", "right", "risk", "river", "roger",
"roman", "rondo", "sabrina", "salary", "salsa", "sample",
"samuel", "saturn", "savage", "scarlet", "scoop", "scorpio",
"scratch", "scroll", "sector", "serpent", "shadow", "shampoo",
"sharon", "sharp", "short", "shrink", "silence", "silk",
"simple", "slang", "smart", "smoke", "snake", "society",
"sonar", "sonata", "soprano", "source", "sparta", "sphere",
"spider", "sponsor", "spring", "acid", "adios", "agatha",
"alamo", "alert", "almanac", "aloha", "andrea", "anita",
"arcade", "aurora", "avalon", "baby", "baggage", "balloon",
"bank", "basil", "begin", "biscuit", "blue", "bombay",
"brain", "brenda", "brigade", "cable", "carmen", "cello",
"celtic", "chariot", "chrome", "citrus", "civil", "cloud",
"common", "compare", "cool", "copper", "coral", "crater",
"cubic", "cupid", "cycle", "depend", "door", "dream",
"dynasty", "edison", "edition", "enigma", "equal", "eric",
"event", "evita", "exodus", "extend", "famous", "farmer",
"food", "fossil", "frog", "fruit", "geneva", "gentle",
"george", "giant", "gilbert", "gossip", "gram", "greek",
"grille", "hammer", "harvest", "hazard", "heaven", "herbert",
"heroic", "hexagon", "husband", "immune", "inca", "inch",
"initial", "isabel", "ivory", "jason", "jerome", "joel",
"joshua", "journal", "judge", "juliet", "jump", "justice",
"kimono", "kinetic", "leonid", "lima", "maze", "medusa",
"member", "memphis", "michael", "miguel", "milan", "mile",
"miller", "mimic", "mimosa", "mission", "monkey", "moral",
"moses", "mouse", "nancy", "natasha", "nebula", "nickel",
"nina", "noise", "orchid", "oregano", "origami", "orinoco",
"orion", "othello", "paper", "paprika", "prelude", "prepare",
"pretend", "profit", "promise", "provide", "puzzle", "remote",
"repair", "reply", "rival", "riviera", "robin", "rose",
"rover", "rudolf", "saga", "sahara", "scholar", "shelter",
"ship", "shoe", "sigma", "sister", "sleep", "smile",
"spain", "spark", "split", "spray", "square", "stadium",
"star", "storm", "story", "strange", "stretch", "stuart",
"subway", "sugar", "sulfur", "summer", "survive", "sweet",
"swim", "table", "taboo", "target", "teacher", "telecom",
"temple", "tibet", "ticket", "tina", "today", "toga",
"tommy", "tower", "trivial", "tunnel", "turtle", "twin",
"uncle", "unicorn", "unique", "update", "valery", "vega",
"version", "voodoo", "warning", "william", "wonder", "year",
"yellow", "young", "absent", "absorb", "accent", "alfonso",
"alias", "ambient", "andy", "anvil", "appear", "apropos",
"archer", "ariel", "armor", "arrow", "austin", "avatar",
"axis", "baboon", "bahama", "bali", "balsa", "bazooka",
"beach", "beast", "beatles", "beauty", "before", "benny",
"betty", "between", "beyond", "billy", "bison", "blast",
"bless", "bogart", "bonanza", "book", "border", "brave",
"bread", "break", "broken", "bucket", "buenos", "buffalo",
"bundle", "button", "buzzer", "byte", "caesar", "camilla",
"canary", "candid", "carrot", "cave", "chant", "child",
"choice", "chris", "cipher", "clarion", "clark", "clever",
"cliff", "clone", "conan", "conduct", "congo", "content",
"costume", "cotton", "cover", "crack", "current", "danube",
"data", "decide", "desire", "detail", "dexter", "dinner",
"dispute", "donor", "druid", "drum", "easy", "eddie",
"enjoy", "enrico", "epoxy", "erosion", "except", "exile",
"explain", "fame", "fast", "father", "felix", "field",
"fiona", "fire", "fish", "flame", "flex", "flipper",
"float", "flood", "floor", "forbid", "forever", "fractal",
"frame", "freddie", "front", "fuel", "gallop", "game",
"garbo", "gate", "gibson", "ginger", "giraffe", "gizmo",
"glass", "goblin", "gopher", "grace", "gray", "gregory",
"grid", "griffin", "ground", "guest", "gustav", "gyro",
"hair", "halt", "harris", "heart", "heavy", "herman",
"hippie", "hobby", "honey", "hope", "horse", "hostel",
"hydro", "imitate", "info", "ingrid", "inside", "invent",
"invest", "invite", "iron", "ivan", "james", "jester",
"jimmy", "join", "joseph", "juice", "julius", "july",
"justin", "kansas", "karl", "kevin", "kiwi", "ladder",
"lake", "laura", "learn", "legacy", "legend", "lesson",
"life", "light", "list", "locate", "lopez", "lorenzo",
"love", "lunch", "malta", "mammal", "margo", "marion",
"mask", "match", "mayday", "meaning", "mercy", "middle",
"mike", "mirror", "modest", "morph", "morris", "nadia",
"nato", "navy", "needle", "neuron", "never", "newton",
"nice", "night", "nissan", "nitro", "nixon", "north",
"oberon", "octavia", "ohio", "olga", "open", "opus",
"orca", "oval", "owner", "page", "paint", "palma",
"parade", "parent", "parole", "paul", "peace", "pearl",
"perform", "phoenix", "phrase", "pierre", "pinball", "place",
"plate", "plato", "plume", "pogo", "point", "polite",
"polka", "poncho", "powder", "prague", "press", "presto",
"pretty", "prime", "promo", "quasi", "quest", "quick",
"quiz", "quota", "race", "rachel", "raja", "ranger",
"region", "remark", "rent", "reward", "rhino", "ribbon",
"rider", "road", "rodent", "round", "rubber", "ruby",
"rufus", "sabine", "saddle", "sailor", "saint", "salt",
"satire", "scale", "scuba", "season", "secure", "shake",
"shallow", "shannon", "shave", "shelf", "sherman", "shine",
"shirt", "side", "sinatra", "sincere", "size", "slalom",
"slow", "small", "snow", "sofia", "song", "sound",
"south", "speech", "spell", "spend", "spoon", "stage",
"stamp", "stand", "state", "stella", "stick", "sting",
"stock", "store", "sunday", "sunset", "support", "sweden",
"swing", "tape", "think", "thomas", "tictac", "time",
"toast", "tobacco", "tonight", "torch", "torso", "touch",
"toyota", "trade", "tribune", "trinity", "triton", "truck",
"trust", "type", "under", "unit", "urban", "urgent",
"user", "value", "vendor", "venice", "verona", "vibrate",
"virgo", "visible", "vista", "vital", "voice", "vortex",
"waiter", "watch", "wave", "weather", "wedding", "wheel",
"whiskey", "wisdom", "deal", "null", "nurse", "quebec",
"reserve", "reunion", "roof", "singer", "verbal", "amen",
"ego", "fax", "jet", "job", "rio", "ski",
"yes",
}

View File

@ -1,7 +1,169 @@
package models package models
import (
"context"
"fmt"
"net"
"os"
"path"
"time"
"github.com/schollz/croc/v10/src/utils"
log "github.com/schollz/logger"
)
// TCP_BUFFER_SIZE is the maximum packet size // TCP_BUFFER_SIZE is the maximum packet size
const TCP_BUFFER_SIZE = 1024 * 64 const TCP_BUFFER_SIZE = 1024 * 64
// DEFAULT_RELAY is the default relay used (can be set using --relay) // DEFAULT_RELAY is the default relay used (can be set using --relay)
const DEFAULT_RELAY = "142.93.177.120:9009" var (
DEFAULT_RELAY = "croc.schollz.com"
DEFAULT_RELAY6 = "croc6.schollz.com"
DEFAULT_PORT = "9009"
DEFAULT_PASSPHRASE = "pass123"
INTERNAL_DNS = false
)
// publicDNS are servers to be queried if a local lookup fails
var publicDNS = []string{
"1.0.0.1", // Cloudflare
"1.1.1.1", // Cloudflare
"[2606:4700:4700::1111]", // Cloudflare
"[2606:4700:4700::1001]", // Cloudflare
"8.8.4.4", // Google
"8.8.8.8", // Google
"[2001:4860:4860::8844]", // Google
"[2001:4860:4860::8888]", // Google
"9.9.9.9", // Quad9
"149.112.112.112", // Quad9
"[2620:fe::fe]", // Quad9
"[2620:fe::fe:9]", // Quad9
"8.26.56.26", // Comodo
"8.20.247.20", // Comodo
"208.67.220.220", // Cisco OpenDNS
"208.67.222.222", // Cisco OpenDNS
"[2620:119:35::35]", // Cisco OpenDNS
"[2620:119:53::53]", // Cisco OpenDNS
}
func getConfigFile(requireValidPath bool) (fname string, err error) {
configFile, err := utils.GetConfigDir(requireValidPath)
if err != nil {
return
}
fname = path.Join(configFile, "internal-dns")
return
}
func init() {
log.SetLevel("info")
log.SetOutput(os.Stderr)
doRemember := false
for _, flag := range os.Args {
if flag == "--internal-dns" {
INTERNAL_DNS = true
break
}
if flag == "--remember" {
doRemember = true
}
}
if doRemember {
// save in config file
fname, err := getConfigFile(true)
if err == nil {
f, _ := os.Create(fname)
f.Close()
}
}
if !INTERNAL_DNS {
fname, err := getConfigFile(false)
if err == nil {
INTERNAL_DNS = utils.Exists(fname)
}
}
log.Trace("Using internal DNS: ", INTERNAL_DNS)
var err error
var addr string
addr, err = lookup(DEFAULT_RELAY)
if err == nil {
DEFAULT_RELAY = net.JoinHostPort(addr, DEFAULT_PORT)
} else {
DEFAULT_RELAY = ""
}
log.Tracef("Default ipv4 relay: %s", addr)
addr, err = lookup(DEFAULT_RELAY6)
if err == nil {
DEFAULT_RELAY6 = net.JoinHostPort(addr, DEFAULT_PORT)
} else {
DEFAULT_RELAY6 = ""
}
log.Tracef("Default ipv6 relay: %s", addr)
}
// Resolve a hostname to an IP address using DNS.
func lookup(address string) (ipaddress string, err error) {
if !INTERNAL_DNS {
log.Tracef("Using local DNS to resolve %s", address)
return localLookupIP(address)
}
type Result struct {
s string
err error
}
result := make(chan Result, len(publicDNS))
for _, dns := range publicDNS {
go func(dns string) {
var r Result
r.s, r.err = remoteLookupIP(address, dns)
log.Tracef("Resolved %s to %s using %s", address, r.s, dns)
result <- r
}(dns)
}
for i := 0; i < len(publicDNS); i++ {
ipaddress = (<-result).s
log.Tracef("Resolved %s to %s", address, ipaddress)
if ipaddress != "" {
return
}
}
err = fmt.Errorf("failed to resolve %s: all DNS servers exhausted", address)
return
}
// localLookupIP returns a host's IP address using the local DNS configuration.
func localLookupIP(address string) (ipaddress string, err error) {
// Create a context with a 500 millisecond timeout
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancel()
r := &net.Resolver{}
// Use the context with timeout in the LookupHost function
ip, err := r.LookupHost(ctx, address)
if err != nil {
return
}
ipaddress = ip[0]
return
}
// remoteLookupIP returns a host's IP address based on a remote DNS server.
func remoteLookupIP(address, dns string) (ipaddress string, err error) {
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancel()
r := &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, _ string) (net.Conn, error) {
d := new(net.Dialer)
return d.DialContext(ctx, network, dns+":53")
},
}
ip, err := r.LookupHost(ctx, address)
if err != nil {
return
}
ipaddress = ip[0]
return
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

9
src/tcp/defaults.go Normal file
View File

@ -0,0 +1,9 @@
package tcp
import "time"
const (
DEFAULT_LOG_LEVEL = "debug"
DEFAULT_ROOM_CLEANUP_INTERVAL = 10 * time.Minute
DEFAULT_ROOM_TTL = 3 * time.Hour
)

53
src/tcp/options.go Normal file
View File

@ -0,0 +1,53 @@
package tcp
import (
"fmt"
"time"
)
// TODO: maybe export from logger library?
var availableLogLevels = []string{"info", "error", "warn", "debug", "trace"}
type serverOptsFunc func(s *server) error
func WithBanner(banner ...string) serverOptsFunc {
return func(s *server) error {
if len(banner) > 0 {
s.banner = banner[0]
}
return nil
}
}
func WithLogLevel(level string) serverOptsFunc {
return func(s *server) error {
if !containsSlice(availableLogLevels, level) {
return fmt.Errorf("invalid log level specified: %s", level)
}
s.debugLevel = level
return nil
}
}
func WithRoomCleanupInterval(interval time.Duration) serverOptsFunc {
return func(s *server) error {
s.roomCleanupInterval = interval
return nil
}
}
func WithRoomTTL(ttl time.Duration) serverOptsFunc {
return func(s *server) error {
s.roomTTL = ttl
return nil
}
}
func containsSlice(s []string, e string) bool {
for _, ss := range s {
if e == ss {
return true
}
}
return false
}

View File

@ -8,17 +8,26 @@ import (
"sync" "sync"
"time" "time"
"github.com/pkg/errors"
"github.com/schollz/croc/v6/src/comm"
"github.com/schollz/croc/v6/src/models"
log "github.com/schollz/logger" log "github.com/schollz/logger"
"github.com/schollz/pake/v3"
"github.com/schollz/croc/v10/src/comm"
"github.com/schollz/croc/v10/src/crypt"
"github.com/schollz/croc/v10/src/models"
) )
type server struct { type server struct {
host string
port string port string
debugLevel string debugLevel string
banner string banner string
password string
rooms roomMap rooms roomMap
roomCleanupInterval time.Duration
roomTTL time.Duration
stopRoomCleanup chan struct{}
} }
type roomInfo struct { type roomInfo struct {
@ -33,43 +42,57 @@ type roomMap struct {
sync.Mutex sync.Mutex
} }
var timeToRoomDeletion = 10 * time.Minute const pingRoom = "pinglkasjdlfjsaldjf"
// Run starts a tcp listener, run async // newDefaultServer initializes a new server, with some default configuration options
func Run(debugLevel, port string, banner ...string) (err error) { func newDefaultServer() *server {
s := new(server) s := new(server)
s.roomCleanupInterval = DEFAULT_ROOM_CLEANUP_INTERVAL
s.roomTTL = DEFAULT_ROOM_TTL
s.debugLevel = DEFAULT_LOG_LEVEL
s.stopRoomCleanup = make(chan struct{})
return s
}
// RunWithOptionsAsync asynchronously starts a TCP listener.
func RunWithOptionsAsync(host, port, password string, opts ...serverOptsFunc) error {
s := newDefaultServer()
s.host = host
s.port = port s.port = port
s.debugLevel = debugLevel s.password = password
if len(banner) > 0 { for _, opt := range opts {
s.banner = banner[0] err := opt(s)
if err != nil {
return fmt.Errorf("could not apply optional configurations: %w", err)
}
} }
return s.start() return s.start()
} }
// Run starts a tcp listener, run async
func Run(debugLevel, host, port, password string, banner ...string) (err error) {
return RunWithOptionsAsync(host, port, password, WithBanner(banner...), WithLogLevel(debugLevel))
}
func (s *server) start() (err error) { func (s *server) start() (err error) {
log.SetLevel(s.debugLevel) log.SetLevel(s.debugLevel)
// Mask our password in logs
maskedPassword := ""
if len(s.password) > 2 {
maskedPassword = fmt.Sprintf("%c***%c", s.password[0], s.password[len(s.password)-1])
} else {
maskedPassword = s.password
}
log.Debugf("starting with password '%s'", maskedPassword)
s.rooms.Lock() s.rooms.Lock()
s.rooms.rooms = make(map[string]roomInfo) s.rooms.rooms = make(map[string]roomInfo)
s.rooms.Unlock() s.rooms.Unlock()
// delete old rooms go s.deleteOldRooms()
go func() { defer s.stopRoomDeletion()
for {
time.Sleep(timeToRoomDeletion)
roomsToDelete := []string{}
s.rooms.Lock()
for room := range s.rooms.rooms {
if time.Since(s.rooms.rooms[room].opened) > 3*time.Hour {
roomsToDelete = append(roomsToDelete, room)
}
}
s.rooms.Unlock()
for _, room := range roomsToDelete {
s.deleteRoom(room)
}
}
}()
err = s.run() err = s.run()
if err != nil { if err != nil {
@ -79,47 +102,211 @@ func (s *server) start() (err error) {
} }
func (s *server) run() (err error) { func (s *server) run() (err error) {
log.Infof("starting TCP server on " + s.port) network := "tcp"
server, err := net.Listen("tcp", ":"+s.port) addr := net.JoinHostPort(s.host, s.port)
if s.host != "" {
ip := net.ParseIP(s.host)
if ip == nil {
var tcpIP *net.IPAddr
tcpIP, err = net.ResolveIPAddr("ip", s.host)
if err != nil {
return err
}
ip = tcpIP.IP
}
addr = net.JoinHostPort(ip.String(), s.port)
if s.host != "" {
if ip.To4() != nil {
network = "tcp4"
} else {
network = "tcp6"
}
}
}
addr = strings.Replace(addr, "127.0.0.1", "0.0.0.0", 1)
log.Infof("starting TCP server on " + addr)
server, err := net.Listen(network, addr)
if err != nil { if err != nil {
return errors.Wrap(err, "Error listening on :"+s.port) return fmt.Errorf("error listening on %s: %w", addr, err)
} }
defer server.Close() defer server.Close()
// spawn a new goroutine whenever a client connects // spawn a new goroutine whenever a client connects
for { for {
connection, err := server.Accept() connection, err := server.Accept()
if err != nil { if err != nil {
return errors.Wrap(err, "problem accepting connection") return fmt.Errorf("problem accepting connection: %w", err)
} }
log.Debugf("client %s connected", connection.RemoteAddr().String()) log.Debugf("client %s connected", connection.RemoteAddr().String())
go func(port string, connection net.Conn) { go func(port string, connection net.Conn) {
errCommunication := s.clientCommuncation(port, comm.New(connection)) c := comm.New(connection)
room, errCommunication := s.clientCommunication(port, c)
log.Debugf("room: %+v", room)
log.Debugf("err: %+v", errCommunication)
if errCommunication != nil { if errCommunication != nil {
log.Warnf("relay-%s: %s", connection.RemoteAddr().String(), errCommunication.Error()) log.Debugf("relay-%s: %s", connection.RemoteAddr().String(), errCommunication.Error())
connection.Close()
return
}
if room == pingRoom {
log.Debugf("got ping")
connection.Close()
return
}
for {
// check connection
log.Debugf("checking connection of room %s for %+v", room, c)
deleteIt := false
s.rooms.Lock()
if _, ok := s.rooms.rooms[room]; !ok {
log.Debug("room is gone")
s.rooms.Unlock()
return
}
log.Debugf("room: %+v", s.rooms.rooms[room])
if s.rooms.rooms[room].first != nil && s.rooms.rooms[room].second != nil {
log.Debug("rooms ready")
s.rooms.Unlock()
break
} else {
if s.rooms.rooms[room].first != nil {
errSend := s.rooms.rooms[room].first.Send([]byte{1})
if errSend != nil {
log.Debug(errSend)
deleteIt = true
}
}
}
s.rooms.Unlock()
if deleteIt {
s.deleteRoom(room)
break
}
time.Sleep(1 * time.Second)
} }
}(s.port, connection) }(s.port, connection)
} }
} }
func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { // deleteOldRooms checks for rooms at a regular interval and removes those that
// have exceeded their allocated TTL.
func (s *server) deleteOldRooms() {
ticker := time.NewTicker(s.roomCleanupInterval)
for {
select {
case <-ticker.C:
var roomsToDelete []string
s.rooms.Lock()
for room := range s.rooms.rooms {
if time.Since(s.rooms.rooms[room].opened) > s.roomTTL {
roomsToDelete = append(roomsToDelete, room)
}
}
s.rooms.Unlock()
for _, room := range roomsToDelete {
s.deleteRoom(room)
log.Debugf("room cleaned up: %s", room)
}
case <-s.stopRoomCleanup:
ticker.Stop()
log.Debug("room cleanup stopped")
return
}
}
}
func (s *server) stopRoomDeletion() {
log.Debug("stop room cleanup fired")
s.stopRoomCleanup <- struct{}{}
}
var weakKey = []byte{1, 2, 3}
func (s *server) clientCommunication(port string, c *comm.Comm) (room string, err error) {
// establish secure password with PAKE for communication with relay
B, err := pake.InitCurve(weakKey, 1, "siec")
if err != nil {
return
}
Abytes, err := c.Receive()
if err != nil {
return
}
log.Debugf("Abytes: %s", Abytes)
if bytes.Equal(Abytes, []byte("ping")) {
room = pingRoom
log.Debug("sending back pong")
c.Send([]byte("pong"))
return
}
err = B.Update(Abytes)
if err != nil {
return
}
err = c.Send(B.Bytes())
if err != nil {
return
}
strongKey, err := B.SessionKey()
if err != nil {
return
}
log.Debugf("strongkey: %x", strongKey)
// receive salt
salt, err := c.Receive()
if err != nil {
return
}
strongKeyForEncryption, _, err := crypt.New(strongKey, salt)
if err != nil {
return
}
log.Debugf("waiting for password")
passwordBytesEnc, err := c.Receive()
if err != nil {
return
}
passwordBytes, err := crypt.Decrypt(passwordBytesEnc, strongKeyForEncryption)
if err != nil {
return
}
if strings.TrimSpace(string(passwordBytes)) != s.password {
err = fmt.Errorf("bad password")
enc, _ := crypt.Encrypt([]byte(err.Error()), strongKeyForEncryption)
if err = c.Send(enc); err != nil {
return "", fmt.Errorf("send error: %w", err)
}
return
}
// send ok to tell client they are connected // send ok to tell client they are connected
banner := s.banner banner := s.banner
if len(banner) == 0 { if len(banner) == 0 {
banner = "ok" banner = "ok"
} }
log.Debugf("sending '%s'", banner) log.Debugf("sending '%s'", banner)
err = c.Send([]byte(banner + "|||" + c.Connection().RemoteAddr().String())) bSend, err := crypt.Encrypt([]byte(banner+"|||"+c.Connection().RemoteAddr().String()), strongKeyForEncryption)
if err != nil {
return
}
err = c.Send(bSend)
if err != nil { if err != nil {
return return
} }
// wait for client to tell me which room they want // wait for client to tell me which room they want
log.Debug("waiting for answer") log.Debug("waiting for answer")
roomBytes, err := c.Receive() enc, err := c.Receive()
if err != nil { if err != nil {
return return
} }
room := string(roomBytes) roomBytes, err := crypt.Decrypt(enc, strongKeyForEncryption)
if err != nil {
return
}
room = string(roomBytes)
s.rooms.Lock() s.rooms.Lock()
// create the room if it is new // create the room if it is new
@ -130,24 +317,32 @@ func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) {
} }
s.rooms.Unlock() s.rooms.Unlock()
// tell the client that they got the room // tell the client that they got the room
err = c.Send([]byte("ok"))
bSend, err = crypt.Encrypt([]byte("ok"), strongKeyForEncryption)
if err != nil {
return
}
err = c.Send(bSend)
if err != nil { if err != nil {
log.Error(err) log.Error(err)
s.deleteRoom(room) s.deleteRoom(room)
return return
} }
log.Debugf("room %s has 1", room) log.Debugf("room %s has 1", room)
return nil return
} }
if s.rooms.rooms[room].full { if s.rooms.rooms[room].full {
s.rooms.Unlock() s.rooms.Unlock()
err = c.Send([]byte("room full")) bSend, err = crypt.Encrypt([]byte("room full"), strongKeyForEncryption)
if err != nil { if err != nil {
log.Error(err)
s.deleteRoom(room)
return return
} }
return nil err = c.Send(bSend)
if err != nil {
log.Error(err)
return
}
return
} }
log.Debugf("room %s has 2", room) log.Debugf("room %s has 2", room)
s.rooms.rooms[room] = roomInfo{ s.rooms.rooms[room] = roomInfo{
@ -172,7 +367,11 @@ func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) {
}(otherConnection, c, &wg) }(otherConnection, c, &wg)
// tell the sender everything is ready // tell the sender everything is ready
err = c.Send([]byte("ok")) bSend, err = crypt.Encrypt([]byte("ok"), strongKeyForEncryption)
if err != nil {
return
}
err = c.Send(bSend)
if err != nil { if err != nil {
s.deleteRoom(room) s.deleteRoom(room)
return return
@ -181,7 +380,7 @@ func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) {
// delete room // delete room
s.deleteRoom(room) s.deleteRoom(room)
return nil return
} }
func (s *server) deleteRoom(room string) { func (s *server) deleteRoom(room string) {
@ -199,17 +398,19 @@ func (s *server) deleteRoom(room string) {
} }
s.rooms.rooms[room] = roomInfo{first: nil, second: nil} s.rooms.rooms[room] = roomInfo{first: nil, second: nil}
delete(s.rooms.rooms, room) delete(s.rooms.rooms, room)
} }
// chanFromConn creates a channel from a Conn object, and sends everything it // chanFromConn creates a channel from a Conn object, and sends everything it
// Read()s from the socket to the channel. //
// Read()s from the socket to the channel.
func chanFromConn(conn net.Conn) chan []byte { func chanFromConn(conn net.Conn) chan []byte {
c := make(chan []byte, 1) c := make(chan []byte, 1)
if err := conn.SetReadDeadline(time.Now().Add(3 * time.Hour)); err != nil {
log.Warnf("can't set read deadline: %v", err)
}
go func() { go func() {
b := make([]byte, models.TCP_BUFFER_SIZE) b := make([]byte, models.TCP_BUFFER_SIZE)
for { for {
n, err := conn.Read(b) n, err := conn.Read(b)
if n > 0 { if n > 0 {
@ -242,47 +443,151 @@ func pipe(conn1 net.Conn, conn2 net.Conn) {
if b1 == nil { if b1 == nil {
return return
} }
conn2.Write(b1) if _, err := conn2.Write(b1); err != nil {
log.Errorf("write error on channel 1: %v", err)
}
case b2 := <-chan2: case b2 := <-chan2:
if b2 == nil { if b2 == nil {
return return
} }
conn1.Write(b2) if _, err := conn1.Write(b2); err != nil {
log.Errorf("write error on channel 2: %v", err)
}
} }
} }
} }
func PingServer(address string) (err error) {
log.Debugf("pinging %s", address)
c, err := comm.NewConnection(address, 300*time.Millisecond)
if err != nil {
log.Debug(err)
return
}
err = c.Send([]byte("ping"))
if err != nil {
log.Debug(err)
return
}
b, err := c.Receive()
if err != nil {
log.Debug(err)
return
}
if bytes.Equal(b, []byte("pong")) {
return nil
}
return fmt.Errorf("no pong")
}
// ConnectToTCPServer will initiate a new connection // ConnectToTCPServer will initiate a new connection
// to the specified address, room with optional time limit // to the specified address, room with optional time limit
func ConnectToTCPServer(address, room string, timelimit ...time.Duration) (c *comm.Comm, banner string, ipaddr string, err error) { func ConnectToTCPServer(address, password, room string, timelimit ...time.Duration) (c *comm.Comm, banner string, ipaddr string, err error) {
if len(timelimit) > 0 { if len(timelimit) > 0 {
c, err = comm.NewConnection(address, timelimit[0]) c, err = comm.NewConnection(address, timelimit[0])
} else { } else {
c, err = comm.NewConnection(address) c, err = comm.NewConnection(address)
} }
if err != nil { if err != nil {
log.Debug(err)
return
}
// get PAKE connection with server to establish strong key to transfer info
A, err := pake.InitCurve(weakKey, 0, "siec")
if err != nil {
log.Debug(err)
return
}
err = c.Send(A.Bytes())
if err != nil {
log.Debug(err)
return
}
Bbytes, err := c.Receive()
if err != nil {
log.Debug(err)
return
}
err = A.Update(Bbytes)
if err != nil {
log.Debug(err)
return
}
strongKey, err := A.SessionKey()
if err != nil {
log.Debug(err)
return
}
log.Debugf("strong key: %x", strongKey)
strongKeyForEncryption, salt, err := crypt.New(strongKey, nil)
if err != nil {
log.Debug(err)
return
}
// send salt
err = c.Send(salt)
if err != nil {
log.Debug(err)
return
}
log.Debug("sending password")
bSend, err := crypt.Encrypt([]byte(password), strongKeyForEncryption)
if err != nil {
log.Debug(err)
return
}
err = c.Send(bSend)
if err != nil {
log.Debug(err)
return return
} }
log.Debug("waiting for first ok") log.Debug("waiting for first ok")
data, err := c.Receive() enc, err := c.Receive()
if err != nil { if err != nil {
log.Debug(err)
return
}
data, err := crypt.Decrypt(enc, strongKeyForEncryption)
if err != nil {
log.Debug(err)
return
}
if !strings.Contains(string(data), "|||") {
err = fmt.Errorf("bad response: %s", string(data))
log.Debug(err)
return return
} }
banner = strings.Split(string(data), "|||")[0] banner = strings.Split(string(data), "|||")[0]
ipaddr = strings.Split(string(data), "|||")[1] ipaddr = strings.Split(string(data), "|||")[1]
log.Debug("sending room") log.Debugf("sending room; %s", room)
err = c.Send([]byte(room)) bSend, err = crypt.Encrypt([]byte(room), strongKeyForEncryption)
if err != nil { if err != nil {
log.Debug(err)
return
}
err = c.Send(bSend)
if err != nil {
log.Debug(err)
return return
} }
log.Debug("waiting for room confirmation") log.Debug("waiting for room confirmation")
data, err = c.Receive() enc, err = c.Receive()
if err != nil { if err != nil {
log.Debug(err)
return
}
data, err = crypt.Decrypt(enc, strongKeyForEncryption)
if err != nil {
log.Debug(err)
return return
} }
if !bytes.Equal(data, []byte("ok")) { if !bytes.Equal(data, []byte("ok")) {
err = fmt.Errorf("got bad response: %s", data) err = fmt.Errorf("got bad response: %s", data)
log.Debug(err)
return return
} }
log.Debug("all set") log.Debug("all set")

View File

@ -1,34 +1,68 @@
package tcp package tcp
import ( import (
"bytes"
"fmt"
"testing" "testing"
"time" "time"
log "github.com/schollz/logger"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestTCP(t *testing.T) { func BenchmarkConnection(b *testing.B) {
timeToRoomDeletion = 100 * time.Millisecond log.SetLevel("trace")
go Run("debug", "8281", "8282") go Run("debug", "127.0.0.1", "8283", "pass123", "8284")
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
c1, banner, _, err := ConnectToTCPServer("localhost:8281", "testRoom", 1*time.Minute) b.ResetTimer()
assert.Equal(t, banner, "8282") for i := 0; i < b.N; i++ {
c, _, _, _ := ConnectToTCPServer("127.0.0.1:8283", "pass123", fmt.Sprintf("testroom%d", i), 1*time.Minute)
c.Close()
}
}
func TestTCP(t *testing.T) {
log.SetLevel("error")
timeToRoomDeletion := 100 * time.Millisecond
go RunWithOptionsAsync("127.0.0.1", "8381", "pass123", WithBanner("8382"), WithLogLevel("debug"), WithRoomTTL(timeToRoomDeletion))
time.Sleep(timeToRoomDeletion)
err := PingServer("127.0.0.1:8381")
assert.Nil(t, err) assert.Nil(t, err)
c2, _, _, err := ConnectToTCPServer("localhost:8281", "testRoom") err = PingServer("127.0.0.1:8333")
assert.Nil(t, err)
_, _, _, err = ConnectToTCPServer("localhost:8281", "testRoom")
assert.NotNil(t, err) assert.NotNil(t, err)
_, _, _, err = ConnectToTCPServer("localhost:8281", "testRoom", 1*time.Nanosecond)
time.Sleep(timeToRoomDeletion)
c1, banner, _, err := ConnectToTCPServer("127.0.0.1:8381", "pass123", "testRoom", 1*time.Minute)
assert.Equal(t, banner, "8382")
assert.Nil(t, err)
c2, _, _, err := ConnectToTCPServer("127.0.0.1:8381", "pass123", "testRoom")
assert.Nil(t, err)
_, _, _, err = ConnectToTCPServer("127.0.0.1:8381", "pass123", "testRoom")
assert.NotNil(t, err)
_, _, _, err = ConnectToTCPServer("127.0.0.1:8381", "pass123", "testRoom", 1*time.Nanosecond)
assert.NotNil(t, err) assert.NotNil(t, err)
// try sending data // try sending data
assert.Nil(t, c1.Send([]byte("hello, c2"))) assert.Nil(t, c1.Send([]byte("hello, c2")))
data, err := c2.Receive() var data []byte
for {
data, err = c2.Receive()
if bytes.Equal(data, []byte{1}) {
continue
}
break
}
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, []byte("hello, c2"), data) assert.Equal(t, []byte("hello, c2"), data)
assert.Nil(t, c2.Send([]byte("hello, c1"))) assert.Nil(t, c2.Send([]byte("hello, c1")))
data, err = c1.Receive() for {
data, err = c1.Receive()
if bytes.Equal(data, []byte{1}) {
continue
}
break
}
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, []byte("hello, c1"), data) assert.Equal(t, []byte("hello, c1"), data)

View File

@ -1,26 +1,64 @@
package utils package utils
import ( import (
"archive/zip"
"bufio" "bufio"
"bytes" "bytes"
"compress/flate"
"crypto/md5" "crypto/md5"
"crypto/rand" "crypto/rand"
"crypto/sha256" "crypto/sha256"
"encoding/hex"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"log"
"math" "math"
"math/big"
"net" "net"
"net/http" "net/http"
"os" "os"
"path"
"path/filepath"
"strings" "strings"
"time"
"unicode"
"github.com/cespare/xxhash" "github.com/cespare/xxhash"
"github.com/kalafut/imohash" "github.com/kalafut/imohash"
"github.com/schollz/mnemonicode" "github.com/minio/highwayhash"
"github.com/schollz/croc/v10/src/mnemonicode"
log "github.com/schollz/logger"
"github.com/schollz/progressbar/v3"
) )
const NbPinNumbers = 4
const NbBytesWords = 4
// Get or create home directory
func GetConfigDir(requireValidPath bool) (homedir string, err error) {
if envHomedir, isSet := os.LookupEnv("CROC_CONFIG_DIR"); isSet {
homedir = envHomedir
} else if xdgConfigHome, isSet := os.LookupEnv("XDG_CONFIG_HOME"); isSet {
homedir = path.Join(xdgConfigHome, "croc")
} else {
homedir, err = os.UserHomeDir()
if err != nil {
if !requireValidPath {
err = nil
homedir = ""
}
return
}
homedir = path.Join(homedir, ".config", "croc")
}
if requireValidPath {
if _, err = os.Stat(homedir); os.IsNotExist(err) {
err = os.MkdirAll(homedir, 0o700)
}
}
return
}
// Exists reports whether the named file or directory exists. // Exists reports whether the named file or directory exists.
func Exists(name string) bool { func Exists(name string) bool {
if _, err := os.Stat(name); err != nil { if _, err := os.Stat(name); err != nil {
@ -39,13 +77,83 @@ func GetInput(prompt string) string {
return strings.TrimSpace(text) return strings.TrimSpace(text)
} }
// HashFile returns the hash of a file // HashFile returns the hash of a file or, in case of a symlink, the
func HashFile(fname string) (hash256 []byte, err error) { // SHA256 hash of its target. Takes an argument to specify the algorithm to use.
return IMOHashFile(fname) func HashFile(fname string, algorithm string, showProgress ...bool) (hash256 []byte, err error) {
doShowProgress := false
if len(showProgress) > 0 {
doShowProgress = showProgress[0]
}
var fstats os.FileInfo
fstats, err = os.Lstat(fname)
if err != nil {
return nil, err
}
if fstats.Mode()&os.ModeSymlink != 0 {
var target string
target, err = os.Readlink(fname)
if err != nil {
return nil, err
}
return []byte(SHA256(target)), nil
}
switch algorithm {
case "imohash":
return IMOHashFile(fname)
case "md5":
return MD5HashFile(fname, doShowProgress)
case "xxhash":
return XXHashFile(fname, doShowProgress)
case "highway":
return HighwayHashFile(fname, doShowProgress)
}
err = fmt.Errorf("unspecified algorithm")
return
}
// HighwayHashFile returns highwayhash of a file
func HighwayHashFile(fname string, doShowProgress bool) (hashHighway []byte, err error) {
f, err := os.Open(fname)
if err != nil {
return
}
defer f.Close()
key, err := hex.DecodeString("1553c5383fb0b86578c3310da665b4f6e0521acf22eb58a99532ffed02a6b115")
if err != nil {
return
}
h, err := highwayhash.New(key)
if err != nil {
err = fmt.Errorf("could not create highwayhash: %s", err.Error())
return
}
if doShowProgress {
stat, _ := f.Stat()
fnameShort := path.Base(fname)
if len(fnameShort) > 20 {
fnameShort = fnameShort[:20] + "..."
}
bar := progressbar.NewOptions64(stat.Size(),
progressbar.OptionSetWriter(os.Stderr),
progressbar.OptionShowBytes(true),
progressbar.OptionSetDescription(fmt.Sprintf("Hashing %s", fnameShort)),
progressbar.OptionClearOnFinish(),
)
if _, err = io.Copy(io.MultiWriter(h, bar), f); err != nil {
return
}
} else {
if _, err = io.Copy(h, f); err != nil {
return
}
}
hashHighway = h.Sum(nil)
return
} }
// MD5HashFile returns MD5 hash // MD5HashFile returns MD5 hash
func MD5HashFile(fname string) (hash256 []byte, err error) { func MD5HashFile(fname string, doShowProgress bool) (hash256 []byte, err error) {
f, err := os.Open(fname) f, err := os.Open(fname)
if err != nil { if err != nil {
return return
@ -53,23 +161,50 @@ func MD5HashFile(fname string) (hash256 []byte, err error) {
defer f.Close() defer f.Close()
h := md5.New() h := md5.New()
if _, err = io.Copy(h, f); err != nil { if doShowProgress {
return stat, _ := f.Stat()
fnameShort := path.Base(fname)
if len(fnameShort) > 20 {
fnameShort = fnameShort[:20] + "..."
}
bar := progressbar.NewOptions64(stat.Size(),
progressbar.OptionSetWriter(os.Stderr),
progressbar.OptionShowBytes(true),
progressbar.OptionSetDescription(fmt.Sprintf("Hashing %s", fnameShort)),
progressbar.OptionClearOnFinish(),
)
if _, err = io.Copy(io.MultiWriter(h, bar), f); err != nil {
return
}
} else {
if _, err = io.Copy(h, f); err != nil {
return
}
} }
hash256 = h.Sum(nil) hash256 = h.Sum(nil)
return return
} }
var imofull = imohash.NewCustom(0, 0)
var imopartial = imohash.NewCustom(16*16*8*1024, 128*1024)
// IMOHashFile returns imohash // IMOHashFile returns imohash
func IMOHashFile(fname string) (hash []byte, err error) { func IMOHashFile(fname string) (hash []byte, err error) {
b, err := imohash.SumFile(fname) b, err := imopartial.SumFile(fname)
hash = b[:]
return
}
// IMOHashFileFull returns imohash of full file
func IMOHashFileFull(fname string) (hash []byte, err error) {
b, err := imofull.SumFile(fname)
hash = b[:] hash = b[:]
return return
} }
// XXHashFile returns the xxhash of a file // XXHashFile returns the xxhash of a file
func XXHashFile(fname string) (hash256 []byte, err error) { func XXHashFile(fname string, doShowProgress bool) (hash256 []byte, err error) {
f, err := os.Open(fname) f, err := os.Open(fname)
if err != nil { if err != nil {
return return
@ -77,8 +212,25 @@ func XXHashFile(fname string) (hash256 []byte, err error) {
defer f.Close() defer f.Close()
h := xxhash.New() h := xxhash.New()
if _, err = io.Copy(h, f); err != nil { if doShowProgress {
return stat, _ := f.Stat()
fnameShort := path.Base(fname)
if len(fnameShort) > 20 {
fnameShort = fnameShort[:20] + "..."
}
bar := progressbar.NewOptions64(stat.Size(),
progressbar.OptionSetWriter(os.Stderr),
progressbar.OptionShowBytes(true),
progressbar.OptionSetDescription(fmt.Sprintf("Hashing %s", fnameShort)),
progressbar.OptionClearOnFinish(),
)
if _, err = io.Copy(io.MultiWriter(h, bar), f); err != nil {
return
}
} else {
if _, err = io.Copy(h, f); err != nil {
return
}
} }
hash256 = h.Sum(nil) hash256 = h.Sum(nil)
@ -89,24 +241,26 @@ func XXHashFile(fname string) (hash256 []byte, err error) {
func SHA256(s string) string { func SHA256(s string) string {
sha := sha256.New() sha := sha256.New()
sha.Write([]byte(s)) sha.Write([]byte(s))
return fmt.Sprintf("%x", sha.Sum(nil)) return hex.EncodeToString(sha.Sum(nil))
} }
// PublicIP returns public ip address // PublicIP returns public ip address
func PublicIP() (ip string, err error) { func PublicIP() (ip string, err error) {
resp, err := http.Get("https://canhazip.com") // ask ipv4.icanhazip.com for the public ip
// by making http request
// if the request fails, return nothing
resp, err := http.Get("http://ipv4.icanhazip.com")
if err != nil { if err != nil {
return return
} }
defer resp.Body.Close() defer resp.Body.Close()
if resp.StatusCode == http.StatusOK { // read the body of the response
bodyBytes, err := ioutil.ReadAll(resp.Body) // and return the ip address
if err != nil { buf := new(bytes.Buffer)
return "", err buf.ReadFrom(resp.Body)
} ip = strings.TrimSpace(buf.String())
ip = strings.TrimSpace(string(bodyBytes))
}
return return
} }
@ -114,7 +268,8 @@ func PublicIP() (ip string, err error) {
func LocalIP() string { func LocalIP() string {
conn, err := net.Dial("udp", "8.8.8.8:80") conn, err := net.Dial("udp", "8.8.8.8:80")
if err != nil { if err != nil {
log.Fatal(err) log.Error(err)
return ""
} }
defer conn.Close() defer conn.Close()
@ -123,18 +278,32 @@ func LocalIP() string {
return localAddr.IP.String() return localAddr.IP.String()
} }
// GetRandomName returns mnemoicoded random name func GenerateRandomPin() string {
s := ""
max := new(big.Int)
max.SetInt64(9)
for i := 0; i < NbPinNumbers; i++ {
v, err := rand.Int(rand.Reader, max)
if err != nil {
panic(err)
}
s += fmt.Sprintf("%d", v)
}
return s
}
// GetRandomName returns mnemonicoded random name
func GetRandomName() string { func GetRandomName() string {
result := []string{} var result []string
bs := make([]byte, 4) bs := make([]byte, NbBytesWords)
rand.Read(bs) rand.Read(bs)
result = mnemonicode.EncodeWordList(result, bs) result = mnemonicode.EncodeWordList(result, bs)
return strings.Join(result, "-") return GenerateRandomPin() + "-" + strings.Join(result, "-")
} }
// ByteCountDecimal converts bytes to human readable byte string // ByteCountDecimal converts bytes to human readable byte string
func ByteCountDecimal(b int64) string { func ByteCountDecimal(b int64) string {
const unit = 1000 const unit = 1024
if b < unit { if b < unit {
return fmt.Sprintf("%d B", b) return fmt.Sprintf("%d B", b)
} }
@ -157,7 +326,7 @@ func MissingChunks(fname string, fsize int64, chunkSize int) (chunkRanges []int6
defer f.Close() defer f.Close()
fstat, err := os.Stat(fname) fstat, err := os.Stat(fname)
if fstat.Size() != fsize || err != nil { if err != nil || fstat.Size() != fsize {
return return
} }
@ -195,7 +364,6 @@ func MissingChunks(fname string, fsize int64, chunkSize int) (chunkRanges []int6
} }
} }
chunkRanges = append(chunkRanges, int64(curCount+1)) chunkRanges = append(chunkRanges, int64(curCount+1))
chunks = chunkRanges
} }
return return
} }
@ -232,3 +400,238 @@ func GetLocalIPs() (ips []string, err error) {
} }
return return
} }
func RandomFileName() (fname string, err error) {
f, err := os.CreateTemp(".", "croc-stdin-")
if err != nil {
return
}
fname = f.Name()
_ = f.Close()
return
}
func FindOpenPorts(host string, portNumStart, numPorts int) (openPorts []int) {
openPorts = []int{}
for port := portNumStart; port-portNumStart < 200; port++ {
timeout := 100 * time.Millisecond
conn, err := net.DialTimeout("tcp", net.JoinHostPort(host, fmt.Sprint(port)), timeout)
if conn != nil {
conn.Close()
} else if err != nil {
openPorts = append(openPorts, port)
}
if len(openPorts) >= numPorts {
return
}
}
return
}
// local ip determination
// https://stackoverflow.com/questions/41240761/check-if-ip-address-is-in-private-network-space
var privateIPBlocks []*net.IPNet
func init() {
for _, cidr := range []string{
"127.0.0.0/8", // IPv4 loopback
"10.0.0.0/8", // RFC1918
"172.16.0.0/12", // RFC1918
"192.168.0.0/16", // RFC1918
"169.254.0.0/16", // RFC3927 link-local
"::1/128", // IPv6 loopback
"fe80::/10", // IPv6 link-local
"fc00::/7", // IPv6 unique local addr
} {
_, block, err := net.ParseCIDR(cidr)
if err != nil {
panic(fmt.Errorf("parse error on %q: %v", cidr, err))
}
privateIPBlocks = append(privateIPBlocks, block)
}
}
func IsLocalIP(ipaddress string) bool {
if strings.Contains(ipaddress, "127.0.0.1") {
return true
}
host, _, _ := net.SplitHostPort(ipaddress)
ip := net.ParseIP(host)
if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() {
return true
}
for _, block := range privateIPBlocks {
if block.Contains(ip) {
return true
}
}
return false
}
func ZipDirectory(destination string, source string) (err error) {
if _, err = os.Stat(destination); err == nil {
log.Errorf("%s file already exists!\n", destination)
}
fmt.Fprintf(os.Stderr, "Zipping %s to %s\n", source, destination)
file, err := os.Create(destination)
if err != nil {
log.Error(err)
}
defer file.Close()
writer := zip.NewWriter(file)
// no compression because croc does its compression on the fly
writer.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) {
return flate.NewWriter(out, flate.NoCompression)
})
defer writer.Close()
err = filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
if err != nil {
log.Error(err)
}
if info.Mode().IsRegular() {
f1, err := os.Open(path)
if err != nil {
log.Error(err)
}
defer f1.Close()
zipPath := strings.ReplaceAll(path, source, strings.TrimSuffix(destination, ".zip"))
zipPath = filepath.ToSlash(zipPath)
w1, err := writer.Create(zipPath)
if err != nil {
log.Error(err)
}
if _, err := io.Copy(w1, f1); err != nil {
log.Error(err)
}
fmt.Fprintf(os.Stderr, "\r\033[2K")
fmt.Fprintf(os.Stderr, "\rAdding %s", zipPath)
}
return nil
})
if err != nil {
log.Error(err)
}
fmt.Fprintf(os.Stderr, "\n")
return nil
}
func UnzipDirectory(destination string, source string) error {
archive, err := zip.OpenReader(source)
if err != nil {
log.Error(err)
}
defer archive.Close()
for _, f := range archive.File {
filePath := filepath.Join(destination, f.Name)
fmt.Fprintf(os.Stderr, "\r\033[2K")
fmt.Fprintf(os.Stderr, "\rUnzipping file %s", filePath)
// Issue #593 conceal path traversal vulnerability
// make sure the filepath does not have ".."
filePath = filepath.Clean(filePath)
if strings.Contains(filePath, "..") {
log.Errorf("Invalid file path %s\n", filePath)
}
if f.FileInfo().IsDir() {
os.MkdirAll(filePath, os.ModePerm)
continue
}
if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
log.Error(err)
}
// check if file exists
if _, err := os.Stat(filePath); err == nil {
prompt := fmt.Sprintf("\nOverwrite '%s'? (y/N) ", filePath)
choice := strings.ToLower(GetInput(prompt))
if choice != "y" && choice != "yes" {
fmt.Fprintf(os.Stderr, "Skipping '%s'\n", filePath)
continue
}
}
dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
log.Error(err)
}
fileInArchive, err := f.Open()
if err != nil {
log.Error(err)
}
if _, err := io.Copy(dstFile, fileInArchive); err != nil {
log.Error(err)
}
dstFile.Close()
fileInArchive.Close()
}
fmt.Fprintf(os.Stderr, "\n")
return nil
}
// ValidFileName checks if a filename is valid
// by making sure it has no invisible characters
func ValidFileName(fname string) (err error) {
// make sure it doesn't contain unicode or invisible characters
for _, r := range fname {
if !unicode.IsGraphic(r) {
err = fmt.Errorf("non-graphical unicode: %x U+%d in '%x'", string(r), r, fname)
return
}
if !unicode.IsPrint(r) {
err = fmt.Errorf("non-printable unicode: %x U+%d in '%x'", string(r), r, fname)
return
}
}
// make sure basename does not include ".." or path separators
_, basename := filepath.Split(fname)
if strings.Contains(basename, "..") {
err = fmt.Errorf("basename cannot contain '..': '%s'", basename)
return
}
if strings.Contains(basename, string(os.PathSeparator)) {
err = fmt.Errorf("basename cannot contain path separators: '%s'", basename)
return
}
// make sure the filename is not an absolute path
if filepath.IsAbs(fname) {
err = fmt.Errorf("filename cannot be an absolute path: '%s'", fname)
return
}
return
}
const crocRemovalFile = "croc-marked-files.txt"
func MarkFileForRemoval(fname string) {
// append the fname to the list of files to remove
f, err := os.OpenFile(crocRemovalFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600)
if err != nil {
log.Debug(err)
return
}
defer f.Close()
_, err = f.WriteString(fname + "\n")
}
func RemoveMarkedFiles() (err error) {
// read the file and remove all the files
f, err := os.Open(crocRemovalFile)
if err != nil {
return
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
fname := scanner.Text()
err = os.Remove(fname)
if err == nil {
log.Tracef("Removed %s", fname)
}
}
os.Remove(crocRemovalFile)
return
}

View File

@ -1,29 +1,31 @@
package utils package utils
import ( import (
"bytes"
"fmt" "fmt"
"io/ioutil"
"log" "log"
"math/rand" "math/rand"
"os" "os"
"path"
"strings" "strings"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
const TCP_BUFFER_SIZE = 1024 * 64
var bigFileSize = 75000000
func bigFile() { func bigFile() {
rand.Seed(0) os.WriteFile("bigfile.test", bytes.Repeat([]byte("z"), bigFileSize), 0o666)
bigBuff := make([]byte, 75000000)
rand.Read(bigBuff)
ioutil.WriteFile("bigfile.test", bigBuff, 0666)
} }
func BenchmarkMD5(b *testing.B) { func BenchmarkMD5(b *testing.B) {
bigFile() bigFile()
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
MD5HashFile("bigfile.test") MD5HashFile("bigfile.test", false)
} }
} }
@ -31,9 +33,10 @@ func BenchmarkXXHash(b *testing.B) {
bigFile() bigFile()
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
XXHashFile("bigfile.test") XXHashFile("bigfile.test", false)
} }
} }
func BenchmarkImoHash(b *testing.B) { func BenchmarkImoHash(b *testing.B) {
bigFile() bigFile()
b.ResetTimer() b.ResetTimer()
@ -42,6 +45,37 @@ func BenchmarkImoHash(b *testing.B) {
} }
} }
func BenchmarkHighwayHash(b *testing.B) {
bigFile()
b.ResetTimer()
for i := 0; i < b.N; i++ {
HighwayHashFile("bigfile.test", false)
}
}
func BenchmarkImoHashFull(b *testing.B) {
bigFile()
b.ResetTimer()
for i := 0; i < b.N; i++ {
IMOHashFileFull("bigfile.test")
}
}
func BenchmarkSha256(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
SHA256("hello,world")
}
}
func BenchmarkMissingChunks(b *testing.B) {
bigFile()
b.ResetTimer()
for i := 0; i < b.N; i++ {
MissingChunks("bigfile.test", int64(bigFileSize), TCP_BUFFER_SIZE/2)
}
}
func TestExists(t *testing.T) { func TestExists(t *testing.T) {
bigFile() bigFile()
defer os.Remove("bigfile.test") defer os.Remove("bigfile.test")
@ -53,10 +87,20 @@ func TestExists(t *testing.T) {
func TestMD5HashFile(t *testing.T) { func TestMD5HashFile(t *testing.T) {
bigFile() bigFile()
defer os.Remove("bigfile.test") defer os.Remove("bigfile.test")
b, err := MD5HashFile("bigfile.test") b, err := MD5HashFile("bigfile.test", false)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "9fed05acbacbc6a36555c998501c21f6", fmt.Sprintf("%x", b)) assert.Equal(t, "8304ff018e02baad0e3555bade29a405", fmt.Sprintf("%x", b))
_, err = MD5HashFile("bigfile.test.nofile") _, err = MD5HashFile("bigfile.test.nofile", false)
assert.NotNil(t, err)
}
func TestHighwayHashFile(t *testing.T) {
bigFile()
defer os.Remove("bigfile.test")
b, err := HighwayHashFile("bigfile.test", false)
assert.Nil(t, err)
assert.Equal(t, "3c32999529323ed66a67aeac5720c7bf1301dcc5dca87d8d46595e85ff990329", fmt.Sprintf("%x", b))
_, err = HighwayHashFile("bigfile.test.nofile", false)
assert.NotNil(t, err) assert.NotNil(t, err)
} }
@ -65,16 +109,16 @@ func TestIMOHashFile(t *testing.T) {
defer os.Remove("bigfile.test") defer os.Remove("bigfile.test")
b, err := IMOHashFile("bigfile.test") b, err := IMOHashFile("bigfile.test")
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "c0d1e123a96a598ea801cc503d3db8c0", fmt.Sprintf("%x", b)) assert.Equal(t, "c0d1e12301e6c635f6d4a8ea5c897437", fmt.Sprintf("%x", b))
} }
func TestXXHashFile(t *testing.T) { func TestXXHashFile(t *testing.T) {
bigFile() bigFile()
defer os.Remove("bigfile.test") defer os.Remove("bigfile.test")
b, err := XXHashFile("bigfile.test") b, err := XXHashFile("bigfile.test", false)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "f2da6ee7e75e8324", fmt.Sprintf("%x", b)) assert.Equal(t, "4918740eb5ccb6f7", fmt.Sprintf("%x", b))
_, err = XXHashFile("nofile") _, err = XXHashFile("nofile", false)
assert.NotNil(t, err) assert.NotNil(t, err)
} }
@ -83,9 +127,9 @@ func TestSHA256(t *testing.T) {
} }
func TestByteCountDecimal(t *testing.T) { func TestByteCountDecimal(t *testing.T) {
assert.Equal(t, "10.0 kB", ByteCountDecimal(10000)) assert.Equal(t, "10.0 kB", ByteCountDecimal(10240))
assert.Equal(t, "50 B", ByteCountDecimal(50)) assert.Equal(t, "50 B", ByteCountDecimal(50))
assert.Equal(t, "12.4 MB", ByteCountDecimal(12378517)) assert.Equal(t, "12.4 MB", ByteCountDecimal(13002343))
} }
func TestMissingChunks(t *testing.T) { func TestMissingChunks(t *testing.T) {
@ -94,9 +138,9 @@ func TestMissingChunks(t *testing.T) {
rand.Seed(1) rand.Seed(1)
bigBuff := make([]byte, fileSize) bigBuff := make([]byte, fileSize)
rand.Read(bigBuff) rand.Read(bigBuff)
ioutil.WriteFile("missing.test", bigBuff, 0644) os.WriteFile("missing.test", bigBuff, 0o644)
empty := make([]byte, chunkSize) empty := make([]byte, chunkSize)
f, err := os.OpenFile("missing.test", os.O_RDWR, 0644) f, err := os.OpenFile("missing.test", os.O_RDWR, 0o644)
assert.Nil(t, err) assert.Nil(t, err)
for block := 0; block < fileSize/chunkSize; block++ { for block := 0; block < fileSize/chunkSize; block++ {
if block == 0 || block == 4 || block == 5 || block >= 7 { if block == 0 || block == 4 || block == 5 || block >= 7 {
@ -114,7 +158,7 @@ func TestMissingChunks(t *testing.T) {
os.Remove("missing.test") os.Remove("missing.test")
content := []byte("temporary file's content") content := []byte("temporary file's content")
tmpfile, err := ioutil.TempFile("", "example") tmpfile, err := os.CreateTemp("", "example")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -146,38 +190,78 @@ func TestMissingChunks(t *testing.T) {
func TestHashFile(t *testing.T) { func TestHashFile(t *testing.T) {
content := []byte("temporary file's content") content := []byte("temporary file's content")
tmpfile, err := ioutil.TempFile("", "example") tmpfile, err := os.CreateTemp("", "example")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
defer os.Remove(tmpfile.Name()) // clean up defer os.Remove(tmpfile.Name()) // clean up
if _, err := tmpfile.Write(content); err != nil { if _, err = tmpfile.Write(content); err != nil {
panic(err) panic(err)
} }
if err := tmpfile.Close(); err != nil { if err = tmpfile.Close(); err != nil {
panic(err) panic(err)
} }
hashed, err := HashFile(tmpfile.Name()) hashed, err := HashFile(tmpfile.Name(), "xxhash")
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "18c9673a4bb8325d323e7f24fda9ae1e", fmt.Sprintf("%x", hashed)) assert.Equal(t, "e66c561610ad51e2", fmt.Sprintf("%x", hashed))
} }
func TestPublicIP(t *testing.T) { func TestPublicIP(t *testing.T) {
ip, err := PublicIP() ip, err := PublicIP()
fmt.Println(ip) fmt.Println(ip)
assert.True(t, strings.Contains(ip, ".")) assert.True(t, strings.Contains(ip, ".") || strings.Contains(ip, ":"))
assert.Nil(t, err) assert.Nil(t, err)
} }
func TestLocalIP(t *testing.T) { func TestLocalIP(t *testing.T) {
ip := LocalIP() ip := LocalIP()
fmt.Println(ip) fmt.Println(ip)
assert.True(t, strings.Contains(ip, ".")) assert.True(t, strings.Contains(ip, ".") || strings.Contains(ip, ":"))
} }
func TestGetRandomName(t *testing.T) { func TestGetRandomName(t *testing.T) {
name := GetRandomName() name := GetRandomName()
fmt.Println(name)
assert.NotEmpty(t, name) assert.NotEmpty(t, name)
} }
func intSliceSame(a, b []int) bool {
if len(a) != len(b) {
return false
}
for i, v := range a {
if v != b[i] {
return false
}
}
return true
}
func TestFindOpenPorts(t *testing.T) {
openPorts := FindOpenPorts("127.0.0.1", 9009, 4)
if !intSliceSame(openPorts, []int{9009, 9010, 9011, 9012}) && !intSliceSame(openPorts, []int{9014, 9015, 9016, 9017}) {
t.Errorf("openPorts: %v", openPorts)
}
}
func TestIsLocalIP(t *testing.T) {
assert.True(t, IsLocalIP("192.168.0.14:9009"))
}
func TestValidFileName(t *testing.T) {
// contains regular characters
assert.Nil(t, ValidFileName("中文.csl"))
// contains regular characters
assert.Nil(t, ValidFileName("[something].csl"))
// contains regular characters
assert.Nil(t, ValidFileName("[(something)].csl"))
// contains invisible character
err := ValidFileName("D中文.cslouglas")
assert.NotNil(t, err)
assert.Equal(t, "non-graphical unicode: e2808b U+8203 in '44e4b8ade696872e63736c6f75676c6173e2808b'", err.Error())
assert.NotNil(t, ValidFileName("hi..txt"))
assert.NotNil(t, ValidFileName(path.Join(string(os.PathSeparator), "abs", string(os.PathSeparator), "hi.txt")))
}