feat(shared_addresses): save own shared addresses in DB (#3950)
This commit is contained in:
parent
bd2c38db5d
commit
f7b342bb07
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue