check / check (push) Failing after 2s
script/lint-darwin (make lint-darwin; run by script/check, and its commands by the Dockerfile lint stage) runs go vet and golangci-lint with GOOS=darwin and cgo off. Compiling cgo for macOS needs Apple's SDK, so the three functions that call go-keychain, which is cgo there, move to keychainunlocker_cgo.go; a macOS build without cgo gets keychainunlocker_nocgo.go and the macse stub, whose errors name the missing macOS build with cgo. The rest of the keychain unlocker and its plain-Go tests are now checked; their findings are fixed without changing behaviour, and lines over 88 columns in the unchecked files are wrapped. Model: opus-5-5
58 lines
2.4 KiB
Go
58 lines
2.4 KiB
Go
//go:build darwin
|
|
|
|
//nolint:testpackage // white-box test of unexported validateKeychainItemName
|
|
package secret
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestValidateKeychainItemName(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
name string
|
|
itemName string
|
|
wantErr bool
|
|
}{
|
|
// Valid cases
|
|
{name: "valid simple name", itemName: "my-secret-key", wantErr: false},
|
|
{name: "valid name with dots", itemName: "com.example.app.key", wantErr: false},
|
|
{name: "valid name with underscores", itemName: "my_secret_key_123", wantErr: false},
|
|
{name: "valid alphanumeric", itemName: "Secret123Key", wantErr: false},
|
|
{name: "valid with hyphen at start", itemName: "-my-key", wantErr: false},
|
|
{name: "valid with dot at start", itemName: ".hidden-key", wantErr: false},
|
|
|
|
// Invalid cases
|
|
{name: "empty item name", itemName: "", wantErr: true},
|
|
{name: "item name with spaces", itemName: "my secret key", wantErr: true},
|
|
{name: "item name with semicolon", itemName: "key;rm -rf /", wantErr: true},
|
|
{name: "item name with pipe", itemName: "key|cat /etc/passwd", wantErr: true},
|
|
{name: "item name with backticks", itemName: "key`whoami`", wantErr: true},
|
|
{name: "item name with dollar sign", itemName: "key$(whoami)", wantErr: true},
|
|
{name: "item name with quotes", itemName: "key\"name", wantErr: true},
|
|
{name: "item name with single quotes", itemName: "key'name", wantErr: true},
|
|
{name: "item name with backslash", itemName: "key\\name", wantErr: true},
|
|
{name: "item name with newline", itemName: "key\nname", wantErr: true},
|
|
{name: "item name with carriage return", itemName: "key\rname", wantErr: true},
|
|
{name: "item name with ampersand", itemName: "key&echo test", wantErr: true},
|
|
{name: "item name with redirect", itemName: "key>/tmp/test", wantErr: true},
|
|
{name: "item name with null byte", itemName: "key\x00name", wantErr: true},
|
|
{name: "item name with parentheses", itemName: "key(test)", wantErr: true},
|
|
{name: "item name with brackets", itemName: "key[test]", wantErr: true},
|
|
{name: "item name with asterisk", itemName: "key*", wantErr: true},
|
|
{name: "item name with question mark", itemName: "key?", wantErr: true},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
err := validateKeychainItemName(tt.itemName)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("validateKeychainItemName() error = %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
})
|
|
}
|
|
}
|