From 31faceef7381d7a31c30b4eb0f059e3a33097a5a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sun, 2 Aug 2026 14:12:57 +0100 Subject: [PATCH 01/16] docs: add bot library APIs (#7334) --- bots/api/COMMANDS.md | 104 ++++++++++++++++++ bots/api/TYPES.md | 1 + bots/src/API/Docs/Commands.hs | 10 +- bots/src/API/Docs/Responses.hs | 4 +- bots/src/API/Docs/Types.hs | 2 +- .../types/typescript/src/commands.ts | 43 ++++++++ .../types/typescript/src/responses.ts | 17 +++ .../types/typescript/src/types.ts | 1 + .../src/simplex_chat/types/_commands.py | 37 +++++++ .../src/simplex_chat/types/_responses.py | 15 ++- .../src/simplex_chat/types/_types.py | 2 +- 11 files changed, 226 insertions(+), 10 deletions(-) diff --git a/bots/api/COMMANDS.md b/bots/api/COMMANDS.md index 8d61622fff..476ee4f94d 100644 --- a/bots/api/COMMANDS.md +++ b/bots/api/COMMANDS.md @@ -15,6 +15,8 @@ This file is generated automatically. - [APIDeleteChatItem](#apideletechatitem) - [APIDeleteMemberChatItem](#apideletememberchatitem) - [APIChatItemReaction](#apichatitemreaction) +- [APIShareMyAddress](#apisharemyaddress) +- [APIShareChatMsgContent](#apisharechatmsgcontent) [File commands](#file-commands) - [ReceiveFile](#receivefile) @@ -35,6 +37,7 @@ This file is generated automatically. - [APIAddGroupRelays](#apiaddgrouprelays) - [APIAllowRelayGroup](#apiallowrelaygroup) - [APIUpdateGroupProfile](#apiupdategroupprofile) +- [APIVerifyGroupDomain](#apiverifygroupdomain) [Group link commands](#group-link-commands) - [APICreateGroupLink](#apicreategrouplink) @@ -489,6 +492,73 @@ ChatCmdError: Command error (only used in WebSockets API). --- +### APIShareMyAddress + +Share user address card + +*Network usage*: no. + +**Parameters**: +- toSendRef: [ChatRef](./TYPES.md#chatref) + +**Syntax**: + +``` +/_share address +``` + +```javascript +'/_share address' + ChatRef.cmdString(toSendRef) // JavaScript +``` + +```python +'/_share address' + ChatRef_cmd_string(toSendRef) # Python +``` + +**Response**: + +ChatMsgContent: Chat card content that can be sent. +- type: "chatMsgContent" +- user: [User](./TYPES.md#user) +- msgContent: [MsgContent](./TYPES.md#msgcontent) + +--- + + +### APIShareChatMsgContent + +Share channel address + +*Network usage*: no. + +**Parameters**: +- shareChatRef: [ChatRef](./TYPES.md#chatref) +- toSendRef: [ChatRef](./TYPES.md#chatref) + +**Syntax**: + +``` +/_share chat content +``` + +```javascript +'/_share chat content ' + ChatRef.cmdString(shareChatRef) + ' ' + ChatRef.cmdString(toSendRef) // JavaScript +``` + +```python +'/_share chat content ' + ChatRef_cmd_string(shareChatRef) + ' ' + ChatRef_cmd_string(toSendRef) # Python +``` + +**Response**: + +ChatMsgContent: Chat card content that can be sent. +- type: "chatMsgContent" +- user: [User](./TYPES.md#user) +- msgContent: [MsgContent](./TYPES.md#msgcontent) + +--- + + ## File commands Commands to receive and to cancel files. Files are sent as part of the message, there are no separate commands to send files. @@ -1165,6 +1235,40 @@ ChatCmdError: Command error (only used in WebSockets API). --- +### APIVerifyGroupDomain + +Verify group domain + +*Network usage*: interactive. + +**Parameters**: +- groupId: int64 + +**Syntax**: + +``` +/_verify domain # +``` + +```javascript +'/_verify domain #' + groupId // JavaScript +``` + +```python +'/_verify domain #' + str(groupId) # Python +``` + +**Response**: + +GroupDomainVerified: Group domain verified. +- type: "groupDomainVerified" +- user: [User](./TYPES.md#user) +- groupInfo: [GroupInfo](./TYPES.md#groupinfo) +- verificationFailure: string? + +--- + + ## Group link commands These commands can be used by bots that manage multiple public groups diff --git a/bots/api/TYPES.md b/bots/api/TYPES.md index 61c8c97132..4546a6aaa7 100644 --- a/bots/api/TYPES.md +++ b/bots/api/TYPES.md @@ -1448,6 +1448,7 @@ Search: **Enum type**: - "human" - "bot" +- "business" --- diff --git a/bots/src/API/Docs/Commands.hs b/bots/src/API/Docs/Commands.hs index da2a9e5d59..09ae1faa5b 100644 --- a/bots/src/API/Docs/Commands.hs +++ b/bots/src/API/Docs/Commands.hs @@ -97,7 +97,9 @@ chatCommandsDocsData = ), ("APIDeleteChatItem", [], "Delete message.", ["CRChatItemsDeleted", "CRChatCmdError"], [], Just UNBackground, "/_delete item " <> Param "chatRef" <> " " <> Join ',' "chatItemIds" <> " " <> Param "deleteMode"), ("APIDeleteMemberChatItem", [], "Moderate message. Requires Moderator role (and higher than message author's).", ["CRChatItemsDeleted", "CRChatCmdError"], [], Just UNBackground, "/_delete member item #" <> Param "groupId" <> " " <> Join ',' "chatItemIds"), - ("APIChatItemReaction", [], "Add/remove message reaction.", ["CRChatItemReaction", "CRChatCmdError"], [], Just UNBackground, "/_reaction " <> Param "chatRef" <> " " <> Param "chatItemId" <> " " <> OnOff "add" <> " " <> Json "reaction") + ("APIChatItemReaction", [], "Add/remove message reaction.", ["CRChatItemReaction", "CRChatCmdError"], [], Just UNBackground, "/_reaction " <> Param "chatRef" <> " " <> Param "chatItemId" <> " " <> OnOff "add" <> " " <> Json "reaction"), + ("APIShareMyAddress", [], "Share user address card", ["CRChatMsgContent"], [], Nothing, "/_share address" <> Param "toSendRef"), + ("APIShareChatMsgContent", [], "Share channel address", ["CRChatMsgContent"], [], Nothing, "/_share chat content " <> Param "shareChatRef" <> " " <> Param "toSendRef") ] ), ( "File commands", @@ -121,7 +123,8 @@ chatCommandsDocsData = ("APIGetGroupRelays", [], "Get group relays.", ["CRGroupRelays", "CRChatCmdError"], [], Nothing, "/_get relays #" <> Param "groupId"), ("APIAddGroupRelays", [], "Add relays to group.", ["CRGroupRelaysAdded", "CRGroupRelaysAddFailed", "CRChatCmdError"], [], Just UNInteractive, "/_add relays #" <> Param "groupId" <> " " <> Join ',' "relayIds"), ("APIAllowRelayGroup", [], "Clear relay rejection for a channel (relay operator).", ["CRRelayGroupAllowed", "CRChatCmdError"], [], Just UNBackground, "/_relay allow #" <> Param "groupId"), - ("APIUpdateGroupProfile", [], "Update group profile.", ["CRGroupUpdated", "CRChatCmdError"], [], Just UNBackground, "/_group_profile #" <> Param "groupId" <> " " <> Json "groupProfile") + ("APIUpdateGroupProfile", [], "Update group profile.", ["CRGroupUpdated", "CRChatCmdError"], [], Just UNBackground, "/_group_profile #" <> Param "groupId" <> " " <> Json "groupProfile"), + ("APIVerifyGroupDomain", [], "Verify group domain", ["CRGroupDomainVerified"], [], Just UNInteractive, "/_verify domain #" <> Param "groupId") ] ), ( "Group link commands", @@ -426,8 +429,6 @@ undocumentedCommands = "APISetUserDomain", "APISetUserServers", "APISetUserUIThemes", - "APIShareChatMsgContent", - "APIShareMyAddress", "APIStandaloneFileInfo", "APIStorageEncryption", "APISuspendChat", @@ -446,7 +447,6 @@ undocumentedCommands = "APIVerifyContact", "APIVerifyContactDomain", "APIVerifyGroupMember", - "APIVerifyGroupDomain", "APIVerifyToken", "CheckChatRunning", "ConfirmRemoteCtrl", diff --git a/bots/src/API/Docs/Responses.hs b/bots/src/API/Docs/Responses.hs index 7f158f7540..76f1ddb76b 100644 --- a/bots/src/API/Docs/Responses.hs +++ b/bots/src/API/Docs/Responses.hs @@ -51,6 +51,7 @@ chatResponsesDocsData = ("CRChatItemReaction", "Message reaction"), ("CRChatItemUpdated", "Message updated"), ("CRChatItemsDeleted", "Messages deleted"), + ("CRChatMsgContent", "Chat card content that can be sent"), ("CRChatRunning", ""), ("CRChatStarted", ""), ("CRChatStopped", ""), @@ -77,6 +78,7 @@ chatResponsesDocsData = ("CRGroupMembers", ""), ("CRGroupUpdated", ""), ("CRGroupsList", "Groups"), + ("CRGroupDomainVerified", ""), ("CRInvitation", "One-time invitation"), ("CRLeftMemberUser", "User left group"), ("CRMemberAccepted", "Member accepted to group"), @@ -136,7 +138,6 @@ undocumentedResponses = "CRChatItemInfo", "CRChatItems", "CRChatItemTTL", - "CRChatMsgContent", "CRChatRelayTestResult", "CRChats", "CRConnectionsDiff", @@ -169,7 +170,6 @@ undocumentedResponses = "CRGroupMemberRatchetSyncStarted", "CRGroupMemberSwitchAborted", "CRGroupMemberSwitchStarted", - "CRGroupDomainVerified", "CRGroupProfile", "CRGroupUserChanged", "CRItemsReadForChat", diff --git a/bots/src/API/Docs/Types.hs b/bots/src/API/Docs/Types.hs index f6b25934b1..e0af1f3ff5 100644 --- a/bots/src/API/Docs/Types.hs +++ b/bots/src/API/Docs/Types.hs @@ -226,7 +226,7 @@ chatTypesDocsData = (sti @BadgeType, STEnum, "BT", ["BTUnknown"], "", ""), (sti @ChatFeature, STEnum, "CF", [], "", ""), (sti @ChatItemDeletion, STRecord, "", [], "", "Message deletion result."), - (sti @ChatPeerType, STEnum, "CPT", [], "", ""), + (sti @ChatPeerType, STEnum, "CPT", ["CPTUnknown"], "", ""), (sti @ChatRef, STRecord, "", [], Param "chatType" <> Param "chatId" <> Optional "" (Param "$0") "chatScope", "Used in API commands. Chat scope can only be passed with groups."), (sti @ChatSettings, STRecord, "", [], "", ""), (sti @ChatStats, STRecord, "", [], "", ""), diff --git a/packages/simplex-chat-client/types/typescript/src/commands.ts b/packages/simplex-chat-client/types/typescript/src/commands.ts index 4c7c13403e..14b03f560f 100644 --- a/packages/simplex-chat-client/types/typescript/src/commands.ts +++ b/packages/simplex-chat-client/types/typescript/src/commands.ts @@ -168,6 +168,35 @@ export namespace APIChatItemReaction { } } +// Share user address card +// Network usage: no. +export interface APIShareMyAddress { + toSendRef: T.ChatRef +} + +export namespace APIShareMyAddress { + export type Response = CR.ChatMsgContent + + export function cmdString(self: APIShareMyAddress): string { + return '/_share address' + T.ChatRef.cmdString(self.toSendRef) + } +} + +// Share channel address +// Network usage: no. +export interface APIShareChatMsgContent { + shareChatRef: T.ChatRef + toSendRef: T.ChatRef +} + +export namespace APIShareChatMsgContent { + export type Response = CR.ChatMsgContent + + export function cmdString(self: APIShareChatMsgContent): string { + return '/_share chat content ' + T.ChatRef.cmdString(self.shareChatRef) + ' ' + T.ChatRef.cmdString(self.toSendRef) + } +} + // File commands // Commands to receive and to cancel files. Files are sent as part of the message, there are no separate commands to send files. @@ -419,6 +448,20 @@ export namespace APIUpdateGroupProfile { } } +// Verify group domain +// Network usage: interactive. +export interface APIVerifyGroupDomain { + groupId: number // int64 +} + +export namespace APIVerifyGroupDomain { + export type Response = CR.GroupDomainVerified + + export function cmdString(self: APIVerifyGroupDomain): string { + return '/_verify domain #' + self.groupId + } +} + // Group link commands // These commands can be used by bots that manage multiple public groups diff --git a/packages/simplex-chat-client/types/typescript/src/responses.ts b/packages/simplex-chat-client/types/typescript/src/responses.ts index fa5c83d03c..b2d29490c8 100644 --- a/packages/simplex-chat-client/types/typescript/src/responses.ts +++ b/packages/simplex-chat-client/types/typescript/src/responses.ts @@ -10,6 +10,7 @@ export type ChatResponse = | CR.ChatItemReaction | CR.ChatItemUpdated | CR.ChatItemsDeleted + | CR.ChatMsgContent | CR.ChatRunning | CR.ChatStarted | CR.ChatStopped @@ -36,6 +37,7 @@ export type ChatResponse = | CR.GroupMembers | CR.GroupUpdated | CR.GroupsList + | CR.GroupDomainVerified | CR.Invitation | CR.LeftMemberUser | CR.MemberAccepted @@ -69,6 +71,7 @@ export namespace CR { | "chatItemReaction" | "chatItemUpdated" | "chatItemsDeleted" + | "chatMsgContent" | "chatRunning" | "chatStarted" | "chatStopped" @@ -95,6 +98,7 @@ export namespace CR { | "groupMembers" | "groupUpdated" | "groupsList" + | "groupDomainVerified" | "invitation" | "leftMemberUser" | "memberAccepted" @@ -162,6 +166,12 @@ export namespace CR { timed: boolean } + export interface ChatMsgContent extends Interface { + type: "chatMsgContent" + user: T.User + msgContent: T.MsgContent + } + export interface ChatRunning extends Interface { type: "chatRunning" } @@ -326,6 +336,13 @@ export namespace CR { groups: T.GroupInfo[] } + export interface GroupDomainVerified extends Interface { + type: "groupDomainVerified" + user: T.User + groupInfo: T.GroupInfo + verificationFailure?: string + } + export interface Invitation extends Interface { type: "invitation" user: T.User diff --git a/packages/simplex-chat-client/types/typescript/src/types.ts b/packages/simplex-chat-client/types/typescript/src/types.ts index abc4187747..5faf084dce 100644 --- a/packages/simplex-chat-client/types/typescript/src/types.ts +++ b/packages/simplex-chat-client/types/typescript/src/types.ts @@ -1680,6 +1680,7 @@ export namespace ChatListQuery { export enum ChatPeerType { Human = "human", Bot = "bot", + Business = "business", } // Used in API commands. Chat scope can only be passed with groups. diff --git a/packages/simplex-chat-python/src/simplex_chat/types/_commands.py b/packages/simplex-chat-python/src/simplex_chat/types/_commands.py index 1886df7868..f73a4fa4f7 100644 --- a/packages/simplex-chat-python/src/simplex_chat/types/_commands.py +++ b/packages/simplex-chat-python/src/simplex_chat/types/_commands.py @@ -149,6 +149,31 @@ def APIChatItemReaction_cmd_string(self: APIChatItemReaction) -> str: APIChatItemReaction_Response = CR.ChatItemReaction | CR.ChatCmdError +# Share user address card +# Network usage: no. +class APIShareMyAddress(TypedDict): + toSendRef: "T.ChatRef" + + +def APIShareMyAddress_cmd_string(self: APIShareMyAddress) -> str: + return '/_share address' + T.ChatRef_cmd_string(self['toSendRef']) + +APIShareMyAddress_Response = CR.ChatMsgContent + + +# Share channel address +# Network usage: no. +class APIShareChatMsgContent(TypedDict): + shareChatRef: "T.ChatRef" + toSendRef: "T.ChatRef" + + +def APIShareChatMsgContent_cmd_string(self: APIShareChatMsgContent) -> str: + return '/_share chat content ' + T.ChatRef_cmd_string(self['shareChatRef']) + ' ' + T.ChatRef_cmd_string(self['toSendRef']) + +APIShareChatMsgContent_Response = CR.ChatMsgContent + + # File commands # Commands to receive and to cancel files. Files are sent as part of the message, there are no separate commands to send files. @@ -368,6 +393,18 @@ def APIUpdateGroupProfile_cmd_string(self: APIUpdateGroupProfile) -> str: APIUpdateGroupProfile_Response = CR.GroupUpdated | CR.ChatCmdError +# Verify group domain +# Network usage: interactive. +class APIVerifyGroupDomain(TypedDict): + groupId: int # int64 + + +def APIVerifyGroupDomain_cmd_string(self: APIVerifyGroupDomain) -> str: + return '/_verify domain #' + str(self['groupId']) + +APIVerifyGroupDomain_Response = CR.GroupDomainVerified + + # Group link commands # These commands can be used by bots that manage multiple public groups diff --git a/packages/simplex-chat-python/src/simplex_chat/types/_responses.py b/packages/simplex-chat-python/src/simplex_chat/types/_responses.py index 955291d0f0..393c20f311 100644 --- a/packages/simplex-chat-python/src/simplex_chat/types/_responses.py +++ b/packages/simplex-chat-python/src/simplex_chat/types/_responses.py @@ -36,6 +36,11 @@ class ChatItemsDeleted(TypedDict): byUser: bool timed: bool +class ChatMsgContent(TypedDict): + type: Literal["chatMsgContent"] + user: "T.User" + msgContent: "T.MsgContent" + class ChatRunning(TypedDict): type: Literal["chatRunning"] @@ -174,6 +179,12 @@ class GroupsList(TypedDict): user: "T.User" groups: list["T.GroupInfo"] +class GroupDomainVerified(TypedDict): + type: Literal["groupDomainVerified"] + user: "T.User" + groupInfo: "T.GroupInfo" + verificationFailure: NotRequired[str] + class Invitation(TypedDict): type: Literal["invitation"] user: "T.User" @@ -319,6 +330,7 @@ ChatResponse = ( | ChatItemReaction | ChatItemUpdated | ChatItemsDeleted + | ChatMsgContent | ChatRunning | ChatStarted | ChatStopped @@ -345,6 +357,7 @@ ChatResponse = ( | GroupMembers | GroupUpdated | GroupsList + | GroupDomainVerified | Invitation | LeftMemberUser | MemberAccepted @@ -371,4 +384,4 @@ ChatResponse = ( | ApiChats ) -ChatResponse_Tag = Literal["acceptingContactRequest", "activeUser", "chatItemNotChanged", "chatItemReaction", "chatItemUpdated", "chatItemsDeleted", "chatRunning", "chatStarted", "chatStopped", "cmdOk", "chatCmdError", "connectionPlan", "contactAlreadyExists", "contactConnectionDeleted", "contactDeleted", "contactPrefsUpdated", "contactRequestRejected", "contactsList", "groupDeletedUser", "groupLink", "groupLinkCreated", "groupLinkDeleted", "groupCreated", "publicGroupCreated", "publicGroupCreationFailed", "groupRelays", "groupRelaysAdded", "groupRelaysAddFailed", "relayGroupAllowed", "groupMembers", "groupUpdated", "groupsList", "invitation", "leftMemberUser", "memberAccepted", "membersBlockedForAllUser", "membersRoleUser", "newChatItems", "rcvFileAccepted", "rcvFileAcceptedSndCancelled", "rcvFileCancelled", "sentConfirmation", "sentGroupInvitation", "sentInvitation", "serviceReplyAccepted", "sndFileCancelled", "userAcceptedGroupSent", "userContactLink", "userContactLinkCreated", "userContactLinkDeleted", "userContactLinkUpdated", "userDeletedMembers", "userProfileUpdated", "userProfileNoChange", "usersList", "apiChats"] +ChatResponse_Tag = Literal["acceptingContactRequest", "activeUser", "chatItemNotChanged", "chatItemReaction", "chatItemUpdated", "chatItemsDeleted", "chatMsgContent", "chatRunning", "chatStarted", "chatStopped", "cmdOk", "chatCmdError", "connectionPlan", "contactAlreadyExists", "contactConnectionDeleted", "contactDeleted", "contactPrefsUpdated", "contactRequestRejected", "contactsList", "groupDeletedUser", "groupLink", "groupLinkCreated", "groupLinkDeleted", "groupCreated", "publicGroupCreated", "publicGroupCreationFailed", "groupRelays", "groupRelaysAdded", "groupRelaysAddFailed", "relayGroupAllowed", "groupMembers", "groupUpdated", "groupsList", "groupDomainVerified", "invitation", "leftMemberUser", "memberAccepted", "membersBlockedForAllUser", "membersRoleUser", "newChatItems", "rcvFileAccepted", "rcvFileAcceptedSndCancelled", "rcvFileCancelled", "sentConfirmation", "sentGroupInvitation", "sentInvitation", "serviceReplyAccepted", "sndFileCancelled", "userAcceptedGroupSent", "userContactLink", "userContactLinkCreated", "userContactLinkDeleted", "userContactLinkUpdated", "userDeletedMembers", "userProfileUpdated", "userProfileNoChange", "usersList", "apiChats"] diff --git a/packages/simplex-chat-python/src/simplex_chat/types/_types.py b/packages/simplex-chat-python/src/simplex_chat/types/_types.py index b57915d2db..b00a559f92 100644 --- a/packages/simplex-chat-python/src/simplex_chat/types/_types.py +++ b/packages/simplex-chat-python/src/simplex_chat/types/_types.py @@ -1175,7 +1175,7 @@ ChatListQuery = ChatListQuery_filters | ChatListQuery_search ChatListQuery_Tag = Literal["filters", "search"] -ChatPeerType = Literal["human", "bot"] +ChatPeerType = Literal["human", "bot", "business"] # Used in API commands. Chat scope can only be passed with groups. From 34b74d1c4986088f6a42c3a13dc584c638ead47a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sun, 2 Aug 2026 16:01:22 +0100 Subject: [PATCH 02/16] directory: remove support for directory log file (#7331) * directory: remove support for directory log file * remove unused exports --- apps/simplex-directory-service/Main.hs | 20 +-- .../src/Directory/Options.hs | 33 ---- .../src/Directory/Service.hs | 103 ++++++------ .../src/Directory/Store.hs | 146 +----------------- .../src/Directory/Store/Migrate.hs | 70 +-------- tests/Bots/DirectoryTests.hs | 11 +- 6 files changed, 58 insertions(+), 325 deletions(-) diff --git a/apps/simplex-directory-service/Main.hs b/apps/simplex-directory-service/Main.hs index 33145497ea..f771199dea 100644 --- a/apps/simplex-directory-service/Main.hs +++ b/apps/simplex-directory-service/Main.hs @@ -5,23 +5,11 @@ module Main where import Directory.Options import Directory.Service -import Directory.Store -import Directory.Store.Migrate import Simplex.Chat.Terminal (terminalChatConfig) main :: IO () main = do - opts@DirectoryOpts {directoryLog, migrateDirectoryLog, runCLI} <- welcomeGetOpts - case migrateDirectoryLog of - Just cmd -> migrate cmd opts terminalChatConfig - Nothing -> do - st <- openDirectoryLog directoryLog - if runCLI - then directoryServiceCLI st opts - else directoryService st opts terminalChatConfig - where - migrate = \case - MLCheck -> checkDirectoryLog - MLImport -> importDirectoryLogToDB - MLExport -> exportDBToDirectoryLog - MLListing -> saveGroupListingFiles + opts@DirectoryOpts {runCLI} <- welcomeGetOpts + if runCLI + then directoryServiceCLI opts + else directoryService opts terminalChatConfig diff --git a/apps/simplex-directory-service/src/Directory/Options.hs b/apps/simplex-directory-service/src/Directory/Options.hs index 199229964a..89709e66d9 100644 --- a/apps/simplex-directory-service/src/Directory/Options.hs +++ b/apps/simplex-directory-service/src/Directory/Options.hs @@ -14,14 +14,11 @@ module Directory.Options ) where -import qualified Data.Attoparsec.ByteString.Char8 as A import qualified Data.Text as T -import Data.Text.Encoding (encodeUtf8) import Options.Applicative import Simplex.Chat.Bot.KnownContacts import Simplex.Chat.Controller (updateStr, versionNumber, versionString) import Simplex.Chat.Options (ChatCmdLog (..), ChatOpts (..), CoreChatOpts, CreateBotOpts (..), coreChatOptsP) -import Simplex.Messaging.Parsers (parseAll) data DirectoryOpts = DirectoryOpts { coreOptions :: CoreChatOpts, @@ -36,8 +33,6 @@ data DirectoryOpts = DirectoryOpts profileNameLimit :: Int, captchaGenerator :: Maybe FilePath, voiceCaptchaGenerator :: Maybe FilePath, - directoryLog :: Maybe FilePath, - migrateDirectoryLog :: Maybe MigrateLog, serviceName :: T.Text, clientService :: Bool, runCLI :: Bool, @@ -133,21 +128,6 @@ directoryOpts appDir defaultDbName = do <> metavar "VOICE_CAPTCHA_GENERATOR" <> help "Executable to generate voice captcha, accepts text as parameter, writes audio file, outputs file_path and duration_seconds to stdout" ) - directoryLog <- - optional $ - strOption - ( long "directory-file" - <> metavar "DIRECTORY_FILE" - <> help "Append only log for directory state" - ) - migrateDirectoryLog <- - optional $ - option - parseMigrateLog - ( long "migrate-directory-file" - <> metavar "MIGRATE_COMMAND" - <> help "Command to import/export directory log file" - ) serviceName <- strOption ( long "service-name" @@ -209,8 +189,6 @@ directoryOpts appDir defaultDbName = do profileNameLimit, captchaGenerator, voiceCaptchaGenerator, - directoryLog, - migrateDirectoryLog, serviceName = T.pack serviceName, clientService, runCLI, @@ -254,14 +232,3 @@ mkChatOpts DirectoryOpts {coreOptions, serviceName, clientService} = userDisplayName = Nothing, userImageFile = Nothing } - -parseMigrateLog :: ReadM MigrateLog -parseMigrateLog = eitherReader $ parseAll mlP . encodeUtf8 . T.pack - where - mlP = - A.takeTill (== ' ') >>= \case - "check" -> pure MLCheck - "import" -> pure MLImport - "export" -> pure MLExport - "listing" -> pure MLListing - _ -> fail "bad MigrateLog" diff --git a/apps/simplex-directory-service/src/Directory/Service.hs b/apps/simplex-directory-service/src/Directory/Service.hs index a3af872ac3..7dc165c4df 100644 --- a/apps/simplex-directory-service/src/Directory/Service.hs +++ b/apps/simplex-directory-service/src/Directory/Service.hs @@ -154,8 +154,8 @@ welcomeGetOpts = do knownContact KnownContact {contactId, localDisplayName = n} = knownName contactId n knownName i n = show i <> ":" <> T.unpack (viewName n) -directoryServiceCLI :: DirectoryLog -> DirectoryOpts -> IO () -directoryServiceCLI st opts = do +directoryServiceCLI :: DirectoryOpts -> IO () +directoryServiceCLI opts = do env@ServiceState {eventQ} <- newServiceState opts let eventHook _cc resp = atomically $ resp <$ mapM_ (writeTQueue eventQ) (crDirectoryEvent resp) chatHooks = @@ -178,7 +178,7 @@ directoryServiceCLI st opts = do forM_ u_ $ \user -> forever $ do event <- atomically $ readTQueue eventQ - directoryServiceEvent st opts env user cc event + directoryServiceEvent opts env user cc event updateListingDelay :: Int updateListingDelay = 5 * 60 * 1000000 -- update every 5 minutes @@ -249,8 +249,8 @@ directoryCommands = where idParam = Just "" -directoryService :: DirectoryLog -> DirectoryOpts -> ChatConfig -> IO () -directoryService st opts cfg = do +directoryService :: DirectoryOpts -> ChatConfig -> IO () +directoryService opts cfg = do env@ServiceState {eventQ} <- newServiceState opts let chatHooks = defaultChatHooks @@ -265,7 +265,7 @@ directoryService st opts cfg = do mapM_ (atomically . writeTQueue eventQ) $ crDirectoryEvent resp, forever $ do event <- atomically $ readTQueue eventQ - directoryServiceEvent st opts env user cc event + directoryServiceEvent opts env user cc event ] <> maybeToList (updateListingsThread_ opts env) <> maybeToList (linkCheckThread_ opts env) @@ -317,8 +317,8 @@ readBlockedWordsConfig DirectoryOpts {blockedFragmentsFile, blockedWordsFile, na unless testing $ putStrLn $ "Blocked fragments: " <> show (length blockedFragments) <> ", blocked words: " <> show (length blockedWords) <> ", spelling rules: " <> show (M.size spelling) pure BlockedWordsConfig {blockedFragments, blockedWords, extensionRules, spelling} -directoryServiceEvent :: DirectoryLog -> DirectoryOpts -> ServiceState -> User -> ChatController -> DirectoryEvent -> IO () -directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName, ownersGroup, searchResults, prohibitedToObserver, alwaysCaptcha} env@ServiceState {searchRequests} user@User {userId} cc = \case +directoryServiceEvent :: DirectoryOpts -> ServiceState -> User -> ChatController -> DirectoryEvent -> IO () +directoryServiceEvent opts@DirectoryOpts {adminUsers, superUsers, serviceName, ownersGroup, searchResults, prohibitedToObserver, alwaysCaptcha} env@ServiceState {searchRequests} user@User {userId} cc = \case DEContactConnected ct -> deContactConnected ct DEGroupInvitation {contact = ct, groupInfo = g, fromMemberRole, memberRole} -> deGroupInvitation ct g fromMemberRole memberRole DEServiceJoinedGroup ctId g owner -> deServiceJoinedGroup ctId g owner @@ -420,8 +420,8 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName processInvitation :: Contact -> GroupInfo -> Maybe GroupReg -> IO () processInvitation ct g@GroupInfo {groupId, groupProfile = GroupProfile {displayName}} = \case - Nothing -> addGroupReg notifyAdminUsers st cc user ct g GRSProposed joinGroup - Just _gr -> setGroupStatus notifyAdminUsers st env cc groupId GRSProposed joinGroup + Nothing -> addGroupReg notifyAdminUsers cc user ct g GRSProposed joinGroup + Just _gr -> setGroupStatus notifyAdminUsers env cc groupId GRSProposed joinGroup where joinGroup _ = do r <- sendChatCmd cc $ APIJoinGroup groupId MFNone @@ -452,7 +452,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName Left e -> sendMessage cc ct $ "Error: getDuplicateGroup. Please notify the developers.\n" <> T.pack e where askConfirmation = - addGroupReg notifyAdminUsers st cc user ct g GRSPendingConfirmation $ \GroupReg {userGroupRegId} -> do + addGroupReg notifyAdminUsers cc user ct g GRSPendingConfirmation $ \GroupReg {userGroupRegId} -> do sendMessage cc ct $ "The group " <> groupNameDescr p <> " is already submitted to the directory.\nTo confirm the registration, please send:" sendMessage cc ct $ "/confirm " <> tshow userGroupRegId <> ":" <> viewName displayName @@ -493,11 +493,10 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName logError msg notifyOwner gr msg Right () -> do - logGUpdateOwner st groupId $ groupMemberId' owner notifyOwner gr $ "Joined the group " <> displayName <> ", creating the link…" sendChatCmd cc (APICreateGroupLink groupId GRMember) >>= \case Right CRGroupLinkCreated {groupLink = GroupLink {connLinkContact = gLink}} -> - setGroupStatus notifyAdminUsers st env cc groupId GRSPendingUpdate $ \gr' -> do + setGroupStatus notifyAdminUsers env cc groupId GRSPendingUpdate $ \gr' -> do notifyOwner gr' "Created the public link to join the group via this directory service that is always online.\n\n\ @@ -576,19 +575,19 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName withDB "getGroupMember" cc (\db -> withExceptT show $ getGroupMember db (storeCxt cc) user groupId ownerGMId) >>= \case Right ownerMember | let GroupMember {memberRole = role} = ownerMember, role >= GROwner -> - setGroupStatus notifyAdminUsers st env cc groupId (GRSPendingApproval n') (`updatedNotification` g') + setGroupStatus notifyAdminUsers env cc groupId (GRSPendingApproval n') (`updatedNotification` g') | otherwise -> do - setGroupStatus notifyAdminUsers st env cc groupId GRSSuspendedBadRoles $ \_ -> pure () + setGroupStatus notifyAdminUsers env cc groupId GRSSuspendedBadRoles $ \_ -> pure () notifyOwner gr $ "The registration owner is no longer an owner. Registration suspended." Left _ -> logError $ "could not find owner member for " <> groupRef Nothing -> logError $ "no owner member set for " <> groupRef _ -> - setGroupStatus notifyAdminUsers st env cc groupId (GRSPendingApproval n') (`updatedNotification` toGroup) + setGroupStatus notifyAdminUsers env cc groupId (GRSPendingApproval n') (`updatedNotification` toGroup) groupLinkAdded gr byMember = getDuplicateGroup toGroup >>= \case Left e -> notifyOwner gr $ "Error: getDuplicateGroup. Please notify the developers.\n" <> T.pack e Right DGReserved -> notifyOwner gr $ groupAlreadyListed toGroup - _ -> setGroupStatus notifyAdminUsers st env cc groupId (GRSPendingApproval gaId) $ \gr' -> do + _ -> setGroupStatus notifyAdminUsers env cc groupId (GRSPendingApproval gaId) $ \gr' -> do notifyOwner gr' $ ("Thank you! The group link for " <> userGroupReference gr' toGroup <> " is added to the welcome message" <> byMember) <> ".\nYou will be notified once the group is added to the directory - it may take up to 48 hours." @@ -599,16 +598,16 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName let userGroupRef = userGroupReference gr toGroup groupRef = groupReference toGroup groupProfileUpdate >>= \case - GPNoServiceLink -> setGroupStatus notifyAdminUsers st env cc groupId GRSPendingUpdate $ \gr' -> do + GPNoServiceLink -> setGroupStatus notifyAdminUsers env cc groupId GRSPendingUpdate $ \gr' -> do notifyOwner gr' $ ("The group profile is updated for " <> userGroupRef <> byMember <> ", but no link is added to the welcome message.\n\n") <> "The group will remain hidden from the directory until the group link is added and the group is re-approved." - GPServiceLinkRemoved -> setGroupStatus notifyAdminUsers st env cc groupId GRSPendingUpdate $ \gr' -> do + GPServiceLinkRemoved -> setGroupStatus notifyAdminUsers env cc groupId GRSPendingUpdate $ \gr' -> do notifyOwner gr' $ ("The group link for " <> userGroupRef <> " is removed from the welcome message" <> byMember) <> ".\n\nThe group is hidden from the directory until the group link is added and the group is re-approved." notifyAdminUsers $ "The group link is removed from " <> groupRef <> ", de-listed." - GPServiceLinkAdded _ -> setGroupStatus notifyAdminUsers st env cc groupId (GRSPendingApproval n') $ \gr' -> do + GPServiceLinkAdded _ -> setGroupStatus notifyAdminUsers env cc groupId (GRSPendingApproval n') $ \gr' -> do notifyOwner gr' $ ("The group link is added to " <> userGroupRef <> byMember) <> "!\nIt is hidden from the directory until approved." @@ -620,7 +619,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName ("The group " <> userGroupRef <> " is updated" <> byMember) <> "!\nThe group is listed in directory." notifyAdminUsers $ "The group " <> groupRef <> " is updated" <> byMember <> " - only link or whitespace changes.\nThe group remained listed in directory." - | otherwise -> setGroupStatus notifyAdminUsers st env cc groupId (GRSPendingApproval n') $ \gr' -> do + | otherwise -> setGroupStatus notifyAdminUsers env cc groupId (GRSPendingApproval n') $ \gr' -> do notifyOwner gr' $ ("The group " <> userGroupRef <> " is updated" <> byMember) <> "!\nIt is hidden from the directory until approved." @@ -839,7 +838,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName when groupUpdated $ reapprove pg gr groupRegStatus g'' when (groupUpdated || summary /= groupSummary g'' || groupDomainVerified g'' /= groupDomainVerified gInfo) $ listingsUpdated env Left (ChatErrorAgent {agentError = SMP _ err}) | linkDeleted err -> - setGroupStatus logError st env cc groupId GRSRemoved $ \gr' -> + setGroupStatus logError env cc groupId GRSRemoved $ \gr' -> notifyOwner gr' "The channel link is no longer valid.\nThe channel is removed from the directory." _ -> pure () where @@ -852,7 +851,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName withDB "checkGroupLink" cc (\db -> withExceptT show $ getGroupMember db (storeCxt cc) user groupId ownerGMId) >>= \case Right GroupMember {memberId, memberPubKey} | any (\GroupLinkOwner {memberId = mId, memberKey} -> memberId == mId && memberPubKey == Just memberKey) owners -> onValid - _ -> setGroupStatus logError st env cc groupId GRSSuspendedBadRoles $ \gr' -> + _ -> setGroupStatus logError env cc groupId GRSSuspendedBadRoles $ \gr' -> notifyOwner gr' "The registration owner is no longer a channel owner.\nThe channel is no longer listed in the directory." Nothing -> onValid reapprove pg gr groupRegStatus g' = do @@ -861,7 +860,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName notifyAdminUsers $ "The " <> gt <> " " <> groupRef <> " profile changed." case groupRegStatus of GRSActive -> - setGroupStatus notifyAdminUsers st env cc groupId (GRSPendingApproval 1) $ \gr' -> do + setGroupStatus notifyAdminUsers env cc groupId (GRSPendingApproval 1) $ \gr' -> do notifyOwner gr' $ "The " <> gt <> " profile has changed.\nIt is hidden from the directory until approved." sendToApprove g' gr' 1 GRSPendingApproval n -> @@ -877,14 +876,14 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName when (ctId `isOwner` gr) $ case groupRegStatus of GRSSuspendedBadRoles | rStatus == GRSOk -> - setGroupStatus notifyAdminUsers st env cc groupId GRSActive $ \gr' -> do + setGroupStatus notifyAdminUsers env cc groupId GRSActive $ \gr' -> do notifyOwner gr' $ uCtRole <> ".\n\nThe group is listed in the directory again." notifyAdminUsers $ "The group " <> groupRef <> " is listed " <> suCtRole GRSPendingApproval gaId | rStatus == GRSOk -> do verifyAndSendToApprove g gr gaId notifyOwner gr $ uCtRole <> ".\n\nThe group is submitted for approval." GRSActive | rStatus /= GRSOk -> - setGroupStatus notifyAdminUsers st env cc groupId GRSSuspendedBadRoles $ \gr' -> do + setGroupStatus notifyAdminUsers env cc groupId GRSSuspendedBadRoles $ \gr' -> do notifyOwner gr' $ uCtRole <> ".\n\nThe group is no longer listed in the directory." notifyAdminUsers $ "The group " <> groupRef <> " is de-listed " <> suCtRole _ -> pure () @@ -903,7 +902,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName case groupRegStatus of GRSSuspendedBadRoles | serviceRole == GRAdmin -> whenContactIsOwner gr $ - setGroupStatus notifyAdminUsers st env cc groupId GRSActive $ \gr' -> do + setGroupStatus notifyAdminUsers env cc groupId GRSActive $ \gr' -> do notifyOwner gr' $ uSrvRole <> ".\n\nThe group is listed in the directory again." notifyAdminUsers $ "The group " <> groupRef <> " is listed " <> suSrvRole GRSPendingApproval gaId | serviceRole == GRAdmin -> @@ -911,7 +910,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName verifyAndSendToApprove g gr gaId notifyOwner gr $ uSrvRole <> ".\n\nThe group is submitted for approval." GRSActive | serviceRole /= GRAdmin -> - setGroupStatus notifyAdminUsers st env cc groupId GRSSuspendedBadRoles $ \gr' -> do + setGroupStatus notifyAdminUsers env cc groupId GRSSuspendedBadRoles $ \gr' -> do notifyOwner gr' $ uSrvRole <> ".\n\nThe group is no longer listed in the directory." notifyAdminUsers $ "The group " <> groupRef <> " is de-listed " <> suSrvRole _ -> pure () @@ -929,7 +928,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName logInfo $ "contact ID " <> tshow ctId <> " removed from group " <> viewGroupName g withGroupReg g "contact removed" $ \gr -> when (ctId `isOwner` gr) $ - setGroupStatus notifyAdminUsers st env cc groupId GRSRemoved $ \gr' -> do + setGroupStatus notifyAdminUsers env cc groupId GRSRemoved $ \gr' -> do notifyOwner gr' $ "You are removed from the " <> gt <> " " <> userGroupReference gr' g <> ".\n\nThe " <> gt <> " is no longer listed in the directory." notifyAdminUsers $ "The " <> gt <> " " <> groupReference g <> " is de-listed (" <> gt <> " owner is removed)." when (isJust pg_) $ leavePublicGroup g @@ -940,7 +939,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName logInfo $ "contact ID " <> tshow ctId <> " left group " <> viewGroupName g withGroupReg g "contact left" $ \gr -> when (ctId `isOwner` gr) $ - setGroupStatus notifyAdminUsers st env cc groupId GRSRemoved $ \gr' -> do + setGroupStatus notifyAdminUsers env cc groupId GRSRemoved $ \gr' -> do notifyOwner gr' $ "You left the " <> gt <> " " <> userGroupReference gr' g <> ".\n\nThe " <> gt <> " is no longer listed in the directory." notifyAdminUsers $ "The " <> gt <> " " <> groupReference g <> " is de-listed (" <> gt <> " owner left)." when (isJust pg_) $ leavePublicGroup g @@ -949,7 +948,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName deServiceRemovedFromGroup g@GroupInfo {groupId, groupProfile = GroupProfile {publicGroup = pg_}} = do let gt = maybe "group" groupTypeStr' pg_ logInfo $ "service removed from group " <> viewGroupName g - setGroupStatus notifyAdminUsers st env cc groupId GRSRemoved $ \gr -> do + setGroupStatus notifyAdminUsers env cc groupId GRSRemoved $ \gr -> do notifyOwner gr $ serviceName <> " is removed from the " <> gt <> " " <> userGroupReference gr g <> ".\n\nThe " <> gt <> " is no longer listed in the directory." notifyAdminUsers $ "The " <> gt <> " " <> groupReference g <> " is de-listed (directory service is removed)." @@ -957,7 +956,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName deGroupDeleted g@GroupInfo {groupId, groupProfile = GroupProfile {publicGroup = pg_}} = do let gt = maybe "group" groupTypeStr' pg_ logInfo $ "group removed " <> viewGroupName g - setGroupStatus notifyAdminUsers st env cc groupId GRSRemoved $ \gr -> do + setGroupStatus notifyAdminUsers env cc groupId GRSRemoved $ \gr -> do notifyOwner gr $ "The " <> gt <> " " <> userGroupReference gr g <> " is deleted.\n\nThe " <> gt <> " is no longer listed in the directory." notifyAdminUsers $ "The " <> gt <> " " <> groupReference g <> " is de-listed (" <> gt <> " is deleted)." @@ -1018,7 +1017,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName sendChatCmd cc (APIPrepareGroup userId ccLink False Nothing groupSLinkData) >>= \case Right (CRNewPreparedChat _ (AChat SCTGroup (Chat (GroupChat gInfo _) _ _))) -> do let gId = groupId' gInfo - addGroupReg notifyAdminUsers st cc user ct gInfo GRSProposed $ \_ -> pure () + addGroupReg notifyAdminUsers cc user ct gInfo GRSProposed $ \_ -> pure () sendChatCmd cc (APIConnectPreparedGroup gId False (Just ownerContact) Nothing) >>= \case Right CRStartedConnectionToGroup {groupInfo = gInfo'} -> withDB "getGroupMember" cc (\db -> withExceptT show $ getGroupMemberByMemberId db (storeCxt cc) user gInfo' mId) >>= \case @@ -1043,7 +1042,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName | contactId' ct `isOwner` gr -> sameOwnerReregistration gr gt | otherwise -> sendMessage cc ct $ "This " <> gt <> " is registered by another owner." Left _ -> - addGroupReg notifyAdminUsers st cc user ct g (GRSPendingApproval 1) $ \gr -> do + addGroupReg notifyAdminUsers cc user ct g (GRSPendingApproval 1) $ \gr -> do void $ setGroupRegOwner cc groupId ownerMember verifyAndSendToApprove g gr 1 | role < GROwner -> sendMessage cc ct $ "You must be the " <> gt <> " owner to register it." @@ -1065,7 +1064,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName GRSRemoved -> pendingApprovalTransition gr gt 1 pendingApprovalTransition gr gt n = do let userGroupRef = userGroupReference gr g - setGroupStatus notifyAdminUsers st env cc groupId (GRSPendingApproval n) $ \gr' -> do + setGroupStatus notifyAdminUsers env cc groupId (GRSPendingApproval n) $ \gr' -> do notifyOwner gr' $ "The " <> gt <> " " <> userGroupRef <> " is submitted for approval.\nIt is hidden from the directory until approved." verifyAndSendToApprove g gr' n @@ -1079,12 +1078,12 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName let GroupMember {memberRole = role} = toMember gt = maybe "group" groupTypeStr' publicGroup in if role >= GROwner - then setGroupStatus notifyAdminUsers st env cc groupId (GRSPendingApproval 1) $ \gr' -> do + then setGroupStatus notifyAdminUsers env cc groupId (GRSPendingApproval 1) $ \gr' -> do notifyOwner gr' $ "Joined the " <> gt <> " " <> displayName <> ". Registration is pending approval — it may take up to 48 hours." notifyOwner gr' $ recommendedSettingsNotice (userGroupRegId gr') verifyAndSendToApprove g gr' 1 else do - setGroupStatus notifyAdminUsers st env cc groupId GRSRemoved $ \_ -> pure () + setGroupStatus notifyAdminUsers env cc groupId GRSRemoved $ \_ -> pure () sendMessage' cc (dbContactId gr) "The signing key does not belong to a current owner. Registration cancelled." deUserCommand :: Contact -> ChatItemId -> DirectoryCmd 'DRUser -> IO () @@ -1159,7 +1158,6 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName let gt = maybe "group" groupTypeStr' pg_ delGroupReg cc dbGroupId >>= \case Right () -> do - logGDelete st dbGroupId sendReply $ (if isAdmin then "The " <> gt <> " " else "Your " <> gt <> " ") <> displayName <> " is deleted from the directory" when (isJust pg_) $ leavePublicGroup g Left e -> sendReply $ "Error deleting " <> gt <> " " <> displayName <> ": " <> T.pack e @@ -1333,7 +1331,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName let grPromoted' | promoted || knownCt `elem` superUsers = fromMaybe promoted promote | otherwise = False - setGroupStatusPromo sendReply st env cc gr GRSActive grPromoted' $ do + setGroupStatusPromo sendReply env cc gr GRSActive grPromoted' $ do let approved = "The " <> gt <> " " <> userGroupReference' gr n <> " is approved" let commands | isPublicGroup_ = "" @@ -1371,7 +1369,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName let groupRef = groupReference' groupId gName withGroupAndReg sendReply groupId gName $ \_ gr -> case groupRegStatus gr of - GRSActive -> setGroupStatus sendReply st env cc groupId GRSSuspended $ \gr' -> do + GRSActive -> setGroupStatus sendReply env cc groupId GRSSuspended $ \gr' -> do let suspended = "The group " <> userGroupReference' gr gName <> " is suspended" notifyOwner gr' $ suspended <> " and hidden from directory. Please contact the administrators." sendReply "Group suspended!" @@ -1381,7 +1379,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName let groupRef = groupReference' groupId gName withGroupAndReg sendReply groupId gName $ \_ gr -> case groupRegStatus gr of - GRSSuspended -> setGroupStatus sendReply st env cc groupId GRSActive $ \gr' -> do + GRSSuspended -> setGroupStatus sendReply env cc groupId GRSActive $ \gr' -> do let groupStr = "The group " <> userGroupReference' gr gName notifyOwner gr' $ groupStr <> " is listed in the directory again!" sendReply "Group listing resumed!" @@ -1452,7 +1450,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName withGroupAndReg sendReply groupId gName $ \_ gr@GroupReg {groupRegStatus, promoted} -> do let notify = sendReply $ "Group promotion " <> (if promote' then "enabled" <> (if groupRegStatus == GRSActive then "." else ", but the group is not listed.") else "disabled.") if promote' /= promoted - then setGroupPromoted sendReply st env cc gr promote' notify + then setGroupPromoted sendReply env cc gr promote' notify else notify DCExecuteCommand cmdStr -> sendChatCmdStr cc cmdStr >>= \case @@ -1510,48 +1508,43 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName msg = maybe (MCText text) (\image -> MCImage {text, image}) image_ in (Nothing, msg) -setGroupStatusPromo :: (Text -> IO ()) -> DirectoryLog -> ServiceState -> ChatController -> GroupReg -> GroupRegStatus -> Bool -> IO () -> IO () -setGroupStatusPromo sendReply st env cc GroupReg {dbGroupId = gId} grStatus' grPromoted' continue = do +setGroupStatusPromo :: (Text -> IO ()) -> ServiceState -> ChatController -> GroupReg -> GroupRegStatus -> Bool -> IO () -> IO () +setGroupStatusPromo sendReply env cc GroupReg {dbGroupId = gId} grStatus' grPromoted' continue = do let status' = grDirectoryStatus grStatus' setGroupStatusPromoStore cc gId grStatus' grPromoted' >>= \case Left e -> sendReply $ "Error updating group " <> tshow gId <> " status: " <> T.pack e Right (status, grPromoted) -> do when ((status == DSListed || status' == DSListed) && (status /= status' || grPromoted /= grPromoted')) $ listingsUpdated env - logGUpdateStatus st gId grStatus' - logGUpdatePromotion st gId grPromoted' continue -addGroupReg :: (Text -> IO ()) -> DirectoryLog -> ChatController -> User -> Contact -> GroupInfo -> GroupRegStatus -> (GroupReg -> IO ()) -> IO () -addGroupReg sendMsg st cc user ct g@GroupInfo {groupId} grStatus continue = +addGroupReg :: (Text -> IO ()) -> ChatController -> User -> Contact -> GroupInfo -> GroupRegStatus -> (GroupReg -> IO ()) -> IO () +addGroupReg sendMsg cc user ct g@GroupInfo {groupId} grStatus continue = addGroupRegStore cc ct g grStatus >>= \case Left e -> sendMsg $ "Error creating group registation for group " <> tshow groupId <> ": " <> T.pack e Right gr -> do - logGCreate st gr let d = toCustomData $ DirectoryGroupData newGroupJoinFilter withDB' "setGroupCustomData" cc (\db -> setGroupCustomData db user g $ Just d) >>= \case Right () -> pure () Left e -> sendMsg $ "Error setting default captcha for group " <> tshow groupId <> ": " <> T.pack e continue gr -setGroupStatus :: (Text -> IO ()) -> DirectoryLog -> ServiceState -> ChatController -> GroupId -> GroupRegStatus -> (GroupReg -> IO ()) -> IO () -setGroupStatus sendMsg st env cc gId grStatus' continue = do +setGroupStatus :: (Text -> IO ()) -> ServiceState -> ChatController -> GroupId -> GroupRegStatus -> (GroupReg -> IO ()) -> IO () +setGroupStatus sendMsg env cc gId grStatus' continue = do let status' = grDirectoryStatus grStatus' setGroupStatusStore cc gId grStatus' >>= \case Left e -> sendMsg $ "Error updating group " <> tshow gId <> " status: " <> T.pack e Right (grStatus, gr) -> do let status = grDirectoryStatus grStatus when ((status == DSListed || status' == DSListed) && status /= status') $ listingsUpdated env - logGUpdateStatus st gId grStatus' continue gr -setGroupPromoted :: (Text -> IO ()) -> DirectoryLog -> ServiceState -> ChatController -> GroupReg -> Bool -> IO () -> IO () -setGroupPromoted sendReply st env cc GroupReg {dbGroupId = gId} grPromoted' continue = +setGroupPromoted :: (Text -> IO ()) -> ServiceState -> ChatController -> GroupReg -> Bool -> IO () -> IO () +setGroupPromoted sendReply env cc GroupReg {dbGroupId = gId} grPromoted' continue = setGroupPromotedStore cc gId grPromoted' >>= \case Left e -> sendReply $ "Error updating group " <> tshow gId <> " status: " <> T.pack e Right (status, grPromoted) -> do when (status == DSListed && grPromoted' /= grPromoted) $ listingsUpdated env - logGUpdatePromotion st gId grPromoted' continue updateGroupListingFiles :: ChatController -> User -> FilePath -> IO () diff --git a/apps/simplex-directory-service/src/Directory/Store.hs b/apps/simplex-directory-service/src/Directory/Store.hs index e3465e64b1..94375eb025 100644 --- a/apps/simplex-directory-service/src/Directory/Store.hs +++ b/apps/simplex-directory-service/src/Directory/Store.hs @@ -11,8 +11,7 @@ {-# OPTIONS_GHC -fno-warn-ambiguous-fields #-} module Directory.Store - ( DirectoryLog (..), - GroupReg (..), + ( GroupReg (..), GroupRegStatus (..), UserGroupRegId, GroupApprovalId, @@ -20,9 +19,6 @@ module Directory.Store DirectoryMemberAcceptance (..), DirectoryStatus (..), ProfileCondition (..), - DirectoryLogRecord (..), - openDirectoryLog, - readDirectoryLogData, addGroupRegStore, insertGroupReg, delGroupReg, @@ -55,16 +51,9 @@ module Directory.Store strongJoinFilter, newGroupJoinFilter, groupDBError, - logGCreate, - logGDelete, - logGUpdateOwner, - logGUpdateStatus, - logGUpdatePromotion, ) where -import Control.Applicative ((<|>)) -import Control.Monad import Control.Monad.Except import Control.Monad.IO.Class import Data.Aeson ((.:), (.=)) @@ -72,18 +61,12 @@ import qualified Data.Aeson.KeyMap as JM import qualified Data.Aeson.TH as JQ import qualified Data.Aeson.Types as JT import qualified Data.Attoparsec.ByteString.Char8 as A -import Data.ByteString.Char8 (ByteString) -import qualified Data.ByteString.Char8 as B import Data.Int (Int64) -import Data.List (sortOn) -import Data.Map (Map) -import qualified Data.Map.Strict as M -import Data.Maybe (fromMaybe, isJust) +import Data.Maybe (fromMaybe) import Data.Text (Text) import qualified Data.Text as T import Data.Text.Encoding (encodeUtf8) import Data.Time.Clock (UTCTime (..), getCurrentTime) -import Data.Time.Clock.System (systemEpochDay) import Directory.Search import Directory.Util import Simplex.Chat.Controller @@ -99,7 +82,6 @@ import qualified Simplex.Messaging.Agent.Store.DB as DB import Simplex.Messaging.Encoding.String import Simplex.Messaging.Parsers (defaultJSON, dropPrefix, enumJSON) import Simplex.Messaging.Util (eitherToMaybe, firstRow, maybeFirstRow', safeDecodeUtf8) -import System.IO (BufferMode (..), Handle, IOMode (..), hSetBuffering, openFile) #if defined(dbPostgres) import Database.PostgreSQL.Simple (Only (..), Query, (:.) (..)) @@ -109,10 +91,6 @@ import Database.SQLite.Simple (Only (..), Query, (:.) (..)) import Database.SQLite.Simple.QQ (sql) #endif -data DirectoryLog = DirectoryLog - { directoryLogFile :: Maybe Handle - } - data GroupReg = GroupReg { dbGroupId :: GroupId, userGroupRegId :: UserGroupRegId, @@ -472,89 +450,6 @@ groupReqQuery = groupInfoQueryFields <> groupRegFields <> groupInfoQueryFrom <> groupRegFields = ", r.group_id, r.user_group_reg_id, r.contact_id, r.owner_member_id, r.group_reg_status, r.group_promoted, r.created_at " groupRegFromCond = " JOIN sx_directory_group_regs r ON r.group_id = g.group_id WHERE g.user_id = ? AND mu.contact_id = ? " -data DirectoryLogRecord - = GRCreate GroupReg - | GRDelete GroupId - | GRUpdateStatus GroupId GroupRegStatus - | GRUpdatePromotion GroupId Bool - | GRUpdateOwner GroupId GroupMemberId - -data DLRTag - = GRCreate_ - | GRDelete_ - | GRUpdateStatus_ - | GRUpdatePromotion_ - | GRUpdateOwner_ - -logDLR :: DirectoryLog -> DirectoryLogRecord -> IO () -logDLR st r = forM_ (directoryLogFile st) $ \h -> B.hPutStrLn h (strEncode r) - -logGCreate :: DirectoryLog -> GroupReg -> IO () -logGCreate st = logDLR st . GRCreate - -logGDelete :: DirectoryLog -> GroupId -> IO () -logGDelete st = logDLR st . GRDelete - -logGUpdateStatus :: DirectoryLog -> GroupId -> GroupRegStatus -> IO () -logGUpdateStatus st gId = logDLR st . GRUpdateStatus gId - -logGUpdatePromotion :: DirectoryLog -> GroupId -> Bool -> IO () -logGUpdatePromotion st gId = logDLR st . GRUpdatePromotion gId - -logGUpdateOwner :: DirectoryLog -> GroupId -> GroupMemberId -> IO () -logGUpdateOwner st gId = logDLR st . GRUpdateOwner gId - -instance StrEncoding DLRTag where - strEncode = \case - GRCreate_ -> "GCREATE" - GRDelete_ -> "GDELETE" - GRUpdateStatus_ -> "GSTATUS" - GRUpdatePromotion_ -> "GPROMOTE" - GRUpdateOwner_ -> "GOWNER" - strP = - A.takeTill (== ' ') >>= \case - "GCREATE" -> pure GRCreate_ - "GDELETE" -> pure GRDelete_ - "GSTATUS" -> pure GRUpdateStatus_ - "GPROMOTE" -> pure GRUpdatePromotion_ - "GOWNER" -> pure GRUpdateOwner_ - _ -> fail "invalid DLRTag" - -instance StrEncoding DirectoryLogRecord where - strEncode = \case - GRCreate gr -> strEncode (GRCreate_, gr) - GRDelete gId -> strEncode (GRDelete_, gId) - GRUpdateStatus gId grStatus -> strEncode (GRUpdateStatus_, gId, grStatus) - GRUpdatePromotion gId promoted -> strEncode (GRUpdatePromotion_, gId, promoted) - GRUpdateOwner gId grOwnerId -> strEncode (GRUpdateOwner_, gId, grOwnerId) - strP = - strP_ >>= \case - GRCreate_ -> GRCreate <$> strP - GRDelete_ -> GRDelete <$> strP - GRUpdateStatus_ -> GRUpdateStatus <$> A.decimal <*> _strP - GRUpdatePromotion_ -> GRUpdatePromotion <$> A.decimal <*> _strP - GRUpdateOwner_ -> GRUpdateOwner <$> A.decimal <* A.space <*> A.decimal - -instance StrEncoding GroupReg where - strEncode GroupReg {dbGroupId, userGroupRegId, dbContactId, dbOwnerMemberId, groupRegStatus, promoted} = - B.unwords $ - [ "group_id=" <> strEncode dbGroupId, - "user_group_id=" <> strEncode userGroupRegId, - "contact_id=" <> strEncode dbContactId, - "owner_member_id=" <> strEncode dbOwnerMemberId, - "status=" <> strEncode groupRegStatus - ] - <> ["promoted=" <> strEncode promoted | promoted] - strP = do - dbGroupId <- "group_id=" *> strP_ - userGroupRegId <- "user_group_id=" *> strP_ - dbContactId <- "contact_id=" *> strP_ - dbOwnerMemberId <- "owner_member_id=" *> strP_ - groupRegStatus <- "status=" *> strP - promoted <- (" promoted=" *> strP) <|> pure False - let createdAt = UTCTime systemEpochDay 0 - pure GroupReg {dbGroupId, userGroupRegId, dbContactId, dbOwnerMemberId, groupRegStatus, promoted, createdAt} - instance StrEncoding GroupRegStatus where strEncode = \case GRSPendingConfirmation -> "pending_confirmation" @@ -580,40 +475,3 @@ instance StrEncoding GroupRegStatus where instance ToField GroupRegStatus where toField = toField . safeDecodeUtf8 . strEncode instance FromField GroupRegStatus where fromField = fromTextField_ $ eitherToMaybe . strDecode . encodeUtf8 - -openDirectoryLog :: Maybe FilePath -> IO DirectoryLog -openDirectoryLog = \case - Just f -> DirectoryLog . Just <$> openLogFile f - Nothing -> pure $ DirectoryLog Nothing - where - openLogFile f = do - h <- openFile f AppendMode - hSetBuffering h LineBuffering - pure h - -readDirectoryLogData :: FilePath -> IO [GroupReg] -readDirectoryLogData f = - sortOn dbGroupId . M.elems - <$> (foldM processDLR M.empty . B.lines =<< B.readFile f) - where - processDLR :: Map GroupId GroupReg -> ByteString -> IO (Map GroupId GroupReg) - processDLR m l = case strDecode l of - Left e -> m <$ putStrLn ("Error parsing log record: " <> e <> ", " <> B.unpack (B.take 80 l)) - Right r -> case r of - GRCreate gr@GroupReg {dbGroupId = gId} -> do - when (isJust $ M.lookup gId m) $ - putStrLn $ - "Warning: duplicate group with ID " <> show gId <> ", group replaced." - pure $ M.insert gId gr m - GRDelete gId -> case M.lookup gId m of - Just _ -> pure $ M.delete gId m - Nothing -> m <$ putStrLn ("Warning: no group with ID " <> show gId <> ", deletion ignored.") - GRUpdateStatus gId groupRegStatus -> case M.lookup gId m of - Just gr -> pure $ M.insert gId gr {groupRegStatus} m - Nothing -> m <$ putStrLn ("Warning: no group with ID " <> show gId <> ", status update ignored.") - GRUpdatePromotion gId promoted -> case M.lookup gId m of - Just gr -> pure $ M.insert gId gr {promoted} m - Nothing -> m <$ putStrLn ("Warning: no group with ID " <> show gId <> ", promotion update ignored.") - GRUpdateOwner gId grOwnerId -> case M.lookup gId m of - Just gr -> pure $ M.insert gId gr {dbOwnerMemberId = Just grOwnerId} m - Nothing -> m <$ putStrLn ("Warning: no group with ID " <> show gId <> ", owner update ignored.") diff --git a/apps/simplex-directory-service/src/Directory/Store/Migrate.hs b/apps/simplex-directory-service/src/Directory/Store/Migrate.hs index d501fbd5c3..1a5c45348a 100644 --- a/apps/simplex-directory-service/src/Directory/Store/Migrate.hs +++ b/apps/simplex-directory-service/src/Directory/Store/Migrate.hs @@ -7,18 +7,15 @@ module Directory.Store.Migrate where -import Control.Concurrent.STM import Control.Monad import Control.Monad.Except import qualified Data.ByteString.Char8 as B import Data.List (find) -import Data.Maybe (fromMaybe) import qualified Data.Text as T -import Directory.Listing import Directory.Options import Directory.Store import Simplex.Chat (createChatDatabase) -import Simplex.Chat.Controller (ChatConfig (..), ChatDatabase (..), mkStoreCxt) +import Simplex.Chat.Controller (ChatConfig (..), ChatDatabase (..)) import Simplex.Chat.Options (CoreChatOpts (..)) import Simplex.Chat.Options.DB import Simplex.Chat.Store.Groups (getHostMember) @@ -30,11 +27,7 @@ import qualified Simplex.Messaging.Agent.Store.DB as DB import Simplex.Messaging.Agent.Store.Interface (closeDBStore, migrateDBSchema) import Simplex.Messaging.Agent.Store.Shared (MigrationConfig (..), MigrationConfirmation (..)) import Simplex.Messaging.Encoding.String -import qualified Simplex.Messaging.TMap as TM -import Simplex.Messaging.Util (whenM) -import System.Directory (doesFileExist, renamePath) import System.Exit (exitFailure) -import System.IO (IOMode (..), withFile) #if defined(dbPostgres) import Directory.Store.Postgres.Migrations @@ -55,66 +48,9 @@ runDirectoryMigrations opts ChatConfig {confirmMigrations} chatStore = DirectoryOpts {coreOptions = CoreChatOpts {dbOptions, yesToUpMigrations}} = opts confirm = if confirmMigrations == MCConsole && yesToUpMigrations then MCYesUp else confirmMigrations -checkDirectoryLog :: DirectoryOpts -> ChatConfig -> IO () -checkDirectoryLog opts cfg = - withDirectoryLog opts $ \logFile -> withChatStore opts $ \st -> do - runDirectoryMigrations opts cfg st - gs <- readDirectoryLogData logFile - withActiveUser st $ \user -> withTransaction st $ \db -> do - mapM_ (verifyGroupRegistration (mkStoreCxt cfg) db user) gs - putStrLn $ show (length gs) <> " group registrations OK" - -importDirectoryLogToDB :: DirectoryOpts -> ChatConfig -> IO () -importDirectoryLogToDB opts cfg = do - withDirectoryLog opts $ \logFile -> withChatStore opts $ \st -> do - runDirectoryMigrations opts cfg st - gs <- readDirectoryLogData logFile - ctRegs <- TM.emptyIO - withActiveUser st $ \user -> withTransaction st $ \db -> do - forM_ gs $ \gr -> - whenM (verifyGroupRegistration (mkStoreCxt cfg) db user gr) $ do - putStrLn $ "importing group " <> show (dbGroupId gr) - insertGroupReg db =<< fixUserGroupRegId ctRegs gr - renamePath logFile (logFile ++ ".bak") - putStrLn $ show (length gs) <> " group registrations imported" - where - fixUserGroupRegId ctRegs gr@GroupReg {dbGroupId, dbContactId} = do - ugIds <- fromMaybe [] <$> TM.lookupIO dbContactId ctRegs - gr' <- - if userGroupRegId gr `elem` ugIds - then do - let ugId = maximum ugIds + 1 - putStrLn $ "Warning: updating userGroupRegId for group " <> show dbGroupId <> ", contact " <> show dbContactId - pure gr {userGroupRegId = ugId} - else pure gr - atomically $ TM.insert dbContactId (userGroupRegId gr' : ugIds) ctRegs - pure gr' - exit :: String -> IO a exit err = putStrLn ("Error: " <> err) >> exitFailure -exportDBToDirectoryLog :: DirectoryOpts -> ChatConfig -> IO () -exportDBToDirectoryLog opts cfg = - withDirectoryLog opts $ \logFile -> withChatStore opts $ \st -> do - whenM (doesFileExist logFile) $ exit $ "directory log file " ++ logFile ++ " already exists" - runDirectoryMigrations opts cfg st - withActiveUser st $ \user -> do - gs <- withFile logFile WriteMode $ \h -> withTransaction st $ \db -> do - gs <- getAllGroupRegs_ db (mkStoreCxt cfg) user - forM_ gs $ \(_, gr) -> - whenM (verifyGroupRegistration (mkStoreCxt cfg) db user gr) $ - B.hPutStrLn h $ strEncode $ GRCreate gr - pure gs - putStrLn $ show (length gs) <> " group registrations exported" - -saveGroupListingFiles :: DirectoryOpts -> ChatConfig -> IO () -saveGroupListingFiles opts cfg = case webFolder opts of - Nothing -> exit "use --web-folder to generate listings" - Just dir -> - withChatStore opts $ \st -> withActiveUser st $ \user -> - withTransaction st $ \db -> - getAllListedGroups_ db (mkStoreCxt cfg) user >>= generateListing dir - verifyGroupRegistration :: StoreCxt -> DB.Connection -> User -> GroupReg -> IO Bool verifyGroupRegistration cxt db user GroupReg {dbGroupId = gId, dbContactId = ctId, dbOwnerMemberId, groupRegStatus} = runExceptT (getGroupInfo db cxt user gId) >>= \case @@ -129,10 +65,6 @@ verifyGroupRegistration cxt db user GroupReg {dbGroupId = gId, dbContactId = ctI | mId /= mId' -> False <$ putStrLn ("Error: different host member ID of " <> groupRef <> " (skipping): " <> show mId') | otherwise -> True <$ unless (Just ctId == ctId') (putStrLn $ "Warning: bad group " <> groupRef <> " contact ID: " <> show ctId') -withDirectoryLog :: DirectoryOpts -> (FilePath -> IO ()) -> IO () -withDirectoryLog DirectoryOpts {directoryLog} action = - maybe (exit "directory log file not specified") action directoryLog - withChatStore :: DirectoryOpts -> (DBStore -> IO ()) -> IO () withChatStore DirectoryOpts {coreOptions = CoreChatOpts {dbOptions, yesToUpMigrations, migrationBackupPath}} action = createChatDatabase dbOptions migrationConfig >>= \case diff --git a/tests/Bots/DirectoryTests.hs b/tests/Bots/DirectoryTests.hs index 15f713cd1c..ad5fb6c8a4 100644 --- a/tests/Bots/DirectoryTests.hs +++ b/tests/Bots/DirectoryTests.hs @@ -19,9 +19,7 @@ import Directory.Captcha import Directory.Listing import Directory.Options import Directory.Service -import Directory.Store import System.Directory (emptyPermissions, setOwnerExecutable, setOwnerReadable, setOwnerWritable, setPermissions) -import System.IO (hClose) import Simplex.Chat.Bot.KnownContacts import Simplex.Chat.Controller (ChatConfig (..)) import qualified Simplex.Chat.Markdown as MD @@ -136,8 +134,6 @@ mkDirectoryOpts TestParams {tmpPath = ps} superUsers ownersGroup webFolder = profileNameLimit = maxBound, captchaGenerator = Nothing, voiceCaptchaGenerator = Nothing, - directoryLog = Just $ ps "directory_service.log", - migrateDirectoryLog = Nothing, serviceName = "SimpleX Directory", clientService = True, runCLI = False, @@ -1801,11 +1797,10 @@ withDirectoryOwnersGroup ps cfg dsLink createOwnersGroup webFolder test = do test superUser dsLink runDirectory :: ChatConfig -> DirectoryOpts -> IO () -> IO () -runDirectory cfg opts@DirectoryOpts {directoryLog} action = do - st <- openDirectoryLog directoryLog - t <- forkIO $ directoryService st opts cfg +runDirectory cfg opts action = do + t <- forkIO $ directoryService opts cfg threadDelay 500000 - action `finally` (mapM_ hClose (directoryLogFile st) >> killThread t) + action `finally` killThread t registerGroup :: TestCC -> TestCC -> String -> String -> IO () registerGroup su u n fn = registerGroupId su u n fn 1 1 From 0324517bfefc9f2ddf0b6fa07da452987c807359 Mon Sep 17 00:00:00 2001 From: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Date: Tue, 4 Aug 2026 07:09:47 +0000 Subject: [PATCH 03/16] android, desktop: keep database passphrase toggle inside the section card (#7326) The "Save passphrase in settings/Keychain" label had no weight, so Row measured it at full available width, the weighted spacer collapsed to 0 and the trailing DefaultSwitch was placed past the row's right edge. Harmless until #6777: the section card is now inset by CARD_PADDING and clipped with SectionCardShape, which cut the row from 348dp to 316dp on the desktop start pane and made the overflowing switch both invisible and unclickable, since Modifier.clip clips pointer input too. With a custom passphrase set the toggle is enabled but unreachable, so the passphrase stays saved in settings and the app never prompts for it on start. Give the label weight(1f) and drop the weighted spacer, matching what SettingsActionItemWithContent does for every other toggle row. --- .../DatabaseEncryptionView.android.kt | 3 +- .../DatabaseEncryptionView.desktop.kt | 3 +- ...-07-31-fix-db-passphrase-toggle-clipped.md | 124 ++++++++++++++++++ 3 files changed, 126 insertions(+), 4 deletions(-) create mode 100644 plans/2026-07-31-fix-db-passphrase-toggle-clipped.md diff --git a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.android.kt b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.android.kt index 83677f3318..1826b2114e 100644 --- a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.android.kt +++ b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.android.kt @@ -42,10 +42,9 @@ actual fun SavePassphraseSetting( } Text( stringResource(MR.strings.save_passphrase_in_keychain), - Modifier.padding(end = 24.dp), + Modifier.weight(1f).padding(end = 24.dp), color = Color.Unspecified ) - Spacer(Modifier.fillMaxWidth().weight(1f)) DefaultSwitch( checked = useKeychain, onCheckedChange = onCheckedChange, diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.desktop.kt index eb93e7c510..4535857696 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.desktop.kt @@ -42,10 +42,9 @@ actual fun SavePassphraseSetting( } Text( stringResource(MR.strings.save_passphrase_in_settings), - Modifier.padding(end = 24.dp), + Modifier.weight(1f).padding(end = 24.dp), color = Color.Unspecified ) - Spacer(Modifier.fillMaxWidth().weight(1f)) DefaultSwitch( checked = useKeychain, onCheckedChange = onCheckedChange, diff --git a/plans/2026-07-31-fix-db-passphrase-toggle-clipped.md b/plans/2026-07-31-fix-db-passphrase-toggle-clipped.md new file mode 100644 index 0000000000..16767d62aa --- /dev/null +++ b/plans/2026-07-31-fix-db-passphrase-toggle-clipped.md @@ -0,0 +1,124 @@ +# Fix "Save passphrase in settings" toggle unreachable on desktop + +## Symptom + +On 7.0 desktop (reproduced on the Linux AppImage and on Windows), in +Chat data → Database passphrase & export → Database passphrase, the +"Save passphrase in settings" toggle cannot be switched off. The reporter sees +the switch sitting slightly past the right edge of the section card. Because the +setting stays on, the passphrase remains stored in `settings.properties` and the +app never prompts for it on start — on desktop that file holds the passphrase in +clear text, since `Cryptor.desktop.kt` is an identity implementation. + +This is distinct from the case where the switch is *rendered disabled* +(`DatabaseEncryptionView.kt:127`, `enabled = (!initialRandomDBPassphrase && !progressIndicator) || migration`), +which is intended behaviour for a database still using the initial random +passphrase. The reports here are from users who set their own passphrase, so +`initialRandomDBPassphrase == false` and the switch is enabled — just not +reachable. + +## Root cause + +1. `SavePassphraseSetting` is hand-rolled in both platform actuals + (`DatabaseEncryptionView.desktop.kt:43-53`, `.android.kt:43-53`) and is the + only toggle row in the app whose label carries no `weight`: + + ```kotlin + Text(stringResource(MR.strings.save_passphrase_in_settings), Modifier.padding(end = 24.dp)) + Spacer(Modifier.fillMaxWidth().weight(1f)) + DefaultSwitch(checked = useKeychain, onCheckedChange = onCheckedChange, enabled = enabled) + ``` + + `Row` measures unweighted children first against the full available width, then + divides what is left among weighted ones. A label that does not comfortably fit + consumes the remainder, the weighted `Spacer` collapses to zero, and + `DefaultSwitch` is placed past the row's right edge. + +2. Every other toggle row goes through `SettingsActionItemWithContent` + (`SettingsView.kt:380`), which gives the label `Modifier.weight(1f)`. There the + label truncates and the trailing control keeps its size and position, so the + same string length is harmless. + +3. Before #6777 this row had enough slack and no clipping. `SectionView` was a + plain `Column` with no horizontal inset, and `SectionItemView` used + `DEFAULT_PADDING` (20.dp) per side — 348.dp of content width on the desktop + start pane (`DEFAULT_START_MODAL_WIDTH` = 388.dp). Any overflow still drew and + still received pointer events. + +4. #6777 introduced `LocalCardScreen` / `CardColumnLayout` (`Section.kt`), which + wraps section content in `Modifier.padding(horizontal = CARD_PADDING /* 18.dp */)` + … `.clip(SectionCardShape)`, and switches `itemHPadding` from `DEFAULT_PADDING` + to `CARD_PADDING`. `DatabaseEncryptionView` is opened with `cardScreen = true` + (`DatabaseView.kt:235`), so its row content width drops 348.dp → **316.dp**. + +5. `Modifier.clip` clips pointer input as well as drawing. The displaced switch is + therefore both cut off visually and unhittable — the toggle stops working rather + than merely looking wrong. + +Budget arithmetic on the desktop start pane: fixed cost in the row is ~96.dp +(24 icon + 8 spacer + 24 label end-padding + ~40 switch), leaving ~220.dp for a +27-character label at 16.sp, which needs ~215.dp in English. Borderline at 100% +font scale and over budget as soon as the label is longer — a longer localization, +or a larger font size, since the label scales with `fontSizeSqrtMultiplier` while +`CARD_PADDING` does not. + +The widths above are derived from the layout constants, not measured against a +running client; the reporter's observation that the switch sits slightly past the +card edge is what confirms the row overflows in practice. + +## Fix + +Move the weight onto the label and drop the weighted spacer, in both actuals: + +```kotlin +Text(stringResource(MR.strings.save_passphrase_in_settings), Modifier.weight(1f).padding(end = 24.dp)) +DefaultSwitch(checked = useKeychain, onCheckedChange = onCheckedChange, enabled = enabled) +``` + +The label now truncates instead of displacing the switch, matching what +`SettingsActionItemWithContent` does for every other toggle row. + +The spacer has to go: leaving both the label and the spacer weighted would split +the remaining space between them and starve the label instead, which trades one +layout bug for another. + +## Why this fix and not alternatives + +- **Widening the card or shrinking `CARD_PADDING`** would buy back the ~32.dp lost + in #6777, but only until the next longer localization or font-size step. The row + would stay the one place in the app where a long label can push a control out of + reach. +- **Removing `clip` from `CardColumnLayout`** would restore clickability of + overflowing content, but the clip is what gives section cards their rounded + corners; dropping it would regress the design and leave the switch drawn outside + its card. +- **Shortening the string** is a translation-wide problem, not a fix, and does not + help at larger font sizes. + +## Impact + +- Desktop and Android only. Both actuals carry the identical defect; Android's row + is in fact narrower still (~288.dp on a 360.dp-wide screen), so it is affected at + least as much — it simply has not been reported. +- iOS is unaffected: `DatabaseEncryptionView.swift` uses a SwiftUI `Toggle` inside + `settingsRow`, where the label truncates and the toggle cannot be displaced. The + `initialRandomDBPassphrase` disabled-state logic is the same on iOS + (`DatabaseEncryptionView.swift:80`) and is unchanged by this fix. +- Users already stuck in the bad state have `StoreDBPassphrase=true` in + `settings.properties` with the passphrase stored alongside it. After this fix + they can turn the setting off in the UI, which removes the stored passphrase via + `removePassphraseFromKeyChain` and restores the prompt on start. +- No behaviour change beyond the row layout: no logic, preference, or string was + touched. + +## Verification + +- `bash ~/build/linux.sh` on this branch: cold `dist-newstyle`, `libsimplex.so` + rebuilt from master's sources, `:common:compileKotlinDesktop` executed, + `BUILD SUCCESSFUL`, AppImage produced. +- `bash ~/build/android.sh` on this branch: `BUILD SUCCESSFUL`, arm64-v8a debug APK + produced (native libs are the prebuilt ones, so this exercises the Kotlin change + only). +- Not done: the rendered row has not been checked in a running client. Worth + confirming at a raised font size and in a locale with a longer label, which is + the case that made the overflow visible in the first place. From 7e99e6895063713b61b450aaadef74cf498fc979 Mon Sep 17 00:00:00 2001 From: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Date: Tue, 4 Aug 2026 20:01:35 +0000 Subject: [PATCH 04/16] android, desktop: fix draft appearing in another chat when switching chats while sending (#7308) * ios, android, desktop: fix message being sent leaking into another chat Compose state is shared between the chats opened in the same view, and the send is launched in a scope that outlives the chat, so a send that was still in flight when the chat was switched put its message (with the reply context) into the compose state and then the draft of another chat, and a late success cleared whatever was typed in the meantime. The message being sent is no longer kept in the compose state when leaving the chat, and the compose state is only cleared or restored after sending if it still holds the message that was sent - the same check is used by the other senders that show progress in the compose. A message that failed to send is restored in the chat it was composed in, or kept as its draft when another chat is open (iOS has no failed message restore, there the message is dropped as before). * android, desktop: keep only the chat switch fix Revert the iOS changes and the same check in the three senders that connect a prepared chat, leaving the fix for the compose state shared between the chats opened in one view. * plan: document what the narrowed change leaves to the connect senders * android, desktop: use the same check where the sending flag is shared The senders that connect a prepared chat set the same inProgress flag, so a connect completing after the chat was switched cleared it for a send started in the chat opened next, and that sent message was then left in the compose. * android, desktop: keep the live message clauses inside the open chat check live and cs.liveMessage != null were alternatives to chatIsOpen, which holds only while a live message is always sent to the chat that is open. #7323 removes that: the live message committed by a chat switch is sent to the chat it was composed in, while this view already shows another one, so an unguarded clause here clears that chat's compose state - the leak this fix exists to prevent. liveSend stays an alternative to inProgress inside the guard, so a live send behaves exactly as before while its chat is open, and it is excluded from the restore/draft branch, which would otherwise write a draft on every failing keystroke send once that chat is no longer open. On this branch the only behaviour change is a live send completing after its chat was left, which now leaves the opened chat alone. Also load the draft of the chat opened next when the compose state is cleared on switching away from a send in flight: clearState() returns before the branch that loads a draft, so that draft was never shown, and being in the slot but in no compose state it was then dropped by clearPrevDraft on the next chat switch. * plan: explain why live sends are guarded by the open chat check Records that the exemption in "Deliberately unchanged" is from a guard based on inProgress, not from chatIsOpen, and why the earlier form broke once #7323 sends a live message to a chat other than the one open. --- .../simplex/common/views/chat/ComposeView.kt | 74 ++++-- ...inflight-send-writes-other-chat-compose.md | 244 ++++++++++++++++++ 2 files changed, 298 insertions(+), 20 deletions(-) create mode 100644 plans/2026-07-25-fix-inflight-send-writes-other-chat-compose.md diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt index 40d7927264..a2bebb9feb 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt @@ -597,6 +597,10 @@ fun ComposeView( composeState.value = composeState.value.copy(inProgress = true) } + // composeState and its inProgress flag are shared between the chats opened in this view, and sending is not cancelled + // when the chat is switched - a send may only clear or reset the state while it still holds the message that was sent + fun composeHasSentMessage(): Boolean = chatModel.chatId.value == chat.id && composeState.value.inProgress + suspend fun sendMemberContactInvitation() { val mc = checkLinkPreview() sending() @@ -604,10 +608,10 @@ fun ComposeView( if (contact != null) { withContext(Dispatchers.Main) { chatsCtx.updateContact(chat.remoteHostId, contact) - clearState() + if (composeHasSentMessage()) clearState() } - } else { - composeState.value = composeState.value.copy(inProgress = false) + } else withContext(Dispatchers.Main) { + if (composeHasSentMessage()) composeState.value = composeState.value.copy(inProgress = false) } } @@ -624,10 +628,10 @@ fun ComposeView( if (contact != null) { withContext(Dispatchers.Main) { chatsCtx.updateContact(chat.remoteHostId, contact) - clearState() + if (composeHasSentMessage()) clearState() } - } else { - composeState.value = composeState.value.copy(inProgress = false) + } else withContext(Dispatchers.Main) { + if (composeHasSentMessage()) composeState.value = composeState.value.copy(inProgress = false) } } @@ -669,10 +673,10 @@ fun ComposeView( chatModel.channelRelayHostnames.remove(groupInfo.groupId) chatModel.groupMembers.value = relayResults.map { it.relayMember } chatModel.populateGroupMembersIndexes() - clearState() + if (composeHasSentMessage()) clearState() } - } else { - composeState.value = composeState.value.copy(inProgress = false) + } else withContext(Dispatchers.Main) { + if (composeHasSentMessage()) composeState.value = composeState.value.copy(inProgress = false) } } @@ -932,16 +936,38 @@ fun ComposeView( val wasForwarding = cs.forwarding val forwardingFromChatId = (cs.contextItem as? ComposeContextItem.ForwardingItems)?.fromChatInfo?.id val lastFailed = lastMessageFailedToSend - if (lastFailed == null) { - clearState(live) - } else { - composeState.value = lastFailed - } - val draft = chatModel.draft.value - if (wasForwarding && chatModel.draftChatId.value == draftChatId(chat.chatInfo.id, chatScope) && forwardingFromChatId != chat.chatInfo.id && draft != null) { - composeState.value = draft - } else { - clearCurrentDraft() + // composeState is shared between the chats opened in this view, and this runs after the send API call, so the user + // could have switched chats or typed another message in the meantime - only the message that was sent may be + // cleared or restored. On Main, so that these checks and changes are not interleaved with the user switching + // chats or typing. + withContext(Dispatchers.Main) { + val chatIsOpen = chatModel.chatId.value == chat.id + // a live message is held in the compose state of the chat it is sent to, but only while that chat is the one open + val liveSend = live || cs.liveMessage != null + val sentMessageInCompose = chatIsOpen && (liveSend || composeState.value.inProgress) + if (sentMessageInCompose) { + if (lastFailed == null) { + clearState(live) + } else { + composeState.value = lastFailed + } + } + val draft = chatModel.draft.value + if (wasForwarding && chatModel.draftChatId.value == draftChatId(chat.chatInfo.id, chatScope) && forwardingFromChatId != chat.chatInfo.id && draft != null) { + if (sentMessageInCompose) composeState.value = draft + } else { + clearCurrentDraft() + // liveSend excluded: a failing keystroke send would otherwise write a draft on every attempt + if (!sentMessageInCompose && !liveSend && lastFailed != null) { + // the message was not sent, so it is restored in the chat it was composed in, or kept as its draft if another chat is open + if (chatIsOpen && composeState.value.empty) { + composeState.value = lastFailed + } else if (saveLastDraft) { + chatModel.draft.value = lastFailed + chatModel.draftChatId.value = draftChatId(chat.id, chatScope) + } + } + } } return sent } @@ -1319,7 +1345,15 @@ fun ComposeView( deleteUnusedFiles() } else if (cs.inProgress) { clearPrevDraft(prevChatId) - composeState.value = cs.copy(inProgress = false, progressByTimeout = false) + // the message being sent must not be kept in the compose state, it is shared with the chat opened next; + // if it fails to send it is restored in this chat or saved as its draft + clearState() + // clearState() does not load the draft of the chat opened next, and without this it is never shown and is + // dropped when that chat is left + val draft = chatModel.draft.value + if (draft != null && chatModel.draftChatId.value == draftChatId(chatModel.chatId.value, chatScope)) { + composeState.value = draft + } } else if (!cs.empty) { if (cs.preview is ComposePreview.VoicePreview && !cs.preview.finished) { recState.value = RecordingState.NotStarted diff --git a/plans/2026-07-25-fix-inflight-send-writes-other-chat-compose.md b/plans/2026-07-25-fix-inflight-send-writes-other-chat-compose.md new file mode 100644 index 0000000000..7a27fdd9d1 --- /dev/null +++ b/plans/2026-07-25-fix-inflight-send-writes-other-chat-compose.md @@ -0,0 +1,244 @@ +# Fix: message being sent leaks into another chat's compose/draft, and erases what is typed there + +Branch: `nd/fix-inflight-send-writes-other-chat-compose` (off `origin/stable`) +Date: 2026-07-25 +PR: #7308 + +Line references are against `origin/stable` at `8dc387cb5`, with this fix +applied. Android and desktop only +(`multiplatform/.../views/chat/ComposeView.kt`); iOS has the same defect +but is not addressed here. + +## Problem + +Two reported symptoms, one cause. Both need a send that is still in +flight when the chat is switched (slow network, large file, or the send +just hanging with the progress circle showing): + +1. **The message ends up in another chat's draft.** Reply to a message + (or just type), press send, switch to another chat while it is + sending: the text *and the reply context* appear in that chat's input, + and leaving it saves them as that chat's draft. No forwarding + involved. +2. **A late send erases what you typed.** Press send, the progress circle + keeps spinning, switch to another chat and back, type a new message — + when the original send finally succeeds, the newly typed message is + erased. + +## Cause + +The compose state is shared, and the send outlives the chat: + +- `ChatView.kt:134` — one `MutableState` per `ChatView` + instance, `rememberSaveable` with no keys, reused for every chat that + the view displays. +- `Utils.kt:43-46` — `withLongRunningApi` launches on + `CoroutineScope(Dispatchers.Default)`, a standalone scope with no tie + to the composition or to the chat, and `sendMessage` + (`ComposeView.kt:972-976`) uses it. Leaving the chat never cancels an + in-flight send. + +Two writes then act on the wrong chat: + +- **On the chat switch** — `ComposeView.kt:1343-1347`: the `cs.inProgress` + branch used to keep the message in the shared compose state + (`composeState.value = cs.copy(inProgress = false, progressByTimeout = false)`) + and only cleared the *previous* chat's saved draft. The text and the + quote were therefore sitting in the input of the chat opened next, and + `ComposeView.kt:1348-1358` (`!cs.empty`) then saved them as *that* + chat's draft on the next switch. Symptom 1. +- **When the send completes** — `ComposeView.kt:943-968`, running in the + detached coroutine after the switch: `clearState(live)` on success, or + `composeState.value = lastFailed` on failure, where `lastFailed = + cs.copy(inProgress = false, preview = preview)` + (`ComposeView.kt:729`) **keeps `contextItem`, i.e. the reply**. On + success this wipes whatever is in the input now — including a message + typed after coming back (symptom 2); on failure it dumps the old + message into whichever chat is open (symptom 1 again). + +The same function was already inconsistent about which chat it acts on: +its draft bookkeeping (`clearCurrentDraft()`, and the forwarding +condition) uses the **captured** `chat` — the chat the message was +composed in — while its `composeState` writes hit whatever chat is +displayed at that moment. + +## Fix + +Two changes, both in `ComposeView.kt`. + +**1. Do not keep the message being sent in the shared compose state** +(`ComposeView.kt:1343-1347`). On switching away with a send in flight the +compose state is cleared, so nothing leaks into the chat opened next: + +```kotlin +} else if (cs.inProgress) { + clearPrevDraft(prevChatId) + // the message being sent must not be kept in the compose state, it is shared with the chat opened next; + // if it fails to send it is restored in this chat or saved as its draft + clearState() +} +``` + +`clearState()` is used rather than assigning an empty `ComposeState` so that +the link preview state is reset too (`pendingLinkUrl` still points at the +sent message's link, and its fetch would otherwise set a preview on the +input of the chat opened next), and so that the attachment size limit is +carried over the same way as everywhere else. + +In-flight content is deliberately **not** saved as a draft here: the +message has been submitted and will most likely be sent, and a draft is +for messages that are not sent yet. + +`clearState()` alone would leave the chat opened next with an empty input +even when it has a draft: this branch, like the live message one above it, +returns before the branch that loads a draft +(`chatModel.draftChatId.value == draftChatId(chatModel.chatId.value, chatScope)`), +so that draft was never shown - and, being still in the slot but not in +any compose state, it was then dropped by `clearPrevDraft` on the next +chat switch. It is loaded here instead. This is not the one-slot +limitation below: nothing else is competing for the slot, the draft is +simply lost. + +**2. Only touch the compose state if it still holds the message that was +sent** (`ComposeView.kt:936-968`): + +```kotlin +withContext(Dispatchers.Main) { + val chatIsOpen = chatModel.chatId.value == chat.id + val liveSend = live || cs.liveMessage != null + val sentMessageInCompose = chatIsOpen && (liveSend || composeState.value.inProgress) + if (sentMessageInCompose) { + if (lastFailed == null) { + clearState(live) + } else { + composeState.value = lastFailed + } + } + val draft = chatModel.draft.value + if (wasForwarding && chatModel.draftChatId.value == draftChatId(chat.chatInfo.id, chatScope) && forwardingFromChatId != chat.chatInfo.id && draft != null) { + if (sentMessageInCompose) composeState.value = draft + } else { + clearCurrentDraft() + if (!sentMessageInCompose && lastFailed != null) { + // the message was not sent, so it is restored in the chat it was composed in, or kept as its draft if another chat is open + if (chatIsOpen && composeState.value.empty) { + composeState.value = lastFailed + } else if (saveLastDraft) { + chatModel.draft.value = lastFailed + chatModel.draftChatId.value = draftChatId(chat.id, chatScope) + } + } + } +} +``` + +Both the checks and the changes run on `Dispatchers.Main` (the block has +no suspension points), so they cannot be interleaved with the user +switching chats or typing - `KeyChangeEffect`, which does change 1, runs +there too. + +`inProgress` is the marker that the compose state is still the submitted +message: it is set by `sending()` (`ComposeView.kt:596-598`), preserved by +`copy` while sending (the only other write during a send is +`progressByTimeout` at `ComposeView.kt:1610-1617`), reset when switching +away (change 1), and never set by typing a new message. So a chat switch +*or* newly typed text both make the guard false. + +A **failed** send is different from an in-flight one - the message was not +sent, so it is an unsent message. It is put back into the input if that +chat is open and nothing else is being composed there, and kept as that +chat's draft otherwise, so it never appears in another chat (see the +limitations below for when it is still dropped). Staying in the chat is +unaffected: the guard is true there +and the failed message is restored into the input as before, keeping +"preserving long message when failed to send" (`e61babdc8`) working. + +Deliberately unchanged: + +- The condition of the forwarding branch. Gating the whole branch would + send a forward that completed after the user left to `clearCurrentDraft()` + instead, **deleting** the destination chat's draft that the branch + exists to preserve - only the compose write inside it is gated. +- Live message sends (`live`, or `cs.liveMessage != null` for the send + that finalises a live message when leaving the chat, `ComposeView.kt:1338-1342`), + as long as their chat is the one open. They never call `sending()`, so a + guard based on `inProgress` would change their behaviour: failed live + sends would stop restoring and would write a draft on every failing + keystroke send. That is why `liveSend` is an alternative to `inProgress` + inside the guard, and why it is excluded from the restore/draft branch - + not gating it there would produce exactly that draft-per-keystroke. + + What they are **not** exempt from is `chatIsOpen`. An earlier revision + had `live || cs.liveMessage != null` outside it, which holds only while + a live message is always sent to the chat that is open. #7323 removes + that: the live message committed by a chat switch is sent to the chat it + was composed in, while this view already shows another one, so an + unguarded clause here would clear *that* chat's compose state - the leak + this fix exists to prevent. Standalone this changes nothing except a + live send that completes after its chat was left, which now leaves the + opened chat alone. `sendMessageAsync` reads `composeState` inside the + coroutine (`ComposeView.kt:684`), so that branch cannot clear the state + itself without racing the send; #7323 adds the `composed` parameter that + makes the captured state explicit. + +**3. The same check where the flag is shared** (`ComposeView.kt:600-602` +and the three senders that connect a prepared chat). They call the same +`sending()`, so an unguarded `clearState()` or `inProgress` reset from +one of them corrupts the state of a send started in the chat opened next. + +## Behaviour after the fix + +| situation | before | after | +| --- | --- | --- | +| send, stay in chat, succeeds | input cleared | input cleared (unchanged) | +| send, stay in chat, fails | message restored in input | message restored in input (unchanged) | +| send, switch chats, succeeds | message left in the other chat's input, saved as its draft | other chat untouched | +| send, switch chats, fails | message dumped into the other chat's input | message restored in the chat it was composed in, or kept as its draft | +| send hangs, switch away and back, type, then it succeeds | typed message erased | typed message kept | +| forward send, still in destination chat | destination chat's draft restored | unchanged | +| live message sent on leaving the chat | compose state cleared by the send | unchanged | + +## Limitations + +Kept deliberately, to not grow the change: + +- A message that failed to send is dropped, rather than kept, when the + "Message draft" privacy setting is off, when the destination chat of a + failed forward already has a draft (its own draft is preserved + instead), and when the single draft slot is later taken by another + chat - drafts are one global slot, so the last write wins. +- The three senders that connect a prepared chat share the same + `sending()` flag, so they use the same check (`ComposeView.kt:604-616`, + `618-640`, `659-685`). Without it a connect completing after the chat + was switched would clear `inProgress` for a send started in the chat + opened next, and that sent message would then stay in the input. They + have no failed-message restore, so their typed message is dropped when + the chat is switched instead of being carried into the next chat. +- Typing in the same chat while its own send is in flight is still + cleared when the send completes: `inProgress` is preserved by `copy`, + so the guard stays true. Unchanged from before, and different from the + reported symptom, which needs the chat to be switched. +## Verification + +- `./gradlew :common:compileKotlinDesktop` — passes. +- Manual (needs a slow or failing send — e.g. airplane mode, or a large + file). On desktop any chat switch exercises it; on Android only an + in-place switch does (member info → open chat), because leaving to the + chat list destroys the view: + 1. Reply + type in A, send, switch to B while sending. B's input must + stay empty; leaving B must not create a draft in B. If the send + failed, A must hold the message (with the reply) as its draft. + 2. Send in A with the network off so the circle keeps spinning, switch + to B and back to A, type a new message, restore the network. The + typed message must survive the old send completing. + 3. Regression: ordinary send in A (input clears), failed send while + staying in A (message comes back in the input), forward into a chat + that has a draft (draft restored after sending). + +Rebased onto the scope-aware draft ids introduced by #7309: the draft +written here for a message that failed to send uses +`draftChatId(chat.id, chatScope)`, like every other draft write. + +Related: `plans/2026-07-25-fix-forward-moves-draft-to-target-chat.md` +(PR #7307) — different cause (stale `chat` captured by the desktop +`onDispose`), same shared-compose-state design. From 77c5fa34a65913c641d2c0f471bc0aced6567469 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 5 Aug 2026 07:53:23 +0100 Subject: [PATCH 05/16] docs: update readme (#7341) --- README.md | 2 +- images/github-banner.jpg | Bin 159335 -> 114240 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 601ab5a161..5583fad0b5 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ SimpleX logo -Invest in SimpleX Chat. [Register now](https://simplexchat.typeform.com/crowdfunding). +Invest in SimpleX Chat. [Learn more on Wefunder](https://wefunder.com/simplexchat). # SimpleX - the first messaging platform that has no user identifiers of any kind - 100% private by design! diff --git a/images/github-banner.jpg b/images/github-banner.jpg index f7a0d730b8ec44489976a449f8e6983fe58e467b..ef3cb5e6f58e0c0acddc7ebcdb6bb9907a2c52eb 100644 GIT binary patch literal 114240 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

CJAWKUDfb`4E7rYj@pO@N6V@d<%b< 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%0A0>C|-;{f+3zr+| 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 z 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 D-wq=1 From 970ef89325e8ac9930d42c8e95a9734c6b42158c Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 5 Aug 2026 11:36:43 +0100 Subject: [PATCH 06/16] website: link to wefunder (#7344) Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- website/langs/en.json | 2 ++ website/src/css/design3.css | 20 +++++++++++++++++++- website/src/index.html | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/website/langs/en.json b/website/langs/en.json index 3cbcb12ee2..482fe50042 100644 --- a/website/langs/en.json +++ b/website/langs/en.json @@ -264,6 +264,8 @@ "index-hero-h1": "Be
Free", "index-hero-h2": "In Your Network", "index-hero-p1": "The first network without user IDs.
You own your contacts, groups and channels.", + "index-hero-invest": "Invest in SimpleX Chat.", + "index-hero-invest-cta": "Learn more on Wefunder.", "index-hero-download-desktop-btn-title": "Download SimpleX Desktop App", "index-testflight-title": "SimpleX iOS beta-release on TestFlight", "index-f-droid-title": "SimpleX app via F-Droid", diff --git a/website/src/css/design3.css b/website/src/css/design3.css index ea6f20273b..4b645804eb 100644 --- a/website/src/css/design3.css +++ b/website/src/css/design3.css @@ -434,6 +434,16 @@ section.cover div.content p { max-width: calc(var(--sec-vwu) * 53); } +section.cover div.content p.invest { + font-weight: 300; +} + +section.cover div.content p.invest a { + font-weight: 500; + text-decoration: none; + white-space: nowrap; +} + .publications-btns { position: absolute; bottom: 24px; @@ -960,7 +970,7 @@ main .section-bg { @media (max-width: 959px) { section.cover div.content { gap: calc(var(--sec-vhu) * 2.5); - transform: translateY(calc(var(--sec-vhu) * 5)); + transform: translateY(calc(var(--sec-vhu) * 3)); } .publications-btns, @@ -994,6 +1004,14 @@ main .section-bg { max-width: calc(var(--sec-vwu) * 93); } + section.cover div.content p.invest { + font-weight: 400; + } + + section.cover div.content p.invest a { + font-weight: 600; + } + /* --- MAIN SECTIONS --- */ .page .text-container { justify-content: flex-end; diff --git a/website/src/index.html b/website/src/index.html index ba4494ab1d..3ce15f6d56 100644 --- a/website/src/index.html +++ b/website/src/index.html @@ -100,6 +100,7 @@ active_home: true

{{ "index-hero-h1" | i18n({}, lang) | safe }}

{{ "index-hero-h2" | i18n({}, lang) | safe }}

{{ "index-hero-p1" | i18n({}, lang) | safe }}

+

{{ "index-hero-invest" | i18n({}, lang) | safe }} {{ "index-hero-invest-cta" | i18n({}, lang) | safe }}