Skip to content

Commit f4cdabf

Browse files
committed
osxkeychain: store: use Apple's proto consts
Commit 4cdcdc2 swapped consts `kSecProtocolTypeHTTPS` and `kSecProtocolTypeHTTP` with plain-text "https" and "http" strings. This is causing a regression where credentials stored with prior versions (< v0.9.0) can't be fetched anymore. Unfortunately we can't just revert back to using Objective-C consts, as these are unsigned integers that need to be converted into `CFStringRef` and then passed to an helper like `keychain.CFStringToString`. Although `keychain.CFStringToString` is exported, it takes a C type `C.CFStringRef` so it's not consumable from other packages due to Cgo restrictions: > Cgo translates C types into equivalent unexported Go types. Because > the translations are unexported, a Go package should not expose C > types in its exported API: a C type used in one Go package is > different from the same C type used in another. We could alternatively copy `keychain.CFStringToString` into the `osxkeychain` package, but this commit takes a simpler approach: just hardcode the value of `kSecProtocolTypeHTTPS` and `kSecProtocolTypeHTTP` as strings. (These consts are very unlikely to ever change since it'd break all existing consumers.) This is **NOT** handling backward compatibility with v0.9.0, since it was released only 12hrs ago. So this fix won't work with credentials created with v0.9.0. Signed-off-by: Albin Kerouanton <[email protected]>
1 parent c7514a0 commit f4cdabf

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

osxkeychain/osxkeychain.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,22 @@ func (h Osxkeychain) List() (map[string]string, error) {
129129
return resp, nil
130130
}
131131

132+
const (
133+
// Hardcoded protocol types matching their Objective-C equivalents.
134+
// https://developer.apple.com/documentation/security/ksecattrprotocolhttps?language=objc
135+
kSecProtocolTypeHTTPS = "htps" // This is NOT a typo.
136+
// https://developer.apple.com/documentation/security/ksecattrprotocolhttp?language=objc
137+
kSecProtocolTypeHTTP = "http"
138+
)
139+
132140
func splitServer(serverURL string, item keychain.Item) error {
133141
u, err := registryurl.Parse(serverURL)
134142
if err != nil {
135143
return err
136144
}
137-
item.SetProtocol("https")
145+
item.SetProtocol(kSecProtocolTypeHTTPS)
138146
if u.Scheme == "http" {
139-
item.SetProtocol("http")
147+
item.SetProtocol(kSecProtocolTypeHTTP)
140148
}
141149
item.SetServer(u.Hostname())
142150
if p := u.Port(); p != "" {

0 commit comments

Comments
 (0)