package keychainlinker import ( "fmt" "path" "strconv" "github.com/godbus/dbus/v5" "github.com/godbus/dbus/v5/introspect" ) const DbusAdv = ` ` + introspect.IntrospectDataString + ` ` type Session struct { Path string Open int } /* Get the next session */ func (s *Session) next() int { s.Open = s.Open + 1 return s.Open } func (s *Session) OpenSession(algorithm string, input dbus.Variant) (dbus.Variant, dbus.ObjectPath, *dbus.Error) { if algorithm != "PLAIN" { return dbus.Variant{}, dbus.ObjectPath(""), &dbus.ErrMsgInvalidArg } nextPath := path.Join(s.Path, strconv.Itoa(s.next())) fmt.Println("recieved algorithm: ", algorithm, "\nresponding with path: ", nextPath) return dbus.MakeVariant(algorithm), dbus.ObjectPath(nextPath), nil } type SecretStruct struct { Session dbus.ObjectPath Parameters []byte Value []byte ContentType string } type SecretService struct { Collections []dbus.ObjectPath SessionBase string // e.g. "/org/freedesktop/secrets/session/" CollectionBase string // e.g. "/org/freedesktop/secrets/collection/" } type Collection struct { Items []dbus.ObjectPath // items in the collection Private string // specifies whether the collection is private or not Label string // The displayable label of this collection. Locked string // Whether the collection is locked and must be authenticated by the client application. Created uint64 // The unix time when the collection was created. Modified uint64 // The unix time when the collection was last modified. } // deletes the collection func (c *Collection) Delete() (dbus.ObjectPath, *dbus.Error) { return dbus.ObjectPath("prompt"), nil } /* Searches the collection for matching items :param attr: the attributes to attempt to match to a key in the collection */ func (c *Collection) SearchItems(attr map[string]string) ([]dbus.ObjectPath, *dbus.Error) { // implement a recursive searching thing return []dbus.ObjectPath{}, nil } /* Creates a new item in the collection with the properties defined in 'props'. Returns the items dbus object path, as well as a path to a dbus prompt :param fields: a map of properties to assign to the item. Will be used to match during lookups :param secret: the secret to encode into the collection :param replace: replace secret if a matching one is found in the store */ func (c *Collection) CreateItem(fields map[string]string, secret SecretStruct, replace bool) (dbus.ObjectPath, dbus.ObjectPath) { return dbus.ObjectPath("/"), dbus.ObjectPath("/") } /* Opens a session for the Secret Service Interface :param algorithm: the encryption algorithm to use with the client :param input: the data used when implementing more advanced encryption algos */ func (s *SecretService) OpenSession(algorithm string, input dbus.Variant) (dbus.Variant, dbus.ObjectPath, *dbus.Error) { if algorithm != "PLAIN" { return dbus.Variant{}, "/", dbus.MakeFailedError(fmt.Errorf("only PLAIN is supported")) } sessionPath := dbus.ObjectPath(path.Join(s.SessionBase, "1")) return input, sessionPath, nil } /* Creates a collection with the Service object :param properties: a set of properties that are used by client apps :param alias: the shortname of the collection */ func (s *SecretService) CreateCollection(properties map[string]dbus.Variant, alias string) (dbus.ObjectPath, dbus.ObjectPath, *dbus.Error) { collPath := dbus.ObjectPath(path.Join(s.CollectionBase, "login")) s.Collections = append(s.Collections, collPath) return collPath, "/", nil } /* search for items in the keychain that satisfy 'attrs' :param attrs: a map of search criteria */ func (s *SecretService) SearchItems(attrs map[string]string) ([]dbus.ObjectPath, []dbus.ObjectPath, *dbus.Error) { // Just return empty results for now return []dbus.ObjectPath{}, []dbus.ObjectPath{}, nil } /* sets all dbus.Objects in 'objects' to the 'unlocked' position :param objects: a slice of dbus.Objects to unlock */ func (s *SecretService) Unlock(objects []dbus.ObjectPath) ([]dbus.ObjectPath, dbus.ObjectPath, *dbus.Error) { return objects, "/", nil // No prompt } /* Sets all dbus.Objects in 'objects' to the 'locked' position :param objects: a slice of dbus.Objects to unlock */ func (s *SecretService) Lock(objects []dbus.ObjectPath) ([]dbus.ObjectPath, dbus.ObjectPath, *dbus.Error) { return objects, "/", nil // No prompt } /* retrives secrets from an array of items/collections :param items: a slice of dbus.ObjectPath that will have their secrets returned */ func (s *SecretService) GetSecrets(items []dbus.ObjectPath, session dbus.ObjectPath) (map[dbus.ObjectPath]SecretStruct, *dbus.Error) { return map[dbus.ObjectPath]SecretStruct{}, nil } /* returns the collection with the given alias 'name' :param name: the name of the alias to return */ func (s *SecretService) ReadAlias(name string) (dbus.ObjectPath, *dbus.Error) { return dbus.ObjectPath("/dev/aetherial/KeychainLinker/login"), nil } /* sets the collections alias name to the specified value in 'name' :param name: the alias name to assign :param collection: the dbus.ObjectPath to assign the alias name to */ func (s *SecretService) SetAlias(name string, collection dbus.ObjectPath) *dbus.Error { // will implement later return nil }