core: prevent making all users inactive when duplicate user is created (#1862)
* core: prevent making all users inactive when duplicate user is created * skip async group test
This commit is contained in:
parent
a1ed0a84b8
commit
13bd51b97d
@ -273,13 +273,16 @@ toView event = do
|
|||||||
processChatCommand :: forall m. ChatMonad m => ChatCommand -> m ChatResponse
|
processChatCommand :: forall m. ChatMonad m => ChatCommand -> m ChatResponse
|
||||||
processChatCommand = \case
|
processChatCommand = \case
|
||||||
ShowActiveUser -> withUser' $ pure . CRActiveUser
|
ShowActiveUser -> withUser' $ pure . CRActiveUser
|
||||||
CreateActiveUser p sameServers -> do
|
CreateActiveUser p@Profile {displayName} sameServers -> do
|
||||||
u <- asks currentUser
|
u <- asks currentUser
|
||||||
(smp, smpServers) <- chooseServers
|
(smp, smpServers) <- chooseServers
|
||||||
auId <-
|
auId <-
|
||||||
withStore' getUsers >>= \case
|
withStore' getUsers >>= \case
|
||||||
[] -> pure 1
|
[] -> pure 1
|
||||||
_ -> withAgent (`createUser` smp)
|
users -> do
|
||||||
|
when (any (\User {localDisplayName = n} -> n == displayName) users) $
|
||||||
|
throwChatError $ CEUserExists displayName
|
||||||
|
withAgent (`createUser` smp)
|
||||||
user <- withStore $ \db -> createUserRecord db (AgentUserId auId) p True
|
user <- withStore $ \db -> createUserRecord db (AgentUserId auId) p True
|
||||||
unless (null smpServers) $
|
unless (null smpServers) $
|
||||||
withStore $ \db -> overwriteSMPServers db user smpServers
|
withStore $ \db -> overwriteSMPServers db user smpServers
|
||||||
|
@ -645,6 +645,7 @@ data ChatErrorType
|
|||||||
= CENoActiveUser
|
= CENoActiveUser
|
||||||
| CENoConnectionUser {agentConnId :: AgentConnId}
|
| CENoConnectionUser {agentConnId :: AgentConnId}
|
||||||
| CEActiveUserExists -- TODO delete
|
| CEActiveUserExists -- TODO delete
|
||||||
|
| CEUserExists {contactName :: ContactName}
|
||||||
| CEDifferentActiveUser {commandUserId :: UserId, activeUserId :: UserId}
|
| CEDifferentActiveUser {commandUserId :: UserId, activeUserId :: UserId}
|
||||||
| CECantDeleteActiveUser {userId :: UserId}
|
| CECantDeleteActiveUser {userId :: UserId}
|
||||||
| CECantDeleteLastUser {userId :: UserId}
|
| CECantDeleteLastUser {userId :: UserId}
|
||||||
|
@ -1185,6 +1185,7 @@ viewChatError logLevel = \case
|
|||||||
CENoActiveUser -> ["error: active user is required"]
|
CENoActiveUser -> ["error: active user is required"]
|
||||||
CENoConnectionUser agentConnId -> ["error: message user not found, conn id: " <> sShow agentConnId | logLevel <= CLLError]
|
CENoConnectionUser agentConnId -> ["error: message user not found, conn id: " <> sShow agentConnId | logLevel <= CLLError]
|
||||||
CEActiveUserExists -> ["error: active user already exists"]
|
CEActiveUserExists -> ["error: active user already exists"]
|
||||||
|
CEUserExists name -> ["user with the name " <> ttyContact name <> " already exists"]
|
||||||
CEDifferentActiveUser commandUserId activeUserId -> ["error: different active user, command user id: " <> sShow commandUserId <> ", active user id: " <> sShow activeUserId]
|
CEDifferentActiveUser commandUserId activeUserId -> ["error: different active user, command user id: " <> sShow commandUserId <> ", active user id: " <> sShow activeUserId]
|
||||||
CECantDeleteActiveUser _ -> ["cannot delete active user"]
|
CECantDeleteActiveUser _ -> ["cannot delete active user"]
|
||||||
CECantDeleteLastUser _ -> ["cannot delete last user"]
|
CECantDeleteLastUser _ -> ["cannot delete last user"]
|
||||||
|
@ -166,7 +166,7 @@ chatTests = do
|
|||||||
xdescribe "send and receive file, fully asynchronous" $ do
|
xdescribe "send and receive file, fully asynchronous" $ do
|
||||||
it "v2" testAsyncFileTransfer
|
it "v2" testAsyncFileTransfer
|
||||||
it "v1" testAsyncFileTransferV1
|
it "v1" testAsyncFileTransferV1
|
||||||
it "send and receive file to group, fully asynchronous" testAsyncGroupFileTransfer
|
xit "send and receive file to group, fully asynchronous" testAsyncGroupFileTransfer
|
||||||
describe "webrtc calls api" $ do
|
describe "webrtc calls api" $ do
|
||||||
it "negotiate call" testNegotiateCall
|
it "negotiate call" testNegotiateCall
|
||||||
describe "maintenance mode" $ do
|
describe "maintenance mode" $ do
|
||||||
|
@ -25,9 +25,9 @@ noActiveUser = "{\"resp\":{\"type\":\"chatCmdError\",\"chatError\":{\"type\":\"e
|
|||||||
|
|
||||||
activeUserExists :: String
|
activeUserExists :: String
|
||||||
#if defined(darwin_HOST_OS) && defined(swiftJSON)
|
#if defined(darwin_HOST_OS) && defined(swiftJSON)
|
||||||
activeUserExists = "{\"resp\":{\"chatCmdError\":{\"user_\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"no\"},\"fullDelete\":{\"allow\":\"no\"},\"voice\":{\"allow\":\"yes\"}},\"activeUser\":true},\"chatError\":{\"errorStore\":{\"storeError\":{\"duplicateName\":{}}}}}}}"
|
activeUserExists = "{\"resp\":{\"chatCmdError\":{\"user_\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"no\"},\"fullDelete\":{\"allow\":\"no\"},\"voice\":{\"allow\":\"yes\"}},\"activeUser\":true},\"chatError\":{\"error\":{\"errorType\":{\"userExists\":{\"contactName\":\"alice\"}}}}}}}"
|
||||||
#else
|
#else
|
||||||
activeUserExists = "{\"resp\":{\"type\":\"chatCmdError\",\"user_\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"no\"},\"fullDelete\":{\"allow\":\"no\"},\"voice\":{\"allow\":\"yes\"}},\"activeUser\":true},\"chatError\":{\"type\":\"errorStore\",\"storeError\":{\"type\":\"duplicateName\"}}}}"
|
activeUserExists = "{\"resp\":{\"type\":\"chatCmdError\",\"user_\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"no\"},\"fullDelete\":{\"allow\":\"no\"},\"voice\":{\"allow\":\"yes\"}},\"activeUser\":true},\"chatError\":{\"type\":\"error\",\"errorType\":{\"type\":\"userExists\",\"contactName\":\"alice\"}}}}"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
activeUser :: String
|
activeUser :: String
|
||||||
@ -73,7 +73,7 @@ pendingSubSummary = "{\"resp\":{\"type\":\"pendingSubSummary\"," <> userJSON <>
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
userJSON :: String
|
userJSON :: String
|
||||||
userJSON = "\"user\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"no\"},\"fullDelete\":{\"allow\":\"no\"},\"voice\":{\"allow\":\"yes\"}},\"activeUser\":false}"
|
userJSON = "\"user\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"no\"},\"fullDelete\":{\"allow\":\"no\"},\"voice\":{\"allow\":\"yes\"}},\"activeUser\":true}"
|
||||||
|
|
||||||
parsedMarkdown :: String
|
parsedMarkdown :: String
|
||||||
#if defined(darwin_HOST_OS) && defined(swiftJSON)
|
#if defined(darwin_HOST_OS) && defined(swiftJSON)
|
||||||
|
Loading…
Reference in New Issue
Block a user