Skip to content
Open
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
1 change: 1 addition & 0 deletions changelog.d/5-internal/WPB-25033
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Start migrating `ConversationSubsystem` errors to `ConversationSubsystemError`
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ import Wire.ConversationSubsystem.Action.Kick
import Wire.ConversationSubsystem.Action.Leave
import Wire.ConversationSubsystem.Action.Notify
import Wire.ConversationSubsystem.Action.Reset
import Wire.ConversationSubsystem.Errors (ConversationSubsystemError (..))
import Wire.ConversationSubsystem.MLS.Conversation
import Wire.ConversationSubsystem.MLS.Migration
import Wire.ConversationSubsystem.MLS.Removal
Expand Down Expand Up @@ -696,9 +697,9 @@ instance IsConversationAction 'ConversationResetTag where
Member E.MLSCommitLockStore r,
Member Resource r,
Member (Input ConversationSubsystemConfig) r,
Member (ErrorS MLSStaleMessage) r,
Member (ErrorS ConvNotFound) r,
Member (ErrorS InvalidOperation) r,
Member (Error ConversationSubsystemError) r,
Member Random r,
Member Now r,
Member TinyLog r
Expand Down Expand Up @@ -1277,7 +1278,7 @@ updateLocalConversationReset ::
Member E.MLSCommitLockStore r,
Member TeamSubsystem r,
Member (Input ConversationSubsystemConfig) r,
Member (ErrorS MLSStaleMessage) r
Member (Error ConversationSubsystemError) r
) =>
Local ConvId ->
Qualified UserId ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import Wire.API.VersionInfo
import Wire.BackendNotificationQueueAccess
import Wire.ConversationStore
import Wire.ConversationSubsystem.Action.Kick
import Wire.ConversationSubsystem.Errors (ConversationSubsystemError (..))
import Wire.ConversationSubsystem.MLS.Util
import Wire.ConversationSubsystem.Util
import Wire.ExternalAccess
Expand All @@ -58,9 +59,8 @@ import Wire.StoredConversation as Data

