diff --git a/bootstrap/login.go b/bootstrap/login.go index fada999..d3e9bde 100644 --- a/bootstrap/login.go +++ b/bootstrap/login.go @@ -10,10 +10,14 @@ import ( var loginBitwarden = secretstore.LoginBitwarden -// DefaultLoginHandler retourne un Handler qui authentifie et déverrouille -// Bitwarden, persiste la session BW_SESSION, et confirme le résultat. -// Utiliser comme hook Login lorsqu'aucune logique personnalisée n'est requise. -func DefaultLoginHandler(binaryName string) Handler { +// BitwardenLoginHandler retourne un Handler pour la commande login des MCPs +// qui utilisent le backend Bitwarden. Il authentifie et déverrouille le vault, +// persiste BW_SESSION, et confirme le résultat. +// +// N'utiliser que si le MCP déclare secret_store.backend_policy = "bitwarden-cli" +// dans son manifest. Pour les backends env-only ou keyring, ne pas définir de +// hook Login : la commande sera automatiquement masquée. +func BitwardenLoginHandler(binaryName string) Handler { name := strings.TrimSpace(binaryName) return func(_ context.Context, inv Invocation) error { if _, err := loginBitwarden(secretstore.BitwardenLoginOptions{ diff --git a/bootstrap/login_test.go b/bootstrap/login_test.go index f609117..b819463 100644 --- a/bootstrap/login_test.go +++ b/bootstrap/login_test.go @@ -17,7 +17,7 @@ func withLoginBitwarden(t *testing.T, fn func(secretstore.BitwardenLoginOptions) t.Cleanup(func() { loginBitwarden = previous }) } -func TestDefaultLoginHandlerPrintsConfirmation(t *testing.T) { +func TestBitwardenLoginHandlerPrintsConfirmation(t *testing.T) { var stdout bytes.Buffer withLoginBitwarden(t, func(opts secretstore.BitwardenLoginOptions) (string, error) { @@ -27,7 +27,7 @@ func TestDefaultLoginHandlerPrintsConfirmation(t *testing.T) { return "session-token", nil }) - handler := DefaultLoginHandler("my-mcp") + handler := BitwardenLoginHandler("my-mcp") err := handler(context.Background(), Invocation{ Command: CommandLogin, Stdout: &stdout, @@ -45,7 +45,7 @@ func TestDefaultLoginHandlerPrintsConfirmation(t *testing.T) { } } -func TestDefaultLoginHandlerPropagatesError(t *testing.T) { +func TestBitwardenLoginHandlerPropagatesError(t *testing.T) { var stdout bytes.Buffer loginErr := errors.New("vault locked") @@ -53,7 +53,7 @@ func TestDefaultLoginHandlerPropagatesError(t *testing.T) { return "", loginErr }) - handler := DefaultLoginHandler("my-mcp") + handler := BitwardenLoginHandler("my-mcp") err := handler(context.Background(), Invocation{ Command: CommandLogin, Stdout: &stdout, @@ -66,7 +66,7 @@ func TestDefaultLoginHandlerPropagatesError(t *testing.T) { } } -func TestRunUsesDefaultLoginHandlerWhenHookSet(t *testing.T) { +func TestRunUsesBitwardenLoginHandlerWhenHookSet(t *testing.T) { var stdout bytes.Buffer withLoginBitwarden(t, func(_ secretstore.BitwardenLoginOptions) (string, error) { @@ -78,7 +78,7 @@ func TestRunUsesDefaultLoginHandlerWhenHookSet(t *testing.T) { Args: []string{"login"}, Stdout: &stdout, Hooks: Hooks{ - Login: DefaultLoginHandler("my-mcp"), + Login: BitwardenLoginHandler("my-mcp"), }, }) if err != nil {