Validate no duplicated community chat names
This commit is contained in:
parent
22204c3757
commit
cc0bb8540e
|
@ -262,6 +262,12 @@ func (o *Community) CreateChat(chatID string, chat *protobuf.CommunityChat) (*Co
|
||||||
return nil, ErrChatAlreadyExists
|
return nil, ErrChatAlreadyExists
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, c := range o.config.CommunityDescription.Chats {
|
||||||
|
if chat.Identity.DisplayName == c.Identity.DisplayName {
|
||||||
|
return nil, ErrInvalidCommunityDescriptionDuplicatedName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Sets the chat position to be the last within its category
|
// Sets the chat position to be the last within its category
|
||||||
chat.Position = 0
|
chat.Position = 0
|
||||||
for _, c := range o.config.CommunityDescription.Chats {
|
for _, c := range o.config.CommunityDescription.Chats {
|
||||||
|
|
|
@ -57,10 +57,11 @@ func (s *CommunitySuite) TestCreateCategory() {
|
||||||
Access: protobuf.CommunityPermissions_NO_MEMBERSHIP,
|
Access: protobuf.CommunityPermissions_NO_MEMBERSHIP,
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _ = org.CreateChat(newChatID, &protobuf.CommunityChat{
|
_, err = org.CreateChat(newChatID, &protobuf.CommunityChat{
|
||||||
Identity: identity,
|
Identity: identity,
|
||||||
Permissions: permissions,
|
Permissions: permissions,
|
||||||
})
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
changes, err = org.CreateCategory(newCategoryID3, newCategoryName3, []string{newChatID})
|
changes, err = org.CreateCategory(newCategoryID3, newCategoryName3, []string{newChatID})
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
@ -81,10 +82,11 @@ func (s *CommunitySuite) TestEditCategory() {
|
||||||
|
|
||||||
org := s.buildCommunity(&s.identity.PublicKey)
|
org := s.buildCommunity(&s.identity.PublicKey)
|
||||||
org.config.PrivateKey = s.identity
|
org.config.PrivateKey = s.identity
|
||||||
_, _ = org.CreateCategory(newCategoryID, newCategoryName, []string{testChatID1})
|
_, err := org.CreateCategory(newCategoryID, newCategoryName, []string{testChatID1})
|
||||||
|
s.Require().NoError(err)
|
||||||
org.config.PrivateKey = nil
|
org.config.PrivateKey = nil
|
||||||
|
|
||||||
_, err := org.EditCategory(newCategoryID, editedCategoryName, []string{testChatID1})
|
_, err = org.EditCategory(newCategoryID, editedCategoryName, []string{testChatID1})
|
||||||
s.Require().Equal(ErrNotAdmin, err)
|
s.Require().Equal(ErrNotAdmin, err)
|
||||||
|
|
||||||
org.config.PrivateKey = s.identity
|
org.config.PrivateKey = s.identity
|
||||||
|
@ -111,7 +113,7 @@ func (s *CommunitySuite) TestEditCategory() {
|
||||||
|
|
||||||
// Edit by removing the chats
|
// Edit by removing the chats
|
||||||
|
|
||||||
identity := &protobuf.ChatIdentity{
|
identity1 := &protobuf.ChatIdentity{
|
||||||
DisplayName: "new-chat-display-name",
|
DisplayName: "new-chat-display-name",
|
||||||
Description: "new-chat-description",
|
Description: "new-chat-description",
|
||||||
}
|
}
|
||||||
|
@ -122,14 +124,21 @@ func (s *CommunitySuite) TestEditCategory() {
|
||||||
testChatID2 := "test-chat-id-2"
|
testChatID2 := "test-chat-id-2"
|
||||||
testChatID3 := "test-chat-id-3"
|
testChatID3 := "test-chat-id-3"
|
||||||
|
|
||||||
_, _ = org.CreateChat(testChatID2, &protobuf.CommunityChat{
|
_, err = org.CreateChat(testChatID2, &protobuf.CommunityChat{
|
||||||
Identity: identity,
|
Identity: identity1,
|
||||||
Permissions: permissions,
|
Permissions: permissions,
|
||||||
})
|
})
|
||||||
_, _ = org.CreateChat(testChatID3, &protobuf.CommunityChat{
|
s.Require().NoError(err)
|
||||||
Identity: identity,
|
identity2 := &protobuf.ChatIdentity{
|
||||||
|
DisplayName: "identity-2",
|
||||||
|
Description: "new-chat-description",
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = org.CreateChat(testChatID3, &protobuf.CommunityChat{
|
||||||
|
Identity: identity2,
|
||||||
Permissions: permissions,
|
Permissions: permissions,
|
||||||
})
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
_, err = org.EditCategory(newCategoryID, editedCategoryName, []string{testChatID1, testChatID2, testChatID3})
|
_, err = org.EditCategory(newCategoryID, editedCategoryName, []string{testChatID1, testChatID2, testChatID3})
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
@ -142,12 +151,14 @@ func (s *CommunitySuite) TestEditCategory() {
|
||||||
s.Require().Equal(int32(1), description.Chats[testChatID2].Position)
|
s.Require().Equal(int32(1), description.Chats[testChatID2].Position)
|
||||||
s.Require().Equal(int32(2), description.Chats[testChatID3].Position)
|
s.Require().Equal(int32(2), description.Chats[testChatID3].Position)
|
||||||
|
|
||||||
_, _ = org.EditCategory(newCategoryID, editedCategoryName, []string{testChatID1, testChatID3})
|
_, err = org.EditCategory(newCategoryID, editedCategoryName, []string{testChatID1, testChatID3})
|
||||||
|
s.Require().NoError(err)
|
||||||
s.Require().Equal("", description.Chats[testChatID2].CategoryId)
|
s.Require().Equal("", description.Chats[testChatID2].CategoryId)
|
||||||
s.Require().Equal(int32(0), description.Chats[testChatID1].Position)
|
s.Require().Equal(int32(0), description.Chats[testChatID1].Position)
|
||||||
s.Require().Equal(int32(1), description.Chats[testChatID3].Position)
|
s.Require().Equal(int32(1), description.Chats[testChatID3].Position)
|
||||||
|
|
||||||
_, _ = org.EditCategory(newCategoryID, editedCategoryName, []string{testChatID3})
|
_, err = org.EditCategory(newCategoryID, editedCategoryName, []string{testChatID3})
|
||||||
|
s.Require().NoError(err)
|
||||||
s.Require().Equal("", description.Chats[testChatID1].CategoryId)
|
s.Require().Equal("", description.Chats[testChatID1].CategoryId)
|
||||||
s.Require().Equal(int32(0), description.Chats[testChatID3].Position)
|
s.Require().Equal(int32(0), description.Chats[testChatID3].Position)
|
||||||
}
|
}
|
||||||
|
@ -155,10 +166,6 @@ func (s *CommunitySuite) TestEditCategory() {
|
||||||
func (s *CommunitySuite) TestDeleteCategory() {
|
func (s *CommunitySuite) TestDeleteCategory() {
|
||||||
org := s.buildCommunity(&s.identity.PublicKey)
|
org := s.buildCommunity(&s.identity.PublicKey)
|
||||||
org.config.PrivateKey = s.identity
|
org.config.PrivateKey = s.identity
|
||||||
identity := &protobuf.ChatIdentity{
|
|
||||||
DisplayName: "new-chat-display-name",
|
|
||||||
Description: "new-chat-description",
|
|
||||||
}
|
|
||||||
permissions := &protobuf.CommunityPermissions{
|
permissions := &protobuf.CommunityPermissions{
|
||||||
Access: protobuf.CommunityPermissions_NO_MEMBERSHIP,
|
Access: protobuf.CommunityPermissions_NO_MEMBERSHIP,
|
||||||
}
|
}
|
||||||
|
@ -168,21 +175,35 @@ func (s *CommunitySuite) TestDeleteCategory() {
|
||||||
newCategoryID := "new-category-id"
|
newCategoryID := "new-category-id"
|
||||||
newCategoryName := "new-category-name"
|
newCategoryName := "new-category-name"
|
||||||
|
|
||||||
_, _ = org.CreateChat(testChatID2, &protobuf.CommunityChat{
|
identity1 := &protobuf.ChatIdentity{
|
||||||
Identity: identity,
|
DisplayName: "display-name-2",
|
||||||
Permissions: permissions,
|
Description: "new-chat-description",
|
||||||
})
|
}
|
||||||
_, _ = org.CreateChat(testChatID3, &protobuf.CommunityChat{
|
|
||||||
Identity: identity,
|
|
||||||
Permissions: permissions,
|
|
||||||
})
|
|
||||||
|
|
||||||
_, _ = org.CreateCategory(newCategoryID, newCategoryName, []string{})
|
_, err := org.CreateChat(testChatID2, &protobuf.CommunityChat{
|
||||||
|
Identity: identity1,
|
||||||
|
Permissions: permissions,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
identity2 := &protobuf.ChatIdentity{
|
||||||
|
DisplayName: "display-name-3",
|
||||||
|
Description: "new-chat-description",
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = org.CreateChat(testChatID3, &protobuf.CommunityChat{
|
||||||
|
Identity: identity2,
|
||||||
|
Permissions: permissions,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
_, err = org.CreateCategory(newCategoryID, newCategoryName, []string{})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
description := org.config.CommunityDescription
|
description := org.config.CommunityDescription
|
||||||
|
|
||||||
_, _ = org.EditCategory(newCategoryID, newCategoryName, []string{testChatID2, testChatID1})
|
_, err = org.EditCategory(newCategoryID, newCategoryName, []string{testChatID2, testChatID1})
|
||||||
|
s.Require().NoError(err)
|
||||||
s.Require().Equal(newCategoryID, description.Chats[testChatID1].CategoryId)
|
s.Require().Equal(newCategoryID, description.Chats[testChatID1].CategoryId)
|
||||||
s.Require().Equal(newCategoryID, description.Chats[testChatID2].CategoryId)
|
s.Require().Equal(newCategoryID, description.Chats[testChatID2].CategoryId)
|
||||||
|
|
||||||
|
@ -191,7 +212,7 @@ func (s *CommunitySuite) TestDeleteCategory() {
|
||||||
s.Require().Equal(int32(1), description.Chats[testChatID1].Position)
|
s.Require().Equal(int32(1), description.Chats[testChatID1].Position)
|
||||||
|
|
||||||
org.config.PrivateKey = nil
|
org.config.PrivateKey = nil
|
||||||
_, err := org.DeleteCategory(testCategoryID1)
|
_, err = org.DeleteCategory(testCategoryID1)
|
||||||
s.Require().Equal(ErrNotAdmin, err)
|
s.Require().Equal(ErrNotAdmin, err)
|
||||||
|
|
||||||
org.config.PrivateKey = s.identity
|
org.config.PrivateKey = s.identity
|
||||||
|
@ -210,10 +231,6 @@ func (s *CommunitySuite) TestDeleteCategory() {
|
||||||
func (s *CommunitySuite) TestDeleteChatOrder() {
|
func (s *CommunitySuite) TestDeleteChatOrder() {
|
||||||
org := s.buildCommunity(&s.identity.PublicKey)
|
org := s.buildCommunity(&s.identity.PublicKey)
|
||||||
org.config.PrivateKey = s.identity
|
org.config.PrivateKey = s.identity
|
||||||
identity := &protobuf.ChatIdentity{
|
|
||||||
DisplayName: "new-chat-display-name",
|
|
||||||
Description: "new-chat-description",
|
|
||||||
}
|
|
||||||
permissions := &protobuf.CommunityPermissions{
|
permissions := &protobuf.CommunityPermissions{
|
||||||
Access: protobuf.CommunityPermissions_NO_MEMBERSHIP,
|
Access: protobuf.CommunityPermissions_NO_MEMBERSHIP,
|
||||||
}
|
}
|
||||||
|
@ -223,24 +240,39 @@ func (s *CommunitySuite) TestDeleteChatOrder() {
|
||||||
newCategoryID := "new-category-id"
|
newCategoryID := "new-category-id"
|
||||||
newCategoryName := "new-category-name"
|
newCategoryName := "new-category-name"
|
||||||
|
|
||||||
_, _ = org.CreateChat(testChatID2, &protobuf.CommunityChat{
|
identity1 := &protobuf.ChatIdentity{
|
||||||
Identity: identity,
|
DisplayName: "identity-1",
|
||||||
|
Description: "new-chat-description",
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := org.CreateChat(testChatID2, &protobuf.CommunityChat{
|
||||||
|
Identity: identity1,
|
||||||
Permissions: permissions,
|
Permissions: permissions,
|
||||||
})
|
})
|
||||||
_, _ = org.CreateChat(testChatID3, &protobuf.CommunityChat{
|
s.Require().NoError(err)
|
||||||
Identity: identity,
|
identity2 := &protobuf.ChatIdentity{
|
||||||
|
DisplayName: "identity-2",
|
||||||
|
Description: "new-chat-description",
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = org.CreateChat(testChatID3, &protobuf.CommunityChat{
|
||||||
|
Identity: identity2,
|
||||||
Permissions: permissions,
|
Permissions: permissions,
|
||||||
})
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
_, _ = org.CreateCategory(newCategoryID, newCategoryName, []string{testChatID1, testChatID2, testChatID3})
|
_, err = org.CreateCategory(newCategoryID, newCategoryName, []string{testChatID1, testChatID2, testChatID3})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
description, _ := org.DeleteChat(testChatID2)
|
description, err := org.DeleteChat(testChatID2)
|
||||||
|
s.Require().NoError(err)
|
||||||
s.Require().Equal(int32(0), description.Chats[testChatID1].Position)
|
s.Require().Equal(int32(0), description.Chats[testChatID1].Position)
|
||||||
s.Require().Equal(int32(1), description.Chats[testChatID3].Position)
|
s.Require().Equal(int32(1), description.Chats[testChatID3].Position)
|
||||||
|
|
||||||
description, _ = org.DeleteChat(testChatID1)
|
description, err = org.DeleteChat(testChatID1)
|
||||||
|
s.Require().NoError(err)
|
||||||
s.Require().Equal(int32(0), description.Chats[testChatID3].Position)
|
s.Require().Equal(int32(0), description.Chats[testChatID3].Position)
|
||||||
|
|
||||||
_, err := org.DeleteChat(testChatID3)
|
_, err = org.DeleteChat(testChatID3)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,6 +141,15 @@ func (s *CommunitySuite) TestCreateChat() {
|
||||||
|
|
||||||
s.Require().NotNil(changes)
|
s.Require().NotNil(changes)
|
||||||
s.Require().NotNil(changes.ChatsAdded[newChatID])
|
s.Require().NotNil(changes.ChatsAdded[newChatID])
|
||||||
|
|
||||||
|
// Add a community with the same name
|
||||||
|
|
||||||
|
_, err = org.CreateChat("different-chat-id", &protobuf.CommunityChat{
|
||||||
|
Identity: identity,
|
||||||
|
Permissions: permissions,
|
||||||
|
})
|
||||||
|
|
||||||
|
s.Require().Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *CommunitySuite) TestEditChat() {
|
func (s *CommunitySuite) TestEditChat() {
|
||||||
|
@ -665,7 +674,10 @@ func (s *CommunitySuite) TestHandleCommunityDescription() {
|
||||||
changes: func(org *Community) *CommunityChanges {
|
changes: func(org *Community) *CommunityChanges {
|
||||||
changes := org.emptyCommunityChanges()
|
changes := org.emptyCommunityChanges()
|
||||||
changes.MembersAdded[s.member3Key] = &protobuf.CommunityMember{}
|
changes.MembersAdded[s.member3Key] = &protobuf.CommunityMember{}
|
||||||
changes.ChatsAdded[testChatID2] = &protobuf.CommunityChat{Permissions: &protobuf.CommunityPermissions{Access: protobuf.CommunityPermissions_INVITATION_ONLY}, Members: make(map[string]*protobuf.CommunityMember)}
|
changes.ChatsAdded[testChatID2] = &protobuf.CommunityChat{
|
||||||
|
Identity: &protobuf.ChatIdentity{DisplayName: "added-chat", Description: "description"},
|
||||||
|
Permissions: &protobuf.CommunityPermissions{Access: protobuf.CommunityPermissions_INVITATION_ONLY},
|
||||||
|
Members: make(map[string]*protobuf.CommunityMember)}
|
||||||
changes.ChatsAdded[testChatID2].Members[s.member3Key] = &protobuf.CommunityMember{}
|
changes.ChatsAdded[testChatID2].Members[s.member3Key] = &protobuf.CommunityMember{}
|
||||||
|
|
||||||
return changes
|
return changes
|
||||||
|
@ -873,6 +885,10 @@ func (s *CommunitySuite) buildCommunityDescription() *protobuf.CommunityDescript
|
||||||
desc.Members[s.member2Key] = &protobuf.CommunityMember{}
|
desc.Members[s.member2Key] = &protobuf.CommunityMember{}
|
||||||
desc.Chats[testChatID1].Members = make(map[string]*protobuf.CommunityMember)
|
desc.Chats[testChatID1].Members = make(map[string]*protobuf.CommunityMember)
|
||||||
desc.Chats[testChatID1].Members[s.member1Key] = &protobuf.CommunityMember{}
|
desc.Chats[testChatID1].Members[s.member1Key] = &protobuf.CommunityMember{}
|
||||||
|
desc.Chats[testChatID1].Identity = &protobuf.ChatIdentity{
|
||||||
|
DisplayName: "display-name",
|
||||||
|
Description: "description",
|
||||||
|
}
|
||||||
return desc
|
return desc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -952,7 +968,10 @@ func (s *CommunitySuite) addedChatCommunityDescription(org *Community) *protobuf
|
||||||
description := proto.Clone(org.config.CommunityDescription).(*protobuf.CommunityDescription)
|
description := proto.Clone(org.config.CommunityDescription).(*protobuf.CommunityDescription)
|
||||||
description.Clock++
|
description.Clock++
|
||||||
description.Members[s.member3Key] = &protobuf.CommunityMember{}
|
description.Members[s.member3Key] = &protobuf.CommunityMember{}
|
||||||
description.Chats[testChatID2] = &protobuf.CommunityChat{Permissions: &protobuf.CommunityPermissions{Access: protobuf.CommunityPermissions_INVITATION_ONLY}, Members: make(map[string]*protobuf.CommunityMember)}
|
description.Chats[testChatID2] = &protobuf.CommunityChat{
|
||||||
|
Identity: &protobuf.ChatIdentity{DisplayName: "added-chat", Description: "description"},
|
||||||
|
Permissions: &protobuf.CommunityPermissions{Access: protobuf.CommunityPermissions_INVITATION_ONLY},
|
||||||
|
Members: make(map[string]*protobuf.CommunityMember)}
|
||||||
description.Chats[testChatID2].Members[s.member3Key] = &protobuf.CommunityMember{}
|
description.Chats[testChatID2].Members[s.member3Key] = &protobuf.CommunityMember{}
|
||||||
|
|
||||||
return description
|
return description
|
||||||
|
|
|
@ -17,6 +17,8 @@ var ErrInvalidCommunityDescriptionUnknownOrgAccess = errors.New("invalid communi
|
||||||
var ErrInvalidCommunityDescriptionMemberInChatButNotInOrg = errors.New("invalid community description member in chat but not in org")
|
var ErrInvalidCommunityDescriptionMemberInChatButNotInOrg = errors.New("invalid community description member in chat but not in org")
|
||||||
var ErrInvalidCommunityDescriptionCategoryNoID = errors.New("invalid community category id")
|
var ErrInvalidCommunityDescriptionCategoryNoID = errors.New("invalid community category id")
|
||||||
var ErrInvalidCommunityDescriptionCategoryNoName = errors.New("invalid community category name")
|
var ErrInvalidCommunityDescriptionCategoryNoName = errors.New("invalid community category name")
|
||||||
|
var ErrInvalidCommunityDescriptionChatIdentity = errors.New("invalid community chat name, missing")
|
||||||
|
var ErrInvalidCommunityDescriptionDuplicatedName = errors.New("invalid community chat name, duplicated")
|
||||||
var ErrInvalidCommunityDescriptionUnknownChatCategory = errors.New("invalid community category in chat")
|
var ErrInvalidCommunityDescriptionUnknownChatCategory = errors.New("invalid community category in chat")
|
||||||
var ErrNotAdmin = errors.New("no admin privileges for this community")
|
var ErrNotAdmin = errors.New("no admin privileges for this community")
|
||||||
var ErrInvalidGrant = errors.New("invalid grant")
|
var ErrInvalidGrant = errors.New("invalid grant")
|
||||||
|
|
|
@ -21,6 +21,10 @@ func validateCommunityChat(desc *protobuf.CommunityDescription, chat *protobuf.C
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if chat.Identity == nil {
|
||||||
|
return ErrInvalidCommunityDescriptionChatIdentity
|
||||||
|
}
|
||||||
|
|
||||||
for pk := range chat.Members {
|
for pk := range chat.Members {
|
||||||
if desc.Members == nil {
|
if desc.Members == nil {
|
||||||
return ErrInvalidCommunityDescriptionMemberInChatButNotInOrg
|
return ErrInvalidCommunityDescriptionMemberInChatButNotInOrg
|
||||||
|
|
Loading…
Reference in New Issue