From 92de6e7c851770cd4e0aa6b8cd5d943ade34dba1 Mon Sep 17 00:00:00 2001 From: ElectroNafta Date: Wed, 9 Apr 2025 11:29:40 +0200 Subject: [PATCH] feat(BRIDGE-348): add utility and tests functions for BYOE --- address_test.go | 12 ++++++------ address_types.go | 6 ++++++ server/backend/api.go | 15 +++++++++++++++ server/backend/backend.go | 4 ++-- server/backend/quark.go | 4 ++-- server/cmd/server/main.go | 2 +- server/server.go | 14 +++++++++++--- server/server_test.go | 8 ++++---- 8 files changed, 47 insertions(+), 18 deletions(-) diff --git a/address_test.go b/address_test.go index 1dab9f9..6effec8 100644 --- a/address_test.go +++ b/address_test.go @@ -16,11 +16,11 @@ func TestAddress_DisplayName(t *testing.T) { // Create a user on the server. userID, _, err := s.CreateUser("user", []byte("pass")) require.NoError(t, err) - addr1, err := s.CreateAddress(userID, "user1@pm.me", []byte("pass")) + addr1, err := s.CreateAddress(userID, "user1@pm.me", []byte("pass"), true) require.NoError(t, err) require.NoError(t, s.ChangeAddressDisplayName(userID, addr1, "User 1")) - addr2, err := s.CreateAddress(userID, "user2@pm.me", []byte("pass")) + addr2, err := s.CreateAddress(userID, "user2@pm.me", []byte("pass"), true) require.NoError(t, err) require.NoError(t, s.ChangeAddressDisplayName(userID, addr2, "User 2")) @@ -60,16 +60,16 @@ func TestAddress_Types(t *testing.T) { // Create a user on the server. userID, _, err := s.CreateUser("user", []byte("pass")) require.NoError(t, err) - id2, err := s.CreateAddress(userID, "user@alias.com", []byte("pass")) + id2, err := s.CreateAddress(userID, "user@alias.com", []byte("pass"), true) require.NoError(t, err) require.NoError(t, s.ChangeAddressType(userID, id2, proton.AddressTypeAlias)) - id3, err := s.CreateAddress(userID, "user@custom.com", []byte("pass")) + id3, err := s.CreateAddress(userID, "user@custom.com", []byte("pass"), true) require.NoError(t, err) require.NoError(t, s.ChangeAddressType(userID, id3, proton.AddressTypeCustom)) - id4, err := s.CreateAddress(userID, "user@premium.com", []byte("pass")) + id4, err := s.CreateAddress(userID, "user@premium.com", []byte("pass"), true) require.NoError(t, err) require.NoError(t, s.ChangeAddressType(userID, id4, proton.AddressTypePremium)) - id5, err := s.CreateAddress(userID, "user@external.com", []byte("pass")) + id5, err := s.CreateAddress(userID, "user@external.com", []byte("pass"), false) require.NoError(t, err) require.NoError(t, s.ChangeAddressType(userID, id5, proton.AddressTypeExternal)) diff --git a/address_types.go b/address_types.go index fffac3d..cb46b5f 100644 --- a/address_types.go +++ b/address_types.go @@ -36,3 +36,9 @@ const ( AddressTypePremium AddressTypeExternal ) + +// IsBYOEAddress - return a bool corresponding to whether an address is a BYOE address. +// BYOE addresses have sending enabled and are of type `external`. +func (a Address) IsBYOEAddress() bool { + return bool(a.Send) && a.Type == AddressTypeExternal +} diff --git a/server/backend/api.go b/server/backend/api.go index 431f9a8..ae11970 100644 --- a/server/backend/api.go +++ b/server/backend/api.go @@ -1131,6 +1131,21 @@ func (b *Backend) AddAddressCreatedUpdate(userID, addrID string) error { }) } +func (b *Backend) AddAddressUpdatedEvent(userID, addrID string) error { + return writeBackendRet(b, func(b *unsafeBackend) error { + return b.withAcc(userID, func(acc *account) error { + updateID, err := b.newUpdate(&addressUpdated{addressID: addrID}) + if err != nil { + return err + } + + acc.updateIDs = append(acc.updateIDs, updateID) + + return nil + }) + }) +} + func (b *Backend) AddLabelCreatedUpdate(userID, labelID string) error { return writeBackendRet(b, func(b *unsafeBackend) error { return b.withAcc(userID, func(acc *account) error { diff --git a/server/backend/backend.go b/server/backend/backend.go index a851bc2..a491734 100644 --- a/server/backend/backend.go +++ b/server/backend/backend.go @@ -254,9 +254,9 @@ func (b *Backend) RemoveUserKey(userID, keyID string) error { }) } -func (b *Backend) CreateAddress(userID, email string, password []byte, withKey bool, status proton.AddressStatus, addrType proton.AddressType) (string, error) { +func (b *Backend) CreateAddress(userID, email string, password []byte, withKey bool, status proton.AddressStatus, addrType proton.AddressType, withSending bool) (string, error) { return writeBackendRetErr(b, func(b *unsafeBackend) (string, error) { - return b.createAddress(userID, email, password, withKey, status, addrType, false, true) + return b.createAddress(userID, email, password, withKey, status, addrType, false, withSending) }) } diff --git a/server/backend/quark.go b/server/backend/quark.go index 2bee963..6005bcb 100644 --- a/server/backend/quark.go +++ b/server/backend/quark.go @@ -72,7 +72,7 @@ func (s *Backend) quarkUserCreate(args ...string) (proton.User, error) { // TODO: Create keys of different types (we always use RSA2048). if *newAddr || *genKeys != "" { - if _, err := s.CreateAddress(userID, *name+"@"+s.domain, []byte(*pass), *genKeys != "", addressStatus, proton.AddressTypeOriginal); err != nil { + if _, err := s.CreateAddress(userID, *name+"@"+s.domain, []byte(*pass), *genKeys != "", addressStatus, proton.AddressTypeOriginal, true); err != nil { return proton.User{}, fmt.Errorf("failed to create address with keys: %w", err) } } @@ -104,7 +104,7 @@ func (s *Backend) quarkUserCreateAddress(args ...string) (proton.Address, error) } // TODO: Create keys of different types (we always use RSA2048). - addrID, err := s.CreateAddress(fs.Arg(0), fs.Arg(2), []byte(fs.Arg(1)), *genKeys != "", addressStatus, proton.AddressTypeOriginal) + addrID, err := s.CreateAddress(fs.Arg(0), fs.Arg(2), []byte(fs.Arg(1)), *genKeys != "", addressStatus, proton.AddressTypeOriginal, true) if err != nil { return proton.Address{}, fmt.Errorf("failed to create address with keys: %w", err) } diff --git a/server/cmd/server/main.go b/server/cmd/server/main.go index 0f5329e..19833d4 100644 --- a/server/cmd/server/main.go +++ b/server/cmd/server/main.go @@ -91,7 +91,7 @@ func (s *service) RevokeUser(ctx context.Context, req *proto.RevokeUserRequest) } func (s *service) CreateAddress(ctx context.Context, req *proto.CreateAddressRequest) (*proto.CreateAddressResponse, error) { - addrID, err := s.server.CreateAddress(req.UserID, req.Email, req.Password) + addrID, err := s.server.CreateAddress(req.UserID, req.Email, req.Password, true) if err != nil { return nil, err } diff --git a/server/server.go b/server/server.go index 29ab61a..8fc7afc 100644 --- a/server/server.go +++ b/server/server.go @@ -112,7 +112,7 @@ func (s *Server) CreateUser(username string, password []byte) (string, string, e return "", "", err } - addrID, err := s.b.CreateAddress(userID, username+"@"+s.domain, password, true, proton.AddressStatusEnabled, proton.AddressTypeOriginal) + addrID, err := s.b.CreateAddress(userID, username+"@"+s.domain, password, true, proton.AddressStatusEnabled, proton.AddressTypeOriginal, true) if err != nil { return "", "", err } @@ -147,8 +147,12 @@ func (s *Server) RemoveUserKey(userID, keyID string) error { return s.b.RemoveUserKey(userID, keyID) } -func (s *Server) CreateAddress(userID, email string, password []byte) (string, error) { - return s.b.CreateAddress(userID, email, password, true, proton.AddressStatusEnabled, proton.AddressTypeOriginal) +func (s *Server) CreateAddress(userID, email string, password []byte, withSend bool) (string, error) { + return s.b.CreateAddress(userID, email, password, true, proton.AddressStatusEnabled, proton.AddressTypeOriginal, withSend) +} + +func (s *Server) CreateExternalAddress(userID, email string, password []byte, withSend bool) (string, error) { + return s.b.CreateAddress(userID, email, password, true, proton.AddressStatusEnabled, proton.AddressTypeExternal, withSend) } func (s *Server) CreateAddressAsUpdate(userID, email string, password []byte) (string, error) { @@ -208,6 +212,10 @@ func (s *Server) AddAddressCreatedEvent(userID, addrID string) error { return s.b.AddAddressCreatedUpdate(userID, addrID) } +func (s *Server) AddAddressUpdatedEvent(userID, addrID string) error { + return s.b.AddAddressUpdatedEvent(userID, addrID) +} + func (s *Server) AddLabelCreatedEvent(userID, labelID string) error { return s.b.AddLabelCreatedUpdate(userID, labelID) } diff --git a/server/server_test.go b/server/server_test.go index a3c0bef..3195894 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -1934,7 +1934,7 @@ func TestServer_AddressCreateDelete(t *testing.T) { require.NoError(t, err) // Create an address. - alias, err := s.CreateAddress(user.ID, "alias@example.com", []byte("pass")) + alias, err := s.CreateAddress(user.ID, "alias@example.com", []byte("pass"), true) require.NoError(t, err) // The user should have two addresses, both enabled. @@ -1982,13 +1982,13 @@ func TestServer_AddressOrder(t *testing.T) { require.NoError(t, err) // Create 3 additional addresses. - addr1, err := s.CreateAddress(user.ID, "addr1@example.com", []byte("pass")) + addr1, err := s.CreateAddress(user.ID, "addr1@example.com", []byte("pass"), true) require.NoError(t, err) - addr2, err := s.CreateAddress(user.ID, "addr2@example.com", []byte("pass")) + addr2, err := s.CreateAddress(user.ID, "addr2@example.com", []byte("pass"), true) require.NoError(t, err) - addr3, err := s.CreateAddress(user.ID, "addr3@example.com", []byte("pass")) + addr3, err := s.CreateAddress(user.ID, "addr3@example.com", []byte("pass"), true) require.NoError(t, err) addresses, err := c.GetAddresses(context.Background())