From 97350ff7b7dce60944a4f5abb77448552770ea07 Mon Sep 17 00:00:00 2001 From: bcmmbaga Date: Thu, 7 Dec 2023 20:03:53 +0300 Subject: [PATCH] Add management peer logout --- management/server/account.go | 1 + management/server/mock_server/account_mock.go | 9 +++++++ management/server/peer.go | 25 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/management/server/account.go b/management/server/account.go index 4c13c8535..544f5069b 100644 --- a/management/server/account.go +++ b/management/server/account.go @@ -112,6 +112,7 @@ type AccountManager interface { GetPeer(accountID, peerID, userID string) (*nbpeer.Peer, error) UpdateAccountSettings(accountID, userID string, newSettings *Settings) (*Account, error) LoginPeer(login PeerLogin) (*nbpeer.Peer, *NetworkMap, error) // used by peer gRPC API + LogoutPeer(peerPubKey string) error // used by peer gRPC API SyncPeer(sync PeerSync) (*nbpeer.Peer, *NetworkMap, error) // used by peer gRPC API GetAllConnectedPeers() (map[string]struct{}, error) HasConnectedChannel(peerID string) bool diff --git a/management/server/mock_server/account_mock.go b/management/server/mock_server/account_mock.go index a349b35a9..73d303330 100644 --- a/management/server/mock_server/account_mock.go +++ b/management/server/mock_server/account_mock.go @@ -78,6 +78,7 @@ type MockAccountManager struct { GetPeerFunc func(accountID, peerID, userID string) (*nbpeer.Peer, error) UpdateAccountSettingsFunc func(accountID, userID string, newSettings *server.Settings) (*server.Account, error) LoginPeerFunc func(login server.PeerLogin) (*nbpeer.Peer, *server.NetworkMap, error) + LogoutPeerFunc func(peerPubKey string) error SyncPeerFunc func(sync server.PeerSync) (*nbpeer.Peer, *server.NetworkMap, error) InviteUserFunc func(accountID string, initiatorUserID string, targetUserEmail string) error GetAllConnectedPeersFunc func() (map[string]struct{}, error) @@ -607,6 +608,14 @@ func (am *MockAccountManager) LoginPeer(login server.PeerLogin) (*nbpeer.Peer, * return nil, nil, status.Errorf(codes.Unimplemented, "method LoginPeer is not implemented") } +// LogoutPeer mocks LogoutPeer of the AccountManager interface +func (am *MockAccountManager) LogoutPeer(peerPubKey string) error { + if am.LogoutPeerFunc != nil { + return am.LogoutPeerFunc(peerPubKey) + } + return status.Errorf(codes.Unimplemented, "method LogoutPeer is not implemented") +} + // SyncPeer mocks SyncPeer of the AccountManager interface func (am *MockAccountManager) SyncPeer(sync server.PeerSync) (*nbpeer.Peer, *server.NetworkMap, error) { if am.SyncPeerFunc != nil { diff --git a/management/server/peer.go b/management/server/peer.go index 18d3f0e01..0a233240e 100644 --- a/management/server/peer.go +++ b/management/server/peer.go @@ -576,6 +576,31 @@ func (am *DefaultAccountManager) LoginPeer(login PeerLogin) (*nbpeer.Peer, *Netw return peer, account.GetPeerNetworkMap(peer.ID, am.dnsDomain), nil } +// LogoutPeer logs out registered peer by delete it and send updates to the remote peers. +func (am *DefaultAccountManager) LogoutPeer(peerPubKey string) error { + account, err := am.Store.GetAccountByPeerPubKey(peerPubKey) + if err != nil { + if errStatus, ok := status.FromError(err); ok && errStatus.Type() == status.NotFound { + return status.Errorf(status.Unauthenticated, "peer is not registered") + } + + log.Errorf("failed while logging out peer %s: %v", peerPubKey, err) + return status.Errorf(status.Internal, "failed while logging out peer") + } + + peer, err := account.FindPeerByPubKey(peerPubKey) + if err != nil { + return status.Errorf(status.Unauthenticated, "peer is not registered") + } + + // prevent logging out peer added by setup key + if peer.UserID == "" { + return status.Errorf(status.PermissionDenied, "peer was added by setup key") + } + + return am.DeletePeer(account.Id, peer.ID, peer.UserID) +} + func checkIfPeerOwnerIsBlocked(peer *nbpeer.Peer, account *Account) error { if peer.AddedWithSSOLogin() { user, err := account.FindUser(peer.UserID)