6 "github.com/keybase/go-keychain"
23 listener, err := net.Listen("unix", path)
27 defer listener.Close()
31 conn, err := listener.Accept()
36 go handleConnection(conn)
39 log.Print("Open and ready for business on UNIX socket at ", path)
41 // Need to catch signals in order for `defer`-ed clean-up items to run.
42 c := make(chan os.Signal, 1)
43 signal.Notify(c, os.Interrupt, os.Kill, syscall.SIGTERM)
45 log.Print("Got signal ", sig)
48 func getSockPath() string {
49 user, err := user.Current()
53 return user.HomeDir + "/.passage.sock"
56 func handleConnection(conn net.Conn) {
58 decoder := json.NewDecoder(conn)
60 err := decoder.Decode(&request)
66 query := keychain.NewItem()
67 query.SetSecClass(keychain.SecClassGenericPassword)
68 query.SetService(request.Service)
69 query.SetAccount(request.Account)
70 query.SetMatchLimit(keychain.MatchLimitOne)
71 query.SetReturnData(true)
72 results, err := keychain.QueryItem(query)
75 } else if len(results) != 1 {
76 log.Print("not found")
78 password := string(results[0].Data)