mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
core: allow admins/owners delete member messages (#1869)
* core: allow admins/owners delete member messages * allow message deletion to admins/owners * deleted by types, schema * check role * fix test, view * view, tests * comment * test timed deletion events * refactor * refactor * refactor --------- Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
a018e4a581
commit
9e4499de6d
@@ -1388,6 +1388,11 @@ testUsersTimedMessages tmp = do
|
||||
|
||||
threadDelay 1000000
|
||||
|
||||
alice <## "[user: alice] timed message deleted: alice 1"
|
||||
alice <## "[user: alice] timed message deleted: alice 2"
|
||||
bob <## "timed message deleted: alice 1"
|
||||
bob <## "timed message deleted: alice 2"
|
||||
|
||||
alice ##> "/user alice"
|
||||
showActiveUser alice "alice (Alice)"
|
||||
alice #$> ("/_get chat @2 count=100", chat, [])
|
||||
@@ -1398,6 +1403,11 @@ testUsersTimedMessages tmp = do
|
||||
|
||||
threadDelay 1000000
|
||||
|
||||
alice <## "timed message deleted: alisa 1"
|
||||
alice <## "timed message deleted: alisa 2"
|
||||
bob <## "timed message deleted: alisa 1"
|
||||
bob <## "timed message deleted: alisa 2"
|
||||
|
||||
alice ##> "/user"
|
||||
showActiveUser alice "alisa"
|
||||
alice #$> ("/_get chat @4 count=100", chat, [])
|
||||
@@ -1435,6 +1445,11 @@ testUsersTimedMessages tmp = do
|
||||
-- messages are deleted after restart
|
||||
threadDelay 1000000
|
||||
|
||||
alice <## "[user: alice] timed message deleted: alice 3"
|
||||
alice <## "[user: alice] timed message deleted: alice 4"
|
||||
bob <## "timed message deleted: alice 3"
|
||||
bob <## "timed message deleted: alice 4"
|
||||
|
||||
alice ##> "/user alice"
|
||||
showActiveUser alice "alice (Alice)"
|
||||
alice #$> ("/_get chat @2 count=100", chat, [])
|
||||
@@ -1445,6 +1460,11 @@ testUsersTimedMessages tmp = do
|
||||
|
||||
threadDelay 1000000
|
||||
|
||||
alice <## "timed message deleted: alisa 3"
|
||||
alice <## "timed message deleted: alisa 4"
|
||||
bob <## "timed message deleted: alisa 3"
|
||||
bob <## "timed message deleted: alisa 4"
|
||||
|
||||
alice ##> "/user"
|
||||
showActiveUser alice "alisa"
|
||||
alice #$> ("/_get chat @4 count=100", chat, [])
|
||||
|
||||
@@ -35,6 +35,8 @@ chatGroupTests = do
|
||||
it "update member role" testUpdateMemberRole
|
||||
it "unused contacts are deleted after all their groups are deleted" testGroupDeleteUnusedContacts
|
||||
it "group description is shown as the first message to new members" testGroupDescription
|
||||
it "delete message of another group member" testGroupMemberMessageDelete
|
||||
it "full delete message of another group member" testGroupMemberMessageFullDelete
|
||||
describe "async group connections" $ do
|
||||
xit "create and join group when clients go offline" testGroupAsync
|
||||
describe "group links" $ do
|
||||
@@ -133,9 +135,9 @@ testGroupShared alice bob cath checkMessages = do
|
||||
-- cath <## "#team: alice changed the role of bob from admin to observer"
|
||||
-- ]
|
||||
-- bob ##> "#team hello"
|
||||
-- bob <## "you don't have permission to send messages to this group"
|
||||
-- bob <## "#team: you don't have permission to send messages to this group"
|
||||
-- bob ##> "/rm team cath"
|
||||
-- bob <## "you have insufficient permissions for this action, the required role is admin"
|
||||
-- bob <## "#team: you have insufficient permissions for this action, the required role is admin"
|
||||
-- cath #> "#team hello"
|
||||
-- concurrentlyN_
|
||||
-- [ alice <# "#team cath> hello",
|
||||
@@ -981,7 +983,7 @@ testUpdateGroupProfile =
|
||||
(bob <# "#team alice> hello!")
|
||||
(cath <# "#team alice> hello!")
|
||||
bob ##> "/gp team my_team"
|
||||
bob <## "you have insufficient permissions for this action, the required role is owner"
|
||||
bob <## "#team: you have insufficient permissions for this action, the required role is owner"
|
||||
alice ##> "/gp team my_team"
|
||||
alice <## "changed to #my_team"
|
||||
concurrentlyN_
|
||||
@@ -1016,13 +1018,13 @@ testUpdateMemberRole =
|
||||
(bob <## "#team: you joined the group")
|
||||
connectUsers bob cath
|
||||
bob ##> "/a team cath"
|
||||
bob <## "you have insufficient permissions for this action, the required role is admin"
|
||||
bob <## "#team: you have insufficient permissions for this action, the required role is admin"
|
||||
alice ##> "/mr team bob admin"
|
||||
concurrently_
|
||||
(alice <## "#team: you changed the role of bob from member to admin")
|
||||
(bob <## "#team: alice changed your role from member to admin")
|
||||
bob ##> "/a team cath owner"
|
||||
bob <## "you have insufficient permissions for this action, the required role is owner"
|
||||
bob <## "#team: you have insufficient permissions for this action, the required role is owner"
|
||||
addMember "team" bob cath GRMember
|
||||
cath ##> "/j team"
|
||||
concurrentlyN_
|
||||
@@ -1041,7 +1043,7 @@ testUpdateMemberRole =
|
||||
cath <## "#team: alice changed the role from owner to admin"
|
||||
]
|
||||
alice ##> "/d #team"
|
||||
alice <## "you have insufficient permissions for this action, the required role is owner"
|
||||
alice <## "#team: you have insufficient permissions for this action, the required role is owner"
|
||||
|
||||
testGroupDeleteUnusedContacts :: HasCallStack => FilePath -> IO ()
|
||||
testGroupDeleteUnusedContacts =
|
||||
@@ -1195,6 +1197,75 @@ testGroupDescription = testChat4 aliceProfile bobProfile cathProfile danProfile
|
||||
cc <## "#team: bob added dan (Daniel) to the group (connecting...)"
|
||||
cc <## "#team: new member dan is connected"
|
||||
|
||||
testGroupMemberMessageDelete :: HasCallStack => FilePath -> IO ()
|
||||
testGroupMemberMessageDelete =
|
||||
testChat3 aliceProfile bobProfile cathProfile $
|
||||
\alice bob cath -> do
|
||||
createGroup3 "team" alice bob cath
|
||||
alice ##> "/mr team cath member"
|
||||
concurrentlyN_
|
||||
[ alice <## "#team: you changed the role of cath from admin to member",
|
||||
bob <## "#team: alice changed the role of cath from admin to member",
|
||||
cath <## "#team: alice changed your role from admin to member"
|
||||
]
|
||||
alice #> "#team hello"
|
||||
concurrently_
|
||||
(bob <# "#team alice> hello")
|
||||
(cath <# "#team alice> hello")
|
||||
bob ##> "\\\\ #team @alice hello"
|
||||
bob <## "#team: you have insufficient permissions for this action, the required role is owner"
|
||||
threadDelay 1000000
|
||||
cath #> "#team hi"
|
||||
concurrently_
|
||||
(alice <# "#team cath> hi")
|
||||
(bob <# "#team cath> hi")
|
||||
bob ##> "\\\\ #team @cath hi"
|
||||
bob <## "message marked deleted"
|
||||
concurrently_
|
||||
(alice <# "#team cath> [marked deleted by bob] hi")
|
||||
(cath <# "#team cath> [marked deleted by bob] hi")
|
||||
alice #$> ("/_get chat #1 count=1", chat, [(0, "hi [marked deleted by bob]")])
|
||||
bob #$> ("/_get chat #1 count=1", chat, [(0, "hi [marked deleted]")])
|
||||
cath #$> ("/_get chat #1 count=1", chat, [(1, "hi [marked deleted by bob]")])
|
||||
|
||||
testGroupMemberMessageFullDelete :: HasCallStack => FilePath -> IO ()
|
||||
testGroupMemberMessageFullDelete =
|
||||
testChat3 aliceProfile bobProfile cathProfile $
|
||||
\alice bob cath -> do
|
||||
createGroup3 "team" alice bob cath
|
||||
alice ##> "/mr team cath member"
|
||||
concurrentlyN_
|
||||
[ alice <## "#team: you changed the role of cath from admin to member",
|
||||
bob <## "#team: alice changed the role of cath from admin to member",
|
||||
cath <## "#team: alice changed your role from admin to member"
|
||||
]
|
||||
alice ##> "/set delete #team on"
|
||||
alice <## "updated group preferences:"
|
||||
alice <## "Full deletion: on"
|
||||
concurrentlyN_
|
||||
[ do
|
||||
bob <## "alice updated group #team:"
|
||||
bob <## "updated group preferences:"
|
||||
bob <## "Full deletion: on",
|
||||
do
|
||||
cath <## "alice updated group #team:"
|
||||
cath <## "updated group preferences:"
|
||||
cath <## "Full deletion: on"
|
||||
]
|
||||
threadDelay 1000000
|
||||
cath #> "#team hi"
|
||||
concurrently_
|
||||
(alice <# "#team cath> hi")
|
||||
(bob <# "#team cath> hi")
|
||||
bob ##> "\\\\ #team @cath hi"
|
||||
bob <## "message deleted"
|
||||
concurrently_
|
||||
(alice <# "#team cath> [deleted by bob] hi")
|
||||
(cath <# "#team cath> [deleted by bob] hi")
|
||||
alice #$> ("/_get chat #1 count=1", chat, [(0, "moderated [deleted by bob]")])
|
||||
bob #$> ("/_get chat #1 count=1", chat, [(0, "Full deletion: on")]) -- fully deleted for bob
|
||||
cath #$> ("/_get chat #1 count=1", chat, [(1, "moderated [deleted by bob]")])
|
||||
|
||||
testGroupAsync :: HasCallStack => FilePath -> IO ()
|
||||
testGroupAsync tmp = do
|
||||
print (0 :: Integer)
|
||||
|
||||
@@ -1234,6 +1234,10 @@ testEnableTimedMessagesContact =
|
||||
alice #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(1, "you offered Disappearing messages (1 sec)"), (0, "Disappearing messages: enabled (1 sec)"), (1, "hi"), (0, "hey")])
|
||||
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "offered Disappearing messages (1 sec)"), (1, "Disappearing messages: enabled (1 sec)"), (0, "hi"), (1, "hey")])
|
||||
threadDelay 1000000
|
||||
alice <## "timed message deleted: hi"
|
||||
alice <## "timed message deleted: hey"
|
||||
bob <## "timed message deleted: hi"
|
||||
bob <## "timed message deleted: hey"
|
||||
alice #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(1, "you offered Disappearing messages (1 sec)"), (0, "Disappearing messages: enabled (1 sec)")])
|
||||
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "offered Disappearing messages (1 sec)"), (1, "Disappearing messages: enabled (1 sec)")])
|
||||
-- turn off, messages are not disappearing
|
||||
@@ -1277,6 +1281,8 @@ testEnableTimedMessagesGroup =
|
||||
alice #$> ("/_get chat #1 count=100", chat, [(0, "connected"), (1, "Disappearing messages: on (1 sec)"), (1, "hi")])
|
||||
bob #$> ("/_get chat #1 count=100", chat, groupFeatures <> [(0, "connected"), (0, "Disappearing messages: on (1 sec)"), (0, "hi")])
|
||||
threadDelay 1000000
|
||||
alice <## "timed message deleted: hi"
|
||||
bob <## "timed message deleted: hi"
|
||||
alice #$> ("/_get chat #1 count=100", chat, [(0, "connected"), (1, "Disappearing messages: on (1 sec)")])
|
||||
bob #$> ("/_get chat #1 count=100", chat, groupFeatures <> [(0, "connected"), (0, "Disappearing messages: on (1 sec)")])
|
||||
-- turn off, messages are not disappearing
|
||||
@@ -1324,5 +1330,9 @@ testTimedMessagesEnabledGlobally =
|
||||
alice #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "Disappearing messages: enabled (1 sec)"), (1, "hi"), (0, "hey")])
|
||||
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(1, "Disappearing messages: enabled (1 sec)"), (0, "hi"), (1, "hey")])
|
||||
threadDelay 1000000
|
||||
alice <## "timed message deleted: hi"
|
||||
bob <## "timed message deleted: hi"
|
||||
alice <## "timed message deleted: hey"
|
||||
bob <## "timed message deleted: hey"
|
||||
alice #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "Disappearing messages: enabled (1 sec)")])
|
||||
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(1, "Disappearing messages: enabled (1 sec)")])
|
||||
|
||||
@@ -171,7 +171,7 @@ decodeChatMessageTest = describe "Chat message encoding/decoding" $ do
|
||||
#==# XMsgUpdate (SharedMsgId "\1\2\3\4") (MCText "hello") Nothing Nothing
|
||||
it "x.msg.del" $
|
||||
"{\"event\":\"x.msg.del\",\"params\":{\"msgId\":\"AQIDBA==\"}}"
|
||||
#==# XMsgDel (SharedMsgId "\1\2\3\4")
|
||||
#==# XMsgDel (SharedMsgId "\1\2\3\4") Nothing
|
||||
it "x.msg.deleted" $
|
||||
"{\"event\":\"x.msg.deleted\",\"params\":{}}"
|
||||
#==# XMsgDeleted
|
||||
|
||||
Reference in New Issue
Block a user