Release 2.0.0: encrypted client session + security fixes - #33
Merged
Conversation
First stable v2 cut (the Go client is in production; v2 leaves alpha). The `V2` namespace stays for now — collapsing it and dropping v1 coexistence is deferred to a later backwards-incompatible release. Security - Rails client session is now signed AND encrypted (AES-256-GCM via ActiveSupport::MessageEncryptor), keyed off a secret_key_base-derived key with a Terminalwire-specific salt, with a 30-day sliding expiry. Previously a signed-only HS256 JWT — confidential-looking per the docs but readable by anyone who could read session.jwt. Legacy JWT sessions are read once and rewritten encrypted, so upgrading logs nobody out. - Handler now honors SystemExit: a command calling exit/abort reports its real status instead of silently telling the client exit 0. - Doc/comment accuracy: corrected the stale "JWT session" label, noted that client_ip proxy headers are spoofable and not for authorization, and fixed the false "capabilities gate request()" claim. Dependencies - Bump vulnerable transitive gems in the root lock (rack, json, addressable, msgpack); bundle-audit is clean. Release mechanics - Bump Terminalwire::V2::VERSION to 2.0.0; finalize CHANGELOG. - Remove the ship-guards and rubygems.invalid push host from the terminalwire and terminalwire-rails gemspecs; update RELEASING.md. - Ignore built *.gem artifacts. Claude-Session: https://claude.ai/code/session_01WwjwiDDzoEczBXBuT5yZbd
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
First stable v2 (2.0.0) cut. The Go client is in production, so v2 leaves alpha. The
V2namespace stays for this release — collapsing it and dropping v1 coexistence is deferred to a later backwards-incompatible release (2.1+).Security
ActiveSupport::MessageEncryptor), key derived fromsecret_key_basewith a Terminalwire-specific salt, 30-day sliding expiry. Was a signed-only HS256 JWT — the docs said "encrypts and signs" but the payload was readable by anyone who could readsession.jwt. Legacy JWT sessions are read once and rewritten encrypted, so upgrading logs nobody out.exit/abort(SystemExit) now reports its real status instead of silently telling the clientexit 0.client_ipproxy headers are spoofable (not for authz), and corrected the false "capabilities gaterequest()" claim.Dependencies
bundle-auditis clean.Release mechanics
Terminalwire::V2::VERSION→2.0.0; CHANGELOG finalized.rubygems.invalidpush host from theterminalwireandterminalwire-railsgemspecs; updateddocs/RELEASING.md; ignore built*.gem.Tests
107 v2 + 96 v1 examples, 0 failures. Both gems build cleanly at 2.0.0.
gem pushto RubyGems — irreversible + your RELEASING.md flags theterminalwirename's proprietary history, so publishing is held for explicit go.v2.0.0git tag — should land on the merge commit onmain.make ruby RUBY_REPO=…) needs theterminalwire/protocolworkspace and hasn't been run here.https://claude.ai/code/session_01WwjwiDDzoEczBXBuT5yZbd