Skip to content

Commit

Permalink
Merge pull request #85 from 99designs/use-keychain-db-extension-in-si…
Browse files Browse the repository at this point in the history
…erra

Use `.keychain-db` extension on macOS Sierra
  • Loading branch information
dgoodlad committed Sep 13, 2016
2 parents 398f39a + f243c22 commit 1c5c5f2
Showing 1 changed file with 32 additions and 3 deletions.
35 changes: 32 additions & 3 deletions keyring/keychain.go
Expand Up @@ -20,6 +20,9 @@ import (
"log"
"os"
"os/user"
"strconv"
"strings"
"syscall"
"unicode/utf8"
"unsafe"
)
Expand All @@ -30,18 +33,44 @@ type keychain struct {
Passphrase string
}

func keychainPath(name string) (string, error) {
usr, err := user.Current()
if err != nil {
return "", err
}

// As of macOS Sierra, Keychain files are stored with the `.keychain-db`
// extension, rather than `.keychain`. The result of the kern.osrelease
// sysctl is the kernel version number in the form "major.minor.patch",
// and Sierra is the first macOS release to use kernel major version 16
osver, err := syscall.Sysctl("kern.osrelease")
if err != nil {
return "", err
}

major, err := strconv.Atoi(strings.Split(osver, ".")[0])
if err != nil {
return "", err
}

if major >= 16 {
return usr.HomeDir + "/Library/Keychains/" + name + ".keychain-db", nil
} else {
return usr.HomeDir + "/Library/Keychains/" + name + ".keychain", nil
}
}

func init() {
supportedBackends[KeychainBackend] = opener(func(name string) (Keyring, error) {
if name == "" {
name = "login"
}

usr, err := user.Current()
path, err := keychainPath(name)
if err != nil {
return nil, err
}

return &keychain{Path: usr.HomeDir + "/Library/Keychains/" + name + ".keychain", Service: name}, nil
return &keychain{Path: path, Service: name}, nil
})

DefaultBackend = KeychainBackend
Expand Down

0 comments on commit 1c5c5f2

Please sign in to comment.