Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 7 additions & 11 deletions internal/guard/store/sqlite/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
_ "modernc.org/sqlite"

"github.com/kontext-security/kontext-cli/internal/guard/risk"
"github.com/kontext-security/kontext-cli/internal/hook"
)

type Store struct {
Expand Down Expand Up @@ -1172,14 +1173,10 @@ func canonicalEventType(hookEventName string) string {
}

func canonicalDecisionResult(decision risk.Decision) string {
switch strings.ToLower(strings.TrimSpace(string(decision))) {
case "allow":
return "allow"
case "deny":
fallthrough
default:
return "deny"
if normalized, ok := hook.NormalizeDecision(string(decision)); ok {
return string(normalized)
}
return "deny"
}

func actionStatus(canonicalEvent, decisionResult string) string {
Expand All @@ -1204,11 +1201,10 @@ func actionStatus(canonicalEvent, decisionResult string) string {
}

func adapterDecision(decision risk.Decision) string {
normalized := strings.ToLower(strings.TrimSpace(string(decision)))
switch normalized {
case "allow", "deny":
return normalized
if normalized, ok := hook.NormalizeDecision(string(decision)); ok {
return string(normalized)
}
normalized := strings.ToLower(strings.TrimSpace(string(decision)))
if normalized == "" {
normalized = "empty"
}
Expand Down
9 changes: 9 additions & 0 deletions internal/guard/store/sqlite/store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,15 @@ where id = ?
}
}

func TestDecisionHelpersNormalizeWhitespaceAndCase(t *testing.T) {
if got := canonicalDecisionResult(risk.Decision(" Allow \n")); got != "allow" {
t.Fatalf("canonicalDecisionResult() = %q, want allow", got)
}
if got := adapterDecision(risk.Decision("\tDeNy ")); got != "deny" {
t.Fatalf("adapterDecision() = %q, want deny", got)
}
}

func TestLedgerBatchExportsSessionsActionsAndReceipts(t *testing.T) {
store, err := OpenStore(t.TempDir() + "/guard.db")
if err != nil {
Expand Down
12 changes: 8 additions & 4 deletions internal/hook/domain.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package hook

import "strings"
import (
"strings"

"github.com/kontext-security/kontext-cli/internal/guard/decision"
)

type HookName string

Expand Down Expand Up @@ -30,11 +34,11 @@ func (h HookName) CanBlock() bool {
return h == HookPreToolUse
}

type Decision string
type Decision = decision.Decision

const (
DecisionAllow Decision = "allow"
DecisionDeny Decision = "deny"
DecisionAllow = decision.Allow
DecisionDeny = decision.Deny
)

func NormalizeDecision(value string) (Decision, bool) {
Expand Down
Loading