mirror of
https://github.com/status-im/status-go.git
synced 2025-02-16 16:56:53 +00:00
parent
ad326fa290
commit
e6a3f63ec7
@ -836,7 +836,6 @@ func (m *Manager) DeclineRequestToJoin(request *requests.DeclineRequestToJoinCom
|
|||||||
}
|
}
|
||||||
|
|
||||||
return m.persistence.SetRequestToJoinState(dbRequest.PublicKey, dbRequest.CommunityID, RequestToJoinStateDeclined)
|
return m.persistence.SetRequestToJoinState(dbRequest.PublicKey, dbRequest.CommunityID, RequestToJoinStateDeclined)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) HandleCommunityRequestToJoin(signer *ecdsa.PublicKey, request *protobuf.CommunityRequestToJoin) (*RequestToJoin, error) {
|
func (m *Manager) HandleCommunityRequestToJoin(signer *ecdsa.PublicKey, request *protobuf.CommunityRequestToJoin) (*RequestToJoin, error) {
|
||||||
@ -1212,6 +1211,11 @@ func (m *Manager) PendingRequestsToJoinForCommunity(id types.HexBytes) ([]*Reque
|
|||||||
return m.persistence.PendingRequestsToJoinForCommunity(id)
|
return m.persistence.PendingRequestsToJoinForCommunity(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Manager) DeclinedRequestsToJoinForCommunity(id types.HexBytes) ([]*RequestToJoin, error) {
|
||||||
|
m.logger.Info("fetching declined invitations", zap.String("community-id", id.String()))
|
||||||
|
return m.persistence.DeclinedRequestsToJoinForCommunity(id)
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Manager) CanPost(pk *ecdsa.PublicKey, communityID string, chatID string, grant []byte) (bool, error) {
|
func (m *Manager) CanPost(pk *ecdsa.PublicKey, communityID string, chatID string, grant []byte) (bool, error) {
|
||||||
community, err := m.GetByIDString(communityID)
|
community, err := m.GetByIDString(communityID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -337,9 +337,9 @@ func (p *Persistence) HasPendingRequestsToJoinForUserAndCommunity(userPk string,
|
|||||||
return count > 0, nil
|
return count > 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Persistence) PendingRequestsToJoinForCommunity(id []byte) ([]*RequestToJoin, error) {
|
func (p *Persistence) RequestsToJoinForCommunityWithState(id []byte, state RequestToJoinState) ([]*RequestToJoin, error) {
|
||||||
var requests []*RequestToJoin
|
var requests []*RequestToJoin
|
||||||
rows, err := p.db.Query(`SELECT id,public_key,clock,ens_name,chat_id,community_id,state FROM communities_requests_to_join WHERE state = ? AND community_id = ?`, RequestToJoinStatePending, id)
|
rows, err := p.db.Query(`SELECT id,public_key,clock,ens_name,chat_id,community_id,state FROM communities_requests_to_join WHERE state = ? AND community_id = ?`, state, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -356,6 +356,14 @@ func (p *Persistence) PendingRequestsToJoinForCommunity(id []byte) ([]*RequestTo
|
|||||||
return requests, nil
|
return requests, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Persistence) PendingRequestsToJoinForCommunity(id []byte) ([]*RequestToJoin, error) {
|
||||||
|
return p.RequestsToJoinForCommunityWithState(id, RequestToJoinStatePending)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Persistence) DeclinedRequestsToJoinForCommunity(id []byte) ([]*RequestToJoin, error) {
|
||||||
|
return p.RequestsToJoinForCommunityWithState(id, RequestToJoinStateDeclined)
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Persistence) SetRequestToJoinState(pk string, communityID []byte, state RequestToJoinState) error {
|
func (p *Persistence) SetRequestToJoinState(pk string, communityID []byte, state RequestToJoinState) error {
|
||||||
_, err := p.db.Exec(`UPDATE communities_requests_to_join SET state = ? WHERE community_id = ? AND public_key = ?`, state, communityID, pk)
|
_, err := p.db.Exec(`UPDATE communities_requests_to_join SET state = ? WHERE community_id = ? AND public_key = ?`, state, communityID, pk)
|
||||||
return err
|
return err
|
||||||
|
@ -1185,6 +1185,185 @@ func (s *MessengerCommunitiesSuite) TestRequestAccessAgain() {
|
|||||||
s.Require().Equal(requestToJoin3.ID, requestToJoin4.ID)
|
s.Require().Equal(requestToJoin3.ID, requestToJoin4.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *MessengerCommunitiesSuite) TestDeclineAccess() {
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
description := &requests.CreateCommunity{
|
||||||
|
Membership: protobuf.CommunityPermissions_ON_REQUEST,
|
||||||
|
Name: "status",
|
||||||
|
Color: "#ffffff",
|
||||||
|
Description: "status community description",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create an community chat
|
||||||
|
response, err := s.bob.CreateCommunity(description, true)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().Len(response.Communities(), 1)
|
||||||
|
|
||||||
|
community := response.Communities()[0]
|
||||||
|
|
||||||
|
chat := CreateOneToOneChat(common.PubkeyToHex(&s.alice.identity.PublicKey), &s.alice.identity.PublicKey, s.alice.transport)
|
||||||
|
|
||||||
|
s.Require().NoError(s.bob.SaveChat(chat))
|
||||||
|
|
||||||
|
message := buildTestMessage(*chat)
|
||||||
|
message.CommunityID = community.IDString()
|
||||||
|
|
||||||
|
// We send a community link to alice
|
||||||
|
response, err = s.bob.SendChatMessage(ctx, message)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
|
||||||
|
// Retrieve community link & community
|
||||||
|
err = tt.RetryWithBackOff(func() error {
|
||||||
|
response, err = s.alice.RetrieveAll()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(response.Communities()) == 0 {
|
||||||
|
return errors.New("message not received")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
request := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
||||||
|
// We try to join the org
|
||||||
|
response, err = s.alice.RequestToJoinCommunity(request)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().Len(response.RequestsToJoinCommunity, 1)
|
||||||
|
|
||||||
|
requestToJoin1 := response.RequestsToJoinCommunity[0]
|
||||||
|
s.Require().NotNil(requestToJoin1)
|
||||||
|
s.Require().Equal(community.ID(), requestToJoin1.CommunityID)
|
||||||
|
s.Require().True(requestToJoin1.Our)
|
||||||
|
s.Require().NotEmpty(requestToJoin1.ID)
|
||||||
|
s.Require().NotEmpty(requestToJoin1.Clock)
|
||||||
|
s.Require().Equal(requestToJoin1.PublicKey, common.PubkeyToHex(&s.alice.identity.PublicKey))
|
||||||
|
s.Require().Equal(communities.RequestToJoinStatePending, requestToJoin1.State)
|
||||||
|
|
||||||
|
// Make sure clock is not empty
|
||||||
|
s.Require().NotEmpty(requestToJoin1.Clock)
|
||||||
|
|
||||||
|
s.Require().Len(response.Communities(), 1)
|
||||||
|
s.Require().Equal(response.Communities()[0].RequestedToJoinAt(), requestToJoin1.Clock)
|
||||||
|
|
||||||
|
// pull all communities to make sure we set RequestedToJoinAt
|
||||||
|
|
||||||
|
allCommunities, err := s.alice.Communities()
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(allCommunities, 2)
|
||||||
|
|
||||||
|
if bytes.Equal(allCommunities[0].ID(), community.ID()) {
|
||||||
|
s.Require().Equal(allCommunities[0].RequestedToJoinAt(), requestToJoin1.Clock)
|
||||||
|
} else {
|
||||||
|
s.Require().Equal(allCommunities[1].RequestedToJoinAt(), requestToJoin1.Clock)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve request to join
|
||||||
|
err = tt.RetryWithBackOff(func() error {
|
||||||
|
response, err = s.bob.RetrieveAll()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(response.RequestsToJoinCommunity) == 0 {
|
||||||
|
return errors.New("request to join community not received")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(response.RequestsToJoinCommunity, 1)
|
||||||
|
|
||||||
|
// Check if admin sees requests correctly
|
||||||
|
requestsToJoin, err := s.bob.PendingRequestsToJoinForCommunity(community.ID())
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(requestsToJoin, 1)
|
||||||
|
|
||||||
|
requestsToJoin, err = s.bob.DeclinedRequestsToJoinForCommunity(community.ID())
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(requestsToJoin, 0)
|
||||||
|
|
||||||
|
requestToJoin2 := response.RequestsToJoinCommunity[0]
|
||||||
|
|
||||||
|
s.Require().NotNil(requestToJoin2)
|
||||||
|
s.Require().Equal(community.ID(), requestToJoin2.CommunityID)
|
||||||
|
s.Require().False(requestToJoin2.Our)
|
||||||
|
s.Require().NotEmpty(requestToJoin2.ID)
|
||||||
|
s.Require().NotEmpty(requestToJoin2.Clock)
|
||||||
|
s.Require().Equal(requestToJoin2.PublicKey, common.PubkeyToHex(&s.alice.identity.PublicKey))
|
||||||
|
s.Require().Equal(communities.RequestToJoinStatePending, requestToJoin2.State)
|
||||||
|
|
||||||
|
s.Require().Equal(requestToJoin1.ID, requestToJoin2.ID)
|
||||||
|
|
||||||
|
// Decline request
|
||||||
|
declinedRequestToJoin := &requests.DeclineRequestToJoinCommunity{ID: requestToJoin1.ID}
|
||||||
|
err = s.bob.DeclineRequestToJoinCommunity(declinedRequestToJoin)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
// Check if admin sees requests correctly
|
||||||
|
requestsToJoin, err = s.bob.PendingRequestsToJoinForCommunity(community.ID())
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(requestsToJoin, 0)
|
||||||
|
|
||||||
|
requestsToJoin, err = s.bob.DeclinedRequestsToJoinForCommunity(community.ID())
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(requestsToJoin, 1)
|
||||||
|
|
||||||
|
// Accept declined request
|
||||||
|
acceptRequestToJoin := &requests.AcceptRequestToJoinCommunity{ID: requestToJoin1.ID}
|
||||||
|
response, err = s.bob.AcceptRequestToJoinCommunity(acceptRequestToJoin)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
|
||||||
|
s.Require().Len(response.Communities(), 1)
|
||||||
|
|
||||||
|
updatedCommunity := response.Communities()[0]
|
||||||
|
|
||||||
|
s.Require().NotNil(updatedCommunity)
|
||||||
|
s.Require().True(updatedCommunity.HasMember(&s.alice.identity.PublicKey))
|
||||||
|
|
||||||
|
// Pull message and make sure org is received
|
||||||
|
err = tt.RetryWithBackOff(func() error {
|
||||||
|
response, err = s.alice.RetrieveAll()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(response.Communities()) == 0 {
|
||||||
|
return errors.New("community not received")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
|
||||||
|
s.Require().Len(response.Communities(), 1)
|
||||||
|
|
||||||
|
aliceCommunity := response.Communities()[0]
|
||||||
|
|
||||||
|
s.Require().Equal(community.ID(), aliceCommunity.ID())
|
||||||
|
s.Require().True(aliceCommunity.HasMember(&s.alice.identity.PublicKey))
|
||||||
|
|
||||||
|
// Community should be joined at this point
|
||||||
|
s.Require().True(aliceCommunity.Joined())
|
||||||
|
|
||||||
|
// Make sure the requests are not pending on either sides
|
||||||
|
requestsToJoin, err = s.bob.PendingRequestsToJoinForCommunity(community.ID())
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(requestsToJoin, 0)
|
||||||
|
|
||||||
|
requestsToJoin, err = s.bob.DeclinedRequestsToJoinForCommunity(community.ID())
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(requestsToJoin, 0)
|
||||||
|
|
||||||
|
requestsToJoin, err = s.alice.MyPendingRequestsToJoin()
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(requestsToJoin, 0)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *MessengerCommunitiesSuite) TestShareCommunity() {
|
func (s *MessengerCommunitiesSuite) TestShareCommunity() {
|
||||||
description := &requests.CreateCommunity{
|
description := &requests.CreateCommunity{
|
||||||
Membership: protobuf.CommunityPermissions_NO_MEMBERSHIP,
|
Membership: protobuf.CommunityPermissions_NO_MEMBERSHIP,
|
||||||
|
@ -1021,6 +1021,10 @@ func (m *Messenger) PendingRequestsToJoinForCommunity(id types.HexBytes) ([]*com
|
|||||||
return m.communitiesManager.PendingRequestsToJoinForCommunity(id)
|
return m.communitiesManager.PendingRequestsToJoinForCommunity(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Messenger) DeclinedRequestsToJoinForCommunity(id types.HexBytes) ([]*communities.RequestToJoin, error) {
|
||||||
|
return m.communitiesManager.DeclinedRequestsToJoinForCommunity(id)
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Messenger) RemoveUserFromCommunity(id types.HexBytes, pkString string) (*MessengerResponse, error) {
|
func (m *Messenger) RemoveUserFromCommunity(id types.HexBytes, pkString string) (*MessengerResponse, error) {
|
||||||
publicKey, err := common.HexToPubkey(pkString)
|
publicKey, err := common.HexToPubkey(pkString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -474,6 +474,11 @@ func (api *PublicAPI) PendingRequestsToJoinForCommunity(id types.HexBytes) ([]*c
|
|||||||
return api.service.messenger.PendingRequestsToJoinForCommunity(id)
|
return api.service.messenger.PendingRequestsToJoinForCommunity(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeclinedRequestsToJoinForCommunity returns the declined requests to join for a given community
|
||||||
|
func (api *PublicAPI) DeclinedRequestsToJoinForCommunity(id types.HexBytes) ([]*communities.RequestToJoin, error) {
|
||||||
|
return api.service.messenger.DeclinedRequestsToJoinForCommunity(id)
|
||||||
|
}
|
||||||
|
|
||||||
// AcceptRequestToJoinCommunity accepts a pending request to join a community
|
// AcceptRequestToJoinCommunity accepts a pending request to join a community
|
||||||
func (api *PublicAPI) AcceptRequestToJoinCommunity(request *requests.AcceptRequestToJoinCommunity) (*protocol.MessengerResponse, error) {
|
func (api *PublicAPI) AcceptRequestToJoinCommunity(request *requests.AcceptRequestToJoinCommunity) (*protocol.MessengerResponse, error) {
|
||||||
return api.service.messenger.AcceptRequestToJoinCommunity(request)
|
return api.service.messenger.AcceptRequestToJoinCommunity(request)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user