From 0761a9640d8ba960f5640a1f971e6572563f7907 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Tue, 23 Jun 2026 12:57:11 -0400 Subject: [PATCH] moderize error handling with errors.As/Is --- README.md | 6 +++--- bind/bind.go | 5 +++-- ios.go | 22 ++++++++++++---------- secretservice/secretservice.go | 5 +++++ secretservice/secretservice_test.go | 1 - 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 5412b1f..0636cb2 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ item.SetSynchronizable(keychain.SynchronizableNo) item.SetAccessible(keychain.AccessibleWhenUnlocked) err := keychain.AddItem(item) -if err == keychain.ErrorDuplicateItem { +if errors.Is(err, keychain.ErrorDuplicateItem) { // Duplicate } ``` @@ -98,7 +98,7 @@ item := keychain.NewGenericPassword("MyService", "gabriel", "A label", []byte("t item.SetSynchronizable(keychain.SynchronizableNo) item.SetAccessible(keychain.AccessibleWhenUnlocked) err := keychain.AddItem(item) -if err == keychain.ErrorDuplicateItem { +if errors.Is(err, keychain.ErrorDuplicateItem) { // Duplicate } @@ -108,7 +108,7 @@ accounts, err := keychain.GetGenericPasswordAccounts("MyService") // Should have 1 account == "gabriel" err := keychain.DeleteGenericPasswordItem("MyService", "gabriel") -if err == keychain.ErrorItemNotFound { +if errors.Is(err, keychain.ErrorItemNotFound) { // Not found } ``` diff --git a/bind/bind.go b/bind/bind.go index ebeca80..c3a41a8 100644 --- a/bind/bind.go +++ b/bind/bind.go @@ -3,6 +3,7 @@ package bind import ( + "errors" "fmt" "reflect" @@ -65,7 +66,7 @@ func GenericPasswordTest(t Test, service string, accessGroup string) { // Test dupe err = keychain.AddItem(item) - if err != keychain.ErrorDuplicateItem { + if !errors.Is(err, keychain.ErrorDuplicateItem) { t.Fail("Should error with duplicate item") } @@ -176,7 +177,7 @@ func GenericPasswordTest(t Test, service string, accessGroup string) { // Test remove not found err = keychain.DeleteItem(item) - if err != keychain.ErrorItemNotFound { + if !errors.Is(err, keychain.ErrorItemNotFound) { t.Fail("Error should be not found") } } diff --git a/ios.go b/ios.go index 9332508..f6533ad 100644 --- a/ios.go +++ b/ios.go @@ -10,13 +10,15 @@ package keychain */ import "C" -var AccessibleKey = attrKey(C.CFTypeRef(C.kSecAttrAccessible)) -var accessibleTypeRef = map[Accessible]C.CFTypeRef{ - AccessibleWhenUnlocked: C.CFTypeRef(C.kSecAttrAccessibleWhenUnlocked), - AccessibleAfterFirstUnlock: C.CFTypeRef(C.kSecAttrAccessibleAfterFirstUnlock), - AccessibleAlways: C.CFTypeRef(C.kSecAttrAccessibleAlways), - AccessibleWhenPasscodeSetThisDeviceOnly: C.CFTypeRef(C.kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly), - AccessibleWhenUnlockedThisDeviceOnly: C.CFTypeRef(C.kSecAttrAccessibleWhenUnlockedThisDeviceOnly), - AccessibleAfterFirstUnlockThisDeviceOnly: C.CFTypeRef(C.kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly), - AccessibleAccessibleAlwaysThisDeviceOnly: C.CFTypeRef(C.kSecAttrAccessibleAlwaysThisDeviceOnly), -} +var ( + AccessibleKey = attrKey(C.CFTypeRef(C.kSecAttrAccessible)) + accessibleTypeRef = map[Accessible]C.CFTypeRef{ + AccessibleWhenUnlocked: C.CFTypeRef(C.kSecAttrAccessibleWhenUnlocked), + AccessibleAfterFirstUnlock: C.CFTypeRef(C.kSecAttrAccessibleAfterFirstUnlock), + AccessibleAlways: C.CFTypeRef(C.kSecAttrAccessibleAlways), + AccessibleWhenPasscodeSetThisDeviceOnly: C.CFTypeRef(C.kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly), + AccessibleWhenUnlockedThisDeviceOnly: C.CFTypeRef(C.kSecAttrAccessibleWhenUnlockedThisDeviceOnly), + AccessibleAfterFirstUnlockThisDeviceOnly: C.CFTypeRef(C.kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly), + AccessibleAccessibleAlwaysThisDeviceOnly: C.CFTypeRef(C.kSecAttrAccessibleAlwaysThisDeviceOnly), + } +) diff --git a/secretservice/secretservice.go b/secretservice/secretservice.go index bbe35dc..870b58f 100644 --- a/secretservice/secretservice.go +++ b/secretservice/secretservice.go @@ -339,6 +339,11 @@ func (p PromptDismissedError) Error() string { return p.err.Error() } +// Unwrap +func (p PromptDismissedError) Unwrap() error { + return p.err +} + // PromptAndWait is NOT thread-safe. func (s *SecretService) PromptAndWait(prompt dbus.ObjectPath) (paths *dbus.Variant, err error) { if prompt == NullPrompt { diff --git a/secretservice/secretservice_test.go b/secretservice/secretservice_test.go index 4797031..c39d3b6 100644 --- a/secretservice/secretservice_test.go +++ b/secretservice/secretservice_test.go @@ -56,7 +56,6 @@ func testKeyring(t *testing.T, mode AuthenticationMode) { err = srv.LockItems([]dbus.ObjectPath{collection}) require.NoError(t, err) - } func TestGetAll(t *testing.T) {