resetLocalMLSMainConversation ::
( Member Now r,
Member (ErrorS MLSStaleMessage) r,
Member (ErrorS ConvNotFound) r,
Member (ErrorS InvalidOperation) r,
Member (Error ConversationSubsystemError) r,
Member BackendNotificationQueueAccess r,
Member (FederationAPIAccess FederatorClient) r,
Member ExternalAccess r,
Expand All @@ -85,17 +85,17 @@ resetLocalMLSMainConversation qusr lcnv reset = do
mlsData <- case cnv.protocol of
ProtocolMLS md -> pure md
ProtocolMixed md -> pure md
ProtocolProteus -> throwS @'InvalidOperation
ProtocolProteus -> throw ConversationSubsystemErrorInvalidOperation
epoch <- case mlsData.cnvmlsActiveData of
Nothing -> throwS @'InvalidOperation
Nothing -> throw ConversationSubsystemErrorInvalidOperation
Just ad -> pure ad.epoch
let gid = mlsData.cnvmlsGroupId

lowerCodensity $ do
withCommitLock lcnvOrSub reset.groupId reset.epoch
lift $ do
unless (reset.groupId == gid) $ throwS @'ConvNotFound
unless (reset.epoch == epoch) $ throwS @'MLSStaleMessage
unless (reset.epoch == epoch) $ throw ConversationSubsystemErrorMLSStaleMessage
removeAllMLSClients gid

let newGid = case nextGenGroupId gid of
Expand Down
26 changes: 5 additions & 21 deletions libs/wire-subsystems/src/Wire/ConversationSubsystem/Create.hs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import Wire.BackendNotificationQueueAccess (BackendNotificationQueueAccess)
import Wire.BrigAPIAccess
import Wire.ConversationStore (ConversationStore)
import Wire.ConversationSubsystem.CreateInternal
import Wire.ConversationSubsystem.Errors (ConversationSubsystemError (..))
import Wire.ConversationSubsystem.Util
import Wire.FeaturesConfigSubsystem
import Wire.FederationAPIAccess (FederationAPIAccess)
Expand All @@ -69,12 +70,7 @@ createLegacyGroupConversation ::
Member (ErrorS 'NotATeamMember) r,
Member (ErrorS OperationDenied) r,
Member (ErrorS 'NotConnected) r,
Member (ErrorS 'MLSNotEnabled) r,
Member (ErrorS 'MLSNonEmptyMemberList) r,
Member (ErrorS 'MissingLegalholdConsent) r,
Member (ErrorS 'ChannelsNotEnabled) r,
Member (ErrorS 'NotAnMlsConversation) r,
Member (ErrorS HistoryNotSupported) r,
Member (Error ConversationSubsystemError) r,
Member (Input ConversationSubsystemConfig) r,
Member LegalHoldStore r,
Member TeamStore r,
Expand Down Expand Up @@ -107,12 +103,7 @@ createGroupOwnConversation ::
Member (ErrorS 'NotATeamMember) r,
Member (ErrorS OperationDenied) r,
Member (ErrorS 'NotConnected) r,
Member (ErrorS 'MLSNotEnabled) r,
Member (ErrorS 'MLSNonEmptyMemberList) r,
Member (ErrorS 'MissingLegalholdConsent) r,
Member (ErrorS 'ChannelsNotEnabled) r,
Member (ErrorS 'NotAnMlsConversation) r,
Member (ErrorS HistoryNotSupported) r,
Member (Error ConversationSubsystemError) r,
Member (Input ConversationSubsystemConfig) r,
Member LegalHoldStore r,
Member TeamStore r,
Expand Down Expand Up @@ -150,12 +141,7 @@ createGroupConversation ::
Member (ErrorS 'NotATeamMember) r,
Member (ErrorS OperationDenied) r,
Member (ErrorS 'NotConnected) r,
Member (ErrorS 'MLSNotEnabled) r,
Member (ErrorS 'MLSNonEmptyMemberList) r,
Member (ErrorS 'MissingLegalholdConsent) r,
Member (ErrorS 'ChannelsNotEnabled) r,
Member (ErrorS 'NotAnMlsConversation) r,
Member (ErrorS HistoryNotSupported) r,
Member (Error ConversationSubsystemError) r,
Member (Input ConversationSubsystemConfig) r,
Member LegalHoldStore r,
Member TeamStore r,
Expand Down Expand Up @@ -209,9 +195,7 @@ createOne2OneConversation ::
Member (Error InvalidInput) r,
Member (ErrorS 'NotATeamMember) r,
Member (ErrorS OperationDenied) r,
Member (ErrorS 'NonBindingTeam) r,
Member (ErrorS 'NoBindingTeamMembers) r,
Member (ErrorS 'TeamNotFound) r,
Member (Error ConversationSubsystemError) r,
Member (ErrorS 'InvalidOperation) r,
Member (ErrorS 'NotConnected) r,
Member TeamStore r,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ import Wire.BackendNotificationQueueAccess (BackendNotificationQueueAccess)
import Wire.BrigAPIAccess
import Wire.ConversationStore (ConversationStore)
import Wire.ConversationStore qualified as ConvStore
import Wire.ConversationSubsystem.Errors (ConversationSubsystemError (..))
import Wire.ConversationSubsystem.One2One
import Wire.ConversationSubsystem.Util
import Wire.FeaturesConfigSubsystem
Expand Down Expand Up @@ -93,12 +94,7 @@ createGroupConversationGeneric ::
Member (ErrorS 'NotATeamMember) r,
Member (ErrorS OperationDenied) r,
Member (ErrorS 'NotConnected) r,
Member (ErrorS 'MLSNotEnabled) r,
Member (ErrorS 'MLSNonEmptyMemberList) r,
Member (ErrorS 'MissingLegalholdConsent) r,
Member (ErrorS 'ChannelsNotEnabled) r,
Member (ErrorS 'NotAnMlsConversation) r,
Member (ErrorS HistoryNotSupported) r,
Member (Error ConversationSubsystemError) r,
Member (Input ConversationSubsystemConfig) r,
Member LegalHoldStore r,
Member TeamStore r,
Expand All @@ -122,7 +118,7 @@ createGroupConversationGeneric lusr conn newConv = do
checkCreateConvPermissions lusr newConv newConv.newConvTeam allUsers
ensureNoLegalholdConflicts allUsers
when (newConv.newConvHistory /= HistoryPrivate && newConv.newConvGroupConvType /= Channel) $
throwS @HistoryNotSupported
throw ConversationSubsystemErrorHistoryNotSupported

when (Public.newConvProtocol newConv == BaseProtocolMLSTag) $ do
assertMLSEnabled
Expand All @@ -141,9 +137,7 @@ createOne2OneConversationLogic ::
Member (Error InvalidInput) r,
Member (ErrorS 'NotATeamMember) r,
Member (ErrorS OperationDenied) r,
Member (ErrorS 'NonBindingTeam) r,
Member (ErrorS 'NoBindingTeamMembers) r,
Member (ErrorS 'TeamNotFound) r,
Member (Error ConversationSubsystemError) r,
Member (ErrorS 'InvalidOperation) r,
Member (ErrorS 'NotConnected) r,
Member TeamStore r,
Expand Down Expand Up @@ -288,7 +282,7 @@ createConnectConversationLogic lusr conn j = do
| otherwise = pure conv

ensureNoLegalholdConflicts ::
( Member (ErrorS 'MissingLegalholdConsent) r,
( Member (Error ConversationSubsystemError) r,
Member (Input ConversationSubsystemConfig) r,
Member LegalHoldStore r,
Member TeamStore r,
Expand All @@ -300,16 +294,15 @@ ensureNoLegalholdConflicts (UserList locals remotes) = do
let FutureWork _remotes = FutureWork @'LegalholdPlusFederationNotImplemented remotes
whenM (anyLegalholdActivated locals) $
unlessM (allLegalholdConsentGiven locals) $
throwS @'MissingLegalholdConsent
throw ConversationSubsystemErrorMissingLegalholdConsent

checkCreateConvPermissions ::
( Member BrigAPIAccess r,
Member (ErrorS 'ConvAccessDenied) r,
Member (ErrorS 'NotATeamMember) r,
Member (ErrorS OperationDenied) r,
Member (ErrorS 'NotConnected) r,
Member (ErrorS 'ChannelsNotEnabled) r,
Member (ErrorS 'NotAnMlsConversation) r,
Member (Error ConversationSubsystemError) r,
Member TeamStore r,
Member FeaturesConfigSubsystem r,
Member TeamCollaboratorsSubsystem r,
Expand Down Expand Up @@ -356,22 +349,21 @@ checkCreateConvPermissions lusr newConv (Just tinfo) allUsers = do
( Member (ErrorS OperationDenied) r,
Member FeaturesConfigSubsystem r,
Member (ErrorS 'NotATeamMember) r,
Member (ErrorS 'ChannelsNotEnabled) r,
Member (ErrorS 'NotAnMlsConversation) r
Member (Error ConversationSubsystemError) r
) =>
TeamId ->
Maybe TeamMember ->
Sem r ()
ensureCreateChannelPermissions tid (Just tm) = do
channelsConf :: LockableFeature ChannelsConfig <- getFeatureForTeam tid
when (channelsConf.status == FeatureStatusDisabled) $ throwS @'ChannelsNotEnabled
when (Public.newConvProtocol newConv /= BaseProtocolMLSTag) $ throwS @'NotAnMlsConversation
when (channelsConf.status == FeatureStatusDisabled) $ throw ConversationSubsystemErrorChannelsNotEnabled
when (Public.newConvProtocol newConv /= BaseProtocolMLSTag) $ throw ConversationSubsystemErrorNotAnMlsConversation
case channelsConf.config.allowedToCreateChannels of
Conf.Everyone -> pure ()
Conf.TeamMembers -> void $ permissionCheck AddRemoveConvMember $ Just tm
Conf.Admins -> unless (isAdminOrOwner (tm ^. permissions)) $ throwS @OperationDenied
ensureCreateChannelPermissions _ Nothing = do
throwS @'NotATeamMember
throw ConversationSubsystemErrorNotATeamMember

getTeamMember :: (Member TeamStore r, Member TeamSubsystem r) => UserId -> Maybe TeamId -> Sem r (Maybe TeamMember)
getTeamMember uid (Just tid) = TeamSubsystem.internalGetTeamMember uid tid
Expand Down Expand Up @@ -490,7 +482,7 @@ createOne2OneConversationRemotely _ _ _ _name _mtid _ =
throw FederationNotImplemented

newRegularConversation ::
( Member (ErrorS 'MLSNonEmptyMemberList) r,
( Member (Error ConversationSubsystemError) r,
Member (ErrorS OperationDenied) r,
Member (Error InvalidInput) r,
Member (Input ConversationSubsystemConfig) r,
Expand All @@ -509,7 +501,7 @@ newRegularConversation lusr newConv = do
users <- case Public.newConvProtocol newConv of
BaseProtocolProteusTag -> checkedConvSize cfg uncheckedUsers
BaseProtocolMLSTag -> do
unless (null uncheckedUsers) $ throwS @'MLSNonEmptyMemberList
unless (null uncheckedUsers) $ throw ConversationSubsystemErrorMLSNonEmptyMemberList
pure mempty
let usersWithoutCreator = (,newConvUsersRole newConv) <$> fromConvSize users
newConvUsersRoles =
Expand Down Expand Up @@ -586,10 +578,10 @@ ensureOne :: (Member (Error InvalidInput) r) => [a] -> Sem r a
ensureOne [x] = pure x
ensureOne _ = throw (InvalidRange "One-to-one conversations can only have a single invited member")

assertMLSEnabled :: (Member (Input ConversationSubsystemConfig) r, Member (ErrorS 'MLSNotEnabled) r) => Sem r ()
assertMLSEnabled :: (Member (Input ConversationSubsystemConfig) r, Member (Error ConversationSubsystemError) r) => Sem r ()
assertMLSEnabled = do
cfg <- input
when (null cfg.mlsKeys) $ throwS @'MLSNotEnabled
when (null cfg.mlsKeys) $ throw ConversationSubsystemErrorMLSNotEnabled

newtype ConvSizeChecked f a = ConvSizeChecked {fromConvSize :: f a}
deriving (Functor, Foldable, Traversable)
Expand Down Expand Up @@ -623,11 +615,9 @@ throwErr :: (Member (Error InvalidInput) r) => String -> Sem r a
throwErr = throw . InvalidRange . fromString

checkBindingTeamPermissions ::
( Member (ErrorS 'NoBindingTeamMembers) r,
Member (ErrorS 'NonBindingTeam) r,
( Member (Error ConversationSubsystemError) r,
Member (ErrorS 'NotATeamMember) r,
Member (ErrorS OperationDenied) r,
Member (ErrorS 'TeamNotFound) r,
Member TeamCollaboratorsSubsystem r,
Member TeamStore r,
Member TeamSubsystem r
Expand All @@ -653,16 +643,16 @@ checkBindingTeamPermissions lusr lother tid = do
unless (isJust mOtherTeamCollaborator) $
verifyMembership tid (tUnqualified lother)
pure (Just tid)
Just _ -> throwS @'NonBindingTeam
Nothing -> throwS @'TeamNotFound
Just _ -> throw ConversationSubsystemErrorNonBindingTeam
Nothing -> throw ConversationSubsystemErrorTeamNotFound
where
guardPerm p m =
if m `hasPermission` p
then pure ()
else throwS @OperationDenied

verifyMembership ::
( Member (ErrorS 'NoBindingTeamMembers) r,
( Member (Error ConversationSubsystemError) r,
Member TeamSubsystem r
) =>
TeamId ->
Expand All @@ -671,7 +661,7 @@ verifyMembership ::
verifyMembership tid u = do
membership <- TeamSubsystem.internalGetTeamMember u tid
when (isNothing membership) $
throwS @'NoBindingTeamMembers
throw ConversationSubsystemErrorNoBindingTeamMembers

sendCellsNotification ::
( Member NotificationSubsystem r,
Expand Down
Loading