chore(release): v0.7.21 — fix cmd-flash on every SSH auth (askpass GUI subsystem)
All checks were successful
ci / mutation test (broker) (push) Has been skipped
ci / test-health gate (push) Successful in 17s
Release Publish (Gitea session_helper) / verify-release-tag (push) Successful in 17s
ci / rust release (push) Successful in 2m50s
ci / rust debug (push) Successful in 3m15s
Release Publish (Gitea session_helper) / publish-linux-x86_64 (push) Successful in 4m4s
ci / python (push) Successful in 1m29s

Followup to v0.7.20: cmd-flash still fired on every connect/reconnect
because v0.7.20 only covered the bridge-child spawn site. The
remaining flash came from ``sessions_askpass.exe``, which OpenSSH for
Windows invokes (via ``SSH_ASKPASS`` + its own ``CreateProcessW``
with ``CREATE_NEW_CONSOLE``) every time a host requires a password,
passphrase, or OTP. Multiplexing is intentionally off on Windows
(v0.7.15 revert), so each connect goes through three to four ssh
calls and the user saw three to four flashes.

Fix: mark ``sessions_askpass`` as ``#![cfg_attr(target_os = "windows",
windows_subsystem = "windows")]`` so the binary is built as a
GUI-subsystem PE. Windows then refuses to allocate a console for it
no matter how its parent invokes it. The protocol is unchanged —
ssh redirects the askpass child's stdio to pipes via ``STARTUPINFO``
before launch, so writing the password to stdout still reaches ssh
and the filesystem rendezvous (``SESSIONS_ASKPASS_REQUEST`` /
``SESSIONS_ASKPASS_RESPONSE`` / ``SESSIONS_ASKPASS_CANCEL``)
operates the same.

Tests: ``sessions_askpass`` 7/7 pass on Linux and via
``--target x86_64-pc-windows-gnu``. No Sublime-side change so the
existing 1247-pass suite is unaffected.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-28 20:47:02 +09:00
parent 1d31817d27
commit 6e8288205a
5 changed files with 17 additions and 9 deletions

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "sessions-sublime" name = "sessions-sublime"
version = "0.7.20" version = "0.7.21"
description = "Sublime-facing Python code for Sessions." description = "Sublime-facing Python code for Sessions."
requires-python = ">=3.8" requires-python = ">=3.8"
license = {text = "MIT"} license = {text = "MIT"}

12
rust/Cargo.lock generated
View File

@@ -221,7 +221,7 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
[[package]] [[package]]
name = "local_bridge" name = "local_bridge"
version = "0.7.20" version = "0.7.21"
dependencies = [ dependencies = [
"base64", "base64",
"glob", "glob",
@@ -432,7 +432,7 @@ dependencies = [
[[package]] [[package]]
name = "session_helper" name = "session_helper"
version = "0.7.20" version = "0.7.21"
dependencies = [ dependencies = [
"base64", "base64",
"notify", "notify",
@@ -443,7 +443,7 @@ dependencies = [
[[package]] [[package]]
name = "session_protocol" name = "session_protocol"
version = "0.7.20" version = "0.7.21"
dependencies = [ dependencies = [
"base64", "base64",
"serde", "serde",
@@ -452,14 +452,14 @@ dependencies = [
[[package]] [[package]]
name = "sessions_askpass" name = "sessions_askpass"
version = "0.7.20" version = "0.7.21"
dependencies = [ dependencies = [
"tempfile", "tempfile",
] ]
[[package]] [[package]]
name = "sessions_native" name = "sessions_native"
version = "0.7.20" version = "0.7.21"
dependencies = [ dependencies = [
"serde_json", "serde_json",
"session_protocol", "session_protocol",
@@ -770,7 +770,7 @@ dependencies = [
[[package]] [[package]]
name = "workspace_identity" name = "workspace_identity"
version = "0.7.20" version = "0.7.21"
[[package]] [[package]]
name = "zmij" name = "zmij"

View File

@@ -12,7 +12,7 @@ resolver = "2"
[workspace.package] [workspace.package]
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
version = "0.7.20" version = "0.7.21"
authors = ["Myeongseon Choi <key262yek@gmail.com>"] authors = ["Myeongseon Choi <key262yek@gmail.com>"]
repository = "https://git.teahaven.kr/sublime-rs/sessions" repository = "https://git.teahaven.kr/sublime-rs/sessions"
homepage = "https://git.teahaven.kr/sublime-rs/sessions" homepage = "https://git.teahaven.kr/sublime-rs/sessions"

View File

@@ -7,6 +7,14 @@
//! Shipping this tiny ``.exe`` lets the plugin's prompt-bridge protocol work //! Shipping this tiny ``.exe`` lets the plugin's prompt-bridge protocol work
//! on Windows without giving up password / passphrase authentication. //! on Windows without giving up password / passphrase authentication.
//! //!
//! Subsystem: GUI on Windows so OpenSSH's ``CREATE_NEW_CONSOLE`` flag for
//! the ``SSH_ASKPASS`` child does not flash a ``cmd.exe`` window for every
//! auth round. The protocol is filesystem-rendezvous + stdout (the password
//! ssh reads); both work the same regardless of subsystem because ssh
//! pre-redirects this child's stdio to pipes via ``STARTUPINFO``.
#![cfg_attr(target_os = "windows", windows_subsystem = "windows")]
//!
//! Protocol (matched verbatim by the Sublime side in ``ssh_runner.py`` / //! Protocol (matched verbatim by the Sublime side in ``ssh_runner.py`` /
//! ``ssh_file_transport.py``): //! ``ssh_file_transport.py``):
//! //!

2
uv.lock generated
View File

@@ -854,7 +854,7 @@ wheels = [
[[package]] [[package]]
name = "sessions-sublime" name = "sessions-sublime"
version = "0.7.20" version = "0.7.21"
source = { virtual = "." } source = { virtual = "." }
[package.dev-dependencies] [package.dev-dependencies]