net-ssh 7.3.6 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/pull_request_template.md +1 -0
- data/.github/workflows/changelog.yml +43 -0
- data/.github/workflows/ci-with-docker.yml +0 -3
- data/.github/workflows/ci.yml +2 -17
- data/.github/workflows/rubocop.yml +3 -1
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +1 -0
- data/CHANGES.txt +73 -7
- data/CONTRIBUTING.md +35 -0
- data/Dockerfile +3 -3
- data/Dockerfile.openssl3 +1 -1
- data/Dockerfile.zlib_ng +1 -1
- data/README.md +71 -57
- data/Rakefile +66 -12
- data/appveyor.yml +4 -16
- data/changelog.d/README.md +1 -0
- data/docker-compose.yml +1 -7
- data/lib/net/ssh/authentication/agent.rb +35 -11
- data/lib/net/ssh/authentication/ed25519.rb +137 -44
- data/lib/net/ssh/authentication/ed25519_loader.rb +14 -9
- data/lib/net/ssh/authentication/key_manager.rb +22 -11
- data/lib/net/ssh/authentication/methods/abstract.rb +2 -8
- data/lib/net/ssh/authentication/methods/publickey.rb +3 -1
- data/lib/net/ssh/authentication/security_key.rb +71 -0
- data/lib/net/ssh/authentication/session.rb +29 -17
- data/lib/net/ssh/buffer.rb +6 -1
- data/lib/net/ssh/buffered_io.rb +40 -3
- data/lib/net/ssh/config.rb +28 -12
- data/lib/net/ssh/connection/channel.rb +49 -2
- data/lib/net/ssh/connection/session.rb +58 -8
- data/lib/net/ssh/errors.rb +24 -6
- data/lib/net/ssh/key_factory.rb +7 -1
- data/lib/net/ssh/known_hosts.rb +18 -8
- data/lib/net/ssh/multiplex/client.rb +162 -0
- data/lib/net/ssh/multiplex/control_path.rb +120 -0
- data/lib/net/ssh/multiplex/proxy_transport.rb +218 -0
- data/lib/net/ssh/multiplex.rb +130 -0
- data/lib/net/ssh/prompt.rb +3 -3
- data/lib/net/ssh/proxy/jump.rb +40 -2
- data/lib/net/ssh/service/forward.rb +29 -24
- data/lib/net/ssh/test.rb +2 -1
- data/lib/net/ssh/transport/algorithms.rb +88 -33
- data/lib/net/ssh/transport/chacha20_poly1305_cipher.rb +89 -16
- data/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb +20 -1
- data/lib/net/ssh/transport/cipher_factory.rb +23 -1
- data/lib/net/ssh/transport/constants.rb +1 -0
- data/lib/net/ssh/transport/gcm_cipher.rb +27 -6
- data/lib/net/ssh/transport/hmac/sha1_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac.rb +2 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256.rb +41 -9
- data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +14 -6
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +8 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +45 -15
- data/lib/net/ssh/transport/openssl.rb +2 -1
- data/lib/net/ssh/transport/packet_stream.rb +12 -0
- data/lib/net/ssh/transport/session.rb +41 -44
- data/lib/net/ssh/verifiers/always.rb +0 -3
- data/lib/net/ssh/version.rb +3 -3
- data/lib/net/ssh.rb +139 -57
- data/net-ssh.gemspec +5 -8
- data/rakelib/changelog.rb +229 -0
- data.tar.gz.sig +0 -0
- metadata +37 -36
- metadata.gz.sig +0 -0
- data/Gemfile.noed25519 +0 -12
- data/Gemfile.norbnacl +0 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fc22933c7ce50930b6118479820acb8d978d855baade0499b94065d7e245c016
|
|
4
|
+
data.tar.gz: 3340e9bd30ac3781da55ffdc0362626e32ad8b0c2db0b2352bf879dc6fe743bc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 226a157e20beb49c008e4a3eb3e15a93ea23b7d0b2935f3c0fa4111d4e43815f6a77b0ef2f22e2bab7123f9410f99655459dc42b94c30ce63a295be77dc3b2ce
|
|
7
|
+
data.tar.gz: fb9269c31afc40374ef1b30cc58008d916cf41f3a633596e2fb04f924917f33e966c3b556df56f3cb10fbc24190d956ac9b59b2d57cb7b23204bded86f5316c6
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!-- After opening the PR, add a changelog.d/<PR number>.<type>.txt fragment (none, change, security, breaking or breaking-security) instead of editing CHANGES.txt; see CONTRIBUTING.md#changelog. -->
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: Changelog
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, synchronize, reopened, labeled, unlabeled]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
changelog:
|
|
12
|
+
if: ${{ github.event.pull_request.user.login != 'dependabot[bot]' }}
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
with:
|
|
17
|
+
# HEAD is the PR merged into the base branch; HEAD^1 is the base it was merged into.
|
|
18
|
+
fetch-depth: 2
|
|
19
|
+
- name: Set up Ruby 3.1
|
|
20
|
+
uses: ruby/setup-ruby@v1
|
|
21
|
+
with:
|
|
22
|
+
ruby-version: 3.1
|
|
23
|
+
- name: Validate fragments
|
|
24
|
+
run: rake changelog:check
|
|
25
|
+
- name: Require a fragment
|
|
26
|
+
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-changelog') }}
|
|
27
|
+
env:
|
|
28
|
+
PR: ${{ github.event.number }}
|
|
29
|
+
run: |
|
|
30
|
+
changed=$(git diff --name-only HEAD^1 HEAD)
|
|
31
|
+
if echo "$changed" | grep -x 'CHANGES\.txt' > /dev/null; then
|
|
32
|
+
echo "::error::Don't edit CHANGES.txt, add a changelog.d/$PR.<type>.txt fragment instead, see CONTRIBUTING.md#changelog"
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
own=$(git diff --name-only --diff-filter=AMR HEAD^1 HEAD -- changelog.d/ | grep -E "^changelog\.d/$PR\.[a-z-]+(\.[0-9]+)?\.txt$" || true)
|
|
36
|
+
if [ -n "$own" ]; then
|
|
37
|
+
echo "Changelog fragments:"; echo "$own"
|
|
38
|
+
elif ! echo "$changed" | grep -v '^changelog\.d/' > /dev/null; then
|
|
39
|
+
echo "Only changelog.d/ changed, no fragment needed"
|
|
40
|
+
else
|
|
41
|
+
echo "::error::Add a changelog fragment named changelog.d/$PR.<type>.txt (use $PR.none.txt if nothing user-visible changed), see CONTRIBUTING.md#changelog"
|
|
42
|
+
exit 1
|
|
43
|
+
fi
|
data/.github/workflows/ci.yml
CHANGED
|
@@ -7,7 +7,7 @@ jobs:
|
|
|
7
7
|
runs-on: ubuntu-22.04
|
|
8
8
|
strategy:
|
|
9
9
|
matrix:
|
|
10
|
-
ruby-version: [2.
|
|
10
|
+
ruby-version: [2.7.8, 3.0.6, 3.1.3, 3.2.1, 3.3, 3.4, '4.0']
|
|
11
11
|
steps:
|
|
12
12
|
- uses: actions/checkout@v3
|
|
13
13
|
|
|
@@ -39,11 +39,10 @@ jobs:
|
|
|
39
39
|
${{ runner.os }}-pip-v1
|
|
40
40
|
- name: Bundle install
|
|
41
41
|
run: |
|
|
42
|
-
gem install bundler ${{
|
|
42
|
+
gem install bundler ${{ startsWith(matrix.ruby-version, '2.7.') && '-v 2.4.22' || '' }}
|
|
43
43
|
bundle config set path 'vendor/bundle'
|
|
44
44
|
bundle config set --local path 'vendor/bundle'
|
|
45
45
|
bundle install --jobs 4 --retry 3
|
|
46
|
-
BUNDLE_GEMFILE=./Gemfile.noed25519 bundle install --jobs 4 --retry 3
|
|
47
46
|
env:
|
|
48
47
|
BUNDLE_PATH: vendor/bundle
|
|
49
48
|
|
|
@@ -79,20 +78,6 @@ jobs:
|
|
|
79
78
|
NET_SSH_RUN_INTEGRATION_TESTS: 1
|
|
80
79
|
CI: 1
|
|
81
80
|
RUBYOPT: '--enable=frozen-string-literal'
|
|
82
|
-
- name: Run tests (without rbnacl)
|
|
83
|
-
run: bundle exec rake test
|
|
84
|
-
env:
|
|
85
|
-
BUNDLE_GEMFILE: ./Gemfile.norbnacl
|
|
86
|
-
NET_SSH_RUN_INTEGRATION_TESTS: 1
|
|
87
|
-
CI: 1
|
|
88
|
-
RUBYOPT: '--enable=frozen-string-literal'
|
|
89
|
-
- name: Run Tests (without ed25519)
|
|
90
|
-
run: bundle exec rake test
|
|
91
|
-
env:
|
|
92
|
-
BUNDLE_GEMFILE: ./Gemfile.noed25519
|
|
93
|
-
NET_SSH_RUN_INTEGRATION_TESTS: 1
|
|
94
|
-
CI: 1
|
|
95
|
-
RUBYOPT: '--enable=frozen-string-literal'
|
|
96
81
|
- name: Run test helper test
|
|
97
82
|
run: bundle exec rake test_test
|
|
98
83
|
env:
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
CHANGED
|
@@ -335,6 +335,7 @@ Naming/MemoizedInstanceVariableName:
|
|
|
335
335
|
Naming/MethodName:
|
|
336
336
|
Exclude:
|
|
337
337
|
- 'lib/net/ssh/authentication/ed25519_loader.rb'
|
|
338
|
+
- 'lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb'
|
|
338
339
|
- 'lib/net/ssh/transport/kex/curve25519_sha256_loader.rb'
|
|
339
340
|
- 'test/authentication/test_agent.rb'
|
|
340
341
|
- 'test/authentication/test_session.rb'
|
data/CHANGES.txt
CHANGED
|
@@ -1,8 +1,56 @@
|
|
|
1
|
-
===
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
===
|
|
1
|
+
=== 8.0.0
|
|
2
|
+
|
|
3
|
+
* No changes since 8.0.0 rc5.
|
|
4
|
+
|
|
5
|
+
=== 8.0.0 rc5
|
|
6
|
+
|
|
7
|
+
* BREAKING: Security: a custom `verify_host_key` verifier must now implement `verify_signature` (deprecated since 5.1.0) or ArgumentError is raised; such verifiers were previously wrapped so the server's host key signature was never checked [#1050]
|
|
8
|
+
* BREAKING: Unsupported key types now raise `Net::SSH::UnsupportedKeyType` (a `Net::SSH::Exception`) instead of `NotImplementedError`; code that rescued `NotImplementedError` around key loading or connecting should rescue the new class [#945, #1060]
|
|
9
|
+
* BREAKING: `Net::SSH.start` raises ArgumentError for option values that are `nil` or arrays containing `nil` (deprecated since 4.0.0); omit the option to use the default or ssh_config value, the error names a value that turns it off where one exists (e.g. `proxy: false`, `keys: []`, `config: false`). `password: nil` and `passphrase: nil` are still accepted [#458, #1053]
|
|
10
|
+
* BREAKING: removed the `:paranoid` option (deprecated since 4.2.0); use `:verify_host_key` with the same values. Passing `:paranoid` raises ArgumentError [#1050]
|
|
11
|
+
* BREAKING: removed the `verify_host_key` values `false`, `true`, `:very` and `:secure` (deprecated since 5.0.0); use `:never`, `:accept_new_or_local_tunnel`, `:accept_new` and `:always` respectively. The old values raise ArgumentError naming the replacement [#1050]
|
|
12
|
+
* BREAKING: `Net::SSH::HostKeyEntries::PubKey` (the known_hosts entries returned by `KnownHosts.search_for`) no longer forwards methods to the wrapped key (deprecated since 7.0.0); use `ssh_type`, `to_blob` or `matches_key?`, or the new `key` reader for the wrapped public key [#1050]
|
|
13
|
+
* Security: `append_all_supported_algorithms: true` no longer enables the `none` cipher and MAC; name them explicitly (`encryption: '+none'`, `hmac: '+none'`) to use them [#1051]
|
|
14
|
+
* Security: `diffie-hellman-group-exchange-sha1/sha256` now requires groups of at least 2048 bits and requests sizes from the negotiated ciphers, as OpenSSH since 7.2, and rejects invalid server groups and DH public values; like OpenSSH, the requested group size is capped at 4096 bits for Cisco servers. Pass `minimum_dh_bits: 1024` to connect to legacy servers that only offer 1024-bit groups. `minimum_dh_bits` values other than 1024 no longer fail key exchange with "could not verify server signature" [#1049]
|
|
15
|
+
* Security: `diffie-hellman-group14-sha1` is no longer offered by default for key exchange, as in OpenSSH since 8.2; add `KexAlgorithms +diffie-hellman-group14-sha1` in ssh_config (or `kex: '+diffie-hellman-group14-sha1'`) or pass `append_all_supported_algorithms: true` to re-enable [#705, #1042]
|
|
16
|
+
* Changelog entries are now added as `changelog.d/<PR number>.<type>.txt` fragment files instead of editing CHANGES.txt, and CI requires one per PR; see CONTRIBUTING.md [#1058]
|
|
17
|
+
* `Net::SSH.start(host, user, control_master: :auto)` reuses an already running OpenSSH ControlMaster found via `:control_path` or ssh_config `ControlPath`, falling back to a normal connection when there is none [#443, #1057]
|
|
18
|
+
* Default `max_win_size` is now 2 MB as in OpenSSH (was 128 KB), which avoids truncated output from some devices (e.g. Mikrotik); pass `max_win_size: 0x20000` for the old behaviour [#726, #1055]
|
|
19
|
+
* Added `hmac-sha1-etm@openssh.com`, offered by default after the SHA2 etm MACs as in OpenSSH [#985, #1056]
|
|
20
|
+
* `Net::SSH::Proxy::Jump` `options:` values may be an Array for ssh_config options that can be given more than once (`IdentityFile`, `CertificateFile`, `SendEnv`); each element is passed as its own `-o Key=value`, an empty Array passes nothing, and a `nil` value (alone or in an Array) raises ArgumentError as in `Net::SSH.start` [#1052]
|
|
21
|
+
* `ssh-rsa-cert-v00@openssh.com` host keys are deprecated and warn when named in `host_key`/`HostKeyAlgorithms` or negotiated; net-ssh cannot parse v00 certificates, use `ssh-rsa-cert-v01@openssh.com` or a modern key type [#1051]
|
|
22
|
+
* README: weak algorithms (CBC/3DES/Blowfish ciphers, `ssh-dss`, `diffie-hellman-group1-sha1`, old MACs, ...) stay available as opt-ins for legacy servers rather than being removed in 8.0 [#1051]
|
|
23
|
+
* An ssh-agent that fails while listing keys (e.g. closes the connection) is now skipped and key files are still tried, as in OpenSSH, instead of aborting authentication [#867, #1048]
|
|
24
|
+
* `%r` in a ProxyCommand now defaults to the connection's user, as in OpenSSH, instead of raising unless `:remote_user` is set [#881, #787, #1047]
|
|
25
|
+
* `Net::SSH.start` no longer modifies the options hash passed to it [#989, #1046]
|
|
26
|
+
* `Session#exec!` with a block now returns an empty string with `exitstatus` (like the non-block form) instead of `nil` [#848, #1045]
|
|
27
|
+
* ssh_config `KexAlgorithms` is now honoured and maps to `:kex`, including `+`, `-` and `^`; it was previously ignored [#1042]
|
|
28
|
+
* `Net::SSH::Proxy::Jump.new` accepts `options:`, a Hash of ssh_config options passed to the jump host's ssh command as escaped `-o Key=value` arguments, e.g. `options: { 'StrictHostKeyChecking' => 'no' }` [#915, #1041]
|
|
29
|
+
* `Net::SSH::Proxy::Jump` no longer fails with "unknown key" or substitutes the target host when the `config:` path contains `%` [#1041]
|
|
30
|
+
|
|
31
|
+
=== 8.0.0 rc4
|
|
32
|
+
|
|
33
|
+
* Security: RSA signatures using SHA-1 (`ssh-rsa`, `ssh-rsa-cert-v01@openssh.com`) are no longer offered by default for host keys or public key authentication, as in OpenSSH since 8.8; RSA keys keep working via rsa-sha2-256/512. For servers that only support SHA-1 add `HostKeyAlgorithms +ssh-rsa` / `PubkeyAcceptedAlgorithms +ssh-rsa` in ssh_config (or `host_key: '+ssh-rsa'` / `pubkey_algorithms: %w[+ssh-rsa]`), or pass `append_all_supported_algorithms: true` [#1039]
|
|
34
|
+
* Security: ssh_config `PubkeyAcceptedAlgorithms` (and its old name `PubkeyAcceptedKeyTypes`) is now honoured, including `+`, `-` and `^`, and `pubkey_algorithms` now applies to all key types instead of only RSA, adding `rsa-sha2-512`; DSA (`ssh-dss`) keys are no longer offered by default, as in OpenSSH since 7.0 — add `+ssh-dss` or pass `append_all_supported_algorithms: true` to re-enable [#923]
|
|
35
|
+
* Security: ssh_config `Ciphers`, `MACs`, `KexAlgorithms` and `HostKeyAlgorithms` lists starting with `+`, `-` or `^` now append to, remove from or prepend to the default list, as in OpenSSH, instead of silently enabling every supported algorithm including weak ones that are off by default; every listed item is honoured and `-` accepts wildcards. Pass `append_all_supported_algorithms: true` to also get the full supported list [#925]
|
|
36
|
+
* Support agent-backed FIDO/U2F security keys (sk-ecdsa-sha2-nistp256@openssh.com, sk-ssh-ed25519@openssh.com) for publickey auth [#1007]
|
|
37
|
+
* Port forwarding no longer buffers a whole stream in memory when one side reads slowly: like OpenSSH, window is granted only as data is written to the local socket, and the local socket is read only while the remote window has room. An application that writes everything to a forwarded port before reading anything now blocks once the window fills, as it would with `ssh -L` or a direct TCP connection; the old unbounded buffering hid this [#1037, #1003]
|
|
38
|
+
* Data forwarded to a local socket just before the remote end sends EOF or closes the channel is no longer truncated or dropped: it is written out before the socket is shut down or closed, without blocking the event loop until the local application reads [#1037]
|
|
39
|
+
* Multi-factor authentication works when the server's AuthenticationMethods order differs from net-ssh's: after each partial success the allowed methods are tried again, as OpenSSH does [#873, #872]
|
|
40
|
+
* `HostKeyError#host`, `#port` and `#ip` now return the connected host, port and IP (`ip` is nil through a ProxyCommand) instead of always nil [#963]
|
|
41
|
+
* OpenSSH-format private keys with Windows (CRLF) line endings now load [#922, #921]
|
|
42
|
+
* Send CHANNEL_EOF before CHANNEL_CLOSE when closing a session's remaining channels, as OpenSSH does; fixes hangs at close with servers that wait for EOF, such as some SFTP servers [#672]
|
|
43
|
+
* ssh_config: trailing `# comments` are now ignored, as in OpenSSH; a `#` inside quotes or in the middle of a word is kept [#990]
|
|
44
|
+
|
|
45
|
+
=== 8.0.0 rc3
|
|
46
|
+
|
|
47
|
+
* Fix "Calling Net::SSH::Buffer methods on HostKeyEntries PubKey is deprecated" warnings printed on every connection to a host in known_hosts [#1026, #1027]
|
|
48
|
+
* `ProxyJump none` now means no proxy instead of jumping through a host named "none", and `ProxyCommand none` is matched case-insensitively, as in OpenSSH [#893, #972, #1030]
|
|
49
|
+
* Send SIGHUP to the ProxyCommand process on close, as OpenSSH does, so tunnels such as EC2 Instance Connect Endpoint no longer hang at exit [#947]
|
|
50
|
+
* Reconnect when the ssh-agent closes the connection on the legacy version request (e.g. older Proton Pass) instead of raising FrozenError [#1008]
|
|
51
|
+
* ssh_config: parse `Key = value` lines like OpenSSH (the value no longer keeps the leading space, and the keyword ends at the first `=`), and honor ProxyJump/ProxyCommand before the first Host [#1034]
|
|
52
|
+
|
|
53
|
+
=== 8.0.0 rc2
|
|
6
54
|
|
|
7
55
|
* Security: refuse agent channels opened by the server unless agent forwarding was requested (`forward_agent`, ForwardAgent, or `Forward#agent`); any use of port forwarding let a malicious server use the local ssh-agent [GHSA-qpg5-fx6p-8cq3]
|
|
8
56
|
* Security: reject host and user names containing shell metacharacters, and non-numeric ports, before substituting them into ProxyCommand/ProxyJump commands, as OpenSSH does since 9.6 [GHSA-3x7f-q7wf-fp73]
|
|
@@ -11,9 +59,27 @@
|
|
|
11
59
|
* Security: reject packet lengths below 5 or above 256 KB, as OpenSSH does [GHSA-pfqh-p9vh-wx4p]
|
|
12
60
|
* Security: treat unexpected packets during the initial key exchange as a protocol error, and bound packets queued during a re-key [GHSA-ggxh-cfwq-5xqc]
|
|
13
61
|
|
|
14
|
-
===
|
|
62
|
+
=== 8.0.0 rc1
|
|
63
|
+
|
|
64
|
+
* BREAKING: TCP_NODELAY is now set on the connection socket by default, as OpenSSH does; pass `no_delay: false` to keep Nagle's algorithm on [#1017]
|
|
65
|
+
* Ruby 4.0 support: add `logger` as a runtime dependency; Windows Pageant users on Ruby 4.0 need `fiddle` in their Gemfile [#984, #1012]
|
|
66
|
+
* Close the socket when connection setup fails, e.g. on a server version timeout [#1013]
|
|
67
|
+
* Ignore SSH_MSG_EXT_INFO from servers that send it unrequested [#1020]
|
|
68
|
+
* Fix `undefined method 'to_pem'` for ECDSA key_data when an agent is running [#982]
|
|
69
|
+
* Agent forwarding connects to the agent set by `identity_agent`/IdentityAgent [#974]
|
|
70
|
+
* Keyboard-interactive prompts show input when the server asks for it to be echoed [#1014]
|
|
71
|
+
* Raise Net::SSH::Exception on a truncated KEXINIT [#1016]
|
|
72
|
+
* Remote forwarding no longer prints diagnostics to stdout [#953]
|
|
73
|
+
|
|
74
|
+
=== 8.0.0 beta3
|
|
75
|
+
|
|
76
|
+
* Verify @cert-authority host certificate constraints — principals (shell-glob, matching OpenSSH), validity window, host type, and critical options — instead of trusting any CA-signed certificate for any host [#1009]
|
|
77
|
+
|
|
78
|
+
=== 8.0.0 beta1
|
|
15
79
|
|
|
16
|
-
*
|
|
80
|
+
* BREAKING: require Ruby 2.7 and the openssl gem >= 3.2 [#1001]
|
|
81
|
+
* Use OpenSSL for Ed25519, X25519 and ChaCha20-Poly1305; the ed25519, x25519 and rbnacl gems are no longer needed [#1001]
|
|
82
|
+
* Support AEAD-encrypted OpenSSH private keys [#1001]
|
|
17
83
|
|
|
18
84
|
=== 7.3.3
|
|
19
85
|
|
data/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Contributing to net-ssh
|
|
2
|
+
|
|
3
|
+
Run the unit tests with `bundle exec rake test` and the linter with `bundle exec rubocop`; see [README.md](README.md) and [DEVELOPMENT.md](DEVELOPMENT.md) for integration tests and debugging tips.
|
|
4
|
+
|
|
5
|
+
## Changelog
|
|
6
|
+
|
|
7
|
+
Don't edit `CHANGES.txt`. Instead, add a fragment file to `changelog.d/` in your PR; the release's version bump (`rake vbump:*`) moves all fragments into a new `=== <version>` section at the top of `CHANGES.txt` and deletes them.
|
|
8
|
+
|
|
9
|
+
A fragment is named `<number>.<type>.txt`, where `<number>` is the PR number (so open the PR first, then add the fragment), and contains a single UTF-8 paragraph: the entry as it should read in `CHANGES.txt`, without the bullet or prefix. Lines are joined, so it can be wrapped. If it doesn't end with a reference list such as `[#985, #1056]`, `[GHSA-xxxx-xxxx-xxxx]` or `[CVE-2024-12345, #1060]`, ` [#<number>]` is appended; write the list yourself to reference issues or advisories too.
|
|
10
|
+
|
|
11
|
+
| Type | Written as | Use for |
|
|
12
|
+
| ------------------- | ------------------------------ | ------------------------------------------------------------ |
|
|
13
|
+
| `breaking-security` | `* BREAKING: Security: <text>` | an incompatible change made for security |
|
|
14
|
+
| `breaking` | `* BREAKING: <text>` | an incompatible change |
|
|
15
|
+
| `security` | `* Security: <text>` | a security fix or hardening |
|
|
16
|
+
| `change` | `* <text>` | any other user-visible fix or feature |
|
|
17
|
+
| `none` | nothing | PRs with no user-visible change (tests, CI, docs, refactors) |
|
|
18
|
+
|
|
19
|
+
Examples:
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
rake "changelog:new[1058,change,Session#exec! now returns the exit status]"
|
|
23
|
+
# changelog.d/1058.change.txt -> * Session#exec! now returns the exit status [#1058]
|
|
24
|
+
|
|
25
|
+
echo 'Removed the `:paranoid` option; use `:verify_host_key` [#1050]' > changelog.d/1050.breaking.txt
|
|
26
|
+
echo 'Reject packet lengths above 256 KB, as OpenSSH does [GHSA-pfqh-p9vh-wx4p]' > changelog.d/1060.security.txt
|
|
27
|
+
echo 'Custom verifiers must implement `verify_signature` [#1050]' > changelog.d/1050.breaking-security.txt
|
|
28
|
+
touch changelog.d/1061.none.txt
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
For several entries from one PR add a suffix: `1050.breaking.txt`, `1050.breaking.2.txt` (`changelog:new` picks the next free one).
|
|
32
|
+
|
|
33
|
+
In a release section, entries are grouped as `BREAKING: Security:`, `BREAKING:`, `Security:`, then the rest; within a group fragments are ordered by number, newest first, followed by any hand-written entries from an `=== Unreleased` section in their written order. A final release with nothing to report still gets a `=== <version>` section saying `No changes since <previous version>.`
|
|
34
|
+
|
|
35
|
+
`rake changelog:check` validates the fragments and the `=== Unreleased` section, and `rake changelog:preview` prints the section the next release would add. CI fails a PR that edits `CHANGES.txt` or doesn't add or modify a `changelog.d/<PR number>.<type>.txt` fragment, unless it only touches `changelog.d/` or a maintainer adds the `skip-changelog` label; Dependabot PRs are skipped.
|
data/Dockerfile
CHANGED
|
@@ -3,8 +3,8 @@ FROM ruby:${RUBY_VERSION}
|
|
|
3
3
|
|
|
4
4
|
ARG BUNDLERV=
|
|
5
5
|
|
|
6
|
-
# Ruby 2.
|
|
7
|
-
RUN if grep -q bullseye /etc/os-release; then sed -i 's|deb.debian.org|archive.debian.org
|
|
6
|
+
# Ruby 2.7 and 3.0 images are built on Debian bullseye, which only archive.debian.org still serves.
|
|
7
|
+
RUN if grep -q bullseye /etc/os-release; then sed -i 's|deb.debian.org|archive.debian.org|' /etc/apt/sources.list; fi
|
|
8
8
|
|
|
9
9
|
RUN apt update && apt install -y openssh-server sudo netcat-openbsd \
|
|
10
10
|
&& useradd --create-home --shell '/bin/bash' --comment 'NetSSH' 'net_ssh_1' \
|
|
@@ -29,4 +29,4 @@ RUN gem install bundler ${BUNDLERV} && bundle install
|
|
|
29
29
|
|
|
30
30
|
COPY . $INSTALL_PATH/
|
|
31
31
|
|
|
32
|
-
CMD service ssh start && rake test
|
|
32
|
+
CMD service ssh start && rake test
|
data/Dockerfile.openssl3
CHANGED
data/Dockerfile.zlib_ng
CHANGED
|
@@ -11,7 +11,7 @@ ENV INSTALL_PATH="/netssh"
|
|
|
11
11
|
# Ruby/OpenSSL initialises — setting it in the Rakefile is too late.
|
|
12
12
|
ENV OPENSSL_CONF="/netssh/test/openssl3.conf"
|
|
13
13
|
|
|
14
|
-
RUN dnf install -y openssl ruby ruby-devel git make gcc redhat-rpm-config zlib-ng crypto-policies-scripts && \
|
|
14
|
+
RUN dnf install -y openssl openssl-devel ruby ruby-devel git make gcc redhat-rpm-config zlib-ng crypto-policies-scripts && \
|
|
15
15
|
update-crypto-policies --set LEGACY
|
|
16
16
|
|
|
17
17
|
WORKDIR $INSTALL_PATH
|
data/README.md
CHANGED
|
@@ -28,67 +28,75 @@ It allows you to write programs that invoke and interact with processes on remot
|
|
|
28
28
|
|
|
29
29
|
## Supported Algorithms
|
|
30
30
|
|
|
31
|
-
Net::SSH
|
|
32
|
-
We strongly recommend that you install a
|
|
31
|
+
Net::SSH only offers secure algorithms by default.
|
|
32
|
+
We strongly recommend that you install a server version that supports the latest algorithms.
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
Unsecure algoritms will definitely be removed in Net::SSH 8.*.
|
|
34
|
+
Weak algorithms are still supported as opt-ins, so legacy servers such as embedded routers and old network gear stay reachable. To enable one, prefix it with `+` in the matching option, e.g. `encryption: '+aes256-cbc'`, `hmac: '+hmac-sha1-96'`, `kex: '+diffie-hellman-group1-sha1'`, `host_key: '+ssh-dss'`, or in ssh_config with `Ciphers`, `MACs`, `KexAlgorithms`, `HostKeyAlgorithms` and `PubkeyAcceptedAlgorithms` (e.g. `Ciphers +aes256-cbc`). Passing `append_all_supported_algorithms: true` appends every supported algorithm except the `none` cipher and MAC, which are only used when named explicitly (e.g. `encryption: '+none'`, `hmac: '+none'`).
|
|
37
35
|
|
|
38
36
|
### Host Keys
|
|
39
37
|
|
|
40
|
-
| Name
|
|
41
|
-
|
|
42
|
-
| ssh-
|
|
43
|
-
| ssh-ed25519
|
|
44
|
-
| ecdsa-sha2-nistp521
|
|
45
|
-
| ecdsa-sha2-
|
|
46
|
-
|
|
|
47
|
-
|
|
|
38
|
+
| Name | Support | Details |
|
|
39
|
+
|------------------------------------------|------------------------|----------|
|
|
40
|
+
| ssh-ed25519 | OK | Backed by Ruby OpenSSL raw Ed25519 APIs (`openssl >= 3.2.0`) |
|
|
41
|
+
| ssh-ed25519-cert-v01@openssh.com | OK | Backed by Ruby OpenSSL raw Ed25519 APIs (`openssl >= 3.2.0`) |
|
|
42
|
+
| ecdsa-sha2-nistp521/384/256 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) |
|
|
43
|
+
| ecdsa-sha2-nistp521/384/256-cert-v01@openssh.com | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) |
|
|
44
|
+
| rsa-sha2-512 | OK | |
|
|
45
|
+
| rsa-sha2-256 | OK | |
|
|
46
|
+
| ssh-rsa | Not offered by default | SHA-1 signatures, off by default as in OpenSSH 8.8; opt-in for legacy servers with `HostKeyAlgorithms +ssh-rsa` or `host_key: '+ssh-rsa'` |
|
|
47
|
+
| ssh-rsa-cert-v01@openssh.com | Not offered by default | SHA-1 signatures; opt-in for legacy servers |
|
|
48
|
+
| ssh-rsa-cert-v00@openssh.com | Deprecated | not offered by default, warns when used and will be removed; net-ssh cannot parse v00 certificates, use ssh-rsa-cert-v01@openssh.com or a modern key type |
|
|
49
|
+
| ssh-dss | Not offered by default | unsecure, off by default as in OpenSSH 7.0; opt-in for legacy servers |
|
|
50
|
+
|
|
51
|
+
RSA public key authentication likewise uses rsa-sha2-512 or rsa-sha2-256 by default; ssh-rsa and ssh-dss keys are only offered when enabled, e.g. with `PubkeyAcceptedAlgorithms +ssh-rsa` or `pubkey_algorithms: %w[+ssh-rsa]`.
|
|
48
52
|
|
|
49
53
|
### Key Exchange
|
|
50
54
|
|
|
51
|
-
| Name | Support
|
|
52
|
-
|
|
53
|
-
| curve25519-sha256 | OK
|
|
54
|
-
|
|
|
55
|
-
| ecdh-sha2-
|
|
56
|
-
| ecdh-sha2-
|
|
57
|
-
|
|
|
58
|
-
| diffie-hellman-
|
|
59
|
-
| diffie-hellman-
|
|
60
|
-
| diffie-hellman-
|
|
55
|
+
| Name | Support | Details |
|
|
56
|
+
|--------------------------------------|------------------------|----------|
|
|
57
|
+
| curve25519-sha256 | OK | Backed by Ruby OpenSSL raw X25519 APIs (`openssl >= 3.2.0`) |
|
|
58
|
+
| curve25519-sha256@libssh.org | OK | Backed by Ruby OpenSSL raw X25519 APIs (`openssl >= 3.2.0`) |
|
|
59
|
+
| ecdh-sha2-nistp521 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) |
|
|
60
|
+
| ecdh-sha2-nistp384 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) |
|
|
61
|
+
| ecdh-sha2-nistp256 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) |
|
|
62
|
+
| diffie-hellman-group-exchange-sha256 | OK | |
|
|
63
|
+
| diffie-hellman-group14-sha256 | OK | |
|
|
64
|
+
| diffie-hellman-group14-sha1 | Not offered by default | SHA-1, off by default as in OpenSSH 8.2; opt-in for legacy servers with `KexAlgorithms +diffie-hellman-group14-sha1` or `kex: '+diffie-hellman-group14-sha1'` |
|
|
65
|
+
| diffie-hellman-group-exchange-sha1 | Not offered by default | unsecure; opt-in for legacy servers |
|
|
66
|
+
| diffie-hellman-group1-sha1 | Not offered by default | unsecure; opt-in for legacy servers |
|
|
61
67
|
|
|
62
68
|
### Encryption algorithms (ciphers)
|
|
63
69
|
|
|
64
|
-
| Name
|
|
65
|
-
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
| aes256-
|
|
69
|
-
|
|
|
70
|
-
|
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
70
|
+
| Name | Support | Details |
|
|
71
|
+
|-----------------------------------------|------------------------|----------|
|
|
72
|
+
| chacha20-poly1305@openssh.com | OK | Backed by Ruby OpenSSL ChaCha20 and Poly1305 APIs (`openssl >= 3.2.0`) |
|
|
73
|
+
| aes256-ctr / aes192-ctr / aes128-ctr | OK | |
|
|
74
|
+
| aes256-gcm@openssh.com / aes128-gcm@openssh.com | OK | |
|
|
75
|
+
| aes256-cbc / aes192-cbc / aes128-cbc | Not offered by default | unsecure; opt-in for legacy servers |
|
|
76
|
+
| rijndael-cbc@lysator.liu.se | Not offered by default | unsecure; opt-in for legacy servers |
|
|
77
|
+
| blowfish-ctr blowfish-cbc | Not offered by default | unsecure; opt-in for legacy servers |
|
|
78
|
+
| cast128-ctr cast128-cbc | Not offered by default | unsecure; opt-in for legacy servers |
|
|
79
|
+
| 3des-ctr 3des-cbc | Not offered by default | unsecure; opt-in for legacy servers |
|
|
80
|
+
| idea-cbc | Not offered by default | unsecure; opt-in for legacy servers |
|
|
81
|
+
| none | Not offered by default | no encryption; only used when named explicitly, not added by `append_all_supported_algorithms` |
|
|
75
82
|
|
|
76
83
|
### Message Authentication Code algorithms
|
|
77
84
|
|
|
78
|
-
| Name
|
|
79
|
-
|
|
80
|
-
| hmac-sha2-512-etm
|
|
81
|
-
| hmac-sha2-256-etm
|
|
82
|
-
| hmac-
|
|
83
|
-
| hmac-sha2-
|
|
84
|
-
| hmac-sha2-
|
|
85
|
-
| hmac-
|
|
86
|
-
| hmac-
|
|
87
|
-
| hmac-
|
|
88
|
-
| hmac-
|
|
89
|
-
| hmac-
|
|
90
|
-
| hmac-md5
|
|
91
|
-
|
|
|
85
|
+
| Name | Support | Details |
|
|
86
|
+
|-------------------------------|------------------------|----------|
|
|
87
|
+
| hmac-sha2-512-etm@openssh.com | OK | |
|
|
88
|
+
| hmac-sha2-256-etm@openssh.com | OK | |
|
|
89
|
+
| hmac-sha1-etm@openssh.com | OK | for backward compatibility |
|
|
90
|
+
| hmac-sha2-512 | OK | |
|
|
91
|
+
| hmac-sha2-256 | OK | |
|
|
92
|
+
| hmac-sha1 | OK | for backward compatibility |
|
|
93
|
+
| hmac-sha2-512-96 | Not offered by default | removed from the specification; opt-in for legacy servers |
|
|
94
|
+
| hmac-sha2-256-96 | Not offered by default | removed from the specification; opt-in for legacy servers |
|
|
95
|
+
| hmac-sha1-96 | Not offered by default | unsecure; opt-in for legacy servers |
|
|
96
|
+
| hmac-ripemd160 / hmac-ripemd160@openssh.com | Not offered by default | unsecure; opt-in for legacy servers |
|
|
97
|
+
| hmac-md5 | Not offered by default | unsecure; opt-in for legacy servers |
|
|
98
|
+
| hmac-md5-96 | Not offered by default | unsecure; opt-in for legacy servers |
|
|
99
|
+
| none | Not offered by default | no integrity protection; only used when named explicitly, not added by `append_all_supported_algorithms` |
|
|
92
100
|
|
|
93
101
|
## SYNOPSIS:
|
|
94
102
|
|
|
@@ -148,16 +156,16 @@ See Net::SSH for more documentation, and links to further information.
|
|
|
148
156
|
|
|
149
157
|
## REQUIREMENTS:
|
|
150
158
|
|
|
151
|
-
|
|
152
|
-
|
|
159
|
+
Net::SSH requires Ruby 2.7 or newer and the Ruby `openssl` gem version `3.2.0` or newer.
|
|
160
|
+
The `openssl` gem uses the OpenSSL library Ruby is built against. You can verify the loaded gem and library with:
|
|
153
161
|
|
|
154
162
|
```sh
|
|
155
|
-
ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
|
|
163
|
+
ruby -ropenssl -e 'puts OpenSSL::VERSION; puts OpenSSL::OPENSSL_VERSION'
|
|
156
164
|
```
|
|
157
165
|
|
|
158
|
-
If
|
|
159
|
-
|
|
160
|
-
|
|
166
|
+
If `openssl` cannot be required, rebuild Ruby with OpenSSL support or install the Ruby `openssl` gem separately.
|
|
167
|
+
|
|
168
|
+
Ed25519, curve25519-sha256, and chacha20-poly1305@openssh.com support also require an OpenSSL backend with Ed25519, X25519, ChaCha20, and Poly1305 enabled.
|
|
161
169
|
|
|
162
170
|
## INSTALL:
|
|
163
171
|
|
|
@@ -188,14 +196,16 @@ gem install net-ssh -P HighSecurity
|
|
|
188
196
|
If you don't add the public key, you'll see an error like "Couldn't verify data signature".
|
|
189
197
|
If you're still having trouble let me know and I'll give you a hand.
|
|
190
198
|
|
|
191
|
-
|
|
199
|
+
Ed25519 public key auth is backed by Ruby OpenSSL. The `bcrypt_pbkdf` gem is only needed when loading bcrypt-encrypted OpenSSH private keys.
|
|
192
200
|
|
|
193
201
|
```sh
|
|
194
|
-
gem install ed25519
|
|
195
202
|
gem install bcrypt_pbkdf
|
|
196
203
|
```
|
|
197
204
|
|
|
198
|
-
|
|
205
|
+
### FIDO/U2F security keys
|
|
206
|
+
|
|
207
|
+
`sk-ecdsa-sha2-nistp256@openssh.com` and `sk-ssh-ed25519@openssh.com` keys work when held in `ssh-agent`.
|
|
208
|
+
Loading `sk-*` private key files from disk is not supported.
|
|
199
209
|
|
|
200
210
|
## RUBY SUPPORT
|
|
201
211
|
|
|
@@ -250,6 +260,10 @@ gem cert --add net-ssh-public_cert.pem
|
|
|
250
260
|
|
|
251
261
|
or `rake cert:update_public_when_expired`
|
|
252
262
|
|
|
263
|
+
## CONTRIBUTING
|
|
264
|
+
|
|
265
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md), including how to add a changelog entry.
|
|
266
|
+
|
|
253
267
|
## Security contact information
|
|
254
268
|
|
|
255
269
|
See [SECURITY.md](SECURITY.md)
|
data/Rakefile
CHANGED
|
@@ -9,7 +9,11 @@ require "rake"
|
|
|
9
9
|
require "rake/clean"
|
|
10
10
|
require "bundler/gem_tasks"
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
begin
|
|
13
|
+
require "rdoc/task"
|
|
14
|
+
rescue LoadError
|
|
15
|
+
# rdoc is no longer a default gem as of Ruby 4.0; the rest of the Rakefile works without it.
|
|
16
|
+
end
|
|
13
17
|
|
|
14
18
|
desc "When releasing make sure NET_SSH_BUILDGEM_SIGNED is set"
|
|
15
19
|
task :check_NET_SSH_BUILDGEM_SIGNED do
|
|
@@ -24,20 +28,23 @@ CLEAN.include ['pkg', 'rdoc']
|
|
|
24
28
|
name = "net-ssh"
|
|
25
29
|
|
|
26
30
|
require_relative "lib/net/ssh/version"
|
|
31
|
+
require_relative "rakelib/changelog"
|
|
27
32
|
version = Net::SSH::Version::CURRENT
|
|
28
33
|
|
|
29
34
|
extra_files = %w[LICENSE.txt THANKS.txt CHANGES.txt]
|
|
30
|
-
RDoc::Task
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
if defined?(RDoc::Task)
|
|
36
|
+
RDoc::Task.new do |rdoc|
|
|
37
|
+
rdoc.rdoc_dir = "rdoc"
|
|
38
|
+
rdoc.title = "#{name} #{version}"
|
|
39
|
+
rdoc.generator = 'hanna' # gem install hanna-nouveau
|
|
40
|
+
rdoc.main = 'README.md'
|
|
41
|
+
rdoc.rdoc_files.include("README*")
|
|
42
|
+
rdoc.rdoc_files.include("bin/*.rb")
|
|
43
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
|
44
|
+
extra_files.each { |file|
|
|
45
|
+
rdoc.rdoc_files.include(file) if File.exist?(file)
|
|
46
|
+
}
|
|
47
|
+
end
|
|
41
48
|
end
|
|
42
49
|
|
|
43
50
|
namespace :cert do
|
|
@@ -103,6 +110,15 @@ def change_version(&block)
|
|
|
103
110
|
raise ArgumentError, "Cound not find line: TINY = \"#{tiny}\" in #{version_file}" unless found[:tiny] || new_tiny == tiny
|
|
104
111
|
end
|
|
105
112
|
|
|
113
|
+
begin
|
|
114
|
+
heading = Changelog.heading(Net::SSH::Version::MAJOR, Net::SSH::Version::MINOR, new_tiny, new_pre)
|
|
115
|
+
section = Changelog.new(__dir__).release(heading)
|
|
116
|
+
rescue StandardError
|
|
117
|
+
FileUtils.rm_f "#{version_file}.new"
|
|
118
|
+
raise
|
|
119
|
+
end
|
|
120
|
+
puts section ? "Added to CHANGES.txt:\n#{section}" : "Nothing to release for a pre-release, CHANGES.txt unchanged"
|
|
121
|
+
|
|
106
122
|
FileUtils.mv version_file, "#{version_file}.old"
|
|
107
123
|
FileUtils.mv "#{version_file}.new", version_file
|
|
108
124
|
end
|
|
@@ -142,6 +158,44 @@ namespace :vbump do
|
|
|
142
158
|
end
|
|
143
159
|
end
|
|
144
160
|
|
|
161
|
+
namespace :changelog do
|
|
162
|
+
changelog = Changelog.new(__dir__)
|
|
163
|
+
|
|
164
|
+
desc "Validate the fragments in changelog.d/"
|
|
165
|
+
task :check do
|
|
166
|
+
count = changelog.check.size
|
|
167
|
+
puts "#{count} valid changelog fragment#{'s' unless count == 1}"
|
|
168
|
+
rescue Changelog::Error => e
|
|
169
|
+
abort e.message
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
desc "Print the CHANGES.txt section the next version bump would write"
|
|
173
|
+
task :preview, [:heading] do |_t, args|
|
|
174
|
+
puts changelog.section(args[:heading] || "Unreleased") || "Nothing to release"
|
|
175
|
+
rescue Changelog::Error => e
|
|
176
|
+
abort e.message
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
desc "Create a fragment: rake \"changelog:new[1234,change,Text of the entry]\""
|
|
180
|
+
task :new, [:number, :type] do |_t, args|
|
|
181
|
+
abort "Usage: rake \"changelog:new[<PR number>,<#{Changelog::TYPES.keys.join('|')}>,<text>]\"" unless args[:number] && args[:type]
|
|
182
|
+
# Rake splits arguments on commas and strips the spaces around them, so take the text from the raw task string.
|
|
183
|
+
raw = Rake.application.top_level_tasks.find { |t| t.start_with?("changelog:new[") }
|
|
184
|
+
text = raw&.[](/\A[^\[]*\[[^,]*,[^,]*,\s*(.*)\]\z/m, 1) || args.extras.join(", ")
|
|
185
|
+
puts "Created #{changelog.new_fragment(args[:number], args[:type], text)}"
|
|
186
|
+
rescue Changelog::Error => e
|
|
187
|
+
abort e.message
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
desc "Write the fragments to CHANGES.txt under a heading, e.g. rake \"changelog:release[7.3.4]\" (vbump does this)"
|
|
191
|
+
task :release, [:heading] do |_t, args|
|
|
192
|
+
abort "Usage: rake \"changelog:release[<version heading>]\"" unless args[:heading]
|
|
193
|
+
puts changelog.release(args[:heading]) || "Nothing to release"
|
|
194
|
+
rescue Changelog::Error => e
|
|
195
|
+
abort e.message
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
145
199
|
namespace :rdoc do
|
|
146
200
|
desc "Update gh-pages branch"
|
|
147
201
|
task :publish do
|