Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions changelog.d/5-internal/WPB-21964-delete-conv
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
- Moved conversation deletion logic from `Wire.ConversationSubsystem.Action` to `Wire.ConversationSubsystem.Interpreter`
- Relocated remote member deletion utilities:
- `Wire.ConversationSubsystem.Action.deleteMembersInRemoteConversation` → `Wire.ConversationSubsystem.Util.deleteMembersInRemoteConversation`
- Updated conversation deletion implementation to handle:
- MLS group cleanup (clients and proposals)
- Sub-conversation removal
- Code key cleanup
- Team conversation vs regular conversation handling
- Added tests for conversation deletion edge cases
11 changes: 11 additions & 0 deletions charts/background-worker/templates/configmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,15 @@ data:
{{- if .postgresMigration }}
postgresMigration: {{- toYaml .postgresMigration | nindent 6 }}
{{- end }}
settings:
{{- if .settings.conversationCodeURI }}
conversationCodeURI: {{ .settings.conversationCodeURI | quote }}
{{- else if .settings.multiIngress }}
multiIngress: {{- toYaml .settings.multiIngress | nindent 8 }}
{{- else }}
{{ fail "Either settings.conversationCodeURI or settings.multiIngress have to be set"}}
{{- end }}
{{- if (and .settings.conversationCodeURI .settings.multiIngress) }}
{{ fail "settings.conversationCodeURI and settings.multiIngress are mutually exclusive" }}
{{- end }}
{{- end }}
14 changes: 14 additions & 0 deletions charts/background-worker/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,20 @@ config:
migrateConversationsOptions:
pageSize: 10000
parallelism: 2

settings:
# Either `conversationCodeURI` or `multiIngress` must be set
# conversationCodeURI is the URI prefix for conversation invitation links
# It should be of form https://{ACCOUNT_PAGES}/conversation-join/
conversationCodeURI: null
# multiIngress is a Z-Host dependent setting of conversationCodeURI.
# Use this only if you want to expose the instance on multiple ingresses.
# If set it must be a map from Z-Host to URI prefix
# Example:
# multiIngress:
# wire.example: https://accounts.wire.example/conversation-join/
# example.net: https://accounts.example.net/conversation-join/
multiIngress: null
# This will start the migration of conversation codes.
# It's important to set `settings.postgresMigration.conversationCodes` to `migration-to-postgresql`
# before starting the migration.
Expand Down
2 changes: 2 additions & 0 deletions hack/helm_vars/wire-server/values.yaml.gotmpl
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,8 @@ background-worker:
conversation: {{ .Values.conversationStore }}
conversationCodes: {{ .Values.conversationCodesStore }}
teamFeatures: {{ .Values.teamFeaturesStore }}
settings:
conversationCodeURI: https://kube-staging-nginz-https.zinfra.io/conversation-join/
rabbitmq:
port: 5671
adminPort: 15671
Expand Down
6 changes: 6 additions & 0 deletions libs/wire-subsystems/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
, bytestring-conversion
, case-insensitive
, cassandra-util
, comonad
, conduit
, constraints
, containers
Expand Down Expand Up @@ -66,6 +67,7 @@
, imports
, iproute
, iso639
, kan-extensions
, lens
, lib
, lrucaching
Expand Down Expand Up @@ -158,6 +160,7 @@ mkDerivation {
bytestring-conversion
case-insensitive
cassandra-util
comonad
conduit
constraints
containers
Expand Down Expand Up @@ -197,6 +200,7 @@ mkDerivation {
imports
iproute
iso639
kan-extensions
lens
lrucaching
memory
Expand Down Expand Up @@ -279,6 +283,7 @@ mkDerivation {
bytestring-conversion
case-insensitive
cassandra-util
comonad
conduit
constraints
containers
Expand Down Expand Up @@ -319,6 +324,7 @@ mkDerivation {
imports
iproute
iso639
kan-extensions
lens
lrucaching
memory
Expand Down
2 changes: 2 additions & 0 deletions libs/wire-subsystems/src/Wire/ConversationSubsystem.hs
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,7 @@ data ConversationSubsystem m a where
ConvId ->
UserId ->
ConversationSubsystem m (Maybe LocalMember)
DeleteConversation :: ConvId -> ConversationSubsystem m ()
InternalDeleteConversation :: ConvId -> ConversationSubsystem m ()

makeSem ''ConversationSubsystem
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Galley.API.Action
module Wire.ConversationSubsystem.Action
( -- * Conversation action types
ConversationActionTag (..),
ConversationJoin (..),
Expand Down Expand Up @@ -61,17 +61,6 @@ import Data.Set qualified as Set
import Data.Singletons
import Data.Time.Clock
import GHC.TypeLits (KnownNat)
import Galley.API.Action.Kick
import Galley.API.Action.Leave
import Galley.API.Action.Notify
import Galley.API.Action.Reset
import Galley.API.MLS.Conversation
import Galley.API.MLS.Migration
import Galley.API.MLS.Removal
import Galley.API.Teams.Features.Get
import Galley.Effects
import Galley.Env (Env)
import Galley.Options (Opts)
import Galley.Types.Error
import Imports hiding ((\\))
import Polysemy
Expand Down Expand Up @@ -106,23 +95,41 @@ import Wire.API.Team.LegalHold
import Wire.API.Team.Member
import Wire.API.Team.Permission (Perm (AddRemoveConvMember, ModifyConvName))
import Wire.API.User as User
import Wire.BackendNotificationQueueAccess
import Wire.BrigAPIAccess
import Wire.BrigAPIAccess qualified as E
import Wire.CodeStore
import Wire.CodeStore qualified as E
import Wire.ConversationStore
import Wire.ConversationStore qualified as E
import Wire.ConversationSubsystem
import Wire.ConversationSubsystem.Action.Kick
import Wire.ConversationSubsystem.Action.Leave
import Wire.ConversationSubsystem.Action.Notify
import Wire.ConversationSubsystem.Action.Reset
import Wire.ConversationSubsystem.MLS.Conversation
import Wire.ConversationSubsystem.MLS.Migration
import Wire.ConversationSubsystem.MLS.Removal
import Wire.ConversationSubsystem.Util
import Wire.ExternalAccess
import Wire.FeaturesConfigSubsystem
import Wire.FederationAPIAccess
import Wire.FederationAPIAccess qualified as E
import Wire.FederationSubsystem
import Wire.FireAndForget
import Wire.FireAndForget qualified as E
import Wire.LegalHoldStore
import Wire.NotificationSubsystem
import Wire.ProposalStore
import Wire.ProposalStore qualified as E
import Wire.Sem.Now (Now)
import Wire.Sem.Now qualified as Now
import Wire.Sem.Random
import Wire.StoredConversation
import Wire.StoredConversation qualified as Data
import Wire.TeamCollaboratorsSubsystem
import Wire.TeamFeatureStore
import Wire.TeamStore
import Wire.TeamSubsystem (TeamSubsystem)
import Wire.TeamSubsystem qualified as TeamSubsystem
import Wire.UserList
Expand Down Expand Up @@ -166,7 +173,6 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
Member (FederationAPIAccess FederatorClient) r,
Member NotificationSubsystem r,
Member Now r,
Member (Input Env) r,
Member (Input ConversationSubsystemConfig) r,
Member ProposalStore r,
Member ConversationStore r,
Expand All @@ -177,7 +183,6 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
( Member (Error NoChanges) r,
Member ConversationStore r,
Member ProposalStore r,
Member (Input Env) r,
Member (Input ConversationSubsystemConfig) r,
Member Now r,
Member ExternalAccess r,
Expand Down Expand Up @@ -220,7 +225,6 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
Member (FederationAPIAccess FederatorClient) r,
Member FireAndForget r,
Member NotificationSubsystem r,
Member (Input Env) r,
Member (Input ConversationSubsystemConfig) r,
Member ProposalStore r,
Member TeamStore r,
Expand Down Expand Up @@ -251,8 +255,6 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
Member ExternalAccess r,
Member (FederationAPIAccess FederatorClient) r,
Member NotificationSubsystem r,
Member (Input Env) r,
Member (Input Opts) r,
Member Now r,
Member ProposalStore r,
Member Random r,
Expand All @@ -266,8 +268,7 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
Member (ErrorS 'InvalidTargetAccess) r
)
HasConversationActionEffects 'ConversationResetTag r =
( Member (Input Env) r,
Member Now r,
( Member Now r,
Member (ErrorS ConvNotFound) r,
Member (ErrorS InvalidOperation) r,
Member ConversationStore r,
Expand Down Expand Up @@ -311,7 +312,7 @@ type family HasConversationActionGalleyErrors (tag :: ConversationActionTag) ::
ErrorS 'ConvMemberNotFound
]
HasConversationActionGalleyErrors 'ConversationDeleteTag =
'[ ErrorS ('ActionDenied 'DeleteConversation),
'[ ErrorS ('ActionDenied Wire.API.Conversation.Role.DeleteConversation),
ErrorS 'NotATeamMember,
ErrorS 'InvalidOperation,
ErrorS 'ConvNotFound
Expand Down Expand Up @@ -661,7 +662,7 @@ performConversationJoin qusr lconv (ConversationJoin invited role joinType) = do
-- - ensure that a consented conv admin exists
-- - and kick all existing members that do not consent to LH from the conversation
-- See also: "Brig.API.Connection.checkLegalholdPolicyConflict"
-- and "Galley.API.LegalHold.Conflicts.guardLegalholdPolicyConflictsUid".
-- and "Wire.LegalHoldStore.Conflicts.guardLegalholdPolicyConflictsUid".
checkLHPolicyConflictsLocal ::
[UserId] ->
Sem r ()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,12 @@
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Galley.API.Action.Kick where
module Wire.ConversationSubsystem.Action.Kick where

import Data.Default
import Data.Id
import Data.Qualified
import Data.Singletons
import Galley.API.Action.Leave
import Galley.API.Action.Notify
import Galley.Effects
import Imports hiding ((\\))
import Polysemy
import Polysemy.Error
Expand All @@ -34,10 +31,17 @@ import Wire.API.Conversation.Action
import Wire.API.Conversation.Config (ConversationSubsystemConfig)
import Wire.API.Event.LeaveReason
import Wire.API.Federation.Error
import Wire.BackendNotificationQueueAccess
import Wire.ConversationStore
import Wire.ConversationSubsystem
import Wire.ConversationSubsystem.Action.Leave
import Wire.ConversationSubsystem.Action.Notify
import Wire.ConversationSubsystem.Util
import Wire.ExternalAccess
import Wire.NotificationSubsystem
import Wire.ProposalStore
import Wire.Sem.Now (Now)
import Wire.Sem.Random
import Wire.StoredConversation

-- | Kick a user from a conversation and send notifications.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,28 @@
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Galley.API.Action.Leave (leaveConversation) where
module Wire.ConversationSubsystem.Action.Leave (leaveConversation) where

import Control.Lens
import Data.Id
import Data.Qualified
import Galley.API.MLS.Removal
import Galley.Effects
-- import Galley.Effects
import Imports hiding ((\\))
import Polysemy
import Polysemy.Error
import Polysemy.Input
import Polysemy.TinyLog
import Wire.API.Conversation.Config (ConversationSubsystemConfig)
import Wire.API.Federation.Error
import Wire.BackendNotificationQueueAccess
import Wire.ConversationStore
import Wire.ConversationSubsystem.MLS.Removal
import Wire.ConversationSubsystem.Util
import Wire.ExternalAccess
import Wire.NotificationSubsystem
import Wire.ProposalStore
import Wire.Sem.Now (Now)
import Wire.Sem.Random
import Wire.StoredConversation
import Wire.UserList

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Galley.API.Action.Notify where
module Wire.ConversationSubsystem.Action.Notify where

import Data.Id
import Data.Qualified
import Data.Singletons
import Galley.Effects
-- import Galley.Effects
import Imports hiding ((\\))
import Polysemy
import Wire.API.Conversation hiding (Conversation, Member)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,13 @@
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Galley.API.Action.Reset (resetLocalMLSMainConversation) where
module Wire.ConversationSubsystem.Action.Reset (resetLocalMLSMainConversation) where

import Control.Monad.Codensity hiding (reset)
import Data.Aeson qualified as A
import Data.ByteString.Conversion (toByteString')
import Data.Id
import Data.Qualified
import Galley.API.Action.Kick
import Galley.API.MLS.Util
import Galley.Effects
import Imports
import Polysemy
import Polysemy.Error
Expand All @@ -46,12 +43,18 @@ import Wire.API.MLS.Group.Serialisation qualified as Group
import Wire.API.MLS.SubConversation
import Wire.API.Routes.Public.Galley.MLS
import Wire.API.VersionInfo
import Wire.BackendNotificationQueueAccess
import Wire.ConversationStore
import Wire.ConversationSubsystem
import Wire.ConversationSubsystem.Action.Kick
import Wire.ConversationSubsystem.MLS.Util
import Wire.ConversationSubsystem.Util
import Wire.ExternalAccess
import Wire.FederationAPIAccess
import Wire.NotificationSubsystem
import Wire.ProposalStore
import Wire.Sem.Now (Now)
import Wire.Sem.Random
import Wire.StoredConversation as Data

resetLocalMLSMainConversation ::
Expand Down
Loading