From 7e8804788ee0d309e02a5b7bb7a8b45fd9c8b7c3 Mon Sep 17 00:00:00 2001 From: Igor Sirotin Date: Mon, 20 Mar 2023 23:51:17 +1100 Subject: [PATCH] feat: Added `setInstallationName` method (#3294) --- VERSION | 2 +- protocol/encryption/multidevice/multidevice.go | 5 +++++ protocol/encryption/multidevice/persistence.go | 13 +++++++++++++ protocol/encryption/protocol.go | 5 +++++ protocol/messenger.go | 12 +++++++++++- services/ext/api.go | 5 +++++ 6 files changed, 40 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index ef3b951b9..820d5c2c5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.138.6 +0.138.7 diff --git a/protocol/encryption/multidevice/multidevice.go b/protocol/encryption/multidevice/multidevice.go index 86d95dc8a..46037ac2d 100644 --- a/protocol/encryption/multidevice/multidevice.go +++ b/protocol/encryption/multidevice/multidevice.go @@ -109,6 +109,11 @@ func (s *Multidevice) SetInstallationMetadata(identity *ecdsa.PublicKey, install return s.persistence.SetInstallationMetadata(identityC, installationID, metadata) } +func (s *Multidevice) SetInstallationName(identity *ecdsa.PublicKey, installationID string, name string) error { + identityC := crypto.CompressPubkey(identity) + return s.persistence.SetInstallationName(identityC, installationID, name) +} + func (s *Multidevice) EnableInstallation(identity *ecdsa.PublicKey, installationID string) error { identityC := crypto.CompressPubkey(identity) return s.persistence.EnableInstallation(identityC, installationID) diff --git a/protocol/encryption/multidevice/persistence.go b/protocol/encryption/multidevice/persistence.go index dc726af78..e7425fc0a 100644 --- a/protocol/encryption/multidevice/persistence.go +++ b/protocol/encryption/multidevice/persistence.go @@ -263,3 +263,16 @@ func (s *sqlitePersistence) SetInstallationMetadata(identity []byte, installatio _, err = stmt.Exec(metadata.Name, metadata.DeviceType, metadata.FCMToken, identity, installationID) return err } + +// SetInstallationName sets the only the name in metadata for a given installation +func (s *sqlitePersistence) SetInstallationName(identity []byte, installationID string, name string) error { + stmt, err := s.db.Prepare(`UPDATE installation_metadata + SET name = ? + WHERE identity = ? AND installation_id = ?`) + if err != nil { + return err + } + + _, err = stmt.Exec(name, identity, installationID) + return err +} diff --git a/protocol/encryption/protocol.go b/protocol/encryption/protocol.go index 4d2cef428..cd7cccf5d 100644 --- a/protocol/encryption/protocol.go +++ b/protocol/encryption/protocol.go @@ -471,6 +471,11 @@ func (p *Protocol) SetInstallationMetadata(myIdentityKey *ecdsa.PublicKey, insta return p.multidevice.SetInstallationMetadata(myIdentityKey, installationID, data) } +// SetInstallationName sets the metadata for our own installation +func (p *Protocol) SetInstallationName(myIdentityKey *ecdsa.PublicKey, installationID string, name string) error { + return p.multidevice.SetInstallationName(myIdentityKey, installationID, name) +} + // GetPublicBundle retrieves a public bundle given an identity func (p *Protocol) GetPublicBundle(theirIdentityKey *ecdsa.PublicKey) (*Bundle, error) { installations, err := p.multidevice.GetActiveInstallations(theirIdentityKey) diff --git a/protocol/messenger.go b/protocol/messenger.go index 4dd2ec7a9..c4f657bb2 100644 --- a/protocol/messenger.go +++ b/protocol/messenger.go @@ -1657,13 +1657,23 @@ func (m *Messenger) setInstallationMetadata(id string, data *multidevice.Install } installation.InstallationMetadata = data - return m.encryptor.SetInstallationMetadata(&m.identity.PublicKey, id, data) + return m.encryptor.SetInstallationMetadata(m.IdentityPublicKey(), id, data) } func (m *Messenger) SetInstallationMetadata(id string, data *multidevice.InstallationMetadata) error { return m.setInstallationMetadata(id, data) } +func (m *Messenger) SetInstallationName(id string, name string) error { + installation, ok := m.allInstallations.Load(id) + if !ok { + return errors.New("no installation found") + } + + installation.InstallationMetadata.Name = name + return m.encryptor.SetInstallationName(m.IdentityPublicKey(), id, name) +} + // NOT IMPLEMENTED func (m *Messenger) SelectMailserver(id string) error { return ErrNotImplemented diff --git a/services/ext/api.go b/services/ext/api.go index e1a7e765f..0335c964b 100644 --- a/services/ext/api.go +++ b/services/ext/api.go @@ -358,6 +358,11 @@ func (api *PublicAPI) SetInstallationMetadata(installationID string, data *multi return api.service.messenger.SetInstallationMetadata(installationID, data) } +// SetInstallationName sets the only the name in metadata for a given installation +func (api *PublicAPI) SetInstallationName(installationID string, name string) error { + return api.service.messenger.SetInstallationName(installationID, name) +} + // Communities returns a list of communities that are stored func (api *PublicAPI) Communities(parent context.Context) ([]*communities.Community, error) { return api.service.messenger.Communities()