feat(shared_addresses): save own shared addresses in DB (#3950)

This commit is contained in:
Jonathan Rainville 2023-08-29 14:56:30 -04:00 committed by GitHub
parent bd2c38db5d
commit f7b342bb07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 94 additions and 49 deletions

View File

@ -2150,7 +2150,7 @@ func (m *Manager) HandleCommunityRequestToJoin(signer *ecdsa.PublicKey, request
// Save revealed addresses + signatures so they can later be added // Save revealed addresses + signatures so they can later be added
// to the control node's local table of known revealed addresses // to the control node's local table of known revealed addresses
err = m.persistence.SaveRequestToJoinRevealedAddresses(requestToJoin) err = m.persistence.SaveRequestToJoinRevealedAddresses(requestToJoin.ID, requestToJoin.RevealedAccounts)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -2242,7 +2242,7 @@ func (m *Manager) HandleCommunityEditSharedAddresses(signer *ecdsa.PublicKey, re
if err != nil { if err != nil {
return err return err
} }
err = m.persistence.SaveRequestToJoinRevealedAddresses(requestToJoin) err = m.persistence.SaveRequestToJoinRevealedAddresses(requestToJoin.ID, requestToJoin.RevealedAccounts)
if err != nil { if err != nil {
return err return err
} }
@ -3140,6 +3140,14 @@ func (m *Manager) GetByIDString(idString string) (*Community, error) {
return m.GetByID(id) return m.GetByID(id)
} }
func (m *Manager) SaveRequestToJoinRevealedAddresses(requestID types.HexBytes, revealedAccounts []*protobuf.RevealedAccount) error {
return m.persistence.SaveRequestToJoinRevealedAddresses(requestID, revealedAccounts)
}
func (m *Manager) RemoveRequestToJoinRevealedAddresses(requestID types.HexBytes) error {
return m.persistence.RemoveRequestToJoinRevealedAddresses(requestID)
}
func (m *Manager) SaveRequestToJoinAndCommunity(requestToJoin *RequestToJoin, community *Community) (*Community, *RequestToJoin, error) { func (m *Manager) SaveRequestToJoinAndCommunity(requestToJoin *RequestToJoin, community *Community) (*Community, *RequestToJoin, error) {
if err := m.persistence.SaveRequestToJoin(requestToJoin); err != nil { if err := m.persistence.SaveRequestToJoin(requestToJoin); err != nil {
return nil, nil, err return nil, nil, err
@ -3147,6 +3155,11 @@ func (m *Manager) SaveRequestToJoinAndCommunity(requestToJoin *RequestToJoin, co
community.config.RequestedToJoinAt = uint64(time.Now().Unix()) community.config.RequestedToJoinAt = uint64(time.Now().Unix())
community.AddRequestToJoin(requestToJoin) community.AddRequestToJoin(requestToJoin)
// Save revealed addresses to our own table so that we can retrieve them later when editing
if err := m.SaveRequestToJoinRevealedAddresses(requestToJoin.ID, requestToJoin.RevealedAccounts); err != nil {
return nil, nil, err
}
return community, requestToJoin, nil return community, requestToJoin, nil
} }

View File

@ -378,7 +378,7 @@ func (p *Persistence) SaveRequestToJoin(request *RequestToJoin) (err error) {
return err return err
} }
func (p *Persistence) SaveRequestToJoinRevealedAddresses(request *RequestToJoin) (err error) { func (p *Persistence) SaveRequestToJoinRevealedAddresses(requestID types.HexBytes, revealedAccounts []*protobuf.RevealedAccount) (err error) {
tx, err := p.db.BeginTx(context.Background(), &sql.TxOptions{}) tx, err := p.db.BeginTx(context.Background(), &sql.TxOptions{})
if err != nil { if err != nil {
return return
@ -398,7 +398,7 @@ func (p *Persistence) SaveRequestToJoinRevealedAddresses(request *RequestToJoin)
return return
} }
defer stmt.Close() defer stmt.Close()
for _, account := range request.RevealedAccounts { for _, account := range revealedAccounts {
var chainIDs []string var chainIDs []string
for _, ID := range account.ChainIds { for _, ID := range account.ChainIds {
@ -406,7 +406,7 @@ func (p *Persistence) SaveRequestToJoinRevealedAddresses(request *RequestToJoin)
} }
_, err = stmt.Exec( _, err = stmt.Exec(
request.ID, requestID,
account.Address, account.Address,
strings.Join(chainIDs, ","), strings.Join(chainIDs, ","),
account.IsAirdropAddress, account.IsAirdropAddress,

View File

@ -385,11 +385,11 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) TestJoinedCommunityMembersSh
s.Require().Equal(3, community.MembersCount()) s.Require().Equal(3, community.MembersCount())
// Check owner's DB for revealed accounts
for pubKey := range community.Members() { for pubKey := range community.Members() {
if pubKey != common.PubkeyToHex(&s.owner.identity.PublicKey) { if pubKey != common.PubkeyToHex(&s.owner.identity.PublicKey) {
revealedAccounts, err := s.owner.communitiesManager.GetRevealedAddresses(community.ID(), pubKey) revealedAccounts, err := s.owner.communitiesManager.GetRevealedAddresses(community.ID(), pubKey)
s.Require().NoError(err) s.Require().NoError(err)
switch pubKey { switch pubKey {
case common.PubkeyToHex(&s.alice.identity.PublicKey): case common.PubkeyToHex(&s.alice.identity.PublicKey):
s.Require().Len(revealedAccounts, 2) s.Require().Len(revealedAccounts, 2)
@ -405,6 +405,21 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) TestJoinedCommunityMembersSh
} }
} }
} }
// Check Bob's DB for revealed accounts
revealedAccountsInBobsDB, err := s.bob.communitiesManager.GetRevealedAddresses(community.ID(), common.PubkeyToHex(&s.bob.identity.PublicKey))
s.Require().NoError(err)
s.Require().Len(revealedAccountsInBobsDB, 1)
s.Require().Equal(revealedAccountsInBobsDB[0].Address, bobAddress)
s.Require().Equal(true, revealedAccountsInBobsDB[0].IsAirdropAddress)
// Check Alices's DB for revealed accounts
revealedAccountsInAlicesDB, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), common.PubkeyToHex(&s.alice.identity.PublicKey))
s.Require().NoError(err)
s.Require().Len(revealedAccountsInAlicesDB, 2)
s.Require().Equal(revealedAccountsInAlicesDB[0].Address, aliceAddress1)
s.Require().Equal(revealedAccountsInAlicesDB[1].Address, aliceAddress2)
s.Require().Equal(true, revealedAccountsInAlicesDB[0].IsAirdropAddress)
} }
func (s *MessengerCommunitiesTokenPermissionsSuite) TestJoinedCommunityMembersSelectedSharedAddress() { func (s *MessengerCommunitiesTokenPermissionsSuite) TestJoinedCommunityMembersSelectedSharedAddress() {
@ -418,21 +433,21 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) TestJoinedCommunityMembersSe
s.Require().Equal(2, community.MembersCount()) s.Require().Equal(2, community.MembersCount())
for pubKey := range community.Members() { alicePubkey := common.PubkeyToHex(&s.alice.identity.PublicKey)
if pubKey != common.PubkeyToHex(&s.owner.identity.PublicKey) {
revealedAccounts, err := s.owner.communitiesManager.GetRevealedAddresses(community.ID(), pubKey)
s.Require().NoError(err)
s.Require().Len(revealedAccounts, 1)
switch pubKey { // Check owner's DB for revealed accounts
case common.PubkeyToHex(&s.alice.identity.PublicKey): revealedAccounts, err := s.owner.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
s.Require().Equal(revealedAccounts[0].Address, aliceAddress2) s.Require().NoError(err)
s.Require().Equal(true, revealedAccounts[0].IsAirdropAddress) s.Require().Len(revealedAccounts, 1)
default: s.Require().Equal(revealedAccounts[0].Address, aliceAddress2)
s.Require().Fail("pubKey does not match expected keys") s.Require().Equal(true, revealedAccounts[0].IsAirdropAddress)
}
} // Check Alice's DB for revealed accounts
} revealedAccountsInAlicesDB, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
s.Require().NoError(err)
s.Require().Len(revealedAccountsInAlicesDB, 1)
s.Require().Equal(revealedAccountsInAlicesDB[0].Address, aliceAddress2)
s.Require().Equal(true, revealedAccountsInAlicesDB[0].IsAirdropAddress)
} }
func (s *MessengerCommunitiesTokenPermissionsSuite) TestJoinedCommunityMembersMultipleSelectedSharedAddresses() { func (s *MessengerCommunitiesTokenPermissionsSuite) TestJoinedCommunityMembersMultipleSelectedSharedAddresses() {
@ -446,32 +461,23 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) TestJoinedCommunityMembersMu
s.Require().Equal(2, community.MembersCount()) s.Require().Equal(2, community.MembersCount())
for pubKey := range community.Members() { alicePubkey := common.PubkeyToHex(&s.alice.identity.PublicKey)
if pubKey != common.PubkeyToHex(&s.owner.identity.PublicKey) {
revealedAccounts, err := s.owner.communitiesManager.GetRevealedAddresses(community.ID(), pubKey)
s.Require().NoError(err)
s.Require().Len(revealedAccounts, 2)
switch pubKey { // Check owner's DB for revealed accounts
case common.PubkeyToHex(&s.alice.identity.PublicKey): revealedAccounts, err := s.owner.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
s.Require().Equal(revealedAccounts[0].Address, aliceAddress1) s.Require().NoError(err)
s.Require().Equal(revealedAccounts[1].Address, aliceAddress2) s.Require().Len(revealedAccounts, 2)
s.Require().Equal(true, revealedAccounts[1].IsAirdropAddress) s.Require().Equal(revealedAccounts[0].Address, aliceAddress1)
default: s.Require().Equal(revealedAccounts[1].Address, aliceAddress2)
s.Require().Fail("pubKey does not match expected keys") s.Require().Equal(true, revealedAccounts[1].IsAirdropAddress)
}
}
}
}
func (s *MessengerCommunitiesTokenPermissionsSuite) validateAddress(accounts []*protobuf.RevealedAccount, wantedAddress string) error { // Check Alice's DB for revealed accounts
revealedAccountsInAlicesDB, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
for _, account := range accounts { s.Require().NoError(err)
if account.Address != wantedAddress { s.Require().Len(revealedAccountsInAlicesDB, 2)
return errors.New("revealed address does not match the wanted address. Wanted " + wantedAddress + ", Found: " + account.Address) s.Require().Equal(revealedAccountsInAlicesDB[0].Address, aliceAddress1)
} s.Require().Equal(revealedAccountsInAlicesDB[1].Address, aliceAddress2)
} s.Require().Equal(true, revealedAccountsInAlicesDB[1].IsAirdropAddress)
return nil
} }
func (s *MessengerCommunitiesTokenPermissionsSuite) TestEditSharedAddresses() { func (s *MessengerCommunitiesTokenPermissionsSuite) TestEditSharedAddresses() {
@ -484,11 +490,20 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) TestEditSharedAddresses() {
s.Require().NoError(err) s.Require().NoError(err)
s.Require().Equal(2, community.MembersCount()) s.Require().Equal(2, community.MembersCount())
revealedAccounts, err := s.owner.communitiesManager.GetRevealedAddresses(community.ID(), common.PubkeyToHex(&s.alice.identity.PublicKey)) alicePubkey := common.PubkeyToHex(&s.alice.identity.PublicKey)
revealedAccounts, err := s.owner.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
s.Require().NoError(err) s.Require().NoError(err)
err = s.validateAddress(revealedAccounts, aliceAddress2) s.Require().Len(revealedAccounts, 1)
s.Require().Equal(revealedAccounts[0].Address, aliceAddress2)
s.Require().Equal(true, revealedAccounts[0].IsAirdropAddress)
alicesRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
s.Require().NoError(err) s.Require().NoError(err)
s.Require().Len(alicesRevealedAccounts, 1)
s.Require().Equal(alicesRevealedAccounts[0].Address, aliceAddress2)
s.Require().Equal(true, alicesRevealedAccounts[0].IsAirdropAddress)
passwdHash := types.EncodeHex(crypto.Keccak256([]byte(alicePassword))) passwdHash := types.EncodeHex(crypto.Keccak256([]byte(alicePassword)))
request := &requests.EditSharedAddresses{CommunityID: community.ID(), Password: passwdHash, AddressesToReveal: []string{aliceAddress1}, AirdropAddress: aliceAddress1} request := &requests.EditSharedAddresses{CommunityID: community.ID(), Password: passwdHash, AddressesToReveal: []string{aliceAddress1}, AirdropAddress: aliceAddress1}
@ -508,11 +523,12 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) TestEditSharedAddresses() {
return nil return nil
}) })
s.Require().NoError(err) s.Require().NoError(err)
revealedAccounts, err = s.owner.communitiesManager.GetRevealedAddresses(community.ID(), common.PubkeyToHex(&s.alice.identity.PublicKey)) revealedAccounts, err = s.owner.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
s.Require().NoError(err) s.Require().NoError(err)
err = s.validateAddress(revealedAccounts, aliceAddress1) s.Require().Len(revealedAccounts, 1)
s.Require().NoError(err) s.Require().Equal(revealedAccounts[0].Address, aliceAddress1)
s.Require().Equal(true, revealedAccounts[0].IsAirdropAddress)
// Retrieve community description change // Retrieve community description change
err = tt.RetryWithBackOff(func() error { err = tt.RetryWithBackOff(func() error {
@ -526,6 +542,12 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) TestEditSharedAddresses() {
return nil return nil
}) })
s.Require().NoError(err) s.Require().NoError(err)
alicesRevealedAccounts, err = s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
s.Require().NoError(err)
s.Require().Len(alicesRevealedAccounts, 1)
s.Require().Equal(alicesRevealedAccounts[0].Address, aliceAddress1)
s.Require().Equal(true, alicesRevealedAccounts[0].IsAirdropAddress)
} }
func (s *MessengerCommunitiesTokenPermissionsSuite) TestBecomeMemberPermissions() { func (s *MessengerCommunitiesTokenPermissionsSuite) TestBecomeMemberPermissions() {

View File

@ -1144,6 +1144,16 @@ func (m *Messenger) EditSharedAddressesForCommunity(request *requests.EditShared
requestToEditRevealedAccountsProto.RevealedAccounts = append(requestToEditRevealedAccountsProto.RevealedAccounts, revealedAccount) requestToEditRevealedAccountsProto.RevealedAccounts = append(requestToEditRevealedAccountsProto.RevealedAccounts, revealedAccount)
} }
requestID := communities.CalculateRequestID(common.PubkeyToHex(&m.identity.PublicKey), request.CommunityID)
err = m.communitiesManager.RemoveRequestToJoinRevealedAddresses(requestID)
if err != nil {
return nil, err
}
err = m.communitiesManager.SaveRequestToJoinRevealedAddresses(requestID, requestToEditRevealedAccountsProto.RevealedAccounts)
if err != nil {
return nil, err
}
payload, err := proto.Marshal(requestToEditRevealedAccountsProto) payload, err := proto.Marshal(requestToEditRevealedAccountsProto)
if err != nil { if err != nil {
return nil, err return nil, err