diff --git a/changelog.d/5-internal/split-members-constraints b/changelog.d/5-internal/split-members-constraints new file mode 100644 index 0000000000..a9046f3195 --- /dev/null +++ b/changelog.d/5-internal/split-members-constraints @@ -0,0 +1 @@ +Split polysemy `Members` constraints into multiple `Member` constraints diff --git a/hack/bin/split-member-constraints.py b/hack/bin/split-member-constraints.py old mode 100644 new mode 100755 index 28a54e688c..17fa49542b --- a/hack/bin/split-member-constraints.py +++ b/hack/bin/split-member-constraints.py @@ -25,8 +25,11 @@ def make_constraint(e): def f(m): effects = re.split(r'\s*,\s*', m.group(1)) - constraints = ', '.join(make_constraint(e) for e in effects) - return f'({constraints})' + constraints = [make_constraint(e) for e in effects] + s = ',\n '.join(constraints) + if len(constraints) > 1: + s = f'({s})' + return s code = open(sys.argv[1]).read() print(re.sub(r"Members\s+'\[\s*([^\]]*)\s*\]\s+r", f, code, flags=re.MULTILINE), diff --git a/services/brig/src/Brig/API.hs b/services/brig/src/Brig/API.hs index c7e3b1fcf5..b477b7346d 100644 --- a/services/brig/src/Brig/API.hs +++ b/services/brig/src/Brig/API.hs @@ -35,16 +35,13 @@ import Wire.Sem.Concurrency sitemap :: forall r p. - ( Members - '[ BlacklistPhonePrefixStore, - BlacklistStore, - GalleyProvider, - CodeStore, - Concurrency 'Unsafe, - PasswordResetStore, - UserPendingActivationStore p - ] - r + ( Member BlacklistPhonePrefixStore r, + Member BlacklistStore r, + Member GalleyProvider r, + Member CodeStore r, + Member (Concurrency 'Unsafe) r, + Member PasswordResetStore r, + Member (UserPendingActivationStore p) r ) => Routes () (Handler r) () sitemap = do diff --git a/services/brig/src/Brig/API/Client.hs b/services/brig/src/Brig/API/Client.hs index 4c30599850..02a3488783 100644 --- a/services/brig/src/Brig/API/Client.hs +++ b/services/brig/src/Brig/API/Client.hs @@ -89,7 +89,7 @@ import Data.String.Conversions (cs) import Imports import Network.HTTP.Types.Method (StdMethod) import Network.Wai.Utilities -import Polysemy (Member, Members) +import Polysemy (Member) import Servant (Link, ToHttpApiData (toUrlPiece)) import System.Logger.Class (field, msg, val, (~~)) import qualified System.Logger.Class as Log @@ -146,7 +146,7 @@ lookupLocalPubClientsBulk :: [UserId] -> ExceptT ClientError (AppT r) (UserMap ( lookupLocalPubClientsBulk = lift . wrapClient . Data.lookupPubClientsBulk addClient :: - (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => + (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => UserId -> Maybe ConnId -> Maybe IP -> @@ -158,7 +158,7 @@ addClient = addClientWithReAuthPolicy Data.reAuthForNewClients -- a superset of the clients known to galley. addClientWithReAuthPolicy :: forall r. - (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => + (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => Data.ReAuthPolicy -> UserId -> Maybe ConnId -> @@ -293,7 +293,7 @@ claimRemotePrekeyBundle quser = do claimMultiPrekeyBundles :: forall r. - (Members '[Concurrency 'Unsafe] r, CallsFed 'Brig "claim-multi-prekey-bundle") => + (Member (Concurrency 'Unsafe) r, CallsFed 'Brig "claim-multi-prekey-bundle") => LegalholdProtectee -> QualifiedUserClients -> ExceptT ClientError (AppT r) QualifiedUserClientPrekeyMap @@ -333,7 +333,7 @@ claimMultiPrekeyBundles protectee quc = do claimLocalMultiPrekeyBundles :: forall r. - Members '[Concurrency 'Unsafe] r => + Member (Concurrency 'Unsafe) r => LegalholdProtectee -> UserClients -> ExceptT ClientError (AppT r) UserClientPrekeyMap diff --git a/services/brig/src/Brig/API/Connection.hs b/services/brig/src/Brig/API/Connection.hs index f1c54d08dc..01af7e65ea 100644 --- a/services/brig/src/Brig/API/Connection.hs +++ b/services/brig/src/Brig/API/Connection.hs @@ -53,11 +53,11 @@ import Data.Qualified import Data.Range import qualified Data.UUID.V4 as UUID import Imports -import Polysemy (Members) +import Polysemy (Member) import qualified System.Logger.Class as Log import System.Logger.Message import Wire.API.Connection hiding (relationWithHistory) -import Wire.API.Conversation +import Wire.API.Conversation hiding (Member) import Wire.API.Error import qualified Wire.API.Error.Brig as E import Wire.API.Federation.API @@ -68,7 +68,7 @@ ensureIsActivated lusr = do active <- lift . wrapClient $ Data.isActivated (tUnqualified lusr) guard active -ensureNotSameTeam :: Members '[GalleyProvider] r => Local UserId -> Local UserId -> (ConnectionM r) () +ensureNotSameTeam :: Member GalleyProvider r => Local UserId -> Local UserId -> (ConnectionM r) () ensureNotSameTeam self target = do selfTeam <- lift $ liftSem $ GalleyProvider.getTeamId (tUnqualified self) targetTeam <- lift $ liftSem $ GalleyProvider.getTeamId (tUnqualified target) @@ -76,7 +76,7 @@ ensureNotSameTeam self target = do throwE ConnectSameBindingTeamUsers createConnection :: - (Members '[GalleyProvider] r, CallsFed 'Brig "send-connection-action") => + (Member GalleyProvider r, CallsFed 'Brig "send-connection-action") => Local UserId -> ConnId -> Qualified UserId -> @@ -96,7 +96,7 @@ createConnection self con target = do target createConnectionToLocalUser :: - Members '[GalleyProvider] r => + Member GalleyProvider r => Local UserId -> ConnId -> Local UserId -> @@ -185,7 +185,7 @@ createConnectionToLocalUser self conn target = do -- FUTUREWORK: we may want to move this to the LH application logic, so we can recycle it for -- group conv creation and possibly other situations. checkLegalholdPolicyConflict :: - Members '[GalleyProvider] r => + Member GalleyProvider r => UserId -> UserId -> ExceptT ConnectionError (AppT r) () diff --git a/services/brig/src/Brig/API/Federation.hs b/services/brig/src/Brig/API/Federation.hs index 7fb1caebc8..61edef6ae9 100644 --- a/services/brig/src/Brig/API/Federation.hs +++ b/services/brig/src/Brig/API/Federation.hs @@ -70,11 +70,9 @@ import Wire.Sem.Concurrency type FederationAPI = "federation" :> BrigApi federationSitemap :: - Members - '[ GalleyProvider, - Concurrency 'Unsafe - ] - r => + ( Member GalleyProvider r, + Member (Concurrency 'Unsafe) r + ) => ServerT FederationAPI (Handler r) federationSitemap = Named @"api-version" (\_ _ -> pure versionInfo) @@ -103,10 +101,7 @@ sendConnectionAction originDomain NewConnectionRequest {..} = do else pure NewConnectionResponseUserNotActivated getUserByHandle :: - Members - '[ GalleyProvider - ] - r => + Member GalleyProvider r => Domain -> Handle -> ExceptT Error (AppT r) (Maybe UserProfile) @@ -129,10 +124,7 @@ getUserByHandle domain handle = do listToMaybe <$> API.lookupLocalProfiles Nothing [ownerId] getUsersByIds :: - Members - '[ GalleyProvider - ] - r => + Member GalleyProvider r => Domain -> [UserId] -> ExceptT Error (AppT r) [UserProfile] @@ -148,7 +140,7 @@ claimPrekeyBundle _ user = API.claimLocalPrekeyBundle LegalholdPlusFederationNotImplemented user !>> clientError claimMultiPrekeyBundle :: - Members '[Concurrency 'Unsafe] r => + Member (Concurrency 'Unsafe) r => Domain -> UserClients -> Handler r UserClientPrekeyMap @@ -169,7 +161,7 @@ fedClaimKeyPackages domain ckpr = -- (This decision may change in the future) searchUsers :: forall r. - Members '[GalleyProvider] r => + Member GalleyProvider r => Domain -> SearchRequest -> ExceptT Error (AppT r) SearchResponse diff --git a/services/brig/src/Brig/API/Internal.hs b/services/brig/src/Brig/API/Internal.hs index 4f455d3e24..60f3005741 100644 --- a/services/brig/src/Brig/API/Internal.hs +++ b/services/brig/src/Brig/API/Internal.hs @@ -103,12 +103,9 @@ import Wire.API.User.RichInfo -- Sitemap (servant) servantSitemap :: - ( Members - '[ BlacklistStore, - GalleyProvider, - UserPendingActivationStore p - ] - r + ( Member BlacklistStore r, + Member GalleyProvider r, + Member (UserPendingActivationStore p) r ) => ServerT BrigIRoutes.API (Handler r) servantSitemap = @@ -121,10 +118,7 @@ servantSitemap = :<|> authAPI ejpdAPI :: - Members - '[ GalleyProvider - ] - r => + Member GalleyProvider r => ServerT BrigIRoutes.EJPD_API (Handler r) ejpdAPI = Brig.User.EJPD.ejpdRequest @@ -149,12 +143,9 @@ mlsAPI = :<|> Named @"put-key-package-add" upsertKeyPackage accountAPI :: - ( Members - '[ BlacklistStore, - GalleyProvider, - UserPendingActivationStore p - ] - r + ( Member BlacklistStore r, + Member GalleyProvider r, + Member (UserPendingActivationStore p) r ) => ServerT BrigIRoutes.AccountAPI (Handler r) accountAPI = @@ -281,15 +272,12 @@ getVerificationCode uid action = do -- Sitemap (wai-route) sitemap :: - ( Members - '[ CodeStore, - PasswordResetStore, - BlacklistStore, - BlacklistPhonePrefixStore, - GalleyProvider, - UserPendingActivationStore p - ] - r + ( Member CodeStore r, + Member PasswordResetStore r, + Member BlacklistStore r, + Member BlacklistPhonePrefixStore r, + Member GalleyProvider r, + Member (UserPendingActivationStore p) r ) => Routes a (Handler r) () sitemap = unsafeCallsFed @'Brig @"on-user-deleted-connections" $ do @@ -454,10 +442,7 @@ sitemap = unsafeCallsFed @'Brig @"on-user-deleted-connections" $ do -- | Add a client without authentication checks addClientInternalH :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections" ) => UserId ::: Maybe Bool ::: JsonRequest NewClient ::: Maybe ConnId ::: JSON -> @@ -467,10 +452,7 @@ addClientInternalH (usr ::: mSkipReAuth ::: req ::: connId ::: _) = do setStatus status201 . json <$> addClientInternal usr mSkipReAuth new connId addClientInternal :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections" ) => UserId -> @@ -513,12 +495,9 @@ internalListFullClients (UserSet usrs) = UserClientsFull <$> wrapClient (Data.lookupClientsBulk (Set.toList usrs)) createUserNoVerify :: - ( Members - '[ BlacklistStore, - GalleyProvider, - UserPendingActivationStore p - ] - r, + ( Member BlacklistStore r, + Member GalleyProvider r, + Member (UserPendingActivationStore p) r, CallsFed 'Brig "on-user-deleted-connections" ) => NewUser -> @@ -537,10 +516,7 @@ createUserNoVerify uData = lift . runExceptT $ do pure . SelfProfile $ usr createUserNoVerifySpar :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections" ) => NewUserSpar -> @@ -640,14 +616,18 @@ instance ToJSON GetActivationCodeResp where toJSON (GetActivationCodeResp (k, c)) = object ["key" .= k, "code" .= c] getPasswordResetCodeH :: - Members '[CodeStore, PasswordResetStore] r => + ( Member CodeStore r, + Member PasswordResetStore r + ) => JSON ::: Either Email Phone -> (Handler r) Response getPasswordResetCodeH (_ ::: emailOrPhone) = do maybe (throwStd (errorToWai @'E.InvalidPasswordResetKey)) (pure . json) =<< lift (getPasswordResetCode emailOrPhone) getPasswordResetCode :: - Members '[CodeStore, PasswordResetStore] r => + ( Member CodeStore r, + Member PasswordResetStore r + ) => Either Email Phone -> (AppT r) (Maybe GetPasswordResetCodeResp) getPasswordResetCode emailOrPhone = diff --git a/services/brig/src/Brig/API/Public.hs b/services/brig/src/Brig/API/Public.hs index e709e615b0..7c194f07ea 100644 --- a/services/brig/src/Brig/API/Public.hs +++ b/services/brig/src/Brig/API/Public.hs @@ -206,20 +206,16 @@ emptySwagger = servantSitemap :: forall r p. - ( Members - '[ BlacklistPhonePrefixStore, - BlacklistStore, - CodeStore, - Concurrency 'Unsafe, - Concurrency 'Unsafe, - GalleyProvider, - JwtTools, - Now, - PasswordResetStore, - PublicKeyBundle, - UserPendingActivationStore p - ] - r + ( Member BlacklistPhonePrefixStore r, + Member BlacklistStore r, + Member CodeStore r, + Member (Concurrency 'Unsafe) r, + Member GalleyProvider r, + Member JwtTools r, + Member Now r, + Member PasswordResetStore r, + Member PublicKeyBundle r, + Member (UserPendingActivationStore p) r ) => ServerT BrigAPI (Handler r) servantSitemap = @@ -371,15 +367,9 @@ servantSitemap = -- - MemberLeave event to members for all conversations the user was in (via galley) sitemap :: - Members - '[ BlacklistPhonePrefixStore, - BlacklistStore, - CodeStore, - Concurrency 'Unsafe, - GalleyProvider, - PasswordResetStore - ] - r => + ( Member (Concurrency 'Unsafe) r, + Member GalleyProvider r + ) => Routes () (Handler r) () sitemap = do Provider.routesPublic @@ -463,7 +453,7 @@ getPrekeyBundleH zusr (Qualified uid domain) = API.claimPrekeyBundle (ProtectedUser zusr) domain uid !>> clientError getMultiUserPrekeyBundleUnqualifiedH :: - Members '[Concurrency 'Unsafe] r => + Member (Concurrency 'Unsafe) r => UserId -> Public.UserClients -> Handler r Public.UserClientPrekeyMap @@ -474,7 +464,7 @@ getMultiUserPrekeyBundleUnqualifiedH zusr userClients = do API.claimLocalMultiPrekeyBundles (ProtectedUser zusr) userClients !>> clientError getMultiUserPrekeyBundleH :: - (Members '[Concurrency 'Unsafe] r, CallsFed 'Brig "claim-multi-prekey-bundle") => + (Member (Concurrency 'Unsafe) r, CallsFed 'Brig "claim-multi-prekey-bundle") => UserId -> Public.QualifiedUserClients -> (Handler r) Public.QualifiedUserClientPrekeyMap @@ -489,10 +479,7 @@ getMultiUserPrekeyBundleH zusr qualUserClients = do API.claimMultiPrekeyBundles (ProtectedUser zusr) qualUserClients !>> clientError addClient :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections" ) => UserId -> @@ -602,12 +589,9 @@ createAccessToken method uid cid proof = do -- | docs/reference/user/registration.md {#RefRegistration} createUser :: - ( Members - '[ BlacklistStore, - GalleyProvider, - UserPendingActivationStore p - ] - r, + ( Member BlacklistStore r, + Member GalleyProvider r, + Member (UserPendingActivationStore p) r, CallsFed 'Brig "on-user-deleted-connections" ) => Public.NewUserPublic -> @@ -686,10 +670,7 @@ getSelf self = >>= ifNothing (errorToWai @'E.UserNotFound) getUserUnqualifiedH :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "get-users-by-ids" ) => UserId -> @@ -700,10 +681,7 @@ getUserUnqualifiedH self uid = do getUser self (Qualified uid domain) getUser :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "get-users-by-ids" ) => UserId -> @@ -715,11 +693,8 @@ getUser self qualifiedUserId = do -- FUTUREWORK: Make servant understand that at least one of these is required listUsersByUnqualifiedIdsOrHandles :: - ( Members - '[ GalleyProvider, - Concurrency 'Unsafe - ] - r, + ( Member GalleyProvider r, + Member (Concurrency 'Unsafe) r, CallsFed 'Brig "get-users-by-ids" ) => UserId -> @@ -743,11 +718,8 @@ listUsersByUnqualifiedIdsOrHandles self mUids mHandles = do listUsersByIdsOrHandles :: forall r. - ( Members - '[ GalleyProvider, - Concurrency 'Unsafe - ] - r, + ( Member GalleyProvider r, + Member (Concurrency 'Unsafe) r, CallsFed 'Brig "get-users-by-ids" ) => UserId -> @@ -786,11 +758,9 @@ updateUser uid conn uu = do pure $ either Just (const Nothing) eithErr changePhone :: - Members - '[ BlacklistStore, - BlacklistPhonePrefixStore - ] - r => + ( Member BlacklistStore r, + Member BlacklistPhonePrefixStore r + ) => UserId -> ConnId -> Public.PhoneUpdate -> @@ -839,10 +809,7 @@ checkHandles _ (Public.CheckHandles hs num) = do -- 'Handle.getHandleInfo') returns UserProfile to reduce traffic between backends -- in a federated scenario. getHandleInfoUnqualifiedH :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "get-user-by-handle", CallsFed 'Brig "get-users-by-ids" ) => @@ -860,7 +827,7 @@ changeHandle u conn (Public.HandleUpdate h) = lift . exceptTToMaybe $ do API.changeHandle u (Just conn) handle API.ForbidSCIMUpdates beginPasswordReset :: - Members '[PasswordResetStore] r => + Member PasswordResetStore r => Public.NewPasswordReset -> (Handler r) () beginPasswordReset (Public.NewPasswordReset target) = do @@ -872,7 +839,9 @@ beginPasswordReset (Public.NewPasswordReset target) = do Right phone -> wrapClient $ sendPasswordResetSms phone pair loc completePasswordReset :: - Members '[CodeStore, PasswordResetStore] r => + ( Member CodeStore r, + Member PasswordResetStore r + ) => Public.CompletePasswordReset -> (Handler r) () completePasswordReset req = do @@ -881,12 +850,10 @@ completePasswordReset req = do -- docs/reference/user/activation.md {#RefActivationRequest} -- docs/reference/user/registration.md {#RefRegistration} sendActivationCode :: - Members - '[ BlacklistStore, - BlacklistPhonePrefixStore, - GalleyProvider - ] - r => + ( Member BlacklistStore r, + Member BlacklistPhonePrefixStore r, + Member GalleyProvider r + ) => Public.SendActivationCode -> (Handler r) () sendActivationCode Public.SendActivationCode {..} = do @@ -911,10 +878,7 @@ customerExtensionCheckBlockedDomains email = do customerExtensionBlockedDomain domain createConnectionUnqualified :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "send-connection-action" ) => UserId -> @@ -927,10 +891,7 @@ createConnectionUnqualified self conn cr = do API.createConnection lself conn (tUntagged target) !>> connError createConnection :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "send-connection-action" ) => UserId -> @@ -1012,10 +973,7 @@ getConnection self other = do lift . wrapClient $ Data.lookupConnection lself other deleteSelfUser :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections" ) => UserId -> @@ -1029,11 +987,9 @@ verifyDeleteUser body = API.verifyDeleteUser body !>> deleteUserError updateUserEmail :: forall r. - Members - '[ BlacklistStore, - GalleyProvider - ] - r => + ( Member BlacklistStore r, + Member GalleyProvider r + ) => UserId -> UserId -> Public.EmailUpdate -> @@ -1061,10 +1017,7 @@ updateUserEmail zuserId emailOwnerId (Public.EmailUpdate email) = do -- activation activate :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections" ) => Public.ActivationKey -> @@ -1076,10 +1029,7 @@ activate k c = do -- docs/reference/user/activation.md {#RefActivationSubmit} activateKey :: - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections" ) => Public.Activate -> @@ -1099,10 +1049,7 @@ activateKey (Public.Activate tgt code dryrun) sendVerificationCode :: forall r. - Members - '[ GalleyProvider - ] - r => + Member GalleyProvider r => Public.SendVerificationCode -> (Handler r) () sendVerificationCode req = do @@ -1156,7 +1103,9 @@ deprecatedOnboarding :: UserId -> JsonValue -> (Handler r) DeprecatedMatchingRes deprecatedOnboarding _ _ = pure DeprecatedMatchingResult deprecatedCompletePasswordReset :: - Members '[CodeStore, PasswordResetStore] r => + ( Member CodeStore r, + Member PasswordResetStore r + ) => Public.PasswordResetKey -> Public.PasswordReset -> (Handler r) () diff --git a/services/brig/src/Brig/API/User.hs b/services/brig/src/Brig/API/User.hs index 6cef15d026..55f9336c08 100644 --- a/services/brig/src/Brig/API/User.hs +++ b/services/brig/src/Brig/API/User.hs @@ -228,10 +228,7 @@ verifyUniquenessAndCheckBlacklist uk = do createUserSpar :: forall r. - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections" ) => NewUserSpar -> @@ -296,12 +293,9 @@ createUserSpar new = do -- docs/reference/user/registration.md {#RefRegistration} createUser :: forall r p. - ( Members - '[ BlacklistStore, - GalleyProvider, - UserPendingActivationStore p - ] - r, + ( Member BlacklistStore r, + Member GalleyProvider r, + Member (UserPendingActivationStore p) r, CallsFed 'Brig "on-user-deleted-connections" ) => NewUser -> @@ -541,12 +535,9 @@ initAccountFeatureConfig uid = do -- all over the place there, we add a new function that handles just the one new flow where -- users are invited to the team via scim. createUserInviteViaScim :: - Members - '[ BlacklistStore, - UserPendingActivationStore p, - GalleyProvider - ] - r => + ( Member BlacklistStore r, + Member (UserPendingActivationStore p) r + ) => UserId -> NewUserScimInvitation -> ExceptT Error.Error (AppT r) UserAccount @@ -747,11 +738,9 @@ changeEmail u email allowScim = do -- Change Phone changePhone :: - Members - '[ BlacklistStore, - BlacklistPhonePrefixStore - ] - r => + ( Member BlacklistStore r, + Member BlacklistPhonePrefixStore r + ) => UserId -> Phone -> ExceptT ChangePhoneError (AppT r) (Activation, Phone) @@ -908,7 +897,7 @@ mkUserEvent usrs status = -- Activation activate :: - (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => + (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => ActivationTarget -> ActivationCode -> -- | The user for whom to activate the key. @@ -917,7 +906,7 @@ activate :: activate tgt code usr = activateWithCurrency tgt code usr Nothing activateWithCurrency :: - (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => + (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => ActivationTarget -> ActivationCode -> -- | The user for whom to activate the key. @@ -974,12 +963,10 @@ onActivated (PhoneActivated uid phone) = do -- docs/reference/user/activation.md {#RefActivationRequest} sendActivationCode :: - Members - '[ BlacklistStore, - BlacklistPhonePrefixStore, - GalleyProvider - ] - r => + ( Member BlacklistStore r, + Member BlacklistPhonePrefixStore r, + Member GalleyProvider r + ) => Either Email Phone -> Maybe Locale -> Bool -> @@ -1103,7 +1090,7 @@ changePassword uid cp = do lift $ wrapClient (Data.updatePassword uid newpw) >> wrapClient (revokeAllCookies uid) beginPasswordReset :: - Members '[PasswordResetStore] r => + Member PasswordResetStore r => Either Email Phone -> ExceptT PasswordResetError (AppT r) (UserId, PasswordResetPair) beginPasswordReset target = do @@ -1119,7 +1106,9 @@ beginPasswordReset target = do (user,) <$> lift (liftSem $ E.createPasswordResetCode user target) completePasswordReset :: - Members '[CodeStore, PasswordResetStore] r => + ( Member CodeStore r, + Member PasswordResetStore r + ) => PasswordResetIdentity -> PasswordResetCode -> PlainTextPassword -> @@ -1147,7 +1136,7 @@ checkNewIsDifferent uid pw = do _ -> pure () mkPasswordResetKey :: - Members '[CodeStore] r => + Member CodeStore r => PasswordResetIdentity -> ExceptT PasswordResetError (AppT r) PasswordResetKey mkPasswordResetKey ident = case ident of @@ -1174,10 +1163,7 @@ mkPasswordResetKey ident = case ident of -- TODO: communicate deletions of SSO users to SSO service. deleteSelfUser :: forall r. - ( Members - '[ GalleyProvider - ] - r, + ( Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections" ) => UserId -> @@ -1377,7 +1363,9 @@ lookupActivationCode emailOrPhone = do pure $ (k,) <$> c lookupPasswordResetCode :: - Members '[CodeStore, PasswordResetStore] r => + ( Member CodeStore r, + Member PasswordResetStore r + ) => Either Email Phone -> (AppT r) (Maybe PasswordResetPair) lookupPasswordResetCode emailOrPhone = do @@ -1429,7 +1417,7 @@ userGC u = case userExpire u of pure u lookupProfile :: - (Members '[GalleyProvider] r, CallsFed 'Brig "get-users-by-ids") => + (Member GalleyProvider r, CallsFed 'Brig "get-users-by-ids") => Local UserId -> Qualified UserId -> ExceptT FederationError (AppT r) (Maybe UserProfile) @@ -1445,11 +1433,8 @@ lookupProfile self other = -- Otherwise only the 'PublicProfile' is accessible for user 'self'. -- If 'self' is an unknown 'UserId', return '[]'. lookupProfiles :: - ( Members - '[ GalleyProvider, - Concurrency 'Unsafe - ] - r, + ( Member GalleyProvider r, + Member (Concurrency 'Unsafe) r, CallsFed 'Brig "get-users-by-ids" ) => -- | User 'self' on whose behalf the profiles are requested. @@ -1464,7 +1449,7 @@ lookupProfiles self others = (bucketQualified others) lookupProfilesFromDomain :: - (Members '[GalleyProvider] r, CallsFed 'Brig "get-users-by-ids") => + (Member GalleyProvider r, CallsFed 'Brig "get-users-by-ids") => Local UserId -> Qualified [UserId] -> ExceptT FederationError (AppT r) [UserProfile] @@ -1490,7 +1475,7 @@ lookupRemoteProfiles (tUntagged -> Qualified uids domain) = -- pure function and writing tests for that. lookupLocalProfiles :: forall r. - Members '[GalleyProvider] r => + Member GalleyProvider r => -- | This is present only when an authenticated user is requesting access. Maybe UserId -> -- | The users ('others') for which to obtain the profiles. @@ -1535,13 +1520,13 @@ lookupLocalProfiles requestingUser others = do in baseProfile {profileEmail = profileEmail'} getLegalHoldStatus :: - Members '[GalleyProvider] r => + Member GalleyProvider r => UserId -> AppT r (Maybe UserLegalHoldStatus) getLegalHoldStatus uid = traverse (liftSem . getLegalHoldStatus' . accountUser) =<< wrapHttpClient (lookupAccount uid) getLegalHoldStatus' :: - Members '[GalleyProvider] r => + Member GalleyProvider r => User -> Sem r UserLegalHoldStatus getLegalHoldStatus' user = diff --git a/services/brig/src/Brig/Effects/GalleyProvider/RPC.hs b/services/brig/src/Brig/Effects/GalleyProvider/RPC.hs index 3abc308051..65ee53fead 100644 --- a/services/brig/src/Brig/Effects/GalleyProvider/RPC.hs +++ b/services/brig/src/Brig/Effects/GalleyProvider/RPC.hs @@ -58,12 +58,10 @@ import Wire.API.Team.SearchVisibility import Wire.Sem.Logger interpretGalleyProviderToRPC :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => Sem (GalleyProvider ': r) a -> Sem r a interpretGalleyProviderToRPC = interpret $ \case @@ -89,11 +87,9 @@ interpretGalleyProviderToRPC = interpret $ \case -- | Calls 'Galley.API.createSelfConversationH'. createSelfConv :: - Members - '[ ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => UserId -> Sem r () createSelfConv u = do @@ -109,12 +105,10 @@ createSelfConv u = do -- | Calls 'Galley.API.getConversationH'. getConv :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => UserId -> Local ConvId -> Sem r (Maybe Conversation) @@ -141,12 +135,10 @@ getConv usr lcnv = do -- | Calls 'Galley.API.getTeamConversationH'. getTeamConv :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => UserId -> TeamId -> ConvId -> @@ -174,11 +166,9 @@ getTeamConv usr tid cnv = do -- | Calls 'Galley.API.addClientH'. newClient :: - Members - '[ ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => UserId -> ClientId -> Sem r () @@ -193,11 +183,9 @@ newClient u c = do -- | Calls 'Galley.API.canUserJoinTeamH'. checkUserCanJoinTeam :: - Members - '[ ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => TeamId -> Sem r (Maybe Wai.Error) checkUserCanJoinTeam tid = do @@ -217,11 +205,9 @@ checkUserCanJoinTeam tid = do -- | Calls 'Galley.API.uncheckedAddTeamMemberH'. addTeamMember :: - Members - '[ ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => UserId -> TeamId -> (Maybe (UserId, UTCTimeMillis), Role) -> @@ -246,11 +232,9 @@ addTeamMember u tid (minvmeta, role) = do -- | Calls 'Galley.API.createBindingTeamH'. createTeam :: - Members - '[ ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => UserId -> BindingNewTeam -> TeamId -> @@ -275,12 +259,10 @@ createTeam u t@(BindingNewTeam bt) teamid = do -- | Calls 'Galley.API.uncheckedGetTeamMemberH'. getTeamMember :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => UserId -> TeamId -> Sem r (Maybe Team.TeamMember) @@ -304,12 +286,10 @@ getTeamMember u tid = do -- means that only the first 2000 members of a team (according to some arbitrary order) will -- be suspended, and the rest will remain active. getTeamMembers :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => TeamId -> Sem r Team.TeamMemberList getTeamMembers tid = do @@ -321,11 +301,7 @@ getTeamMembers tid = do . expect2xx memberIsTeamOwner :: - Members - '[ ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + Member (ServiceRPC 'Galley) r => TeamId -> UserId -> Sem r Bool @@ -337,12 +313,10 @@ memberIsTeamOwner tid uid = do -- | Calls 'Galley.API.getBindingTeamIdH'. getTeamId :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => UserId -> Sem r (Maybe TeamId) getTeamId u = do @@ -358,12 +332,10 @@ getTeamId u = do -- | Calls 'Galley.API.getTeamInternalH'. getTeam :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => TeamId -> Sem r Team.TeamData getTeam tid = do @@ -376,12 +348,10 @@ getTeam tid = do -- | Calls 'Galley.API.getTeamInternalH'. getTeamName :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => TeamId -> Sem r Team.TeamName getTeamName tid = do @@ -394,12 +364,10 @@ getTeamName tid = do -- | Calls 'Galley.API.getTeamFeatureStatusH'. getTeamLegalHoldStatus :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => TeamId -> Sem r (WithStatus LegalholdConfig) getTeamLegalHoldStatus tid = do @@ -412,12 +380,10 @@ getTeamLegalHoldStatus tid = do -- | Calls 'Galley.API.getSearchVisibilityInternalH'. getTeamSearchVisibility :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => TeamId -> Sem r TeamSearchVisibility getTeamSearchVisibility tid = @@ -430,12 +396,10 @@ getTeamSearchVisibility tid = . expect2xx getVerificationCodeEnabled :: - Members - '[ Error ParseException, - ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (Error ParseException) r, + Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => TeamId -> Sem r Bool getVerificationCodeEnabled tid = do @@ -463,11 +427,7 @@ decodeBodyMaybe :: (Typeable a, FromJSON a) => Text -> Response (Maybe BL.ByteSt decodeBodyMaybe t r = hush $ decodeBody t r getAllFeatureConfigsForUser :: - Members - '[ ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + Member (ServiceRPC 'Galley) r => Maybe UserId -> Sem r AllFeatureConfigs getAllFeatureConfigsForUser mbUserId = @@ -480,11 +440,9 @@ getAllFeatureConfigsForUser mbUserId = -- | Calls 'Galley.API.updateTeamStatusH'. changeTeamStatus :: - Members - '[ ServiceRPC 'Galley, - Logger (Msg -> Msg) - ] - r => + ( Member (ServiceRPC 'Galley) r, + Member (Logger (Msg -> Msg)) r + ) => TeamId -> Team.TeamStatus -> Maybe Currency.Alpha -> @@ -500,12 +458,10 @@ changeTeamStatus tid s cur = do . lbytes (encode $ Team.TeamStatusUpdate s cur) getTeamExposeInvitationURLsToTeamAdmin :: - Members - '[ ServiceRPC 'Galley, - Error ParseException, - Logger (Msg -> Msg) - ] - r => + ( Member (ServiceRPC 'Galley) r, + Member (Error ParseException) r, + Member (Logger (Msg -> Msg)) r + ) => TeamId -> Sem r ShowOrHideInvitationUrl getTeamExposeInvitationURLsToTeamAdmin tid = do diff --git a/services/brig/src/Brig/Effects/JwtTools.hs b/services/brig/src/Brig/Effects/JwtTools.hs index b345fcb2cf..8d2692d9ec 100644 --- a/services/brig/src/Brig/Effects/JwtTools.hs +++ b/services/brig/src/Brig/Effects/JwtTools.hs @@ -46,7 +46,7 @@ data JwtTools m a where makeSem ''JwtTools -interpretJwtTools :: Members '[Embed IO] r => Sem (JwtTools ': r) a -> Sem r a +interpretJwtTools :: Member (Embed IO) r => Sem (JwtTools ': r) a -> Sem r a interpretJwtTools = interpret $ \(GenerateDPoPAccessToken pr ci n uri method skew ex now pem) -> do case readHex @Word16 (cs $ client $ ciClient ci) of [(parsedClientId, "")] -> diff --git a/services/brig/src/Brig/Effects/PasswordResetStore/CodeStore.hs b/services/brig/src/Brig/Effects/PasswordResetStore/CodeStore.hs index c0248aa4e5..22f2b1bf45 100644 --- a/services/brig/src/Brig/Effects/PasswordResetStore/CodeStore.hs +++ b/services/brig/src/Brig/Effects/PasswordResetStore/CodeStore.hs @@ -34,7 +34,9 @@ import qualified Wire.Sem.Now as Now passwordResetStoreToCodeStore :: forall r a. - Members '[CodeStore, Now] r => + ( Member CodeStore r, + Member Now r + ) => Sem (PasswordResetStore ': r) a -> Sem r a passwordResetStoreToCodeStore = interpret $ \case @@ -49,7 +51,9 @@ ttl :: NominalDiffTime ttl = 3600 -- 60 minutes create :: - Members '[CodeStore, Now] r => + ( Member CodeStore r, + Member Now r + ) => UserId -> Either Email Phone -> Sem r PasswordResetPair @@ -64,7 +68,9 @@ create u target = do pure (key, code) lookup :: - Members '[CodeStore, Now] r => + ( Member CodeStore r, + Member Now r + ) => UserId -> Sem r (Maybe PasswordResetCode) lookup u = do @@ -76,7 +82,9 @@ lookup u = do validate _ _ = pure Nothing verify :: - Members '[CodeStore, Now] r => + ( Member CodeStore r, + Member Now r + ) => PasswordResetPair -> Sem r (Maybe UserId) verify (k, c) = do diff --git a/services/brig/src/Brig/Effects/PublicKeyBundle.hs b/services/brig/src/Brig/Effects/PublicKeyBundle.hs index 2846bc7a5e..ab236b2566 100644 --- a/services/brig/src/Brig/Effects/PublicKeyBundle.hs +++ b/services/brig/src/Brig/Effects/PublicKeyBundle.hs @@ -14,7 +14,7 @@ data PublicKeyBundle m a where makeSem ''PublicKeyBundle -interpretPublicKeyBundle :: Members '[Embed IO] r => Sem (PublicKeyBundle ': r) a -> Sem r a +interpretPublicKeyBundle :: Member (Embed IO) r => Sem (PublicKeyBundle ': r) a -> Sem r a interpretPublicKeyBundle = interpret $ \(Get fp) -> do contents :: Either IOException ByteString <- liftIO $ try $ BS.readFile fp pure $ either (const Nothing) fromByteString contents diff --git a/services/brig/src/Brig/Effects/RPC/IO.hs b/services/brig/src/Brig/Effects/RPC/IO.hs index 4f1b13d062..8ef33ef80f 100644 --- a/services/brig/src/Brig/Effects/RPC/IO.hs +++ b/services/brig/src/Brig/Effects/RPC/IO.hs @@ -11,7 +11,7 @@ import Control.Monad.Catch import Imports import Polysemy -interpretRpcToIO :: Members '[Final IO] r => Manager -> RequestId -> Sem (RPC ': r) a -> Sem r a +interpretRpcToIO :: Member (Final IO) r => Manager -> RequestId -> Sem (RPC ': r) a -> Sem r a interpretRpcToIO mgr rid = interpret $ \case ServiceRequest txt f sm g -> embedFinal @IO $ viaHttpIO mgr rid $ RPC.serviceRequestImpl txt f sm g diff --git a/services/brig/src/Brig/Effects/SFT.hs b/services/brig/src/Brig/Effects/SFT.hs index de325e810e..c4a4184ceb 100644 --- a/services/brig/src/Brig/Effects/SFT.hs +++ b/services/brig/src/Brig/Effects/SFT.hs @@ -66,7 +66,7 @@ interpretSFT httpManager = interpret $ \(SFTGetAllServers url) -> do debug $ Log.field "URLs" (show res) . Log.msg ("Fetched the following server URLs" :: ByteString) pure res -runSftError :: Members '[TinyLog] r => HttpsUrl -> Sem (Error SFTError : r) a -> Sem r (Either SFTError a) +runSftError :: Member TinyLog r => HttpsUrl -> Sem (Error SFTError : r) a -> Sem r (Either SFTError a) runSftError urlWithPath act = runError $ act diff --git a/services/brig/src/Brig/Provider/API.hs b/services/brig/src/Brig/Provider/API.hs index 7c04f89336..23872d077f 100644 --- a/services/brig/src/Brig/Provider/API.hs +++ b/services/brig/src/Brig/Provider/API.hs @@ -98,7 +98,7 @@ import qualified Ssl.Util as SSL import System.Logger.Class (MonadLogger) import UnliftIO.Async (pooledMapConcurrentlyN_) import qualified Web.Cookie as Cookie -import Wire.API.Conversation +import Wire.API.Conversation hiding (Member) import Wire.API.Conversation.Bot import qualified Wire.API.Conversation.Bot as Public import Wire.API.Conversation.Role @@ -126,7 +126,9 @@ import qualified Wire.API.User.Identity as Public (Email) import Wire.Sem.Concurrency (Concurrency, ConcurrencySafety (Unsafe)) routesPublic :: - Members '[GalleyProvider, Concurrency 'Unsafe] r => + ( Member GalleyProvider r, + Member (Concurrency 'Unsafe) r + ) => Routes () (Handler r) () routesPublic = do -- Public API (Unauthenticated) -------------------------------------------- @@ -326,7 +328,7 @@ routesPublic = do .&> zauth ZAuthBot .&> capture "uid" -routesInternal :: Members '[GalleyProvider] r => Routes a (Handler r) () +routesInternal :: Member GalleyProvider r => Routes a (Handler r) () routesInternal = do get "/i/provider/activation-code" (continue getActivationCodeH) $ accept "application" "json" @@ -335,7 +337,7 @@ routesInternal = do -------------------------------------------------------------------------------- -- Public API (Unauthenticated) -newAccountH :: Members '[GalleyProvider] r => JsonRequest Public.NewProvider -> (Handler r) Response +newAccountH :: Member GalleyProvider r => JsonRequest Public.NewProvider -> (Handler r) Response newAccountH req = do guardSecondFactorDisabled Nothing setStatus status201 . json <$> (newAccount =<< parseJsonBody req) @@ -372,7 +374,7 @@ newAccount new = do lift $ sendActivationMail name email key val False pure $ Public.NewProviderResponse pid newPass -activateAccountKeyH :: Members '[GalleyProvider] r => Code.Key ::: Code.Value -> (Handler r) Response +activateAccountKeyH :: Member GalleyProvider r => Code.Key ::: Code.Value -> (Handler r) Response activateAccountKeyH (key ::: val) = do guardSecondFactorDisabled Nothing maybe (setStatus status204 empty) json <$> activateAccountKey key val @@ -399,7 +401,7 @@ activateAccountKey key val = do lift $ sendApprovalConfirmMail name email pure . Just $ Public.ProviderActivationResponse email -getActivationCodeH :: Members '[GalleyProvider] r => Public.Email -> (Handler r) Response +getActivationCodeH :: Member GalleyProvider r => Public.Email -> (Handler r) Response getActivationCodeH e = do guardSecondFactorDisabled Nothing json <$> getActivationCode e @@ -420,7 +422,7 @@ instance ToJSON FoundActivationCode where toJSON $ Code.KeyValuePair (Code.codeKey vcode) (Code.codeValue vcode) -approveAccountKeyH :: Members '[GalleyProvider] r => Code.Key ::: Code.Value -> (Handler r) Response +approveAccountKeyH :: Member GalleyProvider r => Code.Key ::: Code.Value -> (Handler r) Response approveAccountKeyH (key ::: val) = do guardSecondFactorDisabled Nothing empty <$ approveAccountKey key val @@ -435,7 +437,7 @@ approveAccountKey key val = do lift $ sendApprovalConfirmMail name email _ -> throwStd (errorToWai @'E.InvalidCode) -loginH :: Members '[GalleyProvider] r => JsonRequest Public.ProviderLogin -> (Handler r) Response +loginH :: Member GalleyProvider r => JsonRequest Public.ProviderLogin -> (Handler r) Response loginH req = do guardSecondFactorDisabled Nothing tok <- login =<< parseJsonBody req @@ -449,7 +451,7 @@ login l = do throwStd (errorToWai @'E.BadCredentials) ZAuth.newProviderToken pid -beginPasswordResetH :: Members '[GalleyProvider] r => JsonRequest Public.PasswordReset -> (Handler r) Response +beginPasswordResetH :: Member GalleyProvider r => JsonRequest Public.PasswordReset -> (Handler r) Response beginPasswordResetH req = do guardSecondFactorDisabled Nothing setStatus status201 empty <$ (beginPasswordReset =<< parseJsonBody req) @@ -471,7 +473,7 @@ beginPasswordReset (Public.PasswordReset target) = do tryInsertVerificationCode code $ verificationCodeThrottledError . VerificationCodeThrottled lift $ sendPasswordResetMail target (Code.codeKey code) (Code.codeValue code) -completePasswordResetH :: Members '[GalleyProvider] r => JsonRequest Public.CompletePasswordReset -> (Handler r) Response +completePasswordResetH :: Member GalleyProvider r => JsonRequest Public.CompletePasswordReset -> (Handler r) Response completePasswordResetH req = do guardSecondFactorDisabled Nothing empty <$ (completePasswordReset =<< parseJsonBody req) @@ -492,7 +494,7 @@ completePasswordReset (Public.CompletePasswordReset key val newpwd) = do -------------------------------------------------------------------------------- -- Provider API -getAccountH :: Members '[GalleyProvider] r => ProviderId -> (Handler r) Response +getAccountH :: Member GalleyProvider r => ProviderId -> (Handler r) Response getAccountH pid = do guardSecondFactorDisabled Nothing getAccount pid <&> \case @@ -502,7 +504,7 @@ getAccountH pid = do getAccount :: ProviderId -> (Handler r) (Maybe Public.Provider) getAccount = wrapClientE . DB.lookupAccount -updateAccountProfileH :: Members '[GalleyProvider] r => ProviderId ::: JsonRequest Public.UpdateProvider -> (Handler r) Response +updateAccountProfileH :: Member GalleyProvider r => ProviderId ::: JsonRequest Public.UpdateProvider -> (Handler r) Response updateAccountProfileH (pid ::: req) = do guardSecondFactorDisabled Nothing empty <$ (updateAccountProfile pid =<< parseJsonBody req) @@ -517,7 +519,7 @@ updateAccountProfile pid upd = do (updateProviderUrl upd) (updateProviderDescr upd) -updateAccountEmailH :: Members '[GalleyProvider] r => ProviderId ::: JsonRequest Public.EmailUpdate -> (Handler r) Response +updateAccountEmailH :: Member GalleyProvider r => ProviderId ::: JsonRequest Public.EmailUpdate -> (Handler r) Response updateAccountEmailH (pid ::: req) = do guardSecondFactorDisabled Nothing setStatus status202 empty <$ (updateAccountEmail pid =<< parseJsonBody req) @@ -540,7 +542,7 @@ updateAccountEmail pid (Public.EmailUpdate new) = do tryInsertVerificationCode code $ verificationCodeThrottledError . VerificationCodeThrottled lift $ sendActivationMail (Name "name") email (Code.codeKey code) (Code.codeValue code) True -updateAccountPasswordH :: Members '[GalleyProvider] r => ProviderId ::: JsonRequest Public.PasswordChange -> (Handler r) Response +updateAccountPasswordH :: Member GalleyProvider r => ProviderId ::: JsonRequest Public.PasswordChange -> (Handler r) Response updateAccountPasswordH (pid ::: req) = do guardSecondFactorDisabled Nothing empty <$ (updateAccountPassword pid =<< parseJsonBody req) @@ -554,7 +556,7 @@ updateAccountPassword pid upd = do throwStd newPasswordMustDiffer wrapClientE $ DB.updateAccountPassword pid (cpNewPassword upd) -addServiceH :: Members '[GalleyProvider] r => ProviderId ::: JsonRequest Public.NewService -> (Handler r) Response +addServiceH :: Member GalleyProvider r => ProviderId ::: JsonRequest Public.NewService -> (Handler r) Response addServiceH (pid ::: req) = do guardSecondFactorDisabled Nothing setStatus status201 . json <$> (addService pid =<< parseJsonBody req) @@ -575,7 +577,7 @@ addService pid new = do let rstoken = maybe (Just token) (const Nothing) (newServiceToken new) pure $ Public.NewServiceResponse sid rstoken -listServicesH :: Members '[GalleyProvider] r => ProviderId -> (Handler r) Response +listServicesH :: Member GalleyProvider r => ProviderId -> (Handler r) Response listServicesH pid = do guardSecondFactorDisabled Nothing json <$> listServices pid @@ -583,7 +585,7 @@ listServicesH pid = do listServices :: ProviderId -> (Handler r) [Public.Service] listServices = wrapClientE . DB.listServices -getServiceH :: Members '[GalleyProvider] r => ProviderId ::: ServiceId -> (Handler r) Response +getServiceH :: Member GalleyProvider r => ProviderId ::: ServiceId -> (Handler r) Response getServiceH (pid ::: sid) = do guardSecondFactorDisabled Nothing json <$> getService pid sid @@ -592,7 +594,7 @@ getService :: ProviderId -> ServiceId -> (Handler r) Public.Service getService pid sid = wrapClientE (DB.lookupService pid sid) >>= maybeServiceNotFound -updateServiceH :: Members '[GalleyProvider] r => ProviderId ::: ServiceId ::: JsonRequest Public.UpdateService -> (Handler r) Response +updateServiceH :: Member GalleyProvider r => ProviderId ::: ServiceId ::: JsonRequest Public.UpdateService -> (Handler r) Response updateServiceH (pid ::: sid ::: req) = do guardSecondFactorDisabled Nothing empty <$ (updateService pid sid =<< parseJsonBody req) @@ -625,7 +627,7 @@ updateService pid sid upd = do tagsChange (serviceEnabled svc) -updateServiceConnH :: Members '[GalleyProvider] r => ProviderId ::: ServiceId ::: JsonRequest Public.UpdateServiceConn -> (Handler r) Response +updateServiceConnH :: Member GalleyProvider r => ProviderId ::: ServiceId ::: JsonRequest Public.UpdateServiceConn -> (Handler r) Response updateServiceConnH (pid ::: sid ::: req) = do guardSecondFactorDisabled Nothing empty <$ (updateServiceConn pid sid =<< parseJsonBody req) @@ -666,12 +668,12 @@ updateServiceConn pid sid upd = do -- TODO: Send informational email to provider. --- | Members '[GalleyProvider] r => The endpoint that is called to delete a service. +-- | Member GalleyProvider r => The endpoint that is called to delete a service. -- -- Since deleting a service can be costly, it just marks the service as -- disabled and then creates an event that will, when processed, actually -- delete the service. See 'finishDeleteService'. -deleteServiceH :: Members '[GalleyProvider] r => ProviderId ::: ServiceId ::: JsonRequest Public.DeleteService -> (Handler r) Response +deleteServiceH :: Member GalleyProvider r => ProviderId ::: ServiceId ::: JsonRequest Public.DeleteService -> (Handler r) Response deleteServiceH (pid ::: sid ::: req) = do guardSecondFactorDisabled Nothing setStatus status202 empty <$ (deleteService pid sid =<< parseJsonBody req) @@ -719,7 +721,7 @@ finishDeleteService pid sid = do kick (bid, cid, _) = deleteBot (botUserId bid) Nothing bid cid deleteAccountH :: - Members '[GalleyProvider] r => + Member GalleyProvider r => ProviderId ::: JsonRequest Public.DeleteProvider -> ExceptT Error (AppT r) Response deleteAccountH (pid ::: req) = do @@ -760,7 +762,7 @@ deleteAccount pid del = do -------------------------------------------------------------------------------- -- User API -getProviderProfileH :: Members '[GalleyProvider] r => ProviderId -> (Handler r) Response +getProviderProfileH :: Member GalleyProvider r => ProviderId -> (Handler r) Response getProviderProfileH pid = do guardSecondFactorDisabled Nothing json <$> getProviderProfile pid @@ -769,7 +771,7 @@ getProviderProfile :: ProviderId -> (Handler r) Public.ProviderProfile getProviderProfile pid = wrapClientE (DB.lookupAccountProfile pid) >>= maybeProviderNotFound -listServiceProfilesH :: Members '[GalleyProvider] r => ProviderId -> (Handler r) Response +listServiceProfilesH :: Member GalleyProvider r => ProviderId -> (Handler r) Response listServiceProfilesH pid = do guardSecondFactorDisabled Nothing json <$> listServiceProfiles pid @@ -777,7 +779,7 @@ listServiceProfilesH pid = do listServiceProfiles :: ProviderId -> (Handler r) [Public.ServiceProfile] listServiceProfiles = wrapClientE . DB.listServiceProfiles -getServiceProfileH :: Members '[GalleyProvider] r => ProviderId ::: ServiceId -> (Handler r) Response +getServiceProfileH :: Member GalleyProvider r => ProviderId ::: ServiceId -> (Handler r) Response getServiceProfileH (pid ::: sid) = do guardSecondFactorDisabled Nothing json <$> getServiceProfile pid sid @@ -786,7 +788,7 @@ getServiceProfile :: ProviderId -> ServiceId -> (Handler r) Public.ServiceProfil getServiceProfile pid sid = wrapClientE (DB.lookupServiceProfile pid sid) >>= maybeServiceNotFound -searchServiceProfilesH :: Members '[GalleyProvider] r => Maybe (Public.QueryAnyTags 1 3) ::: Maybe Text ::: Range 10 100 Int32 -> (Handler r) Response +searchServiceProfilesH :: Member GalleyProvider r => Maybe (Public.QueryAnyTags 1 3) ::: Maybe Text ::: Range 10 100 Int32 -> (Handler r) Response searchServiceProfilesH (qt ::: start ::: size) = do guardSecondFactorDisabled Nothing json <$> searchServiceProfiles qt start size @@ -805,7 +807,7 @@ searchServiceProfiles Nothing Nothing _ = do throwStd $ badRequest "At least `tags` or `start` must be provided." searchTeamServiceProfilesH :: - Members '[GalleyProvider] r => + Member GalleyProvider r => UserId ::: TeamId ::: Maybe (Range 1 128 Text) ::: Bool ::: Range 10 100 Int32 -> (Handler r) Response searchTeamServiceProfilesH (uid ::: tid ::: prefix ::: filterDisabled ::: size) = do @@ -830,7 +832,7 @@ searchTeamServiceProfiles uid tid prefix filterDisabled size = do -- Get search results wrapClientE $ DB.paginateServiceWhitelist tid prefix filterDisabled (fromRange size) -getServiceTagListH :: Members '[GalleyProvider] r => () -> (Handler r) Response +getServiceTagListH :: Member GalleyProvider r => () -> (Handler r) Response getServiceTagListH () = do guardSecondFactorDisabled Nothing json <$> getServiceTagList () @@ -840,7 +842,7 @@ getServiceTagList () = pure (Public.ServiceTagList allTags) where allTags = [(minBound :: Public.ServiceTag) ..] -updateServiceWhitelistH :: Members '[GalleyProvider] r => UserId ::: ConnId ::: TeamId ::: JsonRequest Public.UpdateServiceWhitelist -> (Handler r) Response +updateServiceWhitelistH :: Member GalleyProvider r => UserId ::: ConnId ::: TeamId ::: JsonRequest Public.UpdateServiceWhitelist -> (Handler r) Response updateServiceWhitelistH (uid ::: con ::: tid ::: req) = do guardSecondFactorDisabled (Just uid) resp <- updateServiceWhitelist uid con tid =<< parseJsonBody req @@ -853,7 +855,7 @@ data UpdateServiceWhitelistResp = UpdateServiceWhitelistRespChanged | UpdateServiceWhitelistRespUnchanged -updateServiceWhitelist :: Members '[GalleyProvider] r => UserId -> ConnId -> TeamId -> Public.UpdateServiceWhitelist -> (Handler r) UpdateServiceWhitelistResp +updateServiceWhitelist :: Member GalleyProvider r => UserId -> ConnId -> TeamId -> Public.UpdateServiceWhitelist -> (Handler r) UpdateServiceWhitelistResp updateServiceWhitelist uid con tid upd = do let pid = updateServiceWhitelistProvider upd sid = updateServiceWhitelistService upd @@ -886,12 +888,12 @@ updateServiceWhitelist uid con tid upd = do wrapClientE $ DB.deleteServiceWhitelist (Just tid) pid sid pure UpdateServiceWhitelistRespChanged -addBotH :: Members '[GalleyProvider] r => UserId ::: ConnId ::: ConvId ::: JsonRequest Public.AddBot -> (Handler r) Response +addBotH :: Member GalleyProvider r => UserId ::: ConnId ::: ConvId ::: JsonRequest Public.AddBot -> (Handler r) Response addBotH (zuid ::: zcon ::: cid ::: req) = do guardSecondFactorDisabled (Just zuid) setStatus status201 . json <$> (addBot zuid zcon cid =<< parseJsonBody req) -addBot :: Members '[GalleyProvider] r => UserId -> ConnId -> ConvId -> Public.AddBot -> (Handler r) Public.AddBotResponse +addBot :: Member GalleyProvider r => UserId -> ConnId -> ConvId -> Public.AddBot -> (Handler r) Public.AddBotResponse addBot zuid zcon cid add = do zusr <- lift (wrapClient $ User.lookupUser NoPendingInvitations zuid) >>= maybeInvalidUser let pid = addBotProvider add @@ -974,12 +976,12 @@ addBot zuid zcon cid add = do Public.rsAddBotEvent = ev } -removeBotH :: Members '[GalleyProvider] r => UserId ::: ConnId ::: ConvId ::: BotId -> (Handler r) Response +removeBotH :: Member GalleyProvider r => UserId ::: ConnId ::: ConvId ::: BotId -> (Handler r) Response removeBotH (zusr ::: zcon ::: cid ::: bid) = do guardSecondFactorDisabled (Just zusr) maybe (setStatus status204 empty) json <$> removeBot zusr zcon cid bid -removeBot :: Members '[GalleyProvider] r => UserId -> ConnId -> ConvId -> BotId -> (Handler r) (Maybe Public.RemoveBotResponse) +removeBot :: Member GalleyProvider r => UserId -> ConnId -> ConvId -> BotId -> (Handler r) (Maybe Public.RemoveBotResponse) removeBot zusr zcon cid bid = do -- Get the conversation and check preconditions lcid <- qualifyLocal cid @@ -1009,7 +1011,7 @@ guardConvAdmin conv = do -------------------------------------------------------------------------------- -- Bot API -botGetSelfH :: Members '[GalleyProvider] r => BotId -> (Handler r) Response +botGetSelfH :: Member GalleyProvider r => BotId -> (Handler r) Response botGetSelfH bot = do guardSecondFactorDisabled (Just (botUserId bot)) json <$> botGetSelf bot @@ -1019,7 +1021,7 @@ botGetSelf bot = do p <- lift $ wrapClient $ User.lookupUser NoPendingInvitations (botUserId bot) maybe (throwStd (errorToWai @'E.UserNotFound)) (pure . (`Public.publicProfile` UserLegalHoldNoConsent)) p -botGetClientH :: Members '[GalleyProvider] r => BotId -> (Handler r) Response +botGetClientH :: Member GalleyProvider r => BotId -> (Handler r) Response botGetClientH bot = do guardSecondFactorDisabled (Just (botUserId bot)) maybe (throwStd (errorToWai @'E.ClientNotFound)) (pure . json) =<< lift (botGetClient bot) @@ -1028,7 +1030,7 @@ botGetClient :: BotId -> (AppT r) (Maybe Public.Client) botGetClient bot = listToMaybe <$> wrapClient (User.lookupClients (botUserId bot)) -botListPrekeysH :: Members '[GalleyProvider] r => BotId -> (Handler r) Response +botListPrekeysH :: Member GalleyProvider r => BotId -> (Handler r) Response botListPrekeysH bot = do guardSecondFactorDisabled (Just (botUserId bot)) json <$> botListPrekeys bot @@ -1040,7 +1042,7 @@ botListPrekeys bot = do Nothing -> pure [] Just ci -> lift (wrapClient $ User.lookupPrekeyIds (botUserId bot) ci) -botUpdatePrekeysH :: Members '[GalleyProvider] r => BotId ::: JsonRequest Public.UpdateBotPrekeys -> (Handler r) Response +botUpdatePrekeysH :: Member GalleyProvider r => BotId ::: JsonRequest Public.UpdateBotPrekeys -> (Handler r) Response botUpdatePrekeysH (bot ::: req) = do guardSecondFactorDisabled (Just (botUserId bot)) empty <$ (botUpdatePrekeys bot =<< parseJsonBody req) @@ -1055,7 +1057,9 @@ botUpdatePrekeys bot upd = do wrapClientE (User.updatePrekeys (botUserId bot) (clientId c) pks) !>> clientDataError botClaimUsersPrekeysH :: - Members '[GalleyProvider, Concurrency 'Unsafe] r => + ( Member GalleyProvider r, + Member (Concurrency 'Unsafe) r + ) => JsonRequest Public.UserClients -> Handler r Response botClaimUsersPrekeysH req = do @@ -1063,7 +1067,7 @@ botClaimUsersPrekeysH req = do json <$> (botClaimUsersPrekeys =<< parseJsonBody req) botClaimUsersPrekeys :: - Members '[Concurrency 'Unsafe] r => + Member (Concurrency 'Unsafe) r => Public.UserClients -> Handler r Public.UserClientPrekeyMap botClaimUsersPrekeys body = do @@ -1072,7 +1076,7 @@ botClaimUsersPrekeys body = do throwStd (errorToWai @'E.TooManyClients) Client.claimLocalMultiPrekeyBundles UnprotectedBot body !>> clientError -botListUserProfilesH :: Members '[GalleyProvider] r => List UserId -> (Handler r) Response +botListUserProfilesH :: Member GalleyProvider r => List UserId -> (Handler r) Response botListUserProfilesH uids = do guardSecondFactorDisabled Nothing -- should we check all user ids? json <$> botListUserProfiles uids @@ -1082,7 +1086,7 @@ botListUserProfiles uids = do us <- lift . wrapClient $ User.lookupUsers NoPendingInvitations (fromList uids) pure (map mkBotUserView us) -botGetUserClientsH :: Members '[GalleyProvider] r => UserId -> (Handler r) Response +botGetUserClientsH :: Member GalleyProvider r => UserId -> (Handler r) Response botGetUserClientsH uid = do guardSecondFactorDisabled (Just uid) json <$> lift (botGetUserClients uid) @@ -1093,12 +1097,12 @@ botGetUserClients uid = where pubClient c = Public.PubClient (clientId c) (clientClass c) -botDeleteSelfH :: Members '[GalleyProvider] r => BotId ::: ConvId -> (Handler r) Response +botDeleteSelfH :: Member GalleyProvider r => BotId ::: ConvId -> (Handler r) Response botDeleteSelfH (bid ::: cid) = do guardSecondFactorDisabled (Just (botUserId bid)) empty <$ botDeleteSelf bid cid -botDeleteSelf :: Members '[GalleyProvider] r => BotId -> ConvId -> (Handler r) () +botDeleteSelf :: Member GalleyProvider r => BotId -> ConvId -> (Handler r) () botDeleteSelf bid cid = do guardSecondFactorDisabled (Just (botUserId bid)) bot <- lift . wrapClient $ User.lookupUser NoPendingInvitations (botUserId bid) @@ -1112,7 +1116,7 @@ botDeleteSelf bid cid = do -- | If second factor auth is enabled, make sure that end-points that don't support it, but should, are blocked completely. -- (This is a workaround until we have 2FA for those end-points as well.) guardSecondFactorDisabled :: - Members '[GalleyProvider] r => + Member GalleyProvider r => Maybe UserId -> ExceptT Error (AppT r) () guardSecondFactorDisabled mbUserId = do diff --git a/services/brig/src/Brig/Run.hs b/services/brig/src/Brig/Run.hs index 4e600477df..b4035c3beb 100644 --- a/services/brig/src/Brig/Run.hs +++ b/services/brig/src/Brig/Run.hs @@ -67,7 +67,7 @@ import Network.Wai.Routing.Route (App) import Network.Wai.Utilities (lookupRequestId) import Network.Wai.Utilities.Server import qualified Network.Wai.Utilities.Server as Server -import Polysemy (Members) +import Polysemy (Member) import Servant (Context ((:.)), (:<|>) (..)) import qualified Servant import System.Logger (msg, val, (.=), (~~)) @@ -185,7 +185,7 @@ bodyParserErrorFormatter _ _ errMsg = Servant.errHeaders = [(HTTP.hContentType, HTTPMedia.renderHeader (Servant.contentType (Proxy @Servant.JSON)))] } -pendingActivationCleanup :: forall r p. (P.Paging p, Members '[UserPendingActivationStore p] r) => AppT r () +pendingActivationCleanup :: forall r p. (P.Paging p, Member (UserPendingActivationStore p) r) => AppT r () pendingActivationCleanup = do safeForever "pendingActivationCleanup" $ do now <- liftIO =<< view currentTime diff --git a/services/brig/src/Brig/Team/API.hs b/services/brig/src/Brig/Team/API.hs index 6578214d9a..414a0d24c2 100644 --- a/services/brig/src/Brig/Team/API.hs +++ b/services/brig/src/Brig/Team/API.hs @@ -59,7 +59,7 @@ import Network.Wai (Response) import Network.Wai.Predicate hiding (and, result, setStatus) import Network.Wai.Routing import Network.Wai.Utilities hiding (code, message) -import Polysemy (Members) +import Polysemy (Member) import Servant hiding (Handler, JSON, addHeader) import System.Logger (Msg) import qualified System.Logger.Class as Log @@ -82,11 +82,9 @@ import Wire.API.User hiding (fromEmail) import qualified Wire.API.User as Public servantAPI :: - Members - '[ BlacklistStore, - GalleyProvider - ] - r => + ( Member BlacklistStore r, + Member GalleyProvider r + ) => ServerT TeamsAPI (Handler r) servantAPI = Named @"send-team-invitation" createInvitationPublicH @@ -98,12 +96,9 @@ servantAPI = :<|> Named @"get-team-size" teamSizePublic routesInternal :: - ( Members - '[ BlacklistStore, - GalleyProvider, - UserPendingActivationStore p - ] - r, + ( Member BlacklistStore r, + Member GalleyProvider r, + Member (UserPendingActivationStore p) r, CallsFed 'Brig "on-user-deleted-connections" ) => Routes a (Handler r) () @@ -133,7 +128,7 @@ routesInternal = do accept "application" "json" .&. jsonRequest @NewUserScimInvitation -teamSizePublic :: Members '[GalleyProvider] r => UserId -> TeamId -> (Handler r) TeamSize +teamSizePublic :: Member GalleyProvider r => UserId -> TeamId -> (Handler r) TeamSize teamSizePublic uid tid = do ensurePermissions uid tid [AddTeamMember] -- limit this to team admins to reduce risk of involuntary DOS attacks teamSize tid @@ -160,11 +155,9 @@ instance ToJSON FoundInvitationCode where toJSON (FoundInvitationCode c) = object ["code" .= c] createInvitationPublicH :: - Members - '[ BlacklistStore, - GalleyProvider - ] - r => + ( Member BlacklistStore r, + Member GalleyProvider r + ) => UserId -> TeamId -> Public.InvitationRequest -> @@ -184,11 +177,9 @@ data CreateInvitationInviter = CreateInvitationInviter deriving (Eq, Show) createInvitationPublic :: - Members - '[ BlacklistStore, - GalleyProvider - ] - r => + ( Member BlacklistStore r, + Member GalleyProvider r + ) => UserId -> TeamId -> Public.InvitationRequest -> @@ -213,12 +204,10 @@ createInvitationPublic uid tid body = do (createInvitation' tid inviteeRole (Just (inviterUid inviter)) (inviterEmail inviter) body) createInvitationViaScimH :: - Members - '[ BlacklistStore, - GalleyProvider, - UserPendingActivationStore p - ] - r => + ( Member BlacklistStore r, + Member GalleyProvider r, + Member (UserPendingActivationStore p) r + ) => JSON ::: JsonRequest NewUserScimInvitation -> (Handler r) Response createInvitationViaScimH (_ ::: req) = do @@ -226,12 +215,10 @@ createInvitationViaScimH (_ ::: req) = do setStatus status201 . json <$> createInvitationViaScim body createInvitationViaScim :: - Members - '[ BlacklistStore, - GalleyProvider, - UserPendingActivationStore p - ] - r => + ( Member BlacklistStore r, + Member GalleyProvider r, + Member (UserPendingActivationStore p) r + ) => NewUserScimInvitation -> (Handler r) UserAccount createInvitationViaScim newUser@(NewUserScimInvitation tid loc name email role) = do @@ -272,11 +259,9 @@ logInvitationRequest context action = pure (Right result) createInvitation' :: - Members - '[ BlacklistStore, - GalleyProvider - ] - r => + ( Member BlacklistStore r, + Member GalleyProvider r + ) => TeamId -> Public.Role -> Maybe UserId -> @@ -336,19 +321,19 @@ createInvitation' tid inviteeRole mbInviterUid fromEmail body = do timeout (newInv, code) <$ sendInvitationMail inviteeEmail tid fromEmail code locale -deleteInvitation :: Members '[GalleyProvider] r => UserId -> TeamId -> InvitationId -> (Handler r) () +deleteInvitation :: Member GalleyProvider r => UserId -> TeamId -> InvitationId -> (Handler r) () deleteInvitation uid tid iid = do ensurePermissions uid tid [AddTeamMember] lift $ wrapClient $ DB.deleteInvitation tid iid -listInvitations :: Members '[GalleyProvider] r => UserId -> TeamId -> Maybe InvitationId -> Maybe (Range 1 500 Int32) -> (Handler r) Public.InvitationList +listInvitations :: Member GalleyProvider r => UserId -> TeamId -> Maybe InvitationId -> Maybe (Range 1 500 Int32) -> (Handler r) Public.InvitationList listInvitations uid tid start mSize = do ensurePermissions uid tid [AddTeamMember] showInvitationUrl <- lift $ liftSem $ GalleyProvider.getExposeInvitationURLsToTeamAdmin tid rs <- lift $ wrapClient $ DB.lookupInvitations showInvitationUrl tid start (fromMaybe (unsafeRange 100) mSize) pure $! Public.InvitationList (DB.resultList rs) (DB.resultHasMore rs) -getInvitation :: Members '[GalleyProvider] r => UserId -> TeamId -> InvitationId -> (Handler r) (Maybe Public.Invitation) +getInvitation :: Member GalleyProvider r => UserId -> TeamId -> InvitationId -> (Handler r) (Maybe Public.Invitation) getInvitation uid tid iid = do ensurePermissions uid tid [AddTeamMember] showInvitationUrl <- lift $ liftSem $ GalleyProvider.getExposeInvitationURLsToTeamAdmin tid @@ -380,25 +365,25 @@ getInvitationByEmail email = do inv <- lift $ wrapClient $ DB.lookupInvitationByEmail HideInvitationUrl email maybe (throwStd (notFound "Invitation not found")) pure inv -suspendTeamH :: (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => JSON ::: TeamId -> (Handler r) Response +suspendTeamH :: (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => JSON ::: TeamId -> (Handler r) Response suspendTeamH (_ ::: tid) = do empty <$ suspendTeam tid -suspendTeam :: (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => TeamId -> (Handler r) () +suspendTeam :: (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => TeamId -> (Handler r) () suspendTeam tid = do changeTeamAccountStatuses tid Suspended lift $ wrapClient $ DB.deleteInvitations tid lift $ liftSem $ GalleyProvider.changeTeamStatus tid Team.Suspended Nothing unsuspendTeamH :: - (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => + (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => JSON ::: TeamId -> (Handler r) Response unsuspendTeamH (_ ::: tid) = do empty <$ unsuspendTeam tid unsuspendTeam :: - (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => + (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => TeamId -> (Handler r) () unsuspendTeam tid = do @@ -409,7 +394,7 @@ unsuspendTeam tid = do -- Internal changeTeamAccountStatuses :: - (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => + (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => TeamId -> AccountStatus -> (Handler r) () diff --git a/services/brig/src/Brig/User/API/Handle.hs b/services/brig/src/Brig/User/API/Handle.hs index 7d3c37e878..2f7eb7d564 100644 --- a/services/brig/src/Brig/User/API/Handle.hs +++ b/services/brig/src/Brig/User/API/Handle.hs @@ -46,7 +46,7 @@ import Wire.API.User.Search import qualified Wire.API.User.Search as Public getHandleInfo :: - (Members '[GalleyProvider] r, CallsFed 'Brig "get-user-by-handle", CallsFed 'Brig "get-users-by-ids") => + (Member GalleyProvider r, CallsFed 'Brig "get-user-by-handle", CallsFed 'Brig "get-users-by-ids") => UserId -> Qualified Handle -> (Handler r) (Maybe Public.UserProfile) @@ -66,7 +66,7 @@ getRemoteHandleInfo handle = do Federation.getUserHandleInfo handle !>> fedError getLocalHandleInfo :: - (Members '[GalleyProvider] r, CallsFed 'Brig "get-users-by-ids") => + (Member GalleyProvider r, CallsFed 'Brig "get-users-by-ids") => Local UserId -> Handle -> (Handler r) (Maybe Public.UserProfile) diff --git a/services/brig/src/Brig/User/API/Search.hs b/services/brig/src/Brig/User/API/Search.hs index 2713256f82..b3417d0484 100644 --- a/services/brig/src/Brig/User/API/Search.hs +++ b/services/brig/src/Brig/User/API/Search.hs @@ -86,7 +86,7 @@ routesInternal = do -- FUTUREWORK: Consider augmenting 'SearchResult' with full user profiles -- for all results. This is tracked in https://wearezeta.atlassian.net/browse/SQCORE-599 search :: - (Members '[GalleyProvider] r, CallsFed 'Brig "get-users-by-ids", CallsFed 'Brig "search-users") => + (Member GalleyProvider r, CallsFed 'Brig "get-users-by-ids", CallsFed 'Brig "search-users") => UserId -> Text -> Maybe Domain -> @@ -121,7 +121,7 @@ searchRemotely domain searchTerm = do searchLocally :: forall r. - (Members '[GalleyProvider] r, CallsFed 'Brig "get-users-by-ids") => + (Member GalleyProvider r, CallsFed 'Brig "get-users-by-ids") => UserId -> Text -> Maybe (Range 1 500 Int32) -> @@ -176,7 +176,7 @@ searchLocally searcherId searchTerm maybeMaxResults = do <$$> HandleAPI.getLocalHandleInfo lsearcherId handle teamUserSearch :: - Members '[GalleyProvider] r => + Member GalleyProvider r => UserId -> TeamId -> Maybe Text -> diff --git a/services/brig/src/Brig/User/Auth.hs b/services/brig/src/Brig/User/Auth.hs index 7fce512452..7cdfd3937a 100644 --- a/services/brig/src/Brig/User/Auth.hs +++ b/services/brig/src/Brig/User/Auth.hs @@ -135,7 +135,7 @@ lookupLoginCode phone = login :: forall r. - (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => + (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => Login -> CookieType -> ExceptT LoginError (AppT r) (Access ZAuth.User) @@ -172,7 +172,7 @@ login (SmsLogin (SmsLoginData phone code label)) typ = do verifyCode :: forall r. - Members '[GalleyProvider] r => + Member GalleyProvider r => Maybe Code.Value -> VerificationAction -> UserId -> @@ -467,7 +467,7 @@ ssoLogin (SsoLogin uid label) typ = do -- | Log in as a LegalHold service, getting LegalHoldUser/Access Tokens. legalHoldLogin :: - (Members '[GalleyProvider] r, CallsFed 'Brig "on-user-deleted-connections") => + (Member GalleyProvider r, CallsFed 'Brig "on-user-deleted-connections") => LegalHoldLogin -> CookieType -> ExceptT LegalHoldLoginError (AppT r) (Access ZAuth.LegalHoldUser) @@ -485,7 +485,7 @@ legalHoldLogin (LegalHoldLogin uid plainTextPassword label) typ = do !>> LegalHoldLoginError assertLegalHoldEnabled :: - Members '[GalleyProvider] r => + Member GalleyProvider r => TeamId -> ExceptT LegalHoldLoginError (AppT r) () assertLegalHoldEnabled tid = do diff --git a/services/federator/src/Federator/App.hs b/services/federator/src/Federator/App.hs index 888f83fb9d..80caae1baf 100644 --- a/services/federator/src/Federator/App.hs +++ b/services/federator/src/Federator/App.hs @@ -82,7 +82,12 @@ instance MonadIO m => MonadHttp (AppT m) where runAppT :: forall m a. Env -> AppT m a -> m a runAppT e (AppT ma) = runReaderT ma e -embedApp :: Members '[Embed m, Input Env] r => AppT m a -> Sem r a +embedApp :: + ( Member (Embed m) r, + Member (Input Env) r + ) => + AppT m a -> + Sem r a embedApp (AppT action) = do env <- input embed $ runReaderT action env diff --git a/services/federator/src/Federator/Discovery.hs b/services/federator/src/Federator/Discovery.hs index 384d696717..57c7e6c521 100644 --- a/services/federator/src/Federator/Discovery.hs +++ b/services/federator/src/Federator/Discovery.hs @@ -64,18 +64,27 @@ data DiscoverFederator m a where makeSem ''DiscoverFederator discoverFederatorWithError :: - Members '[DiscoverFederator, Polysemy.Error DiscoveryFailure] r => + ( Member DiscoverFederator r, + Member (Polysemy.Error DiscoveryFailure) r + ) => Domain -> Sem r SrvTarget discoverFederatorWithError = Polysemy.fromEither <=< discoverFederator discoverAllFederatorsWithError :: - Members '[DiscoverFederator, Polysemy.Error DiscoveryFailure] r => + ( Member DiscoverFederator r, + Member (Polysemy.Error DiscoveryFailure) r + ) => Domain -> Sem r (NonEmpty SrvTarget) discoverAllFederatorsWithError = Polysemy.fromEither <=< discoverAllFederators -runFederatorDiscovery :: Members '[DNSLookup, TinyLog] r => Sem (DiscoverFederator ': r) a -> Sem r a +runFederatorDiscovery :: + ( Member DNSLookup r, + Member TinyLog r + ) => + Sem (DiscoverFederator ': r) a -> + Sem r a runFederatorDiscovery = interpret $ \case DiscoverFederator d -> -- FUTUREWORK(federation): orderSrvResult and try the list in order this @@ -89,7 +98,12 @@ runFederatorDiscovery = interpret $ \case -- (https://wearezeta.atlassian.net/browse/SQCORE-912) domainSrv d = cs $ "_wire-server-federator._tcp." <> domainText d -lookupDomainByDNS :: Members '[DNSLookup, TinyLog] r => ByteString -> Sem r (Either DiscoveryFailure (NonEmpty SrvTarget)) +lookupDomainByDNS :: + ( Member DNSLookup r, + Member TinyLog r + ) => + ByteString -> + Sem r (Either DiscoveryFailure (NonEmpty SrvTarget)) lookupDomainByDNS domainSrv = do res <- Lookup.lookupSRV domainSrv case res of diff --git a/services/federator/src/Federator/ExternalServer.hs b/services/federator/src/Federator/ExternalServer.hs index 68da960ac6..65444d252e 100644 --- a/services/federator/src/Federator/ExternalServer.hs +++ b/services/federator/src/Federator/ExternalServer.hs @@ -44,17 +44,15 @@ import Wire.API.Federation.Domain -- FUTUREWORK(federation): Versioning of the federation API. callInward :: - Members - '[ ServiceStreaming, - Embed IO, - TinyLog, - DiscoverFederator, - Error ValidationError, - Error DiscoveryFailure, - Error ServerError, - Input RunSettings - ] - r => + ( Member ServiceStreaming r, + Member (Embed IO) r, + Member TinyLog r, + Member DiscoverFederator r, + Member (Error ValidationError) r, + Member (Error DiscoveryFailure) r, + Member (Error ServerError) r, + Member (Input RunSettings) r + ) => Wai.Request -> Sem r Wai.Response callInward wreq = do @@ -99,7 +97,9 @@ data RequestData = RequestData -- -- FUTUREWORK: use higher-level effects parseRequestData :: - Members '[Error ServerError, Embed IO] r => + ( Member (Error ServerError) r, + Member (Embed IO) r + ) => Wai.Request -> Sem r RequestData parseRequestData req = do diff --git a/services/federator/src/Federator/InternalServer.hs b/services/federator/src/Federator/InternalServer.hs index 084907c6eb..e43fbdd6fb 100644 --- a/services/federator/src/Federator/InternalServer.hs +++ b/services/federator/src/Federator/InternalServer.hs @@ -82,7 +82,9 @@ data RequestData = RequestData } parseRequestData :: - Members '[Error ServerError, Embed IO] r => + ( Member (Error ServerError) r, + Member (Embed IO) r + ) => Wai.Request -> Sem r RequestData parseRequestData req = do @@ -112,7 +114,12 @@ parseRequestData req = do } callOutward :: - Members '[Remote, Embed IO, Error ValidationError, Error ServerError, Input RunSettings] r => + ( Member Remote r, + Member (Embed IO) r, + Member (Error ValidationError) r, + Member (Error ServerError) r, + Member (Input RunSettings) r + ) => Wai.Request -> Sem r Wai.Response callOutward req = do diff --git a/services/federator/src/Federator/Monitor/Internal.hs b/services/federator/src/Federator/Monitor/Internal.hs index b1a050e0f6..34f85a0b6f 100644 --- a/services/federator/src/Federator/Monitor/Internal.hs +++ b/services/federator/src/Federator/Monitor/Internal.hs @@ -32,7 +32,7 @@ import GHC.Foreign (peekCStringLen, withCStringLen) import GHC.IO.Encoding (getFileSystemEncoding) import Imports import qualified Network.TLS as TLS -import Polysemy (Embed, Member, Members, Sem, embed) +import Polysemy (Embed, Member, Sem, embed) import qualified Polysemy import qualified Polysemy.Error as Polysemy import Polysemy.Final (Final) @@ -108,7 +108,9 @@ runSemDefault :: Logger -> Sem '[TinyLog, Embed IO, Final IO] a -> IO a runSemDefault logger = Polysemy.runFinal . Polysemy.embedToFinal . Log.loggerToTinyLog logger logErrors :: - Members '[TinyLog, Polysemy.Error FederationSetupError] r => + ( Member TinyLog r, + Member (Polysemy.Error FederationSetupError) r + ) => Sem r a -> Sem r a logErrors action = Polysemy.catch action $ \err -> do @@ -124,7 +126,10 @@ logAndIgnoreErrors :: logAndIgnoreErrors = void . Polysemy.runError . logErrors delMonitor :: - (Members '[TinyLog, Embed IO, Final IO] r) => + ( Member TinyLog r, + Member (Embed IO) r, + Member (Final IO) r + ) => Monitor -> Sem r () delMonitor monitor = Polysemy.resourceToIOFinal @@ -144,8 +149,11 @@ delMonitor monitor = Polysemy.resourceToIOFinal . Log.field "descriptor" (show wd) mkMonitor :: - ( Members '[TinyLog, Embed IO] r, - Members '[TinyLog, Embed IO, Polysemy.Error FederationSetupError] r1 + ( Member TinyLog r, + Member (Embed IO) r, + Member TinyLog r1, + Member (Embed IO) r1, + Member (Polysemy.Error FederationSetupError) r1 ) => (Sem r1 () -> IO ()) -> IORef TLSSettings -> @@ -178,7 +186,10 @@ data Action = ReplaceWatch RawFilePath | ReloadSettings deriving (Eq, Ord, Show) handleEvent :: - Members '[TinyLog, Embed IO, Polysemy.Error FederationSetupError] r => + ( Member TinyLog r, + Member (Embed IO) r, + Member (Polysemy.Error FederationSetupError) r + ) => (Sem r () -> IO ()) -> Monitor -> WatchedPath -> @@ -208,7 +219,10 @@ getActions (WatchedDir dir paths) (Created _ path) getActions _ _ = [] applyAction :: - (Members '[TinyLog, Embed IO, Polysemy.Error FederationSetupError] r) => + ( Member TinyLog r, + Member (Embed IO) r, + Member (Polysemy.Error FederationSetupError) r + ) => Monitor -> Action -> Sem r () @@ -228,7 +242,9 @@ applyAction monitor (ReplaceWatch path) = do WatchedFile _ -> pure () addWatchedFile :: - Members '[TinyLog, Embed IO] r => + ( Member TinyLog r, + Member (Embed IO) r + ) => Monitor -> WatchedPath -> Sem r () @@ -334,7 +350,9 @@ showFederationSetupError (InvalidCAStore path) = "invalid CA store: " <> Text.pa showFederationSetupError (InvalidClientCertificate msg) = Text.pack msg mkTLSSettings :: - Members '[Embed IO, Polysemy.Error FederationSetupError] r => + ( Member (Embed IO) r, + Member (Polysemy.Error FederationSetupError) r + ) => RunSettings -> Sem r TLSSettings mkTLSSettings settings = @@ -343,7 +361,9 @@ mkTLSSettings settings = <*> mkCreds settings mkCAStore :: - Members '[Embed IO, Polysemy.Error FederationSetupError] r => + ( Member (Embed IO) r, + Member (Polysemy.Error FederationSetupError) r + ) => RunSettings -> Sem r CertificateStore mkCAStore settings = do @@ -358,7 +378,9 @@ mkCAStore settings = do pure (customCAStore <> systemCAStore) mkCreds :: - Members '[Embed IO, Polysemy.Error FederationSetupError] r => + ( Member (Embed IO) r, + Member (Polysemy.Error FederationSetupError) r + ) => RunSettings -> Sem r TLS.Credential mkCreds settings = do diff --git a/services/federator/src/Federator/Remote.hs b/services/federator/src/Federator/Remote.hs index a978c4a14d..4428e47c18 100644 --- a/services/federator/src/Federator/Remote.hs +++ b/services/federator/src/Federator/Remote.hs @@ -106,14 +106,12 @@ data Remote m a where makeSem ''Remote interpretRemote :: - Members - '[ Embed (Codensity IO), - DiscoverFederator, - Error DiscoveryFailure, - Error RemoteError, - Input TLSSettings - ] - r => + ( Member (Embed (Codensity IO)) r, + Member DiscoverFederator r, + Member (Error DiscoveryFailure) r, + Member (Error RemoteError) r, + Member (Input TLSSettings) r + ) => Sem (Remote ': r) a -> Sem r a interpretRemote = interpret $ \case diff --git a/services/federator/src/Federator/Response.hs b/services/federator/src/Federator/Response.hs index fa71bab276..edb99377f6 100644 --- a/services/federator/src/Federator/Response.hs +++ b/services/federator/src/Federator/Response.hs @@ -87,7 +87,12 @@ runWaiError = . mapError toWai . raiseUnder where - logError :: Members '[Error Wai.Error, TinyLog] r => Wai.Error -> Sem r a + logError :: + ( Member (Error Wai.Error) r, + Member TinyLog r + ) => + Wai.Error -> + Sem r a logError e = do err $ Wai.logErrorMsg e throw e diff --git a/services/federator/src/Federator/Service.hs b/services/federator/src/Federator/Service.hs index 8a563aaa1e..3a779581af 100644 --- a/services/federator/src/Federator/Service.hs +++ b/services/federator/src/Federator/Service.hs @@ -42,7 +42,6 @@ import Network.HTTP.Client import qualified Network.HTTP.Types as HTTP import Polysemy import Polysemy.Input -import Polysemy.TinyLog import qualified Servant.Client.Core as Servant import Servant.Types.SourceT import Util.Options @@ -76,7 +75,9 @@ bodyReaderToStreamT action = fromStepT go -- FUTUREWORK: unify this interpretation with similar ones in Galley -- interpretServiceHTTP :: - Members '[Embed (Codensity IO), Input Env, TinyLog] r => + ( Member (Embed (Codensity IO)) r, + Member (Input Env) r + ) => Sem (ServiceStreaming ': r) a -> Sem r a interpretServiceHTTP = interpret $ \case diff --git a/services/federator/src/Federator/Validation.hs b/services/federator/src/Federator/Validation.hs index fc43fa1c94..27a5245e28 100644 --- a/services/federator/src/Federator/Validation.hs +++ b/services/federator/src/Federator/Validation.hs @@ -92,7 +92,9 @@ validationErrorStatus _ = HTTP.status403 -- | Validates an already-parsed domain against the allowList using the federator -- startup configuration. ensureCanFederateWith :: - Members '[Input RunSettings, Error ValidationError] r => + ( Member (Input RunSettings) r, + Member (Error ValidationError) r + ) => Domain -> Sem r () ensureCanFederateWith targetDomain = do @@ -137,13 +139,11 @@ parseDomainText domain = -- federator startup configuration and checks that it matches the names reported -- by the client certificate validateDomain :: - Members - '[ Input RunSettings, - Error ValidationError, - Error DiscoveryFailure, - DiscoverFederator - ] - r => + ( Member (Input RunSettings) r, + Member (Error ValidationError) r, + Member (Error DiscoveryFailure) r, + Member DiscoverFederator r + ) => Maybe ByteString -> ByteString -> Sem r Domain diff --git a/services/galley/src/Galley/API/Action.hs b/services/galley/src/Galley/API/Action.hs index c1e395197c..374bccd69c 100644 --- a/services/galley/src/Galley/API/Action.hs +++ b/services/galley/src/Galley/API/Action.hs @@ -98,84 +98,92 @@ data NoChanges = NoChanges type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Constraint where HasConversationActionEffects 'ConversationJoinTag r = - Members - '[ BrigAccess, - Error FederationError, - Error InternalError, - ErrorS 'NotATeamMember, - ErrorS 'NotConnected, - ErrorS ('ActionDenied 'LeaveConversation), - ErrorS ('ActionDenied 'AddConversationMember), - ErrorS 'InvalidOperation, - ErrorS 'ConvAccessDenied, - ErrorS 'ConvNotFound, - ErrorS 'TooManyMembers, - ErrorS 'MissingLegalholdConsent, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - ProposalStore, - TeamStore, - TinyLog, - ConversationStore, - Error NoChanges - ] - r + ( Member BrigAccess r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'NotConnected) r, + Member (ErrorS ('ActionDenied 'LeaveConversation)) r, + Member (ErrorS ('ActionDenied 'AddConversationMember)) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'TooManyMembers) r, + Member (ErrorS 'MissingLegalholdConsent) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member MemberStore r, + Member ProposalStore r, + Member TeamStore r, + Member TinyLog r, + Member ConversationStore r, + Member (Error NoChanges) r + ) HasConversationActionEffects 'ConversationLeaveTag r = - ( Members - '[ MemberStore, - Error InternalError, - Error NoChanges, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input UTCTime, - Input Env, - ProposalStore, - TinyLog - ] - r + ( Member MemberStore r, + Member (Error InternalError) r, + Member (Error NoChanges) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member (Input Env) r, + Member ProposalStore r, + Member TinyLog r ) HasConversationActionEffects 'ConversationRemoveMembersTag r = - (Members '[MemberStore, Error NoChanges] r) + ( Member MemberStore r, + Member (Error NoChanges) r + ) HasConversationActionEffects 'ConversationMemberUpdateTag r = - (Members '[MemberStore, ErrorS 'ConvMemberNotFound] r) + ( Member MemberStore r, + Member (ErrorS 'ConvMemberNotFound) r + ) HasConversationActionEffects 'ConversationDeleteTag r = - Members '[Error FederationError, ErrorS 'NotATeamMember, CodeStore, TeamStore, ConversationStore] r + ( Member (Error FederationError) r, + Member (ErrorS 'NotATeamMember) r, + Member CodeStore r, + Member TeamStore r, + Member ConversationStore r + ) HasConversationActionEffects 'ConversationRenameTag r = - Members '[Error InvalidInput, ConversationStore] r + ( Member (Error InvalidInput) r, + Member ConversationStore r + ) HasConversationActionEffects 'ConversationAccessDataTag r = - Members - '[ BotAccess, - BrigAccess, - CodeStore, - Error InternalError, - Error InvalidInput, - Error NoChanges, - ErrorS 'InvalidTargetAccess, - ErrorS ('ActionDenied 'RemoveConversationMember), - ExternalAccess, - FederatorAccess, - FireAndForget, - GundeckAccess, - Input Env, - MemberStore, - ProposalStore, - TeamStore, - TinyLog, - Input UTCTime, - ConversationStore - ] - r + ( Member BotAccess r, + Member BrigAccess r, + Member CodeStore r, + Member (Error InternalError) r, + Member (Error InvalidInput) r, + Member (Error NoChanges) r, + Member (ErrorS 'InvalidTargetAccess) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member FireAndForget r, + Member GundeckAccess r, + Member (Input Env) r, + Member MemberStore r, + Member ProposalStore r, + Member TeamStore r, + Member TinyLog r, + Member (Input UTCTime) r, + Member ConversationStore r + ) HasConversationActionEffects 'ConversationMessageTimerUpdateTag r = - Members '[ConversationStore, Error NoChanges] r + ( Member ConversationStore r, + Member (Error NoChanges) r + ) HasConversationActionEffects 'ConversationReceiptModeUpdateTag r = - Members '[ConversationStore, Error NoChanges] r + ( Member ConversationStore r, + Member (Error NoChanges) r + ) type family HasConversationActionGalleyErrors (tag :: ConversationActionTag) :: EffectRow where HasConversationActionGalleyErrors 'ConversationJoinTag = @@ -390,14 +398,12 @@ performConversationJoin qusr lconv (ConversationJoin invited role) = do conv = tUnqualified lconv checkLocals :: - Members - '[ BrigAccess, - ErrorS 'NotATeamMember, - ErrorS 'NotConnected, - ErrorS 'ConvAccessDenied, - TeamStore - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'NotConnected) r, + Member (ErrorS 'ConvAccessDenied) r, + Member TeamStore r + ) => Local UserId -> Maybe TeamId -> [UserId] -> @@ -414,13 +420,11 @@ performConversationJoin qusr lconv (ConversationJoin invited role) = do ensureConnectedOrSameTeam lusr newUsers checkRemotes :: - Members - '[ BrigAccess, - Error FederationError, - ErrorS 'NotConnected, - FederatorAccess - ] - r => + ( Member BrigAccess r, + Member (Error FederationError) r, + Member (ErrorS 'NotConnected) r, + Member FederatorAccess r + ) => Local UserId -> [Remote UserId] -> Sem r () @@ -433,26 +437,20 @@ performConversationJoin qusr lconv (ConversationJoin invited role) = do ensureConnectedToRemotes lusr remotes checkLHPolicyConflictsLocal :: - Members - '[ ConversationStore, - Error InternalError, - ErrorS ('ActionDenied 'LeaveConversation), - ErrorS 'InvalidOperation, - ErrorS 'ConvNotFound, - ErrorS 'MissingLegalholdConsent, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - ProposalStore, - TeamStore, - TinyLog - ] - r => + ( Member (Error InternalError) r, + Member (ErrorS 'MissingLegalholdConsent) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member MemberStore r, + Member ProposalStore r, + Member TeamStore r, + Member TinyLog r + ) => [UserId] -> Sem r () checkLHPolicyConflictsLocal newUsers = do @@ -582,19 +580,14 @@ data LocalConversationUpdate = LocalConversationUpdate updateLocalConversation :: forall tag r. - ( Members - '[ ConversationStore, - Error NoChanges, - ErrorS ('ActionDenied (ConversationActionPermission tag)), - ErrorS 'InvalidOperation, - ErrorS 'ConvNotFound, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime - ] - r, + ( Member ConversationStore r, + Member (ErrorS ('ActionDenied (ConversationActionPermission tag))) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'ConvNotFound) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, HasConversationActionEffects tag r, SingI tag, CallsFed 'Galley "on-new-remote-conversation", @@ -676,11 +669,9 @@ ensureConversationActionAllowed :: forall tag mem x r. ( IsConvMember mem, HasConversationActionEffects tag r, - Members - '[ ErrorS ('ActionDenied (ConversationActionPermission tag)), - ErrorS 'InvalidOperation - ] - r + ( Member (ErrorS ('ActionDenied (ConversationActionPermission tag))) r, + Member (ErrorS 'InvalidOperation) r + ) ) => Sing tag -> Local x -> @@ -702,7 +693,9 @@ ensureConversationActionAllowed tag loc action conv self = do -- | Add users to a conversation without performing any checks. Return extra -- notification targets and the action performed. addMembersToLocalConversation :: - Members '[MemberStore, Error NoChanges] r => + ( Member MemberStore r, + Member (Error NoChanges) r + ) => Local ConvId -> UserList UserId -> RoleName -> @@ -715,7 +708,10 @@ addMembersToLocalConversation lcnv users role = do notifyConversationAction :: forall tag r. - ( Members '[FederatorAccess, ExternalAccess, GundeckAccess, Input UTCTime] r, + ( Member FederatorAccess r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, CallsFed 'Galley "on-new-remote-conversation", CallsFed 'Galley "on-conversation-updated" ) => @@ -776,14 +772,11 @@ notifyConversationAction tag quid notifyOrigDomain con lconv targets action = do -- | Notify all local members about a remote conversation update that originated -- from a local user notifyRemoteConversationAction :: - Members - '[ FederatorAccess, - ExternalAccess, - GundeckAccess, - MemberStore, - P.TinyLog - ] - r => + ( Member ExternalAccess r, + Member GundeckAccess r, + Member MemberStore r, + Member P.TinyLog r + ) => Local x -> Remote ConversationUpdate -> Maybe ConnId -> diff --git a/services/galley/src/Galley/API/Clients.hs b/services/galley/src/Galley/API/Clients.hs index d671b33621..9225a572c7 100644 --- a/services/galley/src/Galley/API/Clients.hs +++ b/services/galley/src/Galley/API/Clients.hs @@ -59,14 +59,18 @@ import Wire.API.Routes.MultiTablePaging import Wire.Sem.Paging.Cassandra (CassandraPaging) getClientsH :: - Members '[BrigAccess, ClientStore] r => + ( Member BrigAccess r, + Member ClientStore r + ) => UserId -> Sem r Response getClientsH usr = do json <$> getClients usr getClients :: - Members '[BrigAccess, ClientStore] r => + ( Member BrigAccess r, + Member ClientStore r + ) => UserId -> Sem r [ClientId] getClients usr = do @@ -88,23 +92,21 @@ addClientH (usr ::: clt) = do rmClientH :: forall p1 r. ( p1 ~ CassandraPaging, - Members - '[ ClientStore, - ConversationStore, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input (Local ()), - Input UTCTime, - ListItems p1 ConvId, - ListItems p1 (Remote ConvId), - MemberStore, - Error InternalError, - ProposalStore, - P.TinyLog - ] - r, + ( Member ClientStore r, + Member ConversationStore r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member (ListItems p1 ConvId) r, + Member (ListItems p1 (Remote ConvId)) r, + Member MemberStore r, + Member (Error InternalError) r, + Member ProposalStore r, + Member P.TinyLog r + ), CallsFed 'Galley "on-client-removed", CallsFed 'Galley "on-mls-message-sent" ) => diff --git a/services/galley/src/Galley/API/Create.hs b/services/galley/src/Galley/API/Create.hs index b273ffa860..8ee1994523 100644 --- a/services/galley/src/Galley/API/Create.hs +++ b/services/galley/src/Galley/API/Create.hs @@ -85,29 +85,26 @@ import Wire.API.Team.Permission hiding (self) -- | The public-facing endpoint for creating group conversations. createGroupConversation :: - ( Members - '[ BrigAccess, - ConversationStore, - MemberStore, - ErrorS 'ConvAccessDenied, - Error InternalError, - Error InvalidInput, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'NotConnected, - ErrorS 'MLSNotEnabled, - ErrorS 'MLSNonEmptyMemberList, - ErrorS 'MissingLegalholdConsent, - FederatorAccess, - GundeckAccess, - Input Env, - Input Opts, - Input UTCTime, - LegalHoldStore, - TeamStore, - P.TinyLog - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member MemberStore r, + Member (ErrorS 'ConvAccessDenied) r, + Member (Error InternalError) r, + Member (Error InvalidInput) r, + 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 FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member TeamStore r, + Member P.TinyLog r, CallsFed 'Galley "on-conversation-created" ) => Local UserId -> @@ -149,7 +146,11 @@ createGroupConversation lusr conn newConv = do conversationCreated lusr conv ensureNoLegalholdConflicts :: - Members '[ErrorS 'MissingLegalholdConsent, Input Opts, LegalHoldStore, TeamStore] r => + ( Member (ErrorS 'MissingLegalholdConsent) r, + Member (Input Opts) r, + Member LegalHoldStore r, + Member TeamStore r + ) => UserList UserId -> Sem r () ensureNoLegalholdConflicts (UserList locals remotes) = do @@ -159,15 +160,13 @@ ensureNoLegalholdConflicts (UserList locals remotes) = do throwS @'MissingLegalholdConsent checkCreateConvPermissions :: - Members - '[ BrigAccess, - ErrorS 'ConvAccessDenied, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'NotConnected, - TeamStore - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'NotConnected) r, + Member TeamStore r + ) => Local UserId -> NewConv -> Maybe ConvTeamInfo -> @@ -204,7 +203,10 @@ checkCreateConvPermissions lusr newConv (Just tinfo) allUsers = do createProteusSelfConversation :: forall r. - Members '[ConversationStore, Error InternalError, P.TinyLog] r => + ( Member ConversationStore r, + Member (Error InternalError) r, + Member P.TinyLog r + ) => Local UserId -> Sem r ConversationResponse createProteusSelfConversation lusr = do @@ -225,29 +227,23 @@ createProteusSelfConversation lusr = do createOne2OneConversation :: forall r. - ( Members - '[ BrigAccess, - ConversationStore, - ErrorS 'ConvAccessDenied, - Error FederationError, - Error InternalError, - Error InvalidInput, - ErrorS 'ConvAccessDenied, - ErrorS 'NotATeamMember, - ErrorS 'NonBindingTeam, - ErrorS 'NoBindingTeamMembers, - ErrorS OperationDenied, - ErrorS 'TeamNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - ErrorS 'MissingLegalholdConsent, - FederatorAccess, - GundeckAccess, - Input UTCTime, - TeamStore, - P.TinyLog - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member (Error InvalidInput) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'NonBindingTeam) r, + Member (ErrorS 'NoBindingTeamMembers) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'NotConnected) r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member TeamStore r, + Member P.TinyLog r, CallsFed 'Galley "on-conversation-created" ) => Local UserId -> @@ -294,16 +290,13 @@ createOne2OneConversation lusr zcon j = do Nothing -> throwS @'TeamNotFound createLegacyOne2OneConversationUnchecked :: - ( Members - '[ ConversationStore, - Error InternalError, - Error InvalidInput, - FederatorAccess, - GundeckAccess, - Input UTCTime, - P.TinyLog - ] - r, + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (Error InvalidInput) r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member P.TinyLog r, CallsFed 'Galley "on-conversation-created" ) => Local UserId -> @@ -335,17 +328,13 @@ createLegacyOne2OneConversationUnchecked self zcon name mtid other = do conversationCreated self c createOne2OneConversationUnchecked :: - ( Members - '[ ConversationStore, - Error FederationError, - Error InternalError, - ErrorS 'MissingLegalholdConsent, - FederatorAccess, - GundeckAccess, - Input UTCTime, - P.TinyLog - ] - r, + ( Member ConversationStore r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member P.TinyLog r, CallsFed 'Galley "on-conversation-created" ) => Local UserId -> @@ -363,16 +352,12 @@ createOne2OneConversationUnchecked self zcon name mtid other = do create (one2OneConvId (tUntagged self) other) self zcon name mtid other createOne2OneConversationLocally :: - ( Members - '[ ConversationStore, - Error InternalError, - ErrorS 'MissingLegalholdConsent, - FederatorAccess, - GundeckAccess, - Input UTCTime, - P.TinyLog - ] - r, + ( Member ConversationStore r, + Member (Error InternalError) r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member P.TinyLog r, CallsFed 'Galley "on-conversation-created" ) => Local ConvId -> @@ -416,21 +401,17 @@ createOne2OneConversationRemotely _ _ _ _ _ _ = throw FederationNotImplemented createConnectConversation :: - ( Members - '[ ConversationStore, - ErrorS 'ConvNotFound, - Error FederationError, - Error InternalError, - Error InvalidInput, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - FederatorAccess, - GundeckAccess, - Input UTCTime, - MemberStore, - P.TinyLog - ] - r, + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member (Error InvalidInput) r, + Member (ErrorS 'InvalidOperation) r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r, + Member P.TinyLog r, CallsFed 'Galley "on-conversation-created" ) => Local UserId -> @@ -514,7 +495,10 @@ createConnectConversation lusr conn j = do -- | Return a 'NewConversation' record suitable for creating a group conversation. newRegularConversation :: - Members '[ErrorS 'MLSNonEmptyMemberList, Error InvalidInput, Input Opts] r => + ( Member (ErrorS 'MLSNonEmptyMemberList) r, + Member (Error InvalidInput) r, + Member (Input Opts) r + ) => Local UserId -> NewConv -> Sem r (NewConversation, ConvSizeChecked UserList UserId) @@ -548,14 +532,20 @@ newRegularConversation lusr newConv = do -- Helpers conversationCreated :: - Members '[Error InternalError, P.TinyLog] r => + ( Member (Error InternalError) r, + Member P.TinyLog r + ) => Local UserId -> Data.Conversation -> Sem r ConversationResponse conversationCreated lusr cnv = Created <$> conversationView lusr cnv notifyCreatedConversation :: - ( Members '[Error InternalError, FederatorAccess, GundeckAccess, Input UTCTime, P.TinyLog] r, + ( Member (Error InternalError) r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member P.TinyLog r, CallsFed 'Galley "on-conversation-created" ) => Maybe UTCTime -> diff --git a/services/galley/src/Galley/API/CustomBackend.hs b/services/galley/src/Galley/API/CustomBackend.hs index 596102ab71..89c0053309 100644 --- a/services/galley/src/Galley/API/CustomBackend.hs +++ b/services/galley/src/Galley/API/CustomBackend.hs @@ -41,7 +41,9 @@ import Wire.API.Error.Galley -- PUBLIC --------------------------------------------------------------------- getCustomBackendByDomain :: - Members '[CustomBackendStore, ErrorS 'CustomBackendNotFound] r => + ( Member CustomBackendStore r, + Member (ErrorS 'CustomBackendNotFound) r + ) => Domain -> Sem r Public.CustomBackend getCustomBackendByDomain domain = @@ -52,7 +54,9 @@ getCustomBackendByDomain domain = -- INTERNAL ------------------------------------------------------------------- internalPutCustomBackendByDomainH :: - Members '[CustomBackendStore, WaiRoutes] r => + ( Member CustomBackendStore r, + Member WaiRoutes r + ) => Domain ::: JsonRequest CustomBackend -> Sem r Response internalPutCustomBackendByDomainH (domain ::: req) = do diff --git a/services/galley/src/Galley/API/Federation.hs b/services/galley/src/Galley/API/Federation.hs index 0572690474..d57ad26264 100644 --- a/services/galley/src/Galley/API/Federation.hs +++ b/services/galley/src/Galley/API/Federation.hs @@ -121,20 +121,16 @@ federationSitemap = :<|> Named @"on-typing-indicator-updated" onTypingIndicatorUpdated onClientRemoved :: - ( Members - '[ ConversationStore, - Error InternalError, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input (Local ()), - Input UTCTime, - MemberStore, - ProposalStore, - TinyLog - ] - r, + ( Member ConversationStore r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member TinyLog r, CallsFed 'Galley "on-mls-message-sent" ) => Domain -> @@ -151,16 +147,13 @@ onClientRemoved domain req = do pure EmptyResponse onConversationCreated :: - Members - '[ BrigAccess, - ConversationStore, - GundeckAccess, - ExternalAccess, - Input (Local ()), - MemberStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member GundeckAccess r, + Member ExternalAccess r, + Member (Input (Local ())) r, + Member MemberStore r, + Member P.TinyLog r + ) => Domain -> F.ConversationCreated ConvId -> Sem r () @@ -210,7 +203,9 @@ onNewRemoteConversation domain nrc = do pure EmptyResponse getConversations :: - Members '[ConversationStore, Input (Local ())] r => + ( Member ConversationStore r, + Member (Input (Local ())) r + ) => Domain -> F.GetConversationsRequest -> Sem r F.GetConversationsResponse @@ -227,15 +222,13 @@ getLocalUsers localDomain = map qUnqualified . filter ((== localDomain) . qDomai -- | Update the local database with information on conversation members joining -- or leaving. Finally, push out notifications to local users. onConversationUpdated :: - Members - '[ BrigAccess, - GundeckAccess, - ExternalAccess, - Input (Local ()), - MemberStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member GundeckAccess r, + Member ExternalAccess r, + Member (Input (Local ())) r, + Member MemberStore r, + Member P.TinyLog r + ) => Domain -> F.ConversationUpdate -> Sem r () @@ -305,7 +298,10 @@ onConversationUpdated requestingDomain cu = do pushConversationEvent Nothing event (qualifyAs loc targets) [] addLocalUsersToRemoteConv :: - Members '[BrigAccess, MemberStore, P.TinyLog] r => + ( Member BrigAccess r, + Member MemberStore r, + Member P.TinyLog r + ) => Remote ConvId -> Qualified UserId -> [UserId] -> @@ -332,21 +328,17 @@ addLocalUsersToRemoteConv remoteConvId qAdder localUsers = do -- as of now this will not generate the necessary events on the leaver's domain leaveConversation :: - ( Members - '[ ConversationStore, - Error InternalError, - Error InvalidInput, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input (Local ()), - Input UTCTime, - MemberStore, - ProposalStore, - TinyLog - ] - r, + ( Member ConversationStore r, + Member (Error InternalError) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member TinyLog r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -397,7 +389,12 @@ leaveConversation requestingDomain lc = do -- FUTUREWORK: error handling for missing / mismatched clients -- FUTUREWORK: support bots onMessageSent :: - Members '[GundeckAccess, ExternalAccess, MemberStore, Input (Local ()), P.TinyLog] r => + ( Member GundeckAccess r, + Member ExternalAccess r, + Member MemberStore r, + Member (Input (Local ())) r, + Member P.TinyLog r + ) => Domain -> F.RemoteMessage ConvId -> Sem r () @@ -439,22 +436,18 @@ onMessageSent domain rmUnqualified = do (Map.filterWithKey (\(uid, _) _ -> Set.member uid members) msgs) sendMessage :: - ( Members - '[ BrigAccess, - ClientStore, - ConversationStore, - Error InvalidInput, - FederatorAccess, - GundeckAccess, - Input (Local ()), - Input Opts, - Input UTCTime, - ExternalAccess, - MemberStore, - TeamStore, - P.TinyLog - ] - r, + ( Member BrigAccess r, + Member ClientStore r, + Member ConversationStore r, + Member (Error InvalidInput) r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member ExternalAccess r, + Member TeamStore r, + Member P.TinyLog r, CallsFed 'Galley "on-message-sent", CallsFed 'Brig "get-user-clients" ) => @@ -470,21 +463,17 @@ sendMessage originDomain msr = do throwErr = throw . InvalidPayload . LT.pack onUserDeleted :: - ( Members - '[ ConversationStore, - FederatorAccess, - FireAndForget, - ExternalAccess, - GundeckAccess, - Error InternalError, - Input (Local ()), - Input UTCTime, - Input Env, - MemberStore, - ProposalStore, - TinyLog - ] - r, + ( Member ConversationStore r, + Member FederatorAccess r, + Member FireAndForget r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member (Input Env) r, + Member MemberStore r, + Member ProposalStore r, + Member TinyLog r, CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" @@ -529,29 +518,26 @@ onUserDeleted origDomain udcn = do updateConversation :: forall r. - ( Members - '[ BrigAccess, - CodeStore, - BotAccess, - FireAndForget, - Error FederationError, - Error InvalidInput, - ExternalAccess, - FederatorAccess, - Error InternalError, - GundeckAccess, - Input Env, - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - ProposalStore, - TeamStore, - TinyLog, - ConversationStore, - Input (Local ()) - ] - r, + ( Member BrigAccess r, + Member CodeStore r, + Member BotAccess r, + Member FireAndForget r, + Member (Error FederationError) r, + Member (Error InvalidInput) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member (Error InternalError) r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member MemberStore r, + Member ProposalStore r, + Member TeamStore r, + Member TinyLog r, + Member ConversationStore r, + Member (Input (Local ())) r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -617,26 +603,23 @@ updateConversation origDomain updateRequest = do toResponse (Right (Right update)) = F.ConversationUpdateResponseUpdate update sendMLSCommitBundle :: - ( Members - [ BrigAccess, - ConversationStore, - ExternalAccess, - Error FederationError, - Error InternalError, - FederatorAccess, - GundeckAccess, - Input (Local ()), - Input Env, - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - Resource, - TeamStore, - P.TinyLog, - ProposalStore - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member ExternalAccess r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input Env) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member MemberStore r, + Member Resource r, + Member TeamStore r, + Member P.TinyLog r, + Member ProposalStore r, CallsFed 'Galley "mls-welcome", CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", @@ -667,26 +650,23 @@ sendMLSCommitBundle remoteDomain msr = <$> postMLSCommitBundle loc (tUntagged sender) Nothing qcnv Nothing bundle sendMLSMessage :: - ( Members - [ BrigAccess, - ConversationStore, - ExternalAccess, - Error FederationError, - Error InternalError, - FederatorAccess, - GundeckAccess, - Input (Local ()), - Input Env, - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - Resource, - TeamStore, - P.TinyLog, - ProposalStore - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member ExternalAccess r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input Env) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member MemberStore r, + Member Resource r, + Member TeamStore r, + Member P.TinyLog r, + Member ProposalStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation", @@ -740,15 +720,13 @@ instance Right res -> pure res mlsSendWelcome :: - Members - '[ BrigAccess, - Error InternalError, - GundeckAccess, - Input Env, - Input (Local ()), - Input UTCTime - ] - r => + ( Member BrigAccess r, + Member (Error InternalError) r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r + ) => Domain -> F.MLSWelcomeRequest -> Sem r F.MLSWelcomeResponse @@ -774,15 +752,13 @@ mlsSendWelcome _origDomain (fromBase64ByteString . F.unMLSWelcomeRequest -> rawW sendLocalWelcomes Nothing now rawWelcome lrcpts onMLSMessageSent :: - Members - '[ ExternalAccess, - GundeckAccess, - Input (Local ()), - Input Env, - MemberStore, - P.TinyLog - ] - r => + ( Member ExternalAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input Env) r, + Member MemberStore r, + Member P.TinyLog r + ) => Domain -> F.RemoteMLSMessage -> Sem r F.RemoteMLSMessageResponse @@ -818,12 +794,9 @@ onMLSMessageSent domain rmm = foldMap mkPush recipients queryGroupInfo :: - ( Members - '[ ConversationStore, - Input (Local ()), - Input Env - ] - r, + ( Member ConversationStore r, + Member (Input (Local ())) r, + Member (Input Env) r, Member MemberStore r ) => Domain -> @@ -844,14 +817,10 @@ queryGroupInfo origDomain req = $ state onTypingIndicatorUpdated :: - ( Members - '[ ConversationStore, - MemberStore, - GundeckAccess, - Input UTCTime, - Input (Local ()) - ] - r + ( Member MemberStore r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member (Input (Local ())) r ) => Domain -> TypingDataUpdateRequest -> diff --git a/services/galley/src/Galley/API/Internal.hs b/services/galley/src/Galley/API/Internal.hs index dc9107dcf5..ae7dbd910f 100644 --- a/services/galley/src/Galley/API/Internal.hs +++ b/services/galley/src/Galley/API/Internal.hs @@ -148,7 +148,7 @@ iTeamsAPI = mkAPI $ \tid -> hoistAPIHandler id (base tid) <@> mkNamedAPI @"user-is-team-owner" (Teams.userIsTeamOwner tid) <@> hoistAPISegment ( mkNamedAPI @"get-search-visibility-internal" (Teams.getSearchVisibilityInternal tid) - <@> mkNamedAPI @"set-search-visibility-internal" (Teams.setSearchVisibilityInternal @Cassandra (featureEnabledForTeam @Cassandra @SearchVisibilityAvailableConfig) tid) + <@> mkNamedAPI @"set-search-visibility-internal" (Teams.setSearchVisibilityInternal (featureEnabledForTeam @Cassandra @SearchVisibilityAvailableConfig) tid) ) featureAPI :: API IFeatureAPI GalleyEffects @@ -208,7 +208,7 @@ featureAPI = <@> mkNamedAPI @'("iput", OutlookCalIntegrationConfig) (setFeatureStatusInternal @Cassandra) <@> mkNamedAPI @'("ipatch", OutlookCalIntegrationConfig) (patchFeatureStatusInternal @Cassandra) <@> mkNamedAPI @'("ilock", OutlookCalIntegrationConfig) (updateLockStatus @Cassandra @OutlookCalIntegrationConfig) - <@> mkNamedAPI @"feature-configs-internal" (maybe (getAllFeatureConfigsForServer @Cassandra) (getAllFeatureConfigsForUser @Cassandra)) + <@> mkNamedAPI @"feature-configs-internal" (maybe getAllFeatureConfigsForServer (getAllFeatureConfigsForUser @Cassandra)) internalSitemap :: Routes a (Sem GalleyEffects) () internalSitemap = unsafeCallsFed @'Galley @"on-client-removed" $ unsafeCallsFed @'Galley @"on-mls-message-sent" $ do @@ -299,26 +299,24 @@ rmUser :: forall p1 p2 r. ( p1 ~ CassandraPaging, p2 ~ InternalPaging, - Members - '[ BrigAccess, - ClientStore, - ConversationStore, - Error InternalError, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input (Local ()), - Input UTCTime, - ListItems p1 ConvId, - ListItems p1 (Remote ConvId), - ListItems p2 TeamId, - MemberStore, - ProposalStore, - P.TinyLog, - TeamStore - ] - r, + ( Member BrigAccess r, + Member ClientStore r, + Member ConversationStore r, + Member (Error InternalError) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member (ListItems p1 ConvId) r, + Member (ListItems p1 (Remote ConvId)) r, + Member (ListItems p2 TeamId) r, + Member MemberStore r, + Member ProposalStore r, + Member P.TinyLog r, + Member TeamStore r + ), CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-user-deleted-conversations", CallsFed 'Galley "on-mls-message-sent" @@ -456,15 +454,12 @@ safeForever funName action = threadDelay 60000000 -- pause to keep worst-case noise in logs manageable guardLegalholdPolicyConflictsH :: - Members - '[ BrigAccess, - Input Opts, - TeamStore, - P.TinyLog, - WaiRoutes, - ErrorS 'MissingLegalholdConsent - ] - r => + ( Member BrigAccess r, + Member (Input Opts) r, + Member TeamStore r, + Member P.TinyLog r, + Member (ErrorS 'MissingLegalholdConsent) r + ) => GuardLegalholdPolicyConflicts -> Sem r () guardLegalholdPolicyConflictsH glh = do diff --git a/services/galley/src/Galley/API/LegalHold.hs b/services/galley/src/Galley/API/LegalHold.hs index aa4deca7fa..82acf6bc68 100644 --- a/services/galley/src/Galley/API/LegalHold.hs +++ b/services/galley/src/Galley/API/LegalHold.hs @@ -87,13 +87,11 @@ import Wire.Sem.Paging.Cassandra assertLegalHoldEnabledForTeam :: forall db r. - Members - '[ LegalHoldStore, - TeamStore, - TeamFeatureStore db, - ErrorS 'LegalHoldNotEnabled - ] - r => + ( Member LegalHoldStore r, + Member TeamStore r, + Member (TeamFeatureStore db) r, + Member (ErrorS 'LegalHoldNotEnabled) r + ) => TeamFeatures.FeaturePersistentConstraint db Public.LegalholdConfig => TeamId -> Sem r () @@ -103,7 +101,9 @@ assertLegalHoldEnabledForTeam tid = isLegalHoldEnabledForTeam :: forall db r. - ( Members '[LegalHoldStore, TeamStore, TeamFeatureStore db] r, + ( Member LegalHoldStore r, + Member TeamStore r, + Member (TeamFeatureStore db) r, TeamFeatures.FeaturePersistentConstraint db Public.LegalholdConfig ) => TeamId -> @@ -124,18 +124,16 @@ isLegalHoldEnabledForTeam tid = do createSettings :: forall db r. - Members - '[ ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'LegalHoldNotEnabled, - ErrorS 'LegalHoldServiceInvalidKey, - ErrorS 'LegalHoldServiceBadResponse, - LegalHoldStore, - TeamFeatureStore db, - TeamStore, - P.TinyLog - ] - r => + ( Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'LegalHoldNotEnabled) r, + Member (ErrorS 'LegalHoldServiceInvalidKey) r, + Member (ErrorS 'LegalHoldServiceBadResponse) r, + Member LegalHoldStore r, + Member (TeamFeatureStore db) r, + Member TeamStore r, + Member P.TinyLog r + ) => TeamFeatures.FeaturePersistentConstraint db Public.LegalholdConfig => Local UserId -> TeamId -> @@ -160,14 +158,11 @@ createSettings lzusr tid newService = do getSettings :: forall db r. - Members - '[ ErrorS OperationDenied, - ErrorS 'NotATeamMember, - LegalHoldStore, - TeamFeatureStore db, - TeamStore - ] - r => + ( Member (ErrorS 'NotATeamMember) r, + Member LegalHoldStore r, + Member (TeamFeatureStore db) r, + Member TeamStore r + ) => TeamFeatures.FeaturePersistentConstraint db Public.LegalholdConfig => Local UserId -> TeamId -> @@ -185,40 +180,36 @@ getSettings lzusr tid = do removeSettingsInternalPaging :: forall db r. - ( Members - '[ BotAccess, - BrigAccess, - CodeStore, - ConversationStore, - Error AuthenticationError, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'InvalidOperation, - ErrorS 'LegalHoldCouldNotBlockConnections, - ErrorS 'LegalHoldDisableUnimplemented, - ErrorS 'LegalHoldNotEnabled, - ErrorS 'LegalHoldServiceNotRegistered, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'UserLegalHoldIllegalOperation, - ExternalAccess, - FederatorAccess, - FireAndForget, - GundeckAccess, - Input Env, - Input (Local ()), - Input UTCTime, - LegalHoldStore, - ListItems LegacyPaging ConvId, - MemberStore, - ProposalStore, - P.TinyLog, - TeamFeatureStore db, - TeamMemberStore InternalPaging, - TeamStore, - WaiRoutes - ] - r, + ( Member BotAccess r, + Member BrigAccess r, + Member CodeStore r, + Member ConversationStore r, + Member (Error AuthenticationError) r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r, + Member (ErrorS 'LegalHoldDisableUnimplemented) r, + Member (ErrorS 'LegalHoldNotEnabled) r, + Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'UserLegalHoldIllegalOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member FireAndForget r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member ProposalStore r, + Member P.TinyLog r, + Member (TeamFeatureStore db) r, + Member (TeamMemberStore InternalPaging) r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -234,39 +225,37 @@ removeSettings :: forall db p r. ( Paging p, Bounded (PagingBounds p TeamMember), - Members - '[ BotAccess, - BrigAccess, - CodeStore, - ConversationStore, - Error AuthenticationError, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'InvalidOperation, - ErrorS 'LegalHoldCouldNotBlockConnections, - ErrorS 'LegalHoldDisableUnimplemented, - ErrorS 'LegalHoldNotEnabled, - ErrorS 'LegalHoldServiceNotRegistered, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'UserLegalHoldIllegalOperation, - ExternalAccess, - FederatorAccess, - FireAndForget, - GundeckAccess, - Input Env, - Input (Local ()), - Input UTCTime, - LegalHoldStore, - ListItems LegacyPaging ConvId, - MemberStore, - ProposalStore, - P.TinyLog, - TeamFeatureStore db, - TeamMemberStore p, - TeamStore - ] - r, + ( Member BotAccess r, + Member BrigAccess r, + Member CodeStore r, + Member ConversationStore r, + Member (Error AuthenticationError) r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r, + Member (ErrorS 'LegalHoldDisableUnimplemented) r, + Member (ErrorS 'LegalHoldNotEnabled) r, + Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'UserLegalHoldIllegalOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member FireAndForget r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member ProposalStore r, + Member P.TinyLog r, + Member (TeamFeatureStore db) r, + Member (TeamMemberStore p) r, + Member TeamStore r + ), CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -301,34 +290,32 @@ removeSettings' :: forall p r. ( Paging p, Bounded (PagingBounds p TeamMember), - Members - '[ BotAccess, - BrigAccess, - CodeStore, - ConversationStore, - Error InternalError, - Error AuthenticationError, - ErrorS 'NotATeamMember, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'LegalHoldServiceNotRegistered, - ErrorS 'UserLegalHoldIllegalOperation, - ErrorS 'LegalHoldCouldNotBlockConnections, - ExternalAccess, - FederatorAccess, - FireAndForget, - GundeckAccess, - Input UTCTime, - Input (Local ()), - Input Env, - LegalHoldStore, - ListItems LegacyPaging ConvId, - MemberStore, - TeamMemberStore p, - TeamStore, - ProposalStore, - P.TinyLog - ] - r, + ( Member BotAccess r, + Member BrigAccess r, + Member CodeStore r, + Member ConversationStore r, + Member (Error InternalError) r, + Member (Error AuthenticationError) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member (ErrorS 'UserLegalHoldIllegalOperation) r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member FireAndForget r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member (Input (Local ())) r, + Member (Input Env) r, + Member LegalHoldStore r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member (TeamMemberStore p) r, + Member TeamStore r, + Member ProposalStore r, + Member P.TinyLog r + ), CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -359,14 +346,12 @@ removeSettings' tid = -- Note that this is accessible to ANY authenticated user, even ones outside the team getUserStatus :: forall r. - Members - '[ Error InternalError, - ErrorS 'TeamMemberNotFound, - LegalHoldStore, - TeamStore, - P.TinyLog - ] - r => + ( Member (Error InternalError) r, + Member (ErrorS 'TeamMemberNotFound) r, + Member LegalHoldStore r, + Member TeamStore r, + Member P.TinyLog r + ) => Local UserId -> TeamId -> UserId -> @@ -399,28 +384,24 @@ getUserStatus _lzusr tid uid = do -- @withdrawExplicitConsentH@ (lots of corner cases we'd have to implement for that to pan -- out). grantConsent :: - ( Members - '[ BrigAccess, - ConversationStore, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'InvalidOperation, - ErrorS 'LegalHoldCouldNotBlockConnections, - ErrorS 'TeamMemberNotFound, - ErrorS 'UserLegalHoldIllegalOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - LegalHoldStore, - ListItems LegacyPaging ConvId, - MemberStore, - ProposalStore, - P.TinyLog, - TeamStore - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r, + Member (ErrorS 'TeamMemberNotFound) r, + Member (ErrorS 'UserLegalHoldIllegalOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member ProposalStore r, + Member P.TinyLog r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -442,36 +423,33 @@ grantConsent lusr tid = do -- | Request to provision a device on the legal hold service for a user requestDevice :: forall db r. - ( Members - '[ BrigAccess, - ConversationStore, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'LegalHoldCouldNotBlockConnections, - ErrorS 'LegalHoldNotEnabled, - ErrorS 'LegalHoldServiceBadResponse, - ErrorS 'LegalHoldServiceNotRegistered, - ErrorS 'NotATeamMember, - ErrorS 'NoUserLegalHoldConsent, - ErrorS OperationDenied, - ErrorS 'TeamMemberNotFound, - ErrorS 'UserLegalHoldAlreadyEnabled, - ErrorS 'UserLegalHoldIllegalOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input (Local ()), - Input Env, - Input UTCTime, - LegalHoldStore, - ListItems LegacyPaging ConvId, - MemberStore, - ProposalStore, - P.TinyLog, - TeamFeatureStore db, - TeamStore - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r, + Member (ErrorS 'LegalHoldNotEnabled) r, + Member (ErrorS 'LegalHoldServiceBadResponse) r, + Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'NoUserLegalHoldConsent) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'TeamMemberNotFound) r, + Member (ErrorS 'UserLegalHoldAlreadyEnabled) r, + Member (ErrorS 'UserLegalHoldIllegalOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member ProposalStore r, + Member P.TinyLog r, + Member (TeamFeatureStore db) r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -526,36 +504,33 @@ requestDevice lzusr tid uid = do -- since they are replaced if needed when registering new LH devices. approveDevice :: forall db r. - ( Members - '[ BrigAccess, - ConversationStore, - Error AuthenticationError, - Error InternalError, - ErrorS 'AccessDenied, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'LegalHoldCouldNotBlockConnections, - ErrorS 'LegalHoldNotEnabled, - ErrorS 'LegalHoldServiceNotRegistered, - ErrorS 'NoLegalHoldDeviceAllocated, - ErrorS 'NotATeamMember, - ErrorS 'UserLegalHoldAlreadyEnabled, - ErrorS 'UserLegalHoldIllegalOperation, - ErrorS 'UserLegalHoldNotPending, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input (Local ()), - Input Env, - Input UTCTime, - LegalHoldStore, - ListItems LegacyPaging ConvId, - MemberStore, - ProposalStore, - P.TinyLog, - TeamFeatureStore db, - TeamStore - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error AuthenticationError) r, + Member (Error InternalError) r, + Member (ErrorS 'AccessDenied) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r, + Member (ErrorS 'LegalHoldNotEnabled) r, + Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member (ErrorS 'NoLegalHoldDeviceAllocated) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'UserLegalHoldAlreadyEnabled) r, + Member (ErrorS 'UserLegalHoldIllegalOperation) r, + Member (ErrorS 'UserLegalHoldNotPending) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member ProposalStore r, + Member P.TinyLog r, + Member (TeamFeatureStore db) r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -610,31 +585,28 @@ approveDevice lzusr connId tid uid (Public.ApproveLegalHoldForUserRequest mPassw disableForUser :: forall r. - ( Members - '[ BrigAccess, - ConversationStore, - Error AuthenticationError, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'LegalHoldCouldNotBlockConnections, - ErrorS 'LegalHoldServiceNotRegistered, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'UserLegalHoldIllegalOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input (Local ()), - Input UTCTime, - LegalHoldStore, - ListItems LegacyPaging ConvId, - MemberStore, - ProposalStore, - P.TinyLog, - TeamStore - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error AuthenticationError) r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r, + Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'UserLegalHoldIllegalOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member ProposalStore r, + Member P.TinyLog r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -672,26 +644,23 @@ disableForUser lzusr tid uid (Public.DisableLegalHoldForUserRequest mPassword) = -- or disabled, make sure the affected connections are screened for policy conflict (anybody -- with no-consent), and put those connections in the appropriate blocked state. changeLegalholdStatus :: - ( Members - '[ BrigAccess, - ConversationStore, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'LegalHoldCouldNotBlockConnections, - ErrorS 'UserLegalHoldIllegalOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - LegalHoldStore, - ListItems LegacyPaging ConvId, - MemberStore, - TeamStore, - ProposalStore, - P.TinyLog - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r, + Member (ErrorS 'UserLegalHoldIllegalOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member TeamStore r, + Member ProposalStore r, + Member P.TinyLog r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -738,13 +707,11 @@ changeLegalholdStatus tid luid old new = do -- FUTUREWORK: make this async? blockNonConsentingConnections :: forall r. - Members - '[ BrigAccess, - TeamStore, - P.TinyLog, - ErrorS 'LegalHoldCouldNotBlockConnections - ] - r => + ( Member BrigAccess r, + Member TeamStore r, + Member P.TinyLog r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r + ) => UserId -> Sem r () blockNonConsentingConnections uid = do @@ -796,22 +763,19 @@ unsetTeamLegalholdWhitelistedH tid = do -- contains the hypothetical new LH status of `uid`'s so it can be consulted instead of the -- one from the database. handleGroupConvPolicyConflicts :: - ( Members - '[ ConversationStore, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - ListItems LegacyPaging ConvId, - MemberStore, - ProposalStore, - P.TinyLog, - TeamStore - ] - r, + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member ProposalStore r, + Member P.TinyLog r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" diff --git a/services/galley/src/Galley/API/LegalHold/Conflicts.hs b/services/galley/src/Galley/API/LegalHold/Conflicts.hs index dfcda4e1c9..28e2083f6d 100644 --- a/services/galley/src/Galley/API/LegalHold/Conflicts.hs +++ b/services/galley/src/Galley/API/LegalHold/Conflicts.hs @@ -47,15 +47,13 @@ import Wire.API.User.Client as Client data LegalholdConflicts = LegalholdConflicts guardQualifiedLegalholdPolicyConflicts :: - Members - '[ BrigAccess, - Error LegalholdConflicts, - Input (Local ()), - Input Opts, - TeamStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member (Error LegalholdConflicts) r, + Member (Input (Local ())) r, + Member (Input Opts) r, + Member TeamStore r, + Member P.TinyLog r + ) => LegalholdProtectee -> QualifiedUserClients -> Sem r () @@ -74,14 +72,12 @@ guardQualifiedLegalholdPolicyConflicts protectee qclients = do -- This is a fallback safeguard that shouldn't get triggered if backend and clients work as -- intended. guardLegalholdPolicyConflicts :: - Members - '[ BrigAccess, - Error LegalholdConflicts, - Input Opts, - TeamStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member (Error LegalholdConflicts) r, + Member (Input Opts) r, + Member TeamStore r, + Member P.TinyLog r + ) => LegalholdProtectee -> UserClients -> Sem r () @@ -97,13 +93,11 @@ guardLegalholdPolicyConflicts (ProtectedUser self) otherClients = do guardLegalholdPolicyConflictsUid :: forall r. - Members - '[ BrigAccess, - Error LegalholdConflicts, - TeamStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member (Error LegalholdConflicts) r, + Member TeamStore r, + Member P.TinyLog r + ) => UserId -> UserClients -> Sem r () diff --git a/services/galley/src/Galley/API/MLS/GroupInfo.hs b/services/galley/src/Galley/API/MLS/GroupInfo.hs index 46a6f530f7..e3d2315587 100644 --- a/services/galley/src/Galley/API/MLS/GroupInfo.hs +++ b/services/galley/src/Galley/API/MLS/GroupInfo.hs @@ -45,14 +45,11 @@ type MLSGroupInfoStaticErrors = ] getGroupInfo :: - ( Members - '[ ConversationStore, - Error FederationError, - FederatorAccess, - Input Env, - MemberStore - ] - r, + ( Member ConversationStore r, + Member (Error FederationError) r, + Member FederatorAccess r, + Member (Input Env) r, + Member MemberStore r, CallsFed 'Galley "query-group-info" ) => Members MLSGroupInfoStaticErrors r => @@ -68,11 +65,9 @@ getGroupInfo lusr qcnvId = do qcnvId getGroupInfoFromLocalConv :: - Members - '[ ConversationStore, - MemberStore - ] - r => + ( Member ConversationStore r, + Member MemberStore r + ) => Members MLSGroupInfoStaticErrors r => Qualified UserId -> Local ConvId -> @@ -83,7 +78,10 @@ getGroupInfoFromLocalConv qusr lcnvId = do >>= noteS @'MLSMissingGroupInfo getGroupInfoFromRemoteConv :: - (Members '[Error FederationError, FederatorAccess] r, CallsFed 'Galley "query-group-info") => + ( Member (Error FederationError) r, + Member FederatorAccess r, + CallsFed 'Galley "query-group-info" + ) => Members MLSGroupInfoStaticErrors r => Local UserId -> Remote ConvId -> diff --git a/services/galley/src/Galley/API/MLS/KeyPackage.hs b/services/galley/src/Galley/API/MLS/KeyPackage.hs index c5e42031a4..23fe2760c0 100644 --- a/services/galley/src/Galley/API/MLS/KeyPackage.hs +++ b/services/galley/src/Galley/API/MLS/KeyPackage.hs @@ -30,11 +30,9 @@ nullKeyPackageRef :: KeyPackageRef nullKeyPackageRef = KeyPackageRef (BS.replicate 16 0) derefKeyPackage :: - Members - '[ BrigAccess, - ErrorS 'MLSKeyPackageRefNotFound - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'MLSKeyPackageRefNotFound) r + ) => KeyPackageRef -> Sem r ClientIdentity derefKeyPackage = noteS @'MLSKeyPackageRefNotFound <=< getClientByKeyPackageRef diff --git a/services/galley/src/Galley/API/MLS/Message.hs b/services/galley/src/Galley/API/MLS/Message.hs index dc9031f537..4224d9a028 100644 --- a/services/galley/src/Galley/API/MLS/Message.hs +++ b/services/galley/src/Galley/API/MLS/Message.hs @@ -119,28 +119,26 @@ type MLSBundleStaticErrors = postMLSMessageFromLocalUserV1 :: ( HasProposalEffects r, - Members - '[ Error FederationError, - Error InternalError, - ErrorS 'ConvAccessDenied, - ErrorS 'ConvMemberNotFound, - ErrorS 'ConvNotFound, - ErrorS 'MissingLegalholdConsent, - ErrorS 'MLSClientSenderUserMismatch, - ErrorS 'MLSCommitMissingReferences, - ErrorS 'MLSGroupConversationMismatch, - ErrorS 'MLSMissingSenderClient, - ErrorS 'MLSNotEnabled, - ErrorS 'MLSProposalNotFound, - ErrorS 'MLSSelfRemovalNotAllowed, - ErrorS 'MLSStaleMessage, - ErrorS 'MLSUnsupportedMessage, - Input (Local ()), - ProposalStore, - Resource, - TinyLog - ] - r, + ( Member (Error FederationError) r, + Member (Error InternalError) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvMemberNotFound) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'MissingLegalholdConsent) r, + Member (ErrorS 'MLSClientSenderUserMismatch) r, + Member (ErrorS 'MLSCommitMissingReferences) r, + Member (ErrorS 'MLSGroupConversationMismatch) r, + Member (ErrorS 'MLSMissingSenderClient) r, + Member (ErrorS 'MLSNotEnabled) r, + Member (ErrorS 'MLSProposalNotFound) r, + Member (ErrorS 'MLSSelfRemovalNotAllowed) r, + Member (ErrorS 'MLSStaleMessage) r, + Member (ErrorS 'MLSUnsupportedMessage) r, + Member (Input (Local ())) r, + Member ProposalStore r, + Member Resource r, + Member TinyLog r + ), CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "send-mls-message", CallsFed 'Galley "on-conversation-updated", @@ -162,28 +160,26 @@ postMLSMessageFromLocalUserV1 lusr mc conn smsg = do postMLSMessageFromLocalUser :: ( HasProposalEffects r, - Members - '[ Error FederationError, - Error InternalError, - ErrorS 'ConvAccessDenied, - ErrorS 'ConvMemberNotFound, - ErrorS 'ConvNotFound, - ErrorS 'MissingLegalholdConsent, - ErrorS 'MLSClientSenderUserMismatch, - ErrorS 'MLSCommitMissingReferences, - ErrorS 'MLSGroupConversationMismatch, - ErrorS 'MLSMissingSenderClient, - ErrorS 'MLSNotEnabled, - ErrorS 'MLSProposalNotFound, - ErrorS 'MLSSelfRemovalNotAllowed, - ErrorS 'MLSStaleMessage, - ErrorS 'MLSUnsupportedMessage, - Input (Local ()), - ProposalStore, - Resource, - TinyLog - ] - r, + ( Member (Error FederationError) r, + Member (Error InternalError) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvMemberNotFound) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'MissingLegalholdConsent) r, + Member (ErrorS 'MLSClientSenderUserMismatch) r, + Member (ErrorS 'MLSCommitMissingReferences) r, + Member (ErrorS 'MLSGroupConversationMismatch) r, + Member (ErrorS 'MLSMissingSenderClient) r, + Member (ErrorS 'MLSNotEnabled) r, + Member (ErrorS 'MLSProposalNotFound) r, + Member (ErrorS 'MLSSelfRemovalNotAllowed) r, + Member (ErrorS 'MLSStaleMessage) r, + Member (ErrorS 'MLSUnsupportedMessage) r, + Member (Input (Local ())) r, + Member ProposalStore r, + Member Resource r, + Member TinyLog r + ), CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "send-mls-message", CallsFed 'Galley "on-conversation-updated", @@ -206,20 +202,18 @@ postMLSMessageFromLocalUser lusr mc conn msg = do postMLSCommitBundle :: ( HasProposalEffects r, Members MLSBundleStaticErrors r, - Members - '[ BrigAccess, - Error FederationError, - Error InternalError, - Error MLSProtocolError, - Input (Local ()), - Input Opts, - Input UTCTime, - MemberStore, - ProposalStore, - Resource, - TinyLog - ] - r, + ( Member BrigAccess r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member (Error MLSProtocolError) r, + Member (Input (Local ())) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member Resource r, + Member TinyLog r + ), CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "mls-welcome", CallsFed 'Galley "send-mls-commit-bundle", @@ -244,20 +238,18 @@ postMLSCommitBundle loc qusr mc qcnv conn rawBundle = postMLSCommitBundleFromLocalUser :: ( HasProposalEffects r, Members MLSBundleStaticErrors r, - Members - '[ BrigAccess, - Error FederationError, - Error InternalError, - ErrorS 'MLSNotEnabled, - Input (Local ()), - Input Opts, - Input UTCTime, - MemberStore, - ProposalStore, - Resource, - TinyLog - ] - r, + ( Member BrigAccess r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member (ErrorS 'MLSNotEnabled) r, + Member (Input (Local ())) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member Resource r, + Member TinyLog r + ), CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "mls-welcome", CallsFed 'Galley "send-mls-commit-bundle", @@ -283,18 +275,16 @@ postMLSCommitBundleFromLocalUser lusr mc conn bundle = do postMLSCommitBundleToLocalConv :: ( HasProposalEffects r, Members MLSBundleStaticErrors r, - Members - '[ BrigAccess, - Error FederationError, - Error InternalError, - Error MLSProtocolError, - Input Opts, - Input UTCTime, - ProposalStore, - Resource, - TinyLog - ] - r, + ( Member BrigAccess r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member (Error MLSProtocolError) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member ProposalStore r, + Member Resource r, + Member TinyLog r + ), CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "mls-welcome", CallsFed 'Galley "on-conversation-updated", @@ -354,17 +344,15 @@ postMLSCommitBundleToLocalConv qusr mc conn bundle lcnv = do postMLSCommitBundleToRemoteConv :: ( Members MLSBundleStaticErrors r, - Members - '[ Error FederationError, - Error MLSProtocolError, - Error MLSProposalFailure, - ExternalAccess, - FederatorAccess, - GundeckAccess, - MemberStore, - TinyLog - ] - r, + ( Member (Error FederationError) r, + Member (Error MLSProtocolError) r, + Member (Error MLSProposalFailure) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member MemberStore r, + Member TinyLog r + ), CallsFed 'Galley "send-mls-commit-bundle" ) => Local x -> @@ -399,28 +387,26 @@ postMLSCommitBundleToRemoteConv loc qusr con bundle rcnv = do postMLSMessage :: ( HasProposalEffects r, - Members - '[ Error FederationError, - Error InternalError, - ErrorS 'ConvAccessDenied, - ErrorS 'ConvMemberNotFound, - ErrorS 'ConvNotFound, - ErrorS 'MLSNotEnabled, - ErrorS 'MissingLegalholdConsent, - ErrorS 'MLSClientSenderUserMismatch, - ErrorS 'MLSCommitMissingReferences, - ErrorS 'MLSGroupConversationMismatch, - ErrorS 'MLSMissingSenderClient, - ErrorS 'MLSProposalNotFound, - ErrorS 'MLSSelfRemovalNotAllowed, - ErrorS 'MLSStaleMessage, - ErrorS 'MLSUnsupportedMessage, - Input (Local ()), - ProposalStore, - Resource, - TinyLog - ] - r, + ( Member (Error FederationError) r, + Member (Error InternalError) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvMemberNotFound) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'MLSNotEnabled) r, + Member (ErrorS 'MissingLegalholdConsent) r, + Member (ErrorS 'MLSClientSenderUserMismatch) r, + Member (ErrorS 'MLSCommitMissingReferences) r, + Member (ErrorS 'MLSGroupConversationMismatch) r, + Member (ErrorS 'MLSMissingSenderClient) r, + Member (ErrorS 'MLSProposalNotFound) r, + Member (ErrorS 'MLSSelfRemovalNotAllowed) r, + Member (ErrorS 'MLSStaleMessage) r, + Member (ErrorS 'MLSUnsupportedMessage) r, + Member (Input (Local ())) r, + Member ProposalStore r, + Member Resource r, + Member TinyLog r + ), CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "send-mls-message", CallsFed 'Galley "on-conversation-updated", @@ -448,12 +434,9 @@ postMLSMessage loc qusr mc qcnv con smsg = case rmValue smsg of -- -- The check is skipped in case of conversation creation and encrypted messages. getSenderClient :: - ( Members - '[ ErrorS 'MLSKeyPackageRefNotFound, - ErrorS 'MLSClientSenderUserMismatch, - BrigAccess - ] - r + ( Member (ErrorS 'MLSKeyPackageRefNotFound) r, + Member (ErrorS 'MLSClientSenderUserMismatch) r, + Member BrigAccess r ) => Qualified UserId -> SWireFormatTag tag -> @@ -473,12 +456,9 @@ getSenderClient qusr SMLSPlainText msg = case msgSender msg of -- FUTUREWORK: once we can assume that the Z-Client header is present (i.e. -- when v2 is dropped), remove the Maybe in the return type. getSenderIdentity :: - ( Members - '[ ErrorS 'MLSKeyPackageRefNotFound, - ErrorS 'MLSClientSenderUserMismatch, - BrigAccess - ] - r + ( Member (ErrorS 'MLSKeyPackageRefNotFound) r, + Member (ErrorS 'MLSClientSenderUserMismatch) r, + Member BrigAccess r ) => Qualified UserId -> Maybe ClientId -> @@ -495,23 +475,21 @@ getSenderIdentity qusr mc fmt msg = do postMLSMessageToLocalConv :: ( HasProposalEffects r, - Members - '[ Error FederationError, - Error InternalError, - ErrorS 'ConvNotFound, - ErrorS 'MissingLegalholdConsent, - ErrorS 'MLSClientSenderUserMismatch, - ErrorS 'MLSCommitMissingReferences, - ErrorS 'MLSMissingSenderClient, - ErrorS 'MLSProposalNotFound, - ErrorS 'MLSSelfRemovalNotAllowed, - ErrorS 'MLSStaleMessage, - ErrorS 'MLSUnsupportedMessage, - ProposalStore, - Resource, - TinyLog - ] - r, + ( Member (Error FederationError) r, + Member (Error InternalError) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'MissingLegalholdConsent) r, + Member (ErrorS 'MLSClientSenderUserMismatch) r, + Member (ErrorS 'MLSCommitMissingReferences) r, + Member (ErrorS 'MLSMissingSenderClient) r, + Member (ErrorS 'MLSProposalNotFound) r, + Member (ErrorS 'MLSSelfRemovalNotAllowed) r, + Member (ErrorS 'MLSStaleMessage) r, + Member (ErrorS 'MLSUnsupportedMessage) r, + Member ProposalStore r, + Member Resource r, + Member TinyLog r + ), CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation", @@ -553,7 +531,9 @@ postMLSMessageToLocalConv qusr senderClient con smsg lcnv = case rmValue smsg of postMLSMessageToRemoteConv :: ( Members MLSMessageStaticErrors r, - Members '[Error FederationError, TinyLog] r, + ( Member (Error FederationError) r, + Member TinyLog r + ), HasProposalEffects r, CallsFed 'Galley "send-mls-message" ) => @@ -691,26 +671,23 @@ processCommit qusr senderClient con lconv mlsMeta cm epoch sender commit = do processExternalCommit :: forall r. - ( Members - '[ BrigAccess, - ConversationStore, - Error MLSProtocolError, - ErrorS 'ConvNotFound, - ErrorS 'MLSClientSenderUserMismatch, - ErrorS 'MLSKeyPackageRefNotFound, - ErrorS 'MLSStaleMessage, - ErrorS 'MLSMissingSenderClient, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - MemberStore, - ProposalStore, - Resource, - TinyLog - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error MLSProtocolError) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'MLSClientSenderUserMismatch) r, + Member (ErrorS 'MLSKeyPackageRefNotFound) r, + Member (ErrorS 'MLSStaleMessage) r, + Member (ErrorS 'MLSMissingSenderClient) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member Resource r, + Member TinyLog r, CallsFed 'Galley "on-mls-message-sent" ) => Qualified UserId -> @@ -934,7 +911,9 @@ processInternalCommit qusr senderClient con lconv mlsMeta cm epoch action sender -- | Note: Use this only for KeyPackage that are already validated updateKeyPackageMapping :: - Members '[BrigAccess, MemberStore] r => + ( Member BrigAccess r, + Member MemberStore r + ) => Local Data.Conversation -> GroupId -> Qualified UserId -> @@ -962,13 +941,11 @@ updateKeyPackageMapping lconv groupId qusr cid mOld new = do applyProposalRef :: ( HasProposalEffects r, - Members - '[ ErrorS 'ConvNotFound, - ErrorS 'MLSProposalNotFound, - ErrorS 'MLSStaleMessage, - ProposalStore - ] - r + ( Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'MLSProposalNotFound) r, + Member (ErrorS 'MLSStaleMessage) r, + Member ProposalStore r + ) ) => Data.Conversation -> ConversationMLSData -> @@ -1032,11 +1009,7 @@ applyProposal _conv _groupId (ExternalInitProposal _) = applyProposal _conv _groupId _ = pure mempty checkProposalCipherSuite :: - Members - '[ Error MLSProtocolError, - ProposalStore - ] - r => + Member (Error MLSProtocolError) r => CipherSuiteTag -> Proposal -> Sem r () @@ -1055,14 +1028,9 @@ checkProposalCipherSuite _suite _prop = pure () processProposal :: HasProposalEffects r => - Members - '[ Error MLSProtocolError, - ErrorS 'ConvNotFound, - ErrorS 'MLSStaleMessage, - ProposalStore, - Input (Local ()) - ] - r => + ( Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'MLSStaleMessage) r + ) => Qualified UserId -> Data.Conversation -> ConversationMLSData -> @@ -1101,10 +1069,7 @@ processProposal qusr conv mlsMeta msg prop = do storeProposal (msgGroupId msg) (msgEpoch msg) propRef ProposalOriginClient prop checkExternalProposalSignature :: - Members - '[ ErrorS 'MLSUnsupportedProposal - ] - r => + Member (ErrorS 'MLSUnsupportedProposal) r => CipherSuiteTag -> Message 'MLSPlainText -> RawMLS Proposal -> @@ -1123,12 +1088,10 @@ isExternalProposal msg = case msgSender msg of -- check owner/subject of the key package exists and belongs to the user checkExternalProposalUser :: - Members - '[ BrigAccess, - ErrorS 'MLSUnsupportedProposal, - Input (Local ()) - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'MLSUnsupportedProposal) r, + Member (Input (Local ())) r + ) => Qualified UserId -> Proposal -> Sem r () @@ -1322,7 +1285,8 @@ handleNoChanges :: Monoid a => Sem (Error NoChanges ': r) a -> Sem r a handleNoChanges = fmap fold . runError getClientInfo :: - ( Members '[BrigAccess, FederatorAccess] r, + ( Member BrigAccess r, + Member FederatorAccess r, CallsFed 'Brig "get-mls-clients" ) => Local x -> @@ -1348,10 +1312,7 @@ getRemoteMLSClients rusr ss = do -- | Check if the epoch number matches that of a conversation checkEpoch :: - Members - '[ ErrorS 'MLSStaleMessage - ] - r => + Member (ErrorS 'MLSStaleMessage) r => Epoch -> ConversationMLSData -> Sem r () @@ -1411,12 +1372,9 @@ instance withCommitLock :: forall r a. - ( Members - '[ Resource, - ConversationStore, - ErrorS 'MLSStaleMessage - ] - r + ( Member Resource r, + Member ConversationStore r, + Member (ErrorS 'MLSStaleMessage) r ) => GroupId -> Epoch -> diff --git a/services/galley/src/Galley/API/MLS/Removal.hs b/services/galley/src/Galley/API/MLS/Removal.hs index d06971da27..2d34271b21 100644 --- a/services/galley/src/Galley/API/MLS/Removal.hs +++ b/services/galley/src/Galley/API/MLS/Removal.hs @@ -28,7 +28,6 @@ import qualified Data.Map as Map import Data.Qualified import qualified Data.Set as Set import Data.Time -import Galley.API.Error import Galley.API.MLS.Keys (getMLSRemovalKey) import Galley.API.MLS.Propagate import Galley.API.MLS.Types @@ -39,7 +38,6 @@ import Galley.Effects.ProposalStore import Galley.Env import Imports import Polysemy -import Polysemy.Error import Polysemy.Input import Polysemy.TinyLog import qualified System.Logger as Log @@ -52,16 +50,13 @@ import Wire.API.MLS.Serialisation -- | Send remove proposals for a set of clients to clients in the ClientMap. removeClientsWithClientMap :: - ( Members - '[ Input UTCTime, - TinyLog, - ExternalAccess, - FederatorAccess, - GundeckAccess, - ProposalStore, - Input Env - ] - r, + ( Member (Input UTCTime) r, + Member TinyLog r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member ProposalStore r, + Member (Input Env) r, Traversable t, CallsFed 'Galley "on-mls-message-sent" ) => @@ -93,18 +88,14 @@ removeClientsWithClientMap lc cs cm qusr = do -- | Send remove proposals for a single client of a user to the local conversation. removeClient :: - ( Members - '[ Error InternalError, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - MemberStore, - ProposalStore, - TinyLog - ] - r, + ( Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member TinyLog r, CallsFed 'Galley "on-mls-message-sent" ) => Local Data.Conversation -> @@ -121,17 +112,13 @@ removeClient lc qusr cid = do -- -- All clients of the user have to be contained in the ClientMap. removeUserWithClientMap :: - ( Members - '[ Input UTCTime, - TinyLog, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Error InternalError, - ProposalStore, - Input Env - ] - r, + ( Member (Input UTCTime) r, + Member TinyLog r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member ProposalStore r, + Member (Input Env) r, CallsFed 'Galley "on-mls-message-sent" ) => Local Data.Conversation -> @@ -143,18 +130,14 @@ removeUserWithClientMap lc cm qusr = -- | Send remove proposals for all clients of the user to the local conversation. removeUser :: - ( Members - '[ Error InternalError, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - MemberStore, - ProposalStore, - TinyLog - ] - r, + ( Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member TinyLog r, CallsFed 'Galley "on-mls-message-sent" ) => Local Data.Conversation -> diff --git a/services/galley/src/Galley/API/MLS/Util.hs b/services/galley/src/Galley/API/MLS/Util.hs index 1095e1ef62..a678de4440 100644 --- a/services/galley/src/Galley/API/MLS/Util.hs +++ b/services/galley/src/Galley/API/MLS/Util.hs @@ -40,12 +40,10 @@ import Wire.API.MLS.Proposal import Wire.API.MLS.Serialisation getLocalConvForUser :: - Members - '[ ErrorS 'ConvNotFound, - ConversationStore, - MemberStore - ] - r => + ( Member (ErrorS 'ConvNotFound) r, + Member ConversationStore r, + Member MemberStore r + ) => Qualified UserId -> Local ConvId -> Sem r Data.Conversation @@ -59,7 +57,9 @@ getLocalConvForUser qusr lcnv = do pure conv getPendingBackendRemoveProposals :: - Members '[ProposalStore, TinyLog] r => + ( Member ProposalStore r, + Member TinyLog r + ) => GroupId -> Epoch -> Sem r [KeyPackageRef] diff --git a/services/galley/src/Galley/API/MLS/Welcome.hs b/services/galley/src/Galley/API/MLS/Welcome.hs index 84c67b31f9..6db0f26127 100644 --- a/services/galley/src/Galley/API/MLS/Welcome.hs +++ b/services/galley/src/Galley/API/MLS/Welcome.hs @@ -55,15 +55,12 @@ import Wire.API.MLS.Welcome import Wire.API.Message postMLSWelcome :: - ( Members - '[ BrigAccess, - FederatorAccess, - GundeckAccess, - ErrorS 'MLSKeyPackageRefNotFound, - Input UTCTime, - P.TinyLog - ] - r, + ( Member BrigAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (ErrorS 'MLSKeyPackageRefNotFound) r, + Member (Input UTCTime) r, + Member P.TinyLog r, CallsFed 'Galley "mls-welcome" ) => Local x -> @@ -78,17 +75,14 @@ postMLSWelcome loc con wel = do sendRemoteWelcomes (rmRaw wel) remotes postMLSWelcomeFromLocalUser :: - ( Members - '[ BrigAccess, - FederatorAccess, - GundeckAccess, - ErrorS 'MLSKeyPackageRefNotFound, - ErrorS 'MLSNotEnabled, - Input UTCTime, - Input Env, - P.TinyLog - ] - r, + ( Member BrigAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (ErrorS 'MLSKeyPackageRefNotFound) r, + Member (ErrorS 'MLSNotEnabled) r, + Member (Input UTCTime) r, + Member (Input Env) r, + Member P.TinyLog r, CallsFed 'Galley "mls-welcome" ) => Local x -> @@ -100,11 +94,9 @@ postMLSWelcomeFromLocalUser loc con wel = do postMLSWelcome loc (Just con) wel welcomeRecipients :: - Members - '[ BrigAccess, - ErrorS 'MLSKeyPackageRefNotFound - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'MLSKeyPackageRefNotFound) r + ) => Welcome -> Sem r [Qualified (UserId, ClientId)] welcomeRecipients = @@ -116,7 +108,7 @@ welcomeRecipients = . welSecrets sendLocalWelcomes :: - Members '[GundeckAccess] r => + Member GundeckAccess r => Maybe ConnId -> UTCTime -> ByteString -> @@ -135,11 +127,8 @@ sendLocalWelcomes con now rawWelcome lclients = do in newMessagePush lclients mempty con defMessageMetadata (u, c) e sendRemoteWelcomes :: - ( Members - '[ FederatorAccess, - P.TinyLog - ] - r, + ( Member FederatorAccess r, + Member P.TinyLog r, CallsFed 'Galley "mls-welcome" ) => ByteString -> diff --git a/services/galley/src/Galley/API/Mapping.hs b/services/galley/src/Galley/API/Mapping.hs index d6bd3d4392..ac049cd17f 100644 --- a/services/galley/src/Galley/API/Mapping.hs +++ b/services/galley/src/Galley/API/Mapping.hs @@ -36,7 +36,7 @@ import Polysemy import Polysemy.Error import qualified Polysemy.TinyLog as P import System.Logger.Message (msg, val, (+++)) -import Wire.API.Conversation +import Wire.API.Conversation hiding (Member) import qualified Wire.API.Conversation as Conversation import Wire.API.Federation.API.Galley @@ -44,7 +44,9 @@ import Wire.API.Federation.API.Galley -- -- Throws @BadMemberState@ when the user is not part of the conversation. conversationView :: - Members '[Error InternalError, P.TinyLog] r => + ( Member (Error InternalError) r, + Member P.TinyLog r + ) => Local UserId -> Data.Conversation -> Sem r Conversation @@ -57,7 +59,9 @@ conversationView luid conv = do -- from pre-computing the list of @OtherMember@s in the conversation. For -- instance, creating @ConvesationView@ for more than 1 member of the same conversation. conversationViewWithCachedOthers :: - Members '[Error InternalError, P.TinyLog] r => + ( Member (Error InternalError) r, + Member P.TinyLog r + ) => [OtherMember] -> [OtherMember] -> Data.Conversation -> diff --git a/services/galley/src/Galley/API/Message.hs b/services/galley/src/Galley/API/Message.hs index 7484a4c684..2c95afe280 100644 --- a/services/galley/src/Galley/API/Message.hs +++ b/services/galley/src/Galley/API/Message.hs @@ -228,7 +228,7 @@ getRemoteClients remoteMembers = -- FUTUREWORK: sender should be Local UserId postRemoteOtrMessage :: - (Members '[FederatorAccess] r, CallsFed 'Galley "send-message") => + (Member FederatorAccess r, CallsFed 'Galley "send-message") => Qualified UserId -> Remote ConvId -> ByteString -> @@ -244,19 +244,17 @@ postRemoteOtrMessage sender conv rawMsg = do msResponse <$> runFederated conv rpc postBroadcast :: - Members - '[ BrigAccess, - ClientStore, - ErrorS 'TeamNotFound, - ErrorS 'NonBindingTeam, - ErrorS 'BroadcastLimitExceeded, - GundeckAccess, - Input Opts, - Input UTCTime, - TeamStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member ClientStore r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NonBindingTeam) r, + Member (ErrorS 'BroadcastLimitExceeded) r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member TeamStore r, + Member P.TinyLog r + ) => Local UserId -> Maybe ConnId -> QualifiedNewOtrMessage -> @@ -334,7 +332,9 @@ postBroadcast lusr con msg = runError $ do pure otrResult {mssFailedToSend = failedToSend} where maybeFetchLimitedTeamMemberList :: - Members '[ErrorS 'BroadcastLimitExceeded, TeamStore] r => + ( Member (ErrorS 'BroadcastLimitExceeded) r, + Member TeamStore r + ) => Int -> TeamId -> [UserId] -> @@ -347,7 +347,9 @@ postBroadcast lusr con msg = runError $ do throwS @'BroadcastLimitExceeded selectTeamMembers tid localUserIdsToLookup maybeFetchAllMembersInTeam :: - Members '[ErrorS 'BroadcastLimitExceeded, TeamStore] r => + ( Member (ErrorS 'BroadcastLimitExceeded) r, + Member TeamStore r + ) => TeamId -> Sem r [TeamMember] maybeFetchAllMembersInTeam tid = do @@ -357,21 +359,16 @@ postBroadcast lusr con msg = runError $ do pure (mems ^. teamMembers) postQualifiedOtrMessage :: - ( Members - '[ BrigAccess, - ClientStore, - ConversationStore, - FederatorAccess, - GundeckAccess, - ExternalAccess, - Input (Local ()), -- FUTUREWORK: remove this - Input Opts, - Input UTCTime, - MemberStore, - TeamStore, - P.TinyLog - ] - r, + ( Member BrigAccess r, + Member ClientStore r, + Member ConversationStore r, + Member FederatorAccess r, + Member GundeckAccess r, + Member ExternalAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member TeamStore r, + Member P.TinyLog r, CallsFed 'Galley "on-message-sent", CallsFed 'Brig "get-user-clients" ) => @@ -476,7 +473,11 @@ makeUserMap keys = (<> Map.fromSet (const mempty) keys) sendMessages :: forall t r. ( t ~ 'NormalMessage, - Members '[GundeckAccess, ExternalAccess, FederatorAccess, P.TinyLog] r, + ( Member GundeckAccess r, + Member ExternalAccess r, + Member FederatorAccess r, + Member P.TinyLog r + ), CallsFed 'Galley "on-message-sent" ) => UTCTime -> @@ -499,7 +500,7 @@ sendMessages now sender senderClient mconn lcnv botMap metadata messages = do mkQualifiedUserClientsByDomain <$> Map.traverseWithKey send messageMap sendBroadcastMessages :: - Members '[GundeckAccess, P.TinyLog] r => + Member GundeckAccess r => Local x -> UTCTime -> Qualified UserId -> @@ -558,7 +559,10 @@ sendLocalMessages loc now sender senderClient mconn qcnv botMap metadata localMe -- failure, the empty set is returned. sendRemoteMessages :: forall r x. - (Members '[FederatorAccess, P.TinyLog] r, CallsFed 'Galley "on-message-sent") => + ( Member FederatorAccess r, + Member P.TinyLog r, + CallsFed 'Galley "on-message-sent" + ) => Remote x -> UTCTime -> Qualified UserId -> diff --git a/services/galley/src/Galley/API/One2One.hs b/services/galley/src/Galley/API/One2One.hs index 0a8400d862..c2a98414ad 100644 --- a/services/galley/src/Galley/API/One2One.hs +++ b/services/galley/src/Galley/API/One2One.hs @@ -34,7 +34,7 @@ import Galley.Types.ToUserRole import Galley.Types.UserList import Imports import Polysemy -import Wire.API.Conversation +import Wire.API.Conversation hiding (Member) import Wire.API.Conversation.Protocol import Wire.API.Routes.Internal.Galley.ConversationsIntra (Actor (..), DesiredMembership (..), UpsertOne2OneConversationRequest (..), UpsertOne2OneConversationResponse (..)) @@ -54,7 +54,9 @@ newConnectConversationWithRemote creator users = iUpsertOne2OneConversation :: forall r. - Members '[ConversationStore, MemberStore] r => + ( Member ConversationStore r, + Member MemberStore r + ) => UpsertOne2OneConversationRequest -> Sem r UpsertOne2OneConversationResponse iUpsertOne2OneConversation UpsertOne2OneConversationRequest {..} = do diff --git a/services/galley/src/Galley/API/Public/Conversation.hs b/services/galley/src/Galley/API/Public/Conversation.hs index 800c9f4654..04e84afa17 100644 --- a/services/galley/src/Galley/API/Public/Conversation.hs +++ b/services/galley/src/Galley/API/Public/Conversation.hs @@ -54,7 +54,7 @@ conversationAPI = <@> mkNamedAPI @"add-members-to-conversation-unqualified" (callsFed addMembersUnqualified) <@> mkNamedAPI @"add-members-to-conversation-unqualified2" (callsFed addMembersUnqualifiedV2) <@> mkNamedAPI @"add-members-to-conversation" (callsFed addMembers) - <@> mkNamedAPI @"join-conversation-by-id-unqualified" (callsFed (joinConversationById @Cassandra)) + <@> mkNamedAPI @"join-conversation-by-id-unqualified" (callsFed joinConversationById) <@> mkNamedAPI @"join-conversation-by-code-unqualified" (callsFed (joinConversationByReusableCode @Cassandra)) <@> mkNamedAPI @"code-check" (checkReusableCode @Cassandra) <@> mkNamedAPI @"create-conversation-code-unqualified" (addCodeUnqualified @Cassandra) diff --git a/services/galley/src/Galley/API/Public/Feature.hs b/services/galley/src/Galley/API/Public/Feature.hs index a515aa1a96..d2fe3408bd 100644 --- a/services/galley/src/Galley/API/Public/Feature.hs +++ b/services/galley/src/Galley/API/Public/Feature.hs @@ -37,7 +37,7 @@ featureAPI = <@> mkNamedAPI @'("get-deprecated", SearchVisibilityAvailableConfig) (getFeatureStatus @Cassandra . DoAuth) <@> mkNamedAPI @'("put-deprecated", SearchVisibilityAvailableConfig) (setFeatureStatus @Cassandra . DoAuth) <@> mkNamedAPI @"get-search-visibility" getSearchVisibility - <@> mkNamedAPI @"set-search-visibility" (setSearchVisibility @Cassandra (featureEnabledForTeam @Cassandra @SearchVisibilityAvailableConfig)) + <@> mkNamedAPI @"set-search-visibility" (setSearchVisibility (featureEnabledForTeam @Cassandra @SearchVisibilityAvailableConfig)) <@> mkNamedAPI @'("get", ValidateSAMLEmailsConfig) (getFeatureStatus @Cassandra . DoAuth) <@> mkNamedAPI @'("get-deprecated", ValidateSAMLEmailsConfig) (getFeatureStatus @Cassandra . DoAuth) <@> mkNamedAPI @'("get", DigitalSignaturesConfig) (getFeatureStatus @Cassandra . DoAuth) diff --git a/services/galley/src/Galley/API/Public/TeamNotification.hs b/services/galley/src/Galley/API/Public/TeamNotification.hs index 5cdade2c06..6e58383abf 100644 --- a/services/galley/src/Galley/API/Public/TeamNotification.hs +++ b/services/galley/src/Galley/API/Public/TeamNotification.hs @@ -24,13 +24,11 @@ type SizeRange = Range 1 10000 Int32 -- less warped. This is a work-around because we cannot send events to all of a large team. -- See haddocks of module "Galley.API.TeamNotifications" for details. getTeamNotifications :: - Members - '[ BrigAccess, - ErrorS 'TeamNotFound, - ErrorS 'InvalidTeamNotificationId, - TeamNotificationStore - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'InvalidTeamNotificationId) r, + Member TeamNotificationStore r + ) => UserId -> Maybe NotificationId -> Maybe SizeRange -> diff --git a/services/galley/src/Galley/API/Push.hs b/services/galley/src/Galley/API/Push.hs index 73bc8aed6a..0589c2a2f9 100644 --- a/services/galley/src/Galley/API/Push.hs +++ b/services/galley/src/Galley/API/Push.hs @@ -119,7 +119,9 @@ runMessagePush loc mqcnv mp = withSing @t $ \case SBroadcast -> push (broadcastPushes mp) where pushToBots :: - Members '[ExternalAccess, TinyLog] r => + ( Member ExternalAccess r, + Member TinyLog r + ) => [(BotMember, Event)] -> Sem r () pushToBots pushes = for_ mqcnv $ \qcnv -> diff --git a/services/galley/src/Galley/API/Query.hs b/services/galley/src/Galley/API/Query.hs index 9d3be75637..2a08dd27bc 100644 --- a/services/galley/src/Galley/API/Query.hs +++ b/services/galley/src/Galley/API/Query.hs @@ -98,7 +98,10 @@ import Wire.API.Team.Feature as Public hiding (setStatus) import Wire.Sem.Paging.Cassandra getBotConversationH :: - Members '[ConversationStore, ErrorS 'ConvNotFound, Input (Local ())] r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (Input (Local ())) r + ) => BotId ::: ConvId ::: JSON -> Sem r Response getBotConversationH (zbot ::: zcnv ::: _) = do @@ -106,7 +109,9 @@ getBotConversationH (zbot ::: zcnv ::: _) = do json <$> getBotConversation zbot lcnv getBotConversation :: - Members '[ConversationStore, ErrorS 'ConvNotFound] r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r + ) => BotId -> Local ConvId -> Sem r Public.BotConvView @@ -124,14 +129,12 @@ getBotConversation zbot lcnv = do Just (OtherMember (Qualified (lmId m) domain) (lmService m) (lmConvRoleName m)) getUnqualifiedConversation :: - Members - '[ ConversationStore, - ErrorS 'ConvNotFound, - ErrorS 'ConvAccessDenied, - Error InternalError, - P.TinyLog - ] - r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (Error InternalError) r, + Member P.TinyLog r + ) => Local UserId -> ConvId -> Sem r Public.Conversation @@ -141,16 +144,13 @@ getUnqualifiedConversation lusr cnv = do getConversation :: forall r. - ( Members - '[ ConversationStore, - ErrorS 'ConvNotFound, - ErrorS 'ConvAccessDenied, - Error FederationError, - Error InternalError, - FederatorAccess, - P.TinyLog - ] - r, + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member FederatorAccess r, + Member P.TinyLog r, CallsFed 'Galley "get-conversations" ) => Local UserId -> @@ -173,14 +173,11 @@ getConversation lusr cnv = do _convs -> throw $ FederationUnexpectedBody "expected one conversation, got multiple" getRemoteConversations :: - ( Members - '[ ConversationStore, - Error FederationError, - ErrorS 'ConvNotFound, - FederatorAccess, - P.TinyLog - ] - r, + ( Member ConversationStore r, + Member (Error FederationError) r, + Member (ErrorS 'ConvNotFound) r, + Member FederatorAccess r, + Member P.TinyLog r, CallsFed 'Galley "get-conversations" ) => Local UserId -> @@ -197,7 +194,11 @@ data FailedGetConversationReason | FailedGetConversationRemotely FederationError throwFgcrError :: - Members '[ErrorS 'ConvNotFound, Error FederationError] r => FailedGetConversationReason -> Sem r a + ( Member (ErrorS 'ConvNotFound) r, + Member (Error FederationError) r + ) => + FailedGetConversationReason -> + Sem r a throwFgcrError FailedGetConversationLocally = throwS @'ConvNotFound throwFgcrError (FailedGetConversationRemotely e) = throw e @@ -207,7 +208,11 @@ data FailedGetConversation FailedGetConversationReason throwFgcError :: - Members '[ErrorS 'ConvNotFound, Error FederationError] r => FailedGetConversation -> Sem r a + ( Member (ErrorS 'ConvNotFound) r, + Member (Error FederationError) r + ) => + FailedGetConversation -> + Sem r a throwFgcError (FailedGetConversation _ r) = throwFgcrError r failedGetConversationRemotely :: @@ -228,7 +233,9 @@ partitionGetConversationFailures = bimap concat concat . partitionEithers . map split (FailedGetConversation convs (FailedGetConversationRemotely _)) = Right convs getRemoteConversationsWithFailures :: - ( Members '[ConversationStore, FederatorAccess, P.TinyLog] r, + ( Member ConversationStore r, + Member FederatorAccess r, + Member P.TinyLog r, CallsFed 'Galley "get-conversations" ) => Local UserId -> @@ -262,7 +269,7 @@ getRemoteConversationsWithFailures lusr convs = do <$> traverse handleFailure resp where handleFailure :: - Members '[P.TinyLog] r => + Member P.TinyLog r => Either (Remote [ConvId], FederationError) (Remote GetConversationsResponse) -> Sem r (Either FailedGetConversation [Remote RemoteConversation]) handleFailure (Left (rcids, e)) = do @@ -273,7 +280,10 @@ getRemoteConversationsWithFailures lusr convs = do handleFailure (Right c) = pure . Right . traverse gcresConvs $ c getConversationRoles :: - Members '[ConversationStore, ErrorS 'ConvNotFound, ErrorS 'ConvAccessDenied] r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'ConvAccessDenied) r + ) => Local UserId -> ConvId -> Sem r Public.ConversationRolesList @@ -311,15 +321,13 @@ conversationIdsPageFromUnqualified lusr start msize = do conversationIdsPageFromV2 :: forall p r. ( p ~ CassandraPaging, - Members - '[ ConversationStore, - Error InternalError, - Input Env, - ListItems p ConvId, - ListItems p (Remote ConvId), - P.TinyLog - ] - r + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (Input Env) r, + Member (ListItems p ConvId) r, + Member (ListItems p (Remote ConvId)) r, + Member P.TinyLog r + ) ) => ListGlobalSelfConvs -> Local UserId -> @@ -402,15 +410,13 @@ conversationIdsPageFromV2 listGlobalSelf lusr Public.GetMultiTablePageRequest {. conversationIdsPageFrom :: forall p r. ( p ~ CassandraPaging, - Members - '[ ConversationStore, - Error InternalError, - Input Env, - ListItems p ConvId, - ListItems p (Remote ConvId), - P.TinyLog - ] - r + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (Input Env) r, + Member (ListItems p ConvId) r, + Member (ListItems p (Remote ConvId)) r, + Member P.TinyLog r + ) ) => Local UserId -> Public.GetPaginatedConversationIds -> @@ -430,7 +436,11 @@ conversationIdsPageFrom lusr state = do conversationIdsPageFromV2 ListGlobalSelf lusr state getConversations :: - Members '[Error InternalError, ListItems LegacyPaging ConvId, ConversationStore, P.TinyLog] r => + ( Member (Error InternalError) r, + Member (ListItems LegacyPaging ConvId) r, + Member ConversationStore r, + Member P.TinyLog r + ) => Local UserId -> Maybe (Range 1 32 (CommaSeparatedList ConvId)) -> Maybe ConvId -> @@ -441,7 +451,9 @@ getConversations luser mids mstart msize = do flip ConversationList more <$> mapM (Mapping.conversationView luser) cs getConversationsInternal :: - Members '[ConversationStore, ListItems LegacyPaging ConvId] r => + ( Member ConversationStore r, + Member (ListItems LegacyPaging ConvId) r + ) => Local UserId -> Maybe (Range 1 32 (CommaSeparatedList ConvId)) -> Maybe ConvId -> @@ -460,7 +472,9 @@ getConversationsInternal luser mids mstart msize = do -- get ids and has_more flag getIds :: - Members '[ConversationStore, ListItems LegacyPaging ConvId] r => + ( Member ConversationStore r, + Member (ListItems LegacyPaging ConvId) r + ) => Maybe (Range 1 32 (CommaSeparatedList ConvId)) -> Sem r (Bool, [ConvId]) getIds (Just ids) = @@ -482,7 +496,12 @@ getConversationsInternal luser mids mstart msize = do | otherwise = pure True listConversations :: - (Members '[ConversationStore, Error InternalError, FederatorAccess, P.TinyLog] r, CallsFed 'Galley "get-conversations") => + ( Member ConversationStore r, + Member (Error InternalError) r, + Member FederatorAccess r, + Member P.TinyLog r, + CallsFed 'Galley "get-conversations" + ) => Local UserId -> Public.ListConversations -> Sem r Public.ConversationsResponse @@ -535,7 +554,9 @@ listConversations luser (Public.ListConversations ids) = do pure (founds, notFounds) iterateConversations :: - Members '[ListItems LegacyPaging ConvId, ConversationStore] r => + ( Member (ListItems LegacyPaging ConvId) r, + Member ConversationStore r + ) => Local UserId -> Range 1 500 Int32 -> ([Data.Conversation] -> Sem r a) -> @@ -554,7 +575,10 @@ iterateConversations luid pageSize handleConvs = go Nothing pure $ resultHead : resultTail internalGetMemberH :: - Members '[ConversationStore, Input (Local ()), MemberStore] r => + ( Member ConversationStore r, + Member (Input (Local ())) r, + Member MemberStore r + ) => ConvId ::: UserId -> Sem r Response internalGetMemberH (cnv ::: usr) = do @@ -562,7 +586,9 @@ internalGetMemberH (cnv ::: usr) = do json <$> getLocalSelf lusr cnv getLocalSelf :: - Members '[ConversationStore, MemberStore] r => + ( Member ConversationStore r, + Member MemberStore r + ) => Local UserId -> ConvId -> Sem r (Maybe Public.Member) @@ -680,14 +706,12 @@ getConversationGuestLinksFeatureStatus mbTid = do -- the backend removal key). getMLSSelfConversationWithError :: forall r. - Members - '[ ConversationStore, - Error InternalError, - ErrorS 'MLSNotEnabled, - Input Env, - P.TinyLog - ] - r => + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS 'MLSNotEnabled) r, + Member (Input Env) r, + Member P.TinyLog r + ) => Local UserId -> Sem r Conversation getMLSSelfConversationWithError lusr = do @@ -702,13 +726,10 @@ getMLSSelfConversationWithError lusr = do -- number. getMLSSelfConversation :: forall r. - Members - '[ ConversationStore, - Error InternalError, - Input Env, - P.TinyLog - ] - r => + ( Member ConversationStore r, + Member (Error InternalError) r, + Member P.TinyLog r + ) => Local UserId -> Sem r Conversation getMLSSelfConversation lusr = do @@ -720,7 +741,13 @@ getMLSSelfConversation lusr = do ------------------------------------------------------------------------------- -- Helpers -ensureConvAdmin :: Members '[ErrorS 'ConvAccessDenied, ErrorS 'ConvNotFound] r => [LocalMember] -> UserId -> Sem r () +ensureConvAdmin :: + ( Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvNotFound) r + ) => + [LocalMember] -> + UserId -> + Sem r () ensureConvAdmin users uid = case find ((== uid) . lmId) users of Nothing -> throwS @'ConvNotFound diff --git a/services/galley/src/Galley/API/Teams.hs b/services/galley/src/Galley/API/Teams.hs index 3d42884228..18ed8631ea 100644 --- a/services/galley/src/Galley/API/Teams.hs +++ b/services/galley/src/Galley/API/Teams.hs @@ -162,14 +162,18 @@ getTeamH zusr tid = maybe (throwS @'TeamNotFound) pure =<< lookupTeam zusr tid getTeamInternalH :: - Members '[ErrorS 'TeamNotFound, TeamStore] r => + ( Member (ErrorS 'TeamNotFound) r, + Member TeamStore r + ) => TeamId -> Sem r TeamData getTeamInternalH tid = E.getTeam tid >>= noteS @'TeamNotFound getTeamNameInternalH :: - Members '[ErrorS 'TeamNotFound, TeamStore] r => + ( Member (ErrorS 'TeamNotFound) r, + Member TeamStore r + ) => TeamId -> Sem r TeamName getTeamNameInternalH tid = @@ -192,7 +196,10 @@ getTeamNameInternal = fmap (fmap TeamName) . E.getTeamName -- between 1 and 100, and that will always be an upper bound of the result set of size 0 or -- one.) getManyTeams :: - (Members '[TeamStore, Queue DeleteItem, ListItems LegacyPaging TeamId] r) => + ( Member TeamStore r, + Member (Queue DeleteItem) r, + Member (ListItems LegacyPaging TeamId) r + ) => UserId -> Sem r Public.TeamList getManyTeams zusr = @@ -201,7 +208,9 @@ getManyTeams zusr = pure (Public.newTeamList (catMaybes teams) more) lookupTeam :: - Members '[TeamStore, Queue DeleteItem] r => + ( Member TeamStore r, + Member (Queue DeleteItem) r + ) => UserId -> TeamId -> Sem r (Maybe Public.Team) @@ -253,7 +262,10 @@ createNonBindingTeamH zusr zcon (Public.NonBindingNewTeam body) = do pure (team ^. teamId) createBindingTeam :: - Members '[GundeckAccess, Input UTCTime, TeamStore] r => + ( Member GundeckAccess r, + Member (Input UTCTime) r, + Member TeamStore r + ) => TeamId -> UserId -> BindingNewTeam -> @@ -266,16 +278,14 @@ createBindingTeam tid zusr (BindingNewTeam body) = do pure tid updateTeamStatus :: - Members - '[ BrigAccess, - ErrorS 'InvalidTeamStatusUpdate, - ErrorS 'TeamNotFound, - Input Opts, - Input UTCTime, - P.TinyLog, - TeamStore - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'InvalidTeamStatusUpdate) r, + Member (ErrorS 'TeamNotFound) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member P.TinyLog r, + Member TeamStore r + ) => TeamId -> TeamStatusUpdate -> Sem r () @@ -309,14 +319,12 @@ updateTeamStatus tid (TeamStatusUpdate newStatus cur) = do (_, _) -> throwS @'InvalidTeamStatusUpdate updateTeamH :: - Members - '[ ErrorS 'NotATeamMember, - ErrorS ('MissingPermission ('Just 'SetTeamData)), - GundeckAccess, - Input UTCTime, - TeamStore - ] - r => + ( Member (ErrorS 'NotATeamMember) r, + Member (ErrorS ('MissingPermission ('Just 'SetTeamData))) r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member TeamStore r + ) => UserId -> ConnId -> TeamId -> @@ -369,15 +377,13 @@ deleteTeam zusr zcon tid body = do -- This can be called by stern internalDeleteBindingTeam :: - Members - '[ ErrorS 'NoBindingTeam, - ErrorS 'TeamNotFound, - ErrorS 'NotAOneMemberTeam, - ErrorS 'DeleteQueueFull, - Queue DeleteItem, - TeamStore - ] - r => + ( Member (ErrorS 'NoBindingTeam) r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NotAOneMemberTeam) r, + Member (ErrorS 'DeleteQueueFull) r, + Member (Queue DeleteItem) r, + Member TeamStore r + ) => TeamId -> Bool -> Sem r () @@ -397,18 +403,16 @@ internalDeleteBindingTeam tid force = do -- This function is "unchecked" because it does not validate that the user has the `DeleteTeam` permission. uncheckedDeleteTeam :: forall r. - Members - '[ BrigAccess, - ExternalAccess, - GundeckAccess, - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - SparAccess, - TeamStore - ] - r => + ( Member BrigAccess r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member MemberStore r, + Member SparAccess r, + Member TeamStore r + ) => Local UserId -> Maybe ConnId -> TeamId -> @@ -473,7 +477,9 @@ uncheckedDeleteTeam lusr zcon tid = do pure (pp', ee' ++ ee) getTeamConversationRoles :: - Members '[ErrorS 'NotATeamMember, TeamStore] r => + ( Member (ErrorS 'NotATeamMember) r, + Member TeamStore r + ) => UserId -> TeamId -> Sem r Public.ConversationRolesList @@ -484,7 +490,10 @@ getTeamConversationRoles zusr tid = do pure $ Public.ConversationRolesList wireConvRoles getTeamMembers :: - Members '[ErrorS 'NotATeamMember, TeamStore, TeamMemberStore CassandraPaging] r => + ( Member (ErrorS 'NotATeamMember) r, + Member TeamStore r, + Member (TeamMemberStore CassandraPaging) r + ) => Local UserId -> TeamId -> Maybe (Range 1 Public.HardTruncationLimit Int32) -> @@ -514,7 +523,13 @@ outputToStreamingBody action = withWeavingToFinal @IO $ \state weave _inspect -> void . weave . (<$ state) $ runOutputSem writeChunk action getTeamMembersCSV :: - (Members '[BrigAccess, ErrorS 'AccessDenied, TeamMemberStore InternalPaging, TeamStore, Final IO, SparAccess] r) => + ( Member BrigAccess r, + Member (ErrorS 'AccessDenied) r, + Member (TeamMemberStore InternalPaging) r, + Member TeamStore r, + Member (Final IO) r, + Member SparAccess r + ) => Local UserId -> TeamId -> Sem r StreamingBody @@ -625,7 +640,10 @@ getTeamMembersCSV lusr tid = do -- | like 'getTeamMembers', but with an explicit list of users we are to return. bulkGetTeamMembers :: - Members '[ErrorS 'BulkGetMemberLimitExceeded, ErrorS 'NotATeamMember, TeamStore] r => + ( Member (ErrorS 'BulkGetMemberLimitExceeded) r, + Member (ErrorS 'NotATeamMember) r, + Member TeamStore r + ) => Local UserId -> TeamId -> Maybe (Range 1 HardTruncationLimit Int32) -> @@ -641,7 +659,10 @@ bulkGetTeamMembers lzusr tid mbMaxResults uids = do pure $ setOptionalPermsMany withPerms (newTeamMemberList mems hasMore) getTeamMember :: - Members '[ErrorS 'TeamMemberNotFound, ErrorS 'NotATeamMember, TeamStore] r => + ( Member (ErrorS 'TeamMemberNotFound) r, + Member (ErrorS 'NotATeamMember) r, + Member TeamStore r + ) => Local UserId -> TeamId -> UserId -> @@ -655,7 +676,9 @@ getTeamMember lzusr tid uid = do pure $ setOptionalPerms withPerms member uncheckedGetTeamMember :: - Members '[ErrorS 'TeamMemberNotFound, TeamStore] r => + ( Member (ErrorS 'TeamMemberNotFound) r, + Member TeamStore r + ) => TeamId -> UserId -> Sem r TeamMember @@ -679,29 +702,24 @@ uncheckedGetTeamMembers = E.getTeamMembersWithLimit addTeamMember :: forall db r. - ( Members - '[ BrigAccess, - GundeckAccess, - ErrorS 'InvalidPermissions, - ErrorS 'NoAddToBinding, - ErrorS 'NotATeamMember, - ErrorS 'NotConnected, - ErrorS OperationDenied, - ErrorS 'TeamNotFound, - ErrorS 'TooManyTeamMembers, - ErrorS 'UserBindingExists, - ErrorS 'TooManyTeamMembersOnTeamWithLegalhold, - Input (Local ()), - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - TeamFeatureStore db, - TeamNotificationStore, - TeamStore, - P.TinyLog - ] - r, + ( Member BrigAccess r, + Member GundeckAccess r, + Member (ErrorS 'InvalidPermissions) r, + Member (ErrorS 'NoAddToBinding) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'NotConnected) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'TooManyTeamMembers) r, + Member (ErrorS 'UserBindingExists) r, + Member (ErrorS 'TooManyTeamMembersOnTeamWithLegalhold) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member (TeamFeatureStore db) r, + Member TeamNotificationStore r, + Member TeamStore r, + Member P.TinyLog r, FeaturePersistentConstraint db LegalholdConfig ) => Local UserId -> @@ -732,22 +750,17 @@ addTeamMember lzusr zcon tid nmem = do -- This function is "unchecked" because there is no need to check for user binding (invite only). uncheckedAddTeamMember :: forall db r. - ( Members - '[ BrigAccess, - GundeckAccess, - ErrorS 'TooManyTeamMembers, - Input (Local ()), - ErrorS 'TooManyTeamMembersOnTeamWithLegalhold, - Input Opts, - Input UTCTime, - MemberStore, - LegalHoldStore, - P.TinyLog, - TeamFeatureStore db, - TeamNotificationStore, - TeamStore - ] - r, + ( Member BrigAccess r, + Member GundeckAccess r, + Member (ErrorS 'TooManyTeamMembers) r, + Member (ErrorS 'TooManyTeamMembersOnTeamWithLegalhold) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member P.TinyLog r, + Member (TeamFeatureStore db) r, + Member TeamNotificationStore r, + Member TeamStore r, FeaturePersistentConstraint db LegalholdConfig ) => TeamId -> @@ -763,21 +776,15 @@ uncheckedAddTeamMember tid nmem = do uncheckedUpdateTeamMember :: forall r. - Members - '[ BrigAccess, - ErrorS 'AccessDenied, - ErrorS 'InvalidPermissions, - ErrorS 'TeamNotFound, - ErrorS 'TeamMemberNotFound, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - GundeckAccess, - Input Opts, - Input UTCTime, - P.TinyLog, - TeamStore - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'TeamMemberNotFound) r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member P.TinyLog r, + Member TeamStore r + ) => Maybe (Local UserId) -> Maybe ConnId -> TeamId -> @@ -827,21 +834,19 @@ uncheckedUpdateTeamMember mlzusr mZcon tid newMember = do updateTeamMember :: forall r. - Members - '[ BrigAccess, - ErrorS 'AccessDenied, - ErrorS 'InvalidPermissions, - ErrorS 'TeamNotFound, - ErrorS 'TeamMemberNotFound, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - GundeckAccess, - Input Opts, - Input UTCTime, - P.TinyLog, - TeamStore - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'AccessDenied) r, + Member (ErrorS 'InvalidPermissions) r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'TeamMemberNotFound) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member P.TinyLog r, + Member TeamStore r + ) => Local UserId -> ConnId -> TeamId -> @@ -881,25 +886,23 @@ updateTeamMember lzusr zcon tid newMember = do && permissionsRole targetPermissions /= Just RoleOwner deleteTeamMember :: - Members - '[ BrigAccess, - ConversationStore, - Error AuthenticationError, - Error InvalidInput, - ErrorS 'AccessDenied, - ErrorS 'TeamMemberNotFound, - ErrorS 'TeamNotFound, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ExternalAccess, - Input Opts, - Input UTCTime, - GundeckAccess, - MemberStore, - TeamStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error AuthenticationError) r, + Member (Error InvalidInput) r, + Member (ErrorS 'AccessDenied) r, + Member (ErrorS 'TeamMemberNotFound) r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member ExternalAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member GundeckAccess r, + Member MemberStore r, + Member TeamStore r, + Member P.TinyLog r + ) => Local UserId -> ConnId -> TeamId -> @@ -909,25 +912,23 @@ deleteTeamMember :: deleteTeamMember lusr zcon tid remove body = deleteTeamMember' lusr zcon tid remove (Just body) deleteNonBindingTeamMember :: - Members - '[ BrigAccess, - ConversationStore, - Error AuthenticationError, - Error InvalidInput, - ErrorS 'AccessDenied, - ErrorS 'TeamMemberNotFound, - ErrorS 'TeamNotFound, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ExternalAccess, - Input Opts, - Input UTCTime, - GundeckAccess, - MemberStore, - TeamStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error AuthenticationError) r, + Member (Error InvalidInput) r, + Member (ErrorS 'AccessDenied) r, + Member (ErrorS 'TeamMemberNotFound) r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member ExternalAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member GundeckAccess r, + Member MemberStore r, + Member TeamStore r, + Member P.TinyLog r + ) => Local UserId -> ConnId -> TeamId -> @@ -937,25 +938,23 @@ deleteNonBindingTeamMember lusr zcon tid remove = deleteTeamMember' lusr zcon ti -- | 'TeamMemberDeleteData' is only required for binding teams deleteTeamMember' :: - Members - '[ BrigAccess, - ConversationStore, - Error AuthenticationError, - Error InvalidInput, - ErrorS 'AccessDenied, - ErrorS 'TeamMemberNotFound, - ErrorS 'TeamNotFound, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ExternalAccess, - Input Opts, - Input UTCTime, - GundeckAccess, - MemberStore, - TeamStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error AuthenticationError) r, + Member (Error InvalidInput) r, + Member (ErrorS 'AccessDenied) r, + Member (ErrorS 'TeamMemberNotFound) r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member ExternalAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member GundeckAccess r, + Member MemberStore r, + Member TeamStore r, + Member P.TinyLog r + ) => Local UserId -> ConnId -> TeamId -> @@ -998,15 +997,13 @@ deleteTeamMember' lusr zcon tid remove mBody = do -- This function is "unchecked" because it does not validate that the user has the `RemoveTeamMember` permission. uncheckedDeleteTeamMember :: forall r. - Members - '[ ConversationStore, - GundeckAccess, - ExternalAccess, - Input UTCTime, - MemberStore, - TeamStore - ] - r => + ( Member ConversationStore r, + Member GundeckAccess r, + Member ExternalAccess r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TeamStore r + ) => Local UserId -> Maybe ConnId -> TeamId -> @@ -1056,12 +1053,10 @@ uncheckedDeleteTeamMember lusr zcon tid remove mems = do E.deliverAsync (bots `zip` repeat y) getTeamConversations :: - Members - '[ ErrorS 'NotATeamMember, - ErrorS OperationDenied, - TeamStore - ] - r => + ( Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member TeamStore r + ) => UserId -> TeamId -> Sem r Public.TeamConversationList @@ -1074,13 +1069,11 @@ getTeamConversations zusr tid = do Public.newTeamConversationList <$> E.getTeamConversations tid getTeamConversation :: - Members - '[ ErrorS 'ConvNotFound, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - TeamStore - ] - r => + ( Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member TeamStore r + ) => UserId -> TeamId -> ConvId -> @@ -1095,23 +1088,18 @@ getTeamConversation zusr tid cid = do >>= noteS @'ConvNotFound deleteTeamConversation :: - ( Members - '[ CodeStore, - ConversationStore, - Error FederationError, - Error InvalidInput, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotATeamMember, - ErrorS ('ActionDenied 'DeleteConversation), - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - TeamStore - ] - r, + ( Member CodeStore r, + Member ConversationStore r, + Member (Error FederationError) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS ('ActionDenied 'DeleteConversation)) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -1125,13 +1113,11 @@ deleteTeamConversation lusr zcon _tid cid = do void $ API.deleteLocalConversation lusr zcon lconv getSearchVisibility :: - Members - '[ ErrorS 'NotATeamMember, - ErrorS OperationDenied, - SearchVisibilityStore, - TeamStore - ] - r => + ( Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member SearchVisibilityStore r, + Member TeamStore r + ) => Local UserId -> TeamId -> Sem r TeamSearchVisibilityView @@ -1141,18 +1127,13 @@ getSearchVisibility luid tid = do getSearchVisibilityInternal tid setSearchVisibility :: - forall db r. - Members - '[ ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'TeamSearchVisibilityNotEnabled, - Input Opts, - SearchVisibilityStore, - TeamStore, - TeamFeatureStore db, - WaiRoutes - ] - r => + forall r. + ( Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'TeamSearchVisibilityNotEnabled) r, + Member SearchVisibilityStore r, + Member TeamStore r + ) => (TeamId -> Sem r Bool) -> Local UserId -> TeamId -> @@ -1161,7 +1142,7 @@ setSearchVisibility :: setSearchVisibility availableForTeam luid tid req = do zusrMembership <- E.getTeamMember tid (tUnqualified luid) void $ permissionCheck ChangeTeamSearchVisibility zusrMembership - setSearchVisibilityInternal @db availableForTeam tid req + setSearchVisibilityInternal availableForTeam tid req -- Internal ----------------------------------------------------------------- @@ -1196,7 +1177,12 @@ withTeamIds usr range size k = case range of k False ids {-# INLINE withTeamIds #-} -ensureUnboundUsers :: Members '[ErrorS 'UserBindingExists, TeamStore] r => [UserId] -> Sem r () +ensureUnboundUsers :: + ( Member (ErrorS 'UserBindingExists) r, + Member TeamStore r + ) => + [UserId] -> + Sem r () ensureUnboundUsers uids = do -- We check only 1 team because, by definition, users in binding teams -- can only be part of one team. @@ -1206,7 +1192,10 @@ ensureUnboundUsers uids = do throwS @'UserBindingExists ensureNonBindingTeam :: - Members '[ErrorS 'TeamNotFound, ErrorS 'NoAddToBinding, TeamStore] r => + ( Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NoAddToBinding) r, + Member TeamStore r + ) => TeamId -> Sem r () ensureNonBindingTeam tid = do @@ -1225,7 +1214,10 @@ ensureNotElevated targetPermissions member = $ throwS @'InvalidPermissions ensureNotTooLarge :: - Members '[BrigAccess, ErrorS 'TooManyTeamMembers, Input Opts] r => + ( Member BrigAccess r, + Member (ErrorS 'TooManyTeamMembers) r, + Member (Input Opts) r + ) => TeamId -> Sem r TeamSize ensureNotTooLarge tid = do @@ -1246,13 +1238,10 @@ ensureNotTooLarge tid = do -- FUTUREWORK: Find a way around the fanout limit. ensureNotTooLargeForLegalHold :: forall db r. - ( Members - '[ LegalHoldStore, - TeamStore, - TeamFeatureStore db, - ErrorS 'TooManyTeamMembersOnTeamWithLegalhold - ] - r, + ( Member LegalHoldStore r, + Member TeamStore r, + Member (TeamFeatureStore db) r, + Member (ErrorS 'TooManyTeamMembersOnTeamWithLegalhold) r, FeaturePersistentConstraint db LegalholdConfig ) => TeamId -> @@ -1264,7 +1253,10 @@ ensureNotTooLargeForLegalHold tid teamSize = throwS @'TooManyTeamMembersOnTeamWithLegalhold ensureNotTooLargeToActivateLegalHold :: - Members '[BrigAccess, ErrorS 'CannotEnableLegalHoldServiceLargeTeam, TeamStore] r => + ( Member BrigAccess r, + Member (ErrorS 'CannotEnableLegalHoldServiceLargeTeam) r, + Member TeamStore r + ) => TeamId -> Sem r () ensureNotTooLargeToActivateLegalHold tid = do @@ -1284,19 +1276,15 @@ teamSizeBelowLimit teamSize = do pure True addTeamMemberInternal :: - Members - '[ BrigAccess, - ErrorS 'TooManyTeamMembers, - GundeckAccess, - Input (Local ()), - Input Opts, - Input UTCTime, - MemberStore, - TeamNotificationStore, - TeamStore, - P.TinyLog - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'TooManyTeamMembers) r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member TeamNotificationStore r, + Member TeamStore r, + Member P.TinyLog r + ) => TeamId -> Maybe UserId -> Maybe ConnId -> @@ -1326,7 +1314,10 @@ addTeamMemberInternal tid origin originConn (ntmNewTeamMember -> new) memList = (membersToRecipients Nothing (memList ^. teamMembers)) finishCreateTeam :: - Members '[GundeckAccess, Input UTCTime, TeamStore] r => + ( Member GundeckAccess r, + Member (Input UTCTime) r, + Member TeamStore r + ) => Team -> TeamMember -> [TeamMember] -> @@ -1342,24 +1333,28 @@ finishCreateTeam team owner others zcon = do E.push1 $ newPushLocal1 ListComplete zusr (TeamEvent e) (list1 (userRecipient zusr) r) & pushConn .~ zcon getBindingTeamIdH :: - Members '[ErrorS 'TeamNotFound, ErrorS 'NonBindingTeam, TeamStore] r => + ( Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NonBindingTeam) r, + Member TeamStore r + ) => UserId -> Sem r Response getBindingTeamIdH = fmap json . E.lookupBindingTeam getBindingTeamMembersH :: - Members '[ErrorS 'TeamNotFound, ErrorS 'NonBindingTeam, TeamStore] r => + ( Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NonBindingTeam) r, + Member TeamStore r + ) => UserId -> Sem r Response getBindingTeamMembersH = fmap json . getBindingTeamMembers getBindingTeamMembers :: - Members - '[ ErrorS 'TeamNotFound, - ErrorS 'NonBindingTeam, - TeamStore - ] - r => + ( Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NonBindingTeam) r, + Member TeamStore r + ) => UserId -> Sem r TeamMemberList getBindingTeamMembers zusr = do @@ -1381,14 +1376,11 @@ getBindingTeamMembers zusr = do -- RegisterError`. canUserJoinTeam :: forall db r. - ( Members - '[ BrigAccess, - LegalHoldStore, - TeamStore, - TeamFeatureStore db, - ErrorS 'TooManyTeamMembersOnTeamWithLegalhold - ] - r, + ( Member BrigAccess r, + Member LegalHoldStore r, + Member TeamStore r, + Member (TeamFeatureStore db) r, + Member (ErrorS 'TooManyTeamMembersOnTeamWithLegalhold) r, FeaturePersistentConstraint db LegalholdConfig ) => TeamId -> @@ -1409,14 +1401,10 @@ getSearchVisibilityInternal = . SearchVisibilityData.getSearchVisibility setSearchVisibilityInternal :: - forall db r. - Members - '[ ErrorS 'TeamSearchVisibilityNotEnabled, - Input Opts, - SearchVisibilityStore, - TeamFeatureStore db - ] - r => + forall r. + ( Member (ErrorS 'TeamSearchVisibilityNotEnabled) r, + Member SearchVisibilityStore r + ) => (TeamId -> Sem r Bool) -> TeamId -> TeamSearchVisibilityView -> @@ -1427,14 +1415,12 @@ setSearchVisibilityInternal availableForTeam tid (TeamSearchVisibilityView searc SearchVisibilityData.setSearchVisibility tid searchVisibility userIsTeamOwner :: - Members - '[ ErrorS 'TeamMemberNotFound, - ErrorS 'AccessDenied, - ErrorS 'NotATeamMember, - Input (Local ()), - TeamStore - ] - r => + ( Member (ErrorS 'TeamMemberNotFound) r, + Member (ErrorS 'AccessDenied) r, + Member (ErrorS 'NotATeamMember) r, + Member (Input (Local ())) r, + Member TeamStore r + ) => TeamId -> UserId -> Sem r () @@ -1445,7 +1431,9 @@ userIsTeamOwner tid uid = do -- Queues a team for async deletion queueTeamDeletion :: - Members '[ErrorS 'DeleteQueueFull, Queue DeleteItem] r => + ( Member (ErrorS 'DeleteQueueFull) r, + Member (Queue DeleteItem) r + ) => TeamId -> UserId -> Maybe ConnId -> diff --git a/services/galley/src/Galley/API/Teams/Features.hs b/services/galley/src/Galley/API/Teams/Features.hs index ba60284b86..6b3f313b1b 100644 --- a/services/galley/src/Galley/API/Teams/Features.hs +++ b/services/galley/src/Galley/API/Teams/Features.hs @@ -88,25 +88,29 @@ data DoAuth = DoAuth UserId | DontDoAuth -- | Don't export methods of this typeclass class GetFeatureConfig (db :: Type) cfg where type GetConfigForTeamConstraints db cfg (r :: EffectRow) :: Constraint - type GetConfigForTeamConstraints db cfg (r :: EffectRow) = (FeaturePersistentConstraint db cfg, Members '[Input Opts, TeamFeatureStore db] r) + type + GetConfigForTeamConstraints db cfg (r :: EffectRow) = + ( FeaturePersistentConstraint db cfg, + ( Member (Input Opts) r, + Member (TeamFeatureStore db) r + ) + ) type GetConfigForUserConstraints db cfg (r :: EffectRow) :: Constraint type GetConfigForUserConstraints db cfg (r :: EffectRow) = ( FeaturePersistentConstraint db cfg, - Members - '[ Input Opts, - ErrorS OperationDenied, - ErrorS 'NotATeamMember, - ErrorS 'TeamNotFound, - TeamStore, - TeamFeatureStore db - ] - r + ( Member (Input Opts) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TeamNotFound) r, + Member TeamStore r, + Member (TeamFeatureStore db) r + ) ) getConfigForServer :: - Members '[Input Opts] r => + Member (Input Opts) r => Sem r (WithStatus cfg) -- only override if there is additional business logic for getting the feature config -- and/or if the feature flag is configured for the backend in 'FeatureFlags' for galley in 'Galley.Types.Teams' @@ -119,7 +123,11 @@ class GetFeatureConfig (db :: Type) cfg where TeamId -> Sem r (WithStatus cfg) default getConfigForTeam :: - (FeaturePersistentConstraint db cfg, Members '[Input Opts, TeamFeatureStore db] r) => + ( FeaturePersistentConstraint db cfg, + ( Member (Input Opts) r, + Member (TeamFeatureStore db) r + ) + ) => TeamId -> Sem r (WithStatus cfg) getConfigForTeam = genericGetConfigForTeam @db @@ -130,15 +138,13 @@ class GetFeatureConfig (db :: Type) cfg where Sem r (WithStatus cfg) default getConfigForUser :: ( FeaturePersistentConstraint db cfg, - Members - '[ Input Opts, - ErrorS OperationDenied, - ErrorS 'NotATeamMember, - ErrorS 'TeamNotFound, - TeamStore, - TeamFeatureStore db - ] - r + ( Member (Input Opts) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TeamNotFound) r, + Member TeamStore r, + Member (TeamFeatureStore db) r + ) ) => UserId -> Sem r (WithStatus cfg) @@ -156,13 +162,11 @@ class GetFeatureConfig (db :: Type) cfg => SetFeatureConfig (db :: Type) cfg whe ( SetConfigForTeamConstraints db cfg r, GetConfigForTeamConstraints db cfg r, FeaturePersistentConstraint db cfg, - Members - '[ TeamFeatureStore db, - P.Logger (Log.Msg -> Log.Msg), - GundeckAccess, - TeamStore - ] - r + ( Member (TeamFeatureStore db) r, + Member (P.Logger (Log.Msg -> Log.Msg)) r, + Member GundeckAccess r, + Member TeamStore r + ) ) => TeamId -> WithStatusNoLock cfg -> @@ -191,13 +195,11 @@ getFeatureStatus :: forall db cfg r. ( GetFeatureConfig db cfg, GetConfigForTeamConstraints db cfg r, - Members - '[ ErrorS OperationDenied, - ErrorS 'NotATeamMember, - ErrorS 'TeamNotFound, - TeamStore - ] - r + ( Member (ErrorS OperationDenied) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TeamNotFound) r, + Member TeamStore r + ) ) => DoAuth -> TeamId -> @@ -214,11 +216,9 @@ getFeatureStatusMulti :: forall db cfg r. ( GetFeatureConfig db cfg, FeaturePersistentConstraint db cfg, - Members - '[ Input Opts, - TeamFeatureStore db - ] - r + ( Member (Input Opts) r, + Member (TeamFeatureStore db) r + ) ) => Multi.TeamFeatureNoConfigMultiRequest -> Sem r (Multi.TeamFeatureNoConfigMultiResponse cfg) @@ -236,17 +236,15 @@ patchFeatureStatusInternal :: GetConfigForTeamConstraints db cfg r, SetConfigForTeamConstraints db cfg r, FeaturePersistentConstraint db cfg, - Members - '[ ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'TeamNotFound, - Error TeamFeatureError, - TeamStore, - TeamFeatureStore db, - P.Logger (Log.Msg -> Log.Msg), - GundeckAccess - ] - r + ( Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'TeamNotFound) r, + Member (Error TeamFeatureError) r, + Member TeamStore r, + Member (TeamFeatureStore db) r, + Member (P.Logger (Log.Msg -> Log.Msg)) r, + Member GundeckAccess r + ) ) => TeamId -> WithStatusPatch cfg -> @@ -271,17 +269,15 @@ setFeatureStatus :: GetConfigForTeamConstraints db cfg r, SetConfigForTeamConstraints db cfg r, FeaturePersistentConstraint db cfg, - Members - '[ ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'TeamNotFound, - Error TeamFeatureError, - TeamStore, - TeamFeatureStore db, - P.Logger (Log.Msg -> Log.Msg), - GundeckAccess - ] - r + ( Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'TeamNotFound) r, + Member (Error TeamFeatureError) r, + Member TeamStore r, + Member (TeamFeatureStore db) r, + Member (P.Logger (Log.Msg -> Log.Msg)) r, + Member GundeckAccess r + ) ) => DoAuth -> TeamId -> @@ -303,17 +299,15 @@ setFeatureStatusInternal :: GetConfigForTeamConstraints db cfg r, SetConfigForTeamConstraints db cfg r, FeaturePersistentConstraint db cfg, - Members - '[ ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'TeamNotFound, - Error TeamFeatureError, - TeamStore, - TeamFeatureStore db, - P.Logger (Log.Msg -> Log.Msg), - GundeckAccess - ] - r + ( Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'TeamNotFound) r, + Member (Error TeamFeatureError) r, + Member TeamStore r, + Member (TeamFeatureStore db) r, + Member (P.Logger (Log.Msg -> Log.Msg)) r, + Member GundeckAccess r + ) ) => TeamId -> WithStatusNoLock cfg -> @@ -341,13 +335,9 @@ updateLockStatus tid lockStatus = do -- In `getConfigForUser` this is mostly also the case. But there are exceptions, e.g. `ConferenceCallingConfig` getFeatureStatusForUser :: forall (db :: Type) cfg r. - ( Members - '[ ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'TeamNotFound, - TeamStore - ] - r, + ( Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TeamNotFound) r, + Member TeamStore r, GetConfigForTeamConstraints db cfg r, GetConfigForUserConstraints db cfg r, GetFeatureConfig db cfg @@ -367,17 +357,15 @@ getFeatureStatusForUser zusr = do getAllFeatureConfigsForUser :: forall db r. - Members - '[ BrigAccess, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - ErrorS 'TeamNotFound, - Input Opts, - LegalHoldStore, - TeamFeatureStore db, - TeamStore - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'TeamNotFound) r, + Member (Input Opts) r, + Member LegalHoldStore r, + Member (TeamFeatureStore db) r, + Member TeamStore r + ) => FeaturePersistentAllFeatures db => UserId -> Sem r AllFeatureConfigs @@ -394,16 +382,12 @@ getAllFeatureConfigsForUser zusr = do getAllFeatureConfigsForTeam :: forall db r. - Members - '[ BrigAccess, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - Input Opts, - LegalHoldStore, - TeamFeatureStore db, - TeamStore - ] - r => + ( Member (ErrorS 'NotATeamMember) r, + Member (Input Opts) r, + Member LegalHoldStore r, + Member (TeamFeatureStore db) r, + Member TeamStore r + ) => FeaturePersistentAllFeatures db => Local UserId -> TeamId -> @@ -414,51 +398,39 @@ getAllFeatureConfigsForTeam luid tid = do getAllFeatureConfigsTeam @db tid getAllFeatureConfigsForServer :: - forall db r. - Members - '[ BrigAccess, - ErrorS 'NotATeamMember, - ErrorS 'TeamNotFound, - ErrorS OperationDenied, - Input Opts, - LegalHoldStore, - TeamFeatureStore db, - TeamStore - ] - r => + forall r. + Member (Input Opts) r => Sem r AllFeatureConfigs getAllFeatureConfigsForServer = AllFeatureConfigs - <$> getConfigForServer @db @LegalholdConfig - <*> getConfigForServer @db @SSOConfig - <*> getConfigForServer @db @SearchVisibilityAvailableConfig - <*> getConfigForServer @db @SearchVisibilityInboundConfig - <*> getConfigForServer @db @ValidateSAMLEmailsConfig - <*> getConfigForServer @db @DigitalSignaturesConfig - <*> getConfigForServer @db @AppLockConfig - <*> getConfigForServer @db @FileSharingConfig - <*> getConfigForServer @db @ClassifiedDomainsConfig - <*> getConfigForServer @db @ConferenceCallingConfig - <*> getConfigForServer @db @SelfDeletingMessagesConfig - <*> getConfigForServer @db @GuestLinksConfig - <*> getConfigForServer @db @SndFactorPasswordChallengeConfig - <*> getConfigForServer @db @MLSConfig - <*> getConfigForServer @db @ExposeInvitationURLsToTeamAdminConfig - <*> getConfigForServer @db @OutlookCalIntegrationConfig + <$> getConfigForServer @LegalholdConfig + <*> getConfigForServer @SSOConfig + <*> getConfigForServer @SearchVisibilityAvailableConfig + <*> getConfigForServer @SearchVisibilityInboundConfig + <*> getConfigForServer @ValidateSAMLEmailsConfig + <*> getConfigForServer @DigitalSignaturesConfig + <*> getConfigForServer @AppLockConfig + <*> getConfigForServer @FileSharingConfig + <*> getConfigForServer @ClassifiedDomainsConfig + <*> getConfigForServer @ConferenceCallingConfig + <*> getConfigForServer @SelfDeletingMessagesConfig + <*> getConfigForServer @GuestLinksConfig + <*> getConfigForServer @SndFactorPasswordChallengeConfig + <*> getConfigForServer @MLSConfig + <*> getConfigForServer @ExposeInvitationURLsToTeamAdminConfig + <*> getConfigForServer @OutlookCalIntegrationConfig getAllFeatureConfigsUser :: forall db r. - Members - '[ BrigAccess, - ErrorS 'NotATeamMember, - ErrorS 'TeamNotFound, - ErrorS OperationDenied, - Input Opts, - LegalHoldStore, - TeamFeatureStore db, - TeamStore - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS OperationDenied) r, + Member (Input Opts) r, + Member LegalHoldStore r, + Member (TeamFeatureStore db) r, + Member TeamStore r + ) => FeaturePersistentAllFeatures db => UserId -> Sem r AllFeatureConfigs @@ -483,16 +455,11 @@ getAllFeatureConfigsUser uid = getAllFeatureConfigsTeam :: forall db r. - Members - '[ BrigAccess, - ErrorS 'NotATeamMember, - ErrorS OperationDenied, - Input Opts, - LegalHoldStore, - TeamFeatureStore db, - TeamStore - ] - r => + ( Member (Input Opts) r, + Member LegalHoldStore r, + Member (TeamFeatureStore db) r, + Member TeamStore r + ) => FeaturePersistentAllFeatures db => TeamId -> Sem r AllFeatureConfigs @@ -520,8 +487,8 @@ genericGetConfigForTeam :: forall db cfg r. GetFeatureConfig db cfg => FeaturePersistentConstraint db cfg => - Members '[TeamFeatureStore db] r => - Members '[Input Opts] r => + Member (TeamFeatureStore db) r => + Member (Input Opts) r => TeamId -> Sem r (WithStatus cfg) genericGetConfigForTeam tid = do @@ -535,8 +502,8 @@ genericGetConfigForMultiTeam :: forall db cfg r. GetFeatureConfig db cfg => FeaturePersistentConstraint db cfg => - Members '[TeamFeatureStore db] r => - Members '[Input Opts] r => + Member (TeamFeatureStore db) r => + Member (Input Opts) r => [TeamId] -> Sem r [(TeamId, WithStatus cfg)] genericGetConfigForMultiTeam tids = do @@ -548,15 +515,11 @@ genericGetConfigForMultiTeam tids = do genericGetConfigForUser :: forall db cfg r. FeaturePersistentConstraint db cfg => - ( Members - '[ Input Opts, - TeamFeatureStore db, - ErrorS OperationDenied, - ErrorS 'NotATeamMember, - ErrorS 'TeamNotFound, - TeamStore - ] - r, + ( Member (Input Opts) r, + Member (TeamFeatureStore db) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TeamNotFound) r, + Member TeamStore r, GetFeatureConfig db cfg ) => UserId -> @@ -580,13 +543,11 @@ persistAndPushEvent :: GetFeatureConfig db cfg, FeaturePersistentConstraint db cfg, GetConfigForTeamConstraints db cfg r, - Members - '[ TeamFeatureStore db, - P.Logger (Log.Msg -> Log.Msg), - GundeckAccess, - TeamStore - ] - r + ( Member (TeamFeatureStore db) r, + Member (P.Logger (Log.Msg -> Log.Msg)) r, + Member GundeckAccess r, + Member TeamStore r + ) ) => TeamId -> WithStatusNoLock cfg -> @@ -598,7 +559,10 @@ persistAndPushEvent tid wsnl = do pure fs pushFeatureConfigEvent :: - Members '[GundeckAccess, TeamStore, P.TinyLog] r => + ( Member GundeckAccess r, + Member TeamStore r, + Member P.TinyLog r + ) => TeamId -> Event.Event -> Sem r () @@ -638,7 +602,7 @@ instance GetFeatureConfig db SSOConfig where getConfigForUser = genericGetConfigForUser @db instance SetFeatureConfig db SSOConfig where - type SetConfigForTeamConstraints db SSOConfig (r :: EffectRow) = (Members '[Error TeamFeatureError] r) + type SetConfigForTeamConstraints db SSOConfig (r :: EffectRow) = (Member (Error TeamFeatureError) r) setConfigForTeam tid wsnl = do case wssStatus wsnl of @@ -655,7 +619,7 @@ instance GetFeatureConfig db SearchVisibilityAvailableConfig where pure $ setStatus status defFeatureStatus instance SetFeatureConfig db SearchVisibilityAvailableConfig where - type SetConfigForTeamConstraints db SearchVisibilityAvailableConfig (r :: EffectRow) = (Members '[SearchVisibilityStore] r) + type SetConfigForTeamConstraints db SearchVisibilityAvailableConfig (r :: EffectRow) = (Member SearchVisibilityStore r) setConfigForTeam tid wsnl = do case wssStatus wsnl of @@ -679,21 +643,23 @@ instance GetFeatureConfig db LegalholdConfig where type GetConfigForTeamConstraints db LegalholdConfig (r :: EffectRow) = ( FeaturePersistentConstraint db LegalholdConfig, - Members '[Input Opts, TeamFeatureStore db, LegalHoldStore, TeamStore] r + ( Member (Input Opts) r, + Member (TeamFeatureStore db) r, + Member LegalHoldStore r, + Member TeamStore r + ) ) type GetConfigForUserConstraints db LegalholdConfig (r :: EffectRow) = ( FeaturePersistentConstraint db LegalholdConfig, - Members - '[ Input Opts, - TeamFeatureStore db, - LegalHoldStore, - TeamStore, - ErrorS OperationDenied, - ErrorS 'NotATeamMember, - ErrorS 'TeamNotFound - ] - r + ( Member (Input Opts) r, + Member (TeamFeatureStore db) r, + Member LegalHoldStore r, + Member TeamStore r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TeamNotFound) r + ) ) getConfigForTeam tid = do @@ -713,39 +679,37 @@ instance type SetConfigForTeamConstraints db LegalholdConfig (r :: EffectRow) = ( Bounded (PagingBounds InternalPaging TeamMember), - Members - '[ BotAccess, - BrigAccess, - CodeStore, - ConversationStore, - Error AuthenticationError, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'CannotEnableLegalHoldServiceLargeTeam, - ErrorS 'NotATeamMember, - Error TeamFeatureError, - ErrorS 'LegalHoldNotEnabled, - ErrorS 'LegalHoldDisableUnimplemented, - ErrorS 'LegalHoldServiceNotRegistered, - ErrorS 'UserLegalHoldIllegalOperation, - ErrorS 'LegalHoldCouldNotBlockConnections, - ExternalAccess, - FederatorAccess, - FireAndForget, - GundeckAccess, - Input (Local ()), - Input Env, - Input UTCTime, - LegalHoldStore, - ListItems LegacyPaging ConvId, - MemberStore, - ProposalStore, - TeamFeatureStore db, - TeamStore, - TeamMemberStore InternalPaging, - P.TinyLog - ] - r, + ( Member BotAccess r, + Member BrigAccess r, + Member CodeStore r, + Member ConversationStore r, + Member (Error AuthenticationError) r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'CannotEnableLegalHoldServiceLargeTeam) r, + Member (ErrorS 'NotATeamMember) r, + Member (Error TeamFeatureError) r, + Member (ErrorS 'LegalHoldNotEnabled) r, + Member (ErrorS 'LegalHoldDisableUnimplemented) r, + Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member (ErrorS 'UserLegalHoldIllegalOperation) r, + Member (ErrorS 'LegalHoldCouldNotBlockConnections) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member FireAndForget r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member (ListItems LegacyPaging ConvId) r, + Member MemberStore r, + Member ProposalStore r, + Member (TeamFeatureStore db) r, + Member TeamStore r, + Member (TeamMemberStore InternalPaging) r, + Member P.TinyLog r + ), FeaturePersistentConstraint db LegalholdConfig ) @@ -780,7 +744,7 @@ instance GetFeatureConfig db AppLockConfig where input <&> view (optSettings . setFeatureFlags . flagAppLockDefaults . unDefaults . unImplicitLockStatus) instance SetFeatureConfig db AppLockConfig where - type SetConfigForTeamConstraints db AppLockConfig r = Members '[Error TeamFeatureError] r + type SetConfigForTeamConstraints db AppLockConfig r = Member (Error TeamFeatureError) r setConfigForTeam tid wsnl = do when ((applockInactivityTimeoutSecs . wssConfig $ wsnl) < 30) $ @@ -795,16 +759,14 @@ instance GetFeatureConfig db ConferenceCallingConfig where type GetConfigForUserConstraints db ConferenceCallingConfig r = ( FeaturePersistentConstraint db ConferenceCallingConfig, - Members - '[ Input Opts, - ErrorS OperationDenied, - ErrorS 'NotATeamMember, - ErrorS 'TeamNotFound, - TeamStore, - TeamFeatureStore db, - BrigAccess - ] - r + ( Member (Input Opts) r, + Member (ErrorS OperationDenied) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TeamNotFound) r, + Member TeamStore r, + Member (TeamFeatureStore db) r, + Member BrigAccess r + ) ) getConfigForServer = @@ -839,7 +801,7 @@ instance GetFeatureConfig db SndFactorPasswordChallengeConfig where input <&> view (optSettings . setFeatureFlags . flagTeamFeatureSndFactorPasswordChallengeStatus . unDefaults) instance SetFeatureConfig db SearchVisibilityInboundConfig where - type SetConfigForTeamConstraints db SearchVisibilityInboundConfig (r :: EffectRow) = (Members '[BrigAccess] r) + type SetConfigForTeamConstraints db SearchVisibilityInboundConfig (r :: EffectRow) = (Member BrigAccess r) setConfigForTeam tid wsnl = do updateSearchVisibilityInbound $ toTeamStatus tid wsnl persistAndPushEvent @db tid wsnl @@ -924,13 +886,11 @@ featureEnabledForTeam :: forall db cfg r. ( GetFeatureConfig db cfg, GetConfigForTeamConstraints db cfg r, - Members - '[ ErrorS OperationDenied, - ErrorS 'NotATeamMember, - ErrorS 'TeamNotFound, - TeamStore - ] - r + ( Member (ErrorS OperationDenied) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TeamNotFound) r, + Member TeamStore r + ) ) => TeamId -> Sem r Bool diff --git a/services/galley/src/Galley/API/Teams/Notifications.hs b/services/galley/src/Galley/API/Teams/Notifications.hs index fe32f47ecd..8d34b4bedc 100644 --- a/services/galley/src/Galley/API/Teams/Notifications.hs +++ b/services/galley/src/Galley/API/Teams/Notifications.hs @@ -57,7 +57,10 @@ import Wire.API.Internal.Notification import Wire.API.User getTeamNotifications :: - Members '[BrigAccess, ErrorS 'TeamNotFound, TeamNotificationStore] r => + ( Member BrigAccess r, + Member (ErrorS 'TeamNotFound) r, + Member TeamNotificationStore r + ) => UserId -> Maybe NotificationId -> Range 1 10000 Int32 -> diff --git a/services/galley/src/Galley/API/Update.hs b/services/galley/src/Galley/API/Update.hs index 06133de467..06193bd8cc 100644 --- a/services/galley/src/Galley/API/Update.hs +++ b/services/galley/src/Galley/API/Update.hs @@ -138,19 +138,16 @@ import Wire.API.Team.Member import Wire.API.User.Client acceptConvH :: - Members - '[ ConversationStore, - Error InternalError, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - GundeckAccess, - Input (Local ()), - Input UTCTime, - MemberStore, - TinyLog - ] - r => + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TinyLog r + ) => UserId ::: Maybe ConnId ::: ConvId -> Sem r Response acceptConvH (usr ::: conn ::: cnv) = do @@ -158,18 +155,15 @@ acceptConvH (usr ::: conn ::: cnv) = do setStatus status200 . json <$> acceptConv lusr conn cnv acceptConv :: - Members - '[ ConversationStore, - Error InternalError, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - GundeckAccess, - Input UTCTime, - MemberStore, - TinyLog - ] - r => + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TinyLog r + ) => Local UserId -> Maybe ConnId -> ConvId -> @@ -181,26 +175,22 @@ acceptConv lusr conn cnv = do conversationView lusr conv' blockConvH :: - Members - '[ ConversationStore, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - MemberStore - ] - r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member MemberStore r + ) => UserId ::: ConvId -> Sem r Response blockConvH (zusr ::: cnv) = empty <$ blockConv zusr cnv blockConv :: - Members - '[ ConversationStore, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - MemberStore - ] - r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member MemberStore r + ) => UserId -> ConvId -> Sem r () @@ -213,19 +203,16 @@ blockConv zusr cnv = do E.deleteMembers cnv (UserList [zusr] []) unblockConvH :: - Members - '[ ConversationStore, - Error InternalError, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - GundeckAccess, - Input (Local ()), - Input UTCTime, - MemberStore, - TinyLog - ] - r => + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TinyLog r + ) => UserId ::: Maybe ConnId ::: ConvId -> Sem r Response unblockConvH (usr ::: conn ::: cnv) = do @@ -233,18 +220,15 @@ unblockConvH (usr ::: conn ::: cnv) = do setStatus status200 . json <$> unblockConv lusr conn cnv unblockConv :: - Members - '[ ConversationStore, - Error InternalError, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - GundeckAccess, - Input UTCTime, - MemberStore, - TinyLog - ] - r => + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TinyLog r + ) => Local UserId -> Maybe ConnId -> ConvId -> @@ -325,23 +309,19 @@ updateConversationAccessUnqualified lusr con cnv update = update updateConversationReceiptMode :: - ( Members - '[ BrigAccess, - ConversationStore, - Error FederationError, - ErrorS ('ActionDenied 'ModifyConversationReceiptMode), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input (Local ()), - Input Env, - Input UTCTime, - MemberStore, - TinyLog - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error FederationError) r, + Member (ErrorS ('ActionDenied 'ModifyConversationReceiptMode)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TinyLog r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation", CallsFed 'Galley "update-conversation" @@ -368,17 +348,13 @@ updateConversationReceiptMode lusr zcon qcnv update = updateRemoteConversation :: forall tag r. - ( Members - '[ BrigAccess, - Error FederationError, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input (Local ()), - MemberStore, - TinyLog - ] - r, + ( Member BrigAccess r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member MemberStore r, + Member TinyLog r, RethrowErrors (HasConversationActionGalleyErrors tag) (Error NoChanges : r), SingI tag, CallsFed 'Galley "update-conversation" @@ -405,23 +381,19 @@ updateRemoteConversation rcnv lusr conn action = getUpdateResult $ do notifyRemoteConversationAction lusr (qualifyAs rcnv convUpdate) (Just conn) updateConversationReceiptModeUnqualified :: - ( Members - '[ BrigAccess, - ConversationStore, - Error FederationError, - ErrorS ('ActionDenied 'ModifyConversationReceiptMode), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input (Local ()), - Input Env, - Input UTCTime, - MemberStore, - TinyLog - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error FederationError) r, + Member (ErrorS ('ActionDenied 'ModifyConversationReceiptMode)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TinyLog r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation", CallsFed 'Galley "update-conversation" @@ -434,19 +406,15 @@ updateConversationReceiptModeUnqualified :: updateConversationReceiptModeUnqualified lusr zcon cnv = updateConversationReceiptMode lusr zcon (tUntagged (qualifyAs lusr cnv)) updateConversationMessageTimer :: - ( Members - '[ ConversationStore, - ErrorS ('ActionDenied 'ModifyConversationMessageTimer), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - Error FederationError, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime - ] - r, + ( Member ConversationStore r, + Member (ErrorS ('ActionDenied 'ModifyConversationMessageTimer)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (Error FederationError) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -472,19 +440,15 @@ updateConversationMessageTimer lusr zcon qcnv update = qcnv updateConversationMessageTimerUnqualified :: - ( Members - '[ ConversationStore, - ErrorS ('ActionDenied 'ModifyConversationMessageTimer), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - Error FederationError, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime - ] - r, + ( Member ConversationStore r, + Member (ErrorS ('ActionDenied 'ModifyConversationMessageTimer)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (Error FederationError) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -496,22 +460,18 @@ updateConversationMessageTimerUnqualified :: updateConversationMessageTimerUnqualified lusr zcon cnv = updateConversationMessageTimer lusr zcon (tUntagged (qualifyAs lusr cnv)) deleteLocalConversation :: - ( Members - '[ CodeStore, - ConversationStore, - Error FederationError, - ErrorS 'NotATeamMember, - ErrorS ('ActionDenied 'DeleteConversation), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - TeamStore - ] - r, + ( Member CodeStore r, + Member ConversationStore r, + Member (Error FederationError) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS ('ActionDenied 'DeleteConversation)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -602,17 +562,15 @@ addCode lusr zcon lcnv = do $ throwS @'ConvAccessDenied rmCodeUnqualified :: - Members - '[ CodeStore, - ConversationStore, - ErrorS 'ConvNotFound, - ErrorS 'ConvAccessDenied, - ExternalAccess, - GundeckAccess, - Input (Local ()), - Input UTCTime - ] - r => + ( Member CodeStore r, + Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'ConvAccessDenied) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input UTCTime) r + ) => Local UserId -> ConnId -> ConvId -> @@ -622,16 +580,14 @@ rmCodeUnqualified lusr zcon cnv = do rmCode lusr zcon lcnv rmCode :: - Members - '[ CodeStore, - ConversationStore, - ErrorS 'ConvAccessDenied, - ErrorS 'ConvNotFound, - ExternalAccess, - GundeckAccess, - Input UTCTime - ] - r => + ( Member CodeStore r, + Member ConversationStore r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvNotFound) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r + ) => Local UserId -> ConnId -> Local ConvId -> @@ -680,15 +636,12 @@ returnCode c = do checkReusableCode :: forall db r. - ( Members - '[ CodeStore, - ConversationStore, - TeamFeatureStore db, - ErrorS 'CodeNotFound, - ErrorS 'ConvNotFound, - Input Opts - ] - r, + ( Member CodeStore r, + Member ConversationStore r, + Member (TeamFeatureStore db) r, + Member (ErrorS 'CodeNotFound) r, + Member (ErrorS 'ConvNotFound) r, + Member (Input Opts) r, FeaturePersistentConstraint db GuestLinksConfig ) => ConversationCode -> @@ -701,27 +654,24 @@ checkReusableCode convCode = do joinConversationByReusableCode :: forall db r. - ( Members - '[ BrigAccess, - CodeStore, - ConversationStore, - ErrorS 'CodeNotFound, - ErrorS 'ConvAccessDenied, - ErrorS 'ConvNotFound, - ErrorS 'GuestLinksDisabled, - ErrorS 'InvalidOperation, - ErrorS 'NotATeamMember, - ErrorS 'TooManyMembers, - FederatorAccess, - ExternalAccess, - GundeckAccess, - Input Opts, - Input UTCTime, - MemberStore, - TeamStore, - TeamFeatureStore db - ] - r, + ( Member BrigAccess r, + Member CodeStore r, + Member ConversationStore r, + Member (ErrorS 'CodeNotFound) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'GuestLinksDisabled) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TooManyMembers) r, + Member FederatorAccess r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TeamStore r, + Member (TeamFeatureStore db) r, FeaturePersistentConstraint db GuestLinksConfig, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" @@ -734,28 +684,24 @@ joinConversationByReusableCode lusr zcon convCode = do c <- verifyReusableCode convCode conv <- E.getConversation (codeConversation c) >>= noteS @'ConvNotFound Query.ensureGuestLinksEnabled @db (Data.convTeam conv) - joinConversation @db lusr zcon conv CodeAccess + joinConversation lusr zcon conv CodeAccess joinConversationById :: - forall db r. - ( Members - '[ BrigAccess, - FederatorAccess, - ConversationStore, - ErrorS 'ConvAccessDenied, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotATeamMember, - ErrorS 'TooManyMembers, - ExternalAccess, - GundeckAccess, - Input Opts, - Input UTCTime, - MemberStore, - TeamStore, - TeamFeatureStore db - ] - r, + forall r. + ( Member BrigAccess r, + Member FederatorAccess r, + Member ConversationStore r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TooManyMembers) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -765,26 +711,22 @@ joinConversationById :: Sem r (UpdateResult Event) joinConversationById lusr zcon cnv = do conv <- E.getConversation cnv >>= noteS @'ConvNotFound - joinConversation @db lusr zcon conv LinkAccess + joinConversation lusr zcon conv LinkAccess joinConversation :: - ( Members - '[ BrigAccess, - ConversationStore, - FederatorAccess, - ErrorS 'ConvAccessDenied, - ErrorS 'InvalidOperation, - ErrorS 'NotATeamMember, - ErrorS 'TooManyMembers, - ExternalAccess, - GundeckAccess, - Input Opts, - Input UTCTime, - MemberStore, - TeamStore, - TeamFeatureStore db - ] - r, + forall r. + ( Member BrigAccess r, + Member FederatorAccess r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TooManyMembers) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member TeamStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -817,33 +759,30 @@ joinConversation lusr zcon conv access = do action addMembers :: - ( Members - '[ BrigAccess, - ConversationStore, - Error FederationError, - Error InternalError, - ErrorS ('ActionDenied 'AddConversationMember), - ErrorS ('ActionDenied 'LeaveConversation), - ErrorS 'ConvAccessDenied, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - ErrorS 'NotATeamMember, - ErrorS 'TooManyMembers, - ErrorS 'MissingLegalholdConsent, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - ProposalStore, - TeamStore, - TinyLog - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'AddConversationMember)) r, + Member (ErrorS ('ActionDenied 'LeaveConversation)) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'NotConnected) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TooManyMembers) r, + Member (ErrorS 'MissingLegalholdConsent) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member MemberStore r, + Member ProposalStore r, + Member TeamStore r, + Member TinyLog r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -860,33 +799,30 @@ addMembers lusr zcon qcnv (InviteQualified users role) = do ConversationJoin users role addMembersUnqualifiedV2 :: - ( Members - '[ BrigAccess, - ConversationStore, - Error FederationError, - Error InternalError, - ErrorS ('ActionDenied 'AddConversationMember), - ErrorS ('ActionDenied 'LeaveConversation), - ErrorS 'ConvAccessDenied, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - ErrorS 'NotATeamMember, - ErrorS 'TooManyMembers, - ErrorS 'MissingLegalholdConsent, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - ProposalStore, - TeamStore, - TinyLog - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'AddConversationMember)) r, + Member (ErrorS ('ActionDenied 'LeaveConversation)) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'NotConnected) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TooManyMembers) r, + Member (ErrorS 'MissingLegalholdConsent) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member MemberStore r, + Member ProposalStore r, + Member TeamStore r, + Member TinyLog r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -903,33 +839,30 @@ addMembersUnqualifiedV2 lusr zcon cnv (InviteQualified users role) = do ConversationJoin users role addMembersUnqualified :: - ( Members - '[ BrigAccess, - ConversationStore, - Error FederationError, - Error InternalError, - ErrorS ('ActionDenied 'AddConversationMember), - ErrorS ('ActionDenied 'LeaveConversation), - ErrorS 'ConvAccessDenied, - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - ErrorS 'NotATeamMember, - ErrorS 'TooManyMembers, - ErrorS 'MissingLegalholdConsent, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input Opts, - Input UTCTime, - LegalHoldStore, - MemberStore, - ProposalStore, - TeamStore, - TinyLog - ] - r, + ( Member BrigAccess r, + Member ConversationStore r, + Member (Error FederationError) r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'AddConversationMember)) r, + Member (ErrorS ('ActionDenied 'LeaveConversation)) r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'NotConnected) r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'TooManyMembers) r, + Member (ErrorS 'MissingLegalholdConsent) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member LegalHoldStore r, + Member MemberStore r, + Member ProposalStore r, + Member TeamStore r, + Member TinyLog r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -944,15 +877,13 @@ addMembersUnqualified lusr zcon cnv (Invite users role) = do addMembers lusr zcon (tUntagged (qualifyAs lusr cnv)) (InviteQualified qusers role) updateSelfMember :: - Members - '[ ConversationStore, - ErrorS 'ConvNotFound, - ExternalAccess, - GundeckAccess, - Input UTCTime, - MemberStore - ] - r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r + ) => Local UserId -> ConnId -> Qualified ConvId -> @@ -967,14 +898,14 @@ updateSelfMember lusr zcon qcnv update = do pushConversationEvent (Just zcon) e (fmap pure lusr) [] where checkLocalMembership :: - Members '[MemberStore] r => + Member MemberStore r => Local ConvId -> Sem r Bool checkLocalMembership lcnv = isMember (tUnqualified lusr) <$> E.getLocalMembers (tUnqualified lcnv) checkRemoteMembership :: - Members '[ConversationStore] r => + Member ConversationStore r => Remote ConvId -> Sem r Bool checkRemoteMembership rcnv = @@ -993,15 +924,13 @@ updateSelfMember lusr zcon qcnv update = do } updateUnqualifiedSelfMember :: - Members - '[ ConversationStore, - ErrorS 'ConvNotFound, - ExternalAccess, - GundeckAccess, - Input UTCTime, - MemberStore - ] - r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r + ) => Local UserId -> ConnId -> ConvId -> @@ -1012,21 +941,17 @@ updateUnqualifiedSelfMember lusr zcon cnv update = do updateSelfMember lusr zcon (tUntagged lcnv) update updateOtherMemberLocalConv :: - ( Members - '[ ConversationStore, - ErrorS ('ActionDenied 'ModifyOtherConversationMember), - ErrorS 'InvalidTarget, - ErrorS 'InvalidOperation, - ErrorS 'ConvNotFound, - ErrorS 'ConvMemberNotFound, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - MemberStore - ] - r, + ( Member ConversationStore r, + Member (ErrorS ('ActionDenied 'ModifyOtherConversationMember)) r, + Member (ErrorS 'InvalidTarget) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'ConvMemberNotFound) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -1043,21 +968,17 @@ updateOtherMemberLocalConv lcnv lusr con qvictim update = void . getUpdateResult ConversationMemberUpdate qvictim update updateOtherMemberUnqualified :: - ( Members - '[ ConversationStore, - ErrorS ('ActionDenied 'ModifyOtherConversationMember), - ErrorS 'InvalidTarget, - ErrorS 'InvalidOperation, - ErrorS 'ConvNotFound, - ErrorS 'ConvMemberNotFound, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - MemberStore - ] - r, + ( Member ConversationStore r, + Member (ErrorS ('ActionDenied 'ModifyOtherConversationMember)) r, + Member (ErrorS 'InvalidTarget) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'ConvMemberNotFound) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -1073,22 +994,18 @@ updateOtherMemberUnqualified lusr zcon cnv victim update = do updateOtherMemberLocalConv lcnv lusr zcon (tUntagged lvictim) update updateOtherMember :: - ( Members - '[ ConversationStore, - Error FederationError, - ErrorS ('ActionDenied 'ModifyOtherConversationMember), - ErrorS 'InvalidTarget, - ErrorS 'InvalidOperation, - ErrorS 'ConvNotFound, - ErrorS 'ConvMemberNotFound, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - MemberStore - ] - r, + ( Member ConversationStore r, + Member (Error FederationError) r, + Member (ErrorS ('ActionDenied 'ModifyOtherConversationMember)) r, + Member (ErrorS 'InvalidTarget) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'ConvMemberNotFound) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -1113,22 +1030,19 @@ updateOtherMemberRemoteConv :: updateOtherMemberRemoteConv _ _ _ _ _ = throw FederationNotImplemented removeMemberUnqualified :: - ( Members - '[ ConversationStore, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - MemberStore, - ProposalStore, - TinyLog - ] - r, + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member TinyLog r, CallsFed 'Galley "leave-conversation", CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", @@ -1145,22 +1059,19 @@ removeMemberUnqualified lusr con cnv victim = do removeMemberQualified lusr con (tUntagged lcnv) (tUntagged lvictim) removeMemberQualified :: - ( Members - '[ ConversationStore, - Error InternalError, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - MemberStore, - ProposalStore, - TinyLog - ] - r, + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member TinyLog r, CallsFed 'Galley "leave-conversation", CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", @@ -1181,13 +1092,10 @@ removeMemberQualified lusr con qcnv victim = victim removeMemberFromRemoteConv :: - ( Members - '[ FederatorAccess, - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'ConvNotFound, - Input UTCTime - ] - r, + ( Member FederatorAccess r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'ConvNotFound) r, + Member (Input UTCTime) r, CallsFed 'Galley "leave-conversation" ) => Remote ConvId -> @@ -1203,7 +1111,9 @@ removeMemberFromRemoteConv cnv lusr victim | otherwise = throwS @('ActionDenied 'RemoveConversationMember) where handleError :: - Members '[ErrorS ('ActionDenied 'RemoveConversationMember), ErrorS 'ConvNotFound] r => + ( Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'ConvNotFound) r + ) => RemoveFromConversationError -> Sem r (Maybe Event) handleError RemoveFromConversationErrorRemovalNotAllowed = @@ -1220,23 +1130,20 @@ removeMemberFromRemoteConv cnv lusr victim -- | Remove a member from a local conversation. removeMemberFromLocalConv :: - ( Members - '[ ConversationStore, - Error InternalError, - ErrorS ('ActionDenied 'LeaveConversation), - ErrorS ('ActionDenied 'RemoveConversationMember), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime, - MemberStore, - ProposalStore, - TinyLog - ] - r, + ( Member ConversationStore r, + Member (Error InternalError) r, + Member (ErrorS ('ActionDenied 'LeaveConversation)) r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input Env) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member ProposalStore r, + Member TinyLog r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-mls-message-sent", CallsFed 'Galley "on-new-remote-conversation" @@ -1262,21 +1169,16 @@ removeMemberFromLocalConv lcnv lusr con victim -- OTR postProteusMessage :: - ( Members - '[ BotAccess, - BrigAccess, - ClientStore, - ConversationStore, - FederatorAccess, - GundeckAccess, - ExternalAccess, - Input Opts, - Input UTCTime, - MemberStore, - TeamStore, - TinyLog - ] - r, + ( Member BrigAccess r, + Member ClientStore r, + Member ConversationStore r, + Member FederatorAccess r, + Member GundeckAccess r, + Member ExternalAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member TeamStore r, + Member TinyLog r, CallsFed 'Brig "get-user-clients", CallsFed 'Galley "on-message-sent", CallsFed 'Galley "send-message" @@ -1294,24 +1196,17 @@ postProteusMessage sender zcon conv msg = runLocalInput sender $ do conv postProteusBroadcast :: - Members - '[ BotAccess, - BrigAccess, - ClientStore, - ConversationStore, - ErrorS 'TeamNotFound, - ErrorS 'NonBindingTeam, - ErrorS 'BroadcastLimitExceeded, - FederatorAccess, - GundeckAccess, - ExternalAccess, - Input Opts, - Input UTCTime, - MemberStore, - TeamStore, - TinyLog - ] - r => + ( Member BrigAccess r, + Member ClientStore r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NonBindingTeam) r, + Member (ErrorS 'BroadcastLimitExceeded) r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member TeamStore r, + Member TinyLog r + ) => Local UserId -> ConnId -> QualifiedNewOtrMessage -> @@ -1350,22 +1245,17 @@ unqualifyEndpoint loc f ignoreMissing reportMissing message = do unqualify (tDomain loc) <$> f qualifiedMessage postBotMessageUnqualified :: - ( Members - '[ BrigAccess, - ClientStore, - ConversationStore, - ErrorS 'ConvNotFound, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input (Local ()), - Input Opts, - MemberStore, - TeamStore, - TinyLog, - Input UTCTime - ] - r, + ( Member BrigAccess r, + Member ClientStore r, + Member ConversationStore r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input Opts) r, + Member TeamStore r, + Member TinyLog r, + Member (Input UTCTime) r, CallsFed 'Galley "on-message-sent", CallsFed 'Brig "get-user-clients" ) => @@ -1386,19 +1276,17 @@ postBotMessageUnqualified sender cnv ignoreMissing reportMissing message = do message postOtrBroadcastUnqualified :: - Members - '[ BrigAccess, - ClientStore, - ErrorS 'TeamNotFound, - ErrorS 'NonBindingTeam, - ErrorS 'BroadcastLimitExceeded, - GundeckAccess, - Input Opts, - Input UTCTime, - TeamStore, - TinyLog - ] - r => + ( Member BrigAccess r, + Member ClientStore r, + Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NonBindingTeam) r, + Member (ErrorS 'BroadcastLimitExceeded) r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member TeamStore r, + Member TinyLog r + ) => Local UserId -> ConnId -> Maybe IgnoreMissing -> @@ -1411,21 +1299,16 @@ postOtrBroadcastUnqualified sender zcon = (postBroadcast sender (Just zcon)) postOtrMessageUnqualified :: - ( Members - '[ BotAccess, - BrigAccess, - ClientStore, - ConversationStore, - FederatorAccess, - GundeckAccess, - ExternalAccess, - MemberStore, - Input Opts, - Input UTCTime, - TeamStore, - TinyLog - ] - r, + ( Member BrigAccess r, + Member ClientStore r, + Member ConversationStore r, + Member FederatorAccess r, + Member GundeckAccess r, + Member ExternalAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member TeamStore r, + Member TinyLog r, CallsFed 'Galley "on-message-sent", CallsFed 'Brig "get-user-clients" ) => @@ -1443,20 +1326,16 @@ postOtrMessageUnqualified sender zcon cnv = (runLocalInput sender . postQualifiedOtrMessage User (tUntagged sender) (Just zcon) lcnv) updateConversationName :: - ( Members - '[ ConversationStore, - Error FederationError, - Error InvalidInput, - ErrorS ('ActionDenied 'ModifyConversationName), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime - ] - r, + ( Member ConversationStore r, + Member (Error FederationError) r, + Member (Error InvalidInput) r, + Member (ErrorS ('ActionDenied 'ModifyConversationName)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -1474,19 +1353,15 @@ updateConversationName lusr zcon qcnv convRename = do convRename updateUnqualifiedConversationName :: - ( Members - '[ ConversationStore, - Error InvalidInput, - ErrorS ('ActionDenied 'ModifyConversationName), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime - ] - r, + ( Member ConversationStore r, + Member (Error InvalidInput) r, + Member (ErrorS ('ActionDenied 'ModifyConversationName)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -1500,19 +1375,15 @@ updateUnqualifiedConversationName lusr zcon cnv rename = do updateLocalConversationName lusr zcon lcnv rename updateLocalConversationName :: - ( Members - '[ ConversationStore, - Error InvalidInput, - ErrorS ('ActionDenied 'ModifyConversationName), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ExternalAccess, - FederatorAccess, - GundeckAccess, - Input Env, - Input UTCTime - ] - r, + ( Member ConversationStore r, + Member (Error InvalidInput) r, + Member (ErrorS ('ActionDenied 'ModifyConversationName)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member ExternalAccess r, + Member FederatorAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, CallsFed 'Galley "on-conversation-updated", CallsFed 'Galley "on-new-remote-conversation" ) => @@ -1526,16 +1397,12 @@ updateLocalConversationName lusr zcon lcnv rename = updateLocalConversation @'ConversationRenameTag lcnv (tUntagged lusr) (Just zcon) rename isTypingQualified :: - ( Members - '[ GundeckAccess, - ErrorS 'ConvNotFound, - Input (Local ()), - Input UTCTime, - MemberStore, - FederatorAccess, - WaiRoutes - ] - r, + ( Member GundeckAccess r, + Member (ErrorS 'ConvNotFound) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member FederatorAccess r, CallsFed 'Galley "on-typing-indicator-updated" ) => Local UserId -> @@ -1562,15 +1429,12 @@ isTypingQualified lusr zcon qcnv ts = do void $ E.runFederated rcnv (fedClient @'Galley @"on-typing-indicator-updated" rpc) isTypingUnqualified :: - Members - '[ GundeckAccess, - ErrorS 'ConvNotFound, - Input (Local ()), - Input UTCTime, - MemberStore, - WaiRoutes - ] - r => + ( Member GundeckAccess r, + Member (ErrorS 'ConvNotFound) r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member MemberStore r + ) => Local UserId -> ConnId -> ConvId -> @@ -1581,11 +1445,9 @@ isTypingUnqualified lusr zcon cnv ts = do isTyping (tUntagged lusr) (Just zcon) lcnv ts addServiceH :: - Members - '[ ServiceStore, - WaiRoutes - ] - r => + ( Member ServiceStore r, + Member WaiRoutes r + ) => JsonRequest Service -> Sem r Response addServiceH req = do @@ -1593,7 +1455,9 @@ addServiceH req = do pure empty rmServiceH :: - Members '[ServiceStore, WaiRoutes] r => + ( Member ServiceStore r, + Member WaiRoutes r + ) => JsonRequest ServiceRef -> Sem r Response rmServiceH req = do @@ -1601,23 +1465,20 @@ rmServiceH req = do pure empty addBotH :: - Members - '[ ClientStore, - ConversationStore, - ErrorS ('ActionDenied 'AddConversationMember), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'TooManyMembers, - ExternalAccess, - GundeckAccess, - Input (Local ()), - Input Opts, - Input UTCTime, - MemberStore, - TeamStore, - WaiRoutes - ] - r => + ( Member ClientStore r, + Member ConversationStore r, + Member (ErrorS ('ActionDenied 'AddConversationMember)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'TooManyMembers) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member WaiRoutes r + ) => UserId ::: ConnId ::: JsonRequest AddBot -> Sem r Response addBotH (zusr ::: zcon ::: req) = do @@ -1627,21 +1488,18 @@ addBotH (zusr ::: zcon ::: req) = do addBot :: forall r. - Members - '[ ClientStore, - ConversationStore, - ErrorS ('ActionDenied 'AddConversationMember), - ErrorS 'ConvNotFound, - ErrorS 'InvalidOperation, - ErrorS 'TooManyMembers, - ExternalAccess, - GundeckAccess, - Input Opts, - Input UTCTime, - MemberStore, - TeamStore - ] - r => + ( Member ClientStore r, + Member ConversationStore r, + Member (ErrorS ('ActionDenied 'AddConversationMember)) r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'InvalidOperation) r, + Member (ErrorS 'TooManyMembers) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input Opts) r, + Member (Input UTCTime) r, + Member MemberStore r + ) => Local UserId -> ConnId -> AddBot -> @@ -1687,19 +1545,17 @@ addBot lusr zcon b = do pure (bots, users) rmBotH :: - Members - '[ ClientStore, - ConversationStore, - ErrorS 'ConvNotFound, - ExternalAccess, - GundeckAccess, - Input (Local ()), - Input UTCTime, - MemberStore, - WaiRoutes, - ErrorS ('ActionDenied 'RemoveConversationMember) - ] - r => + ( Member ClientStore r, + Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input (Local ())) r, + Member (Input UTCTime) r, + Member MemberStore r, + Member WaiRoutes r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r + ) => UserId ::: Maybe ConnId ::: JsonRequest RemoveBot -> Sem r Response rmBotH (zusr ::: zcon ::: req) = do @@ -1708,17 +1564,15 @@ rmBotH (zusr ::: zcon ::: req) = do handleUpdateResult <$> rmBot lusr zcon bot rmBot :: - Members - '[ ClientStore, - ConversationStore, - ErrorS 'ConvNotFound, - ExternalAccess, - GundeckAccess, - Input UTCTime, - MemberStore, - ErrorS ('ActionDenied 'RemoveConversationMember) - ] - r => + ( Member ClientStore r, + Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member ExternalAccess r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r, + Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r + ) => Local UserId -> Maybe ConnId -> RemoveBot -> diff --git a/services/galley/src/Galley/API/Util.hs b/services/galley/src/Galley/API/Util.hs index c31f30bc19..8205012fda 100644 --- a/services/galley/src/Galley/API/Util.hs +++ b/services/galley/src/Galley/API/Util.hs @@ -88,7 +88,10 @@ import Wire.API.User.Auth.ReAuth type JSON = Media "application" "json" ensureAccessRole :: - Members '[BrigAccess, ErrorS 'NotATeamMember, ErrorS 'ConvAccessDenied] r => + ( Member BrigAccess r, + Member (ErrorS 'NotATeamMember) r, + Member (ErrorS 'ConvAccessDenied) r + ) => Set Public.AccessRole -> [(UserId, Maybe TeamMember)] -> Sem r () @@ -110,7 +113,10 @@ ensureAccessRole roles users = do -- Team members are always considered connected, so we only check 'ensureConnected' -- for non-team-members of the _given_ user ensureConnectedOrSameTeam :: - Members '[BrigAccess, ErrorS 'NotConnected, TeamStore] r => + ( Member BrigAccess r, + Member (ErrorS 'NotConnected) r, + Member TeamStore r + ) => Local UserId -> [UserId] -> Sem r () @@ -129,7 +135,9 @@ ensureConnectedOrSameTeam (tUnqualified -> u) uids = do -- B blocks A, the status of A-to-B is still 'Accepted' but it doesn't mean -- that they are connected). ensureConnected :: - Members '[BrigAccess, ErrorS 'NotConnected] r => + ( Member BrigAccess r, + Member (ErrorS 'NotConnected) r + ) => Local UserId -> UserList UserId -> Sem r () @@ -138,7 +146,9 @@ ensureConnected self others = do ensureConnectedToRemotes self (ulRemotes others) ensureConnectedToLocals :: - Members '[ErrorS 'NotConnected, BrigAccess] r => + ( Member (ErrorS 'NotConnected) r, + Member BrigAccess r + ) => UserId -> [UserId] -> Sem r () @@ -150,7 +160,9 @@ ensureConnectedToLocals u uids = do throwS @'NotConnected ensureConnectedToRemotes :: - Members '[BrigAccess, ErrorS 'NotConnected] r => + ( Member BrigAccess r, + Member (ErrorS 'NotConnected) r + ) => Local UserId -> [Remote UserId] -> Sem r () @@ -161,11 +173,9 @@ ensureConnectedToRemotes u remotes = do throwS @'NotConnected ensureReAuthorised :: - Members - '[ BrigAccess, - Error AuthenticationError - ] - r => + ( Member BrigAccess r, + Member (Error AuthenticationError) r + ) => UserId -> Maybe PlainTextPassword -> Maybe Code.Value -> @@ -179,7 +189,7 @@ ensureReAuthorised u secret mbAction mbCode = -- custom role, throw 'ActionDenied'. ensureActionAllowed :: forall (action :: Action) mem r. - (IsConvMember mem, Members '[ErrorS ('ActionDenied action)] r) => + (IsConvMember mem, Member (ErrorS ('ActionDenied action)) r) => Sing action -> mem -> Sem r () @@ -200,7 +210,7 @@ ensureGroupConversation conv = do -- This function needs to be review when custom roles are introduced since only -- custom roles can cause `roleNameToActions` to return a Nothing ensureConvRoleNotElevated :: - (IsConvMember mem, Members '[ErrorS 'InvalidAction] r) => + (IsConvMember mem, Member (ErrorS 'InvalidAction) r) => mem -> RoleName -> Sem r () @@ -218,11 +228,9 @@ permissionCheckS :: forall perm (p :: perm) r. ( SingKind perm, IsPerm (Demote perm), - Members - '[ ErrorS (PermError p), - ErrorS 'NotATeamMember - ] - r + ( Member (ErrorS (PermError p)) r, + Member (ErrorS 'NotATeamMember) r + ) ) => Sing p -> Maybe TeamMember -> @@ -240,7 +248,11 @@ permissionCheckS p = -- member does not have the given permission, throw 'operationDenied'. -- Otherwise, return the team member. permissionCheck :: - (IsPerm perm, Members '[ErrorS OperationDenied, ErrorS 'NotATeamMember] r) => + ( IsPerm perm, + ( Member (ErrorS OperationDenied) r, + Member (ErrorS 'NotATeamMember) r + ) + ) => perm -> Maybe TeamMember -> Sem r TeamMember @@ -253,14 +265,25 @@ permissionCheck p = \case -- FUTUREWORK: factor `noteS` out of this function. Nothing -> throwS @'NotATeamMember -assertTeamExists :: Members '[ErrorS 'TeamNotFound, TeamStore] r => TeamId -> Sem r () +assertTeamExists :: + ( Member (ErrorS 'TeamNotFound) r, + Member TeamStore r + ) => + TeamId -> + Sem r () assertTeamExists tid = do teamExists <- isJust <$> getTeam tid if teamExists then pure () else throwS @'TeamNotFound -assertOnTeam :: Members '[ErrorS 'NotATeamMember, TeamStore] r => UserId -> TeamId -> Sem r () +assertOnTeam :: + ( Member (ErrorS 'NotATeamMember) r, + Member TeamStore r + ) => + UserId -> + TeamId -> + Sem r () assertOnTeam uid tid = getTeamMember tid uid >>= \case Nothing -> throwS @'NotATeamMember @@ -268,17 +291,14 @@ assertOnTeam uid tid = -- | Try to accept a 1-1 conversation, promoting connect conversations as appropriate. acceptOne2One :: - Members - '[ ConversationStore, - ErrorS 'ConvNotFound, - Error InternalError, - ErrorS 'InvalidOperation, - ErrorS 'NotConnected, - GundeckAccess, - Input UTCTime, - MemberStore - ] - r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (Error InternalError) r, + Member (ErrorS 'InvalidOperation) r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r + ) => Local UserId -> Data.Conversation -> Maybe ConnId -> @@ -501,7 +521,10 @@ getMember :: getMember p u = noteS @e . find ((u ==) . p) getConversationAndCheckMembership :: - Members '[ConversationStore, ErrorS 'ConvNotFound, ErrorS 'ConvAccessDenied] r => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS 'ConvAccessDenied) r + ) => UserId -> Local ConvId -> Sem r Data.Conversation @@ -524,7 +547,11 @@ getConversationWithError lcnv = getConversationAndMemberWithError :: forall e uid mem r. - (Members '[ConversationStore, ErrorS 'ConvNotFound, ErrorS e] r, IsConvMemberId uid mem) => + ( Member ConversationStore r, + Member (ErrorS 'ConvNotFound) r, + Member (ErrorS e) r, + IsConvMemberId uid mem + ) => uid -> Local ConvId -> Sem r (Data.Conversation, mem) @@ -552,7 +579,10 @@ canDeleteMember deleter deletee -- | Send an event to local users and bots pushConversationEvent :: - (Members '[GundeckAccess, ExternalAccess] r, Foldable f) => + ( Member GundeckAccess r, + Member ExternalAccess r, + Foldable f + ) => Maybe ConnId -> Event -> Local (f UserId) -> @@ -564,7 +594,9 @@ pushConversationEvent conn e lusers bots = do deliverAsync (toList bots `zip` repeat e) verifyReusableCode :: - Members '[CodeStore, ErrorS 'CodeNotFound] r => + ( Member CodeStore r, + Member (ErrorS 'CodeNotFound) r + ) => ConversationCode -> Sem r DataTypes.Code verifyReusableCode convCode = do @@ -576,14 +608,11 @@ verifyReusableCode convCode = do pure c ensureConversationAccess :: - Members - '[ BrigAccess, - ConversationStore, - ErrorS 'ConvAccessDenied, - ErrorS 'NotATeamMember, - TeamStore - ] - r => + ( Member BrigAccess r, + Member (ErrorS 'ConvAccessDenied) r, + Member (ErrorS 'NotATeamMember) r, + Member TeamStore r + ) => UserId -> Data.Conversation -> Access -> @@ -777,7 +806,9 @@ getLHStatus teamOfUser other = do pure $ maybe defUserLegalHoldStatus (view legalHoldStatus) mMember anyLegalholdActivated :: - Members '[Input Opts, TeamStore] r => + ( Member (Input Opts) r, + Member TeamStore r + ) => [UserId] -> Sem r Bool anyLegalholdActivated uids = do @@ -793,7 +824,10 @@ anyLegalholdActivated uids = do anyM (\uid -> userLHEnabled <$> getLHStatus (Map.lookup uid teamsOfUsers) uid) uidsPage allLegalholdConsentGiven :: - Members '[Input Opts, LegalHoldStore, TeamStore] r => + ( Member (Input Opts) r, + Member LegalHoldStore r, + Member TeamStore r + ) => [UserId] -> Sem r Bool allLegalholdConsentGiven uids = do @@ -833,7 +867,11 @@ getTeamMembersForFanout tid = do getTeamMembersWithLimit tid lim ensureMemberLimit :: - (Foldable f, Members '[ErrorS 'TooManyMembers, Input Opts] r) => + ( Foldable f, + ( Member (ErrorS 'TooManyMembers) r, + Member (Input Opts) r + ) + ) => [LocalMember] -> f a -> Sem r () @@ -844,7 +882,9 @@ ensureMemberLimit old new = do throwS @'TooManyMembers conversationExisted :: - Members '[Error InternalError, P.TinyLog] r => + ( Member (Error InternalError) r, + Member P.TinyLog r + ) => Local UserId -> Data.Conversation -> Sem r ConversationResponse @@ -876,13 +916,11 @@ instance -------------------------------------------------------------------------------- -- Send typing indicator events isTyping :: - Members - '[ ErrorS 'ConvNotFound, - GundeckAccess, - Input UTCTime, - MemberStore - ] - r => + ( Member (ErrorS 'ConvNotFound) r, + Member GundeckAccess r, + Member (Input UTCTime) r, + Member MemberStore r + ) => Qualified UserId -> Maybe ConnId -> Local ConvId -> diff --git a/services/galley/src/Galley/App.hs b/services/galley/src/Galley/App.hs index 4e18718f22..588a6b47b4 100644 --- a/services/galley/src/Galley/App.hs +++ b/services/galley/src/Galley/App.hs @@ -198,7 +198,7 @@ initHttpManager o = do } interpretTinyLog :: - Members '[Embed IO] r => + Member (Embed IO) r => Env -> Sem (P.TinyLog ': r) a -> Sem r a diff --git a/services/galley/src/Galley/Cassandra/Client.hs b/services/galley/src/Galley/Cassandra/Client.hs index 25fb2a44d2..31b7720baf 100644 --- a/services/galley/src/Galley/Cassandra/Client.hs +++ b/services/galley/src/Galley/Cassandra/Client.hs @@ -58,7 +58,10 @@ eraseClients :: UserId -> Client () eraseClients user = retry x5 (write Cql.rmClients (params LocalQuorum (Identity user))) interpretClientStoreToCassandra :: - Members '[Embed IO, Input ClientState, Input Env] r => + ( Member (Embed IO) r, + Member (Input ClientState) r, + Member (Input Env) r + ) => Sem (ClientStore ': r) a -> Sem r a interpretClientStoreToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Cassandra/Code.hs b/services/galley/src/Galley/Cassandra/Code.hs index abb898e2fe..754df8e747 100644 --- a/services/galley/src/Galley/Cassandra/Code.hs +++ b/services/galley/src/Galley/Cassandra/Code.hs @@ -35,7 +35,10 @@ import Polysemy import Polysemy.Input interpretCodeStoreToCassandra :: - Members '[Embed IO, Input ClientState, Input Env] r => + ( Member (Embed IO) r, + Member (Input ClientState) r, + Member (Input Env) r + ) => Sem (CodeStore ': r) a -> Sem r a interpretCodeStoreToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Cassandra/Conversation.hs b/services/galley/src/Galley/Cassandra/Conversation.hs index 1b26c2207f..d4d82fcd45 100644 --- a/services/galley/src/Galley/Cassandra/Conversation.hs +++ b/services/galley/src/Galley/Cassandra/Conversation.hs @@ -273,7 +273,10 @@ localConversation cid = <*> UnliftIO.Concurrently (retry x1 $ query1 Cql.selectConv (params LocalQuorum (Identity cid))) localConversations :: - Members '[Embed IO, Input ClientState, TinyLog] r => + ( Member (Embed IO) r, + Member (Input ClientState) r, + Member TinyLog r + ) => [ConvId] -> Sem r [Conversation] localConversations = @@ -374,7 +377,10 @@ lookupGroupId gId = uncurry Qualified <$$> retry x1 (query1 Cql.lookupGroupId (params LocalQuorum (Identity gId))) interpretConversationStoreToCassandra :: - Members '[Embed IO, Input ClientState, TinyLog] r => + ( Member (Embed IO) r, + Member (Input ClientState) r, + Member TinyLog r + ) => Sem (ConversationStore ': r) a -> Sem r a interpretConversationStoreToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Cassandra/Conversation/Members.hs b/services/galley/src/Galley/Cassandra/Conversation/Members.hs index 7f79df3042..8590b2496e 100644 --- a/services/galley/src/Galley/Cassandra/Conversation/Members.hs +++ b/services/galley/src/Galley/Cassandra/Conversation/Members.hs @@ -364,7 +364,9 @@ lookupMLSClients groupId = (query Cql.lookupMLSClients (params LocalQuorum (Identity groupId))) interpretMemberStoreToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (MemberStore ': r) a -> Sem r a interpretMemberStoreToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Cassandra/ConversationList.hs b/services/galley/src/Galley/Cassandra/ConversationList.hs index 93ae9352d7..d0d5354884 100644 --- a/services/galley/src/Galley/Cassandra/ConversationList.hs +++ b/services/galley/src/Galley/Cassandra/ConversationList.hs @@ -65,21 +65,27 @@ remoteConversationIdsPageFrom usr pagingState max = uncurry toRemoteUnsafe <$$> paginateWithState Cql.selectUserRemoteConvs (paramsPagingState LocalQuorum (Identity usr) max pagingState) interpretConversationListToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (ListItems CassandraPaging ConvId ': r) a -> Sem r a interpretConversationListToCassandra = interpret $ \case ListItems uid ps max -> embedClient $ localConversationIdsPageFrom uid ps max interpretRemoteConversationListToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (ListItems CassandraPaging (Remote ConvId) ': r) a -> Sem r a interpretRemoteConversationListToCassandra = interpret $ \case ListItems uid ps max -> embedClient $ remoteConversationIdsPageFrom uid ps (fromRange max) interpretLegacyConversationListToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (ListItems LegacyPaging ConvId ': r) a -> Sem r a interpretLegacyConversationListToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Cassandra/CustomBackend.hs b/services/galley/src/Galley/Cassandra/CustomBackend.hs index c257416707..3eb73ae686 100644 --- a/services/galley/src/Galley/Cassandra/CustomBackend.hs +++ b/services/galley/src/Galley/Cassandra/CustomBackend.hs @@ -31,7 +31,9 @@ import Polysemy.Input import Wire.API.CustomBackend interpretCustomBackendStoreToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (CustomBackendStore ': r) a -> Sem r a interpretCustomBackendStoreToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Cassandra/LegalHold.hs b/services/galley/src/Galley/Cassandra/LegalHold.hs index 578be86d16..29528a02b4 100644 --- a/services/galley/src/Galley/Cassandra/LegalHold.hs +++ b/services/galley/src/Galley/Cassandra/LegalHold.hs @@ -55,7 +55,10 @@ import Wire.API.Provider.Service import Wire.API.User.Client.Prekey interpretLegalHoldStoreToCassandra :: - Members '[Embed IO, Input ClientState, Input Env] r => + ( Member (Embed IO) r, + Member (Input ClientState) r, + Member (Input Env) r + ) => FeatureLegalHold -> Sem (LegalHoldStore ': r) a -> Sem r a diff --git a/services/galley/src/Galley/Cassandra/Proposal.hs b/services/galley/src/Galley/Cassandra/Proposal.hs index 7b5089631c..e7d0c0b64f 100644 --- a/services/galley/src/Galley/Cassandra/Proposal.hs +++ b/services/galley/src/Galley/Cassandra/Proposal.hs @@ -39,7 +39,9 @@ defaultTTL :: Timeout defaultTTL = 28 # Day interpretProposalStoreToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (ProposalStore ': r) a -> Sem r a interpretProposalStoreToCassandra = diff --git a/services/galley/src/Galley/Cassandra/SearchVisibility.hs b/services/galley/src/Galley/Cassandra/SearchVisibility.hs index d8884b9758..5612739030 100644 --- a/services/galley/src/Galley/Cassandra/SearchVisibility.hs +++ b/services/galley/src/Galley/Cassandra/SearchVisibility.hs @@ -29,7 +29,9 @@ import Polysemy.Input import Wire.API.Team.SearchVisibility interpretSearchVisibilityStoreToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (SearchVisibilityStore ': r) a -> Sem r a interpretSearchVisibilityStoreToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Cassandra/Services.hs b/services/galley/src/Galley/Cassandra/Services.hs index 9052ca607c..f24544ff57 100644 --- a/services/galley/src/Galley/Cassandra/Services.hs +++ b/services/galley/src/Galley/Cassandra/Services.hs @@ -48,7 +48,9 @@ addBotMember s bot cnv = do -- Service -------------------------------------------------------------------- interpretServiceStoreToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (ServiceStore ': r) a -> Sem r a interpretServiceStoreToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Cassandra/Store.hs b/services/galley/src/Galley/Cassandra/Store.hs index 6c68eaf48c..1679452355 100644 --- a/services/galley/src/Galley/Cassandra/Store.hs +++ b/services/galley/src/Galley/Cassandra/Store.hs @@ -25,7 +25,12 @@ import Imports import Polysemy import Polysemy.Input -embedClient :: Members '[Embed IO, Input ClientState] r => Client a -> Sem r a +embedClient :: + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => + Client a -> + Sem r a embedClient client = do cs <- input embed @IO $ runClient cs client diff --git a/services/galley/src/Galley/Cassandra/Team.hs b/services/galley/src/Galley/Cassandra/Team.hs index a2eed6014d..093faadb2a 100644 --- a/services/galley/src/Galley/Cassandra/Team.hs +++ b/services/galley/src/Galley/Cassandra/Team.hs @@ -63,7 +63,10 @@ import Wire.API.Team.Permission (Perm (SetBilling), Permissions, self) import Wire.Sem.Paging.Cassandra interpretTeamStoreToCassandra :: - Members '[Embed IO, Input Env, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input Env) r, + Member (Input ClientState) r + ) => FeatureLegalHold -> Sem (TeamStore ': r) a -> Sem r a @@ -102,14 +105,18 @@ interpretTeamStoreToCassandra lh = interpret $ \case embed @IO $ Aws.execute env (Aws.enqueue e) interpretTeamListToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (ListItems LegacyPaging TeamId ': r) a -> Sem r a interpretTeamListToCassandra = interpret $ \case ListItems uid ps lim -> embedClient $ teamIdsFrom uid ps lim interpretInternalTeamListToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (ListItems InternalPaging TeamId ': r) a -> Sem r a interpretInternalTeamListToCassandra = interpret $ \case @@ -120,7 +127,9 @@ interpretInternalTeamListToCassandra = interpret $ \case Just ps -> ipNext ps interpretTeamMemberStoreToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => FeatureLegalHold -> Sem (TeamMemberStore InternalPaging ': r) a -> Sem r a @@ -132,7 +141,9 @@ interpretTeamMemberStoreToCassandra lh = interpret $ \case Just ps -> ipNext ps interpretTeamMemberStoreToCassandraWithPaging :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => FeatureLegalHold -> Sem (TeamMemberStore CassandraPaging ': r) a -> Sem r a diff --git a/services/galley/src/Galley/Cassandra/TeamFeatures.hs b/services/galley/src/Galley/Cassandra/TeamFeatures.hs index 26476d7cd7..cfa27d7e86 100644 --- a/services/galley/src/Galley/Cassandra/TeamFeatures.hs +++ b/services/galley/src/Galley/Cassandra/TeamFeatures.hs @@ -44,7 +44,9 @@ data Cassandra type instance TFS.FeaturePersistentConstraint Cassandra = FeatureStatusCassandra interpretTeamFeatureStoreToCassandra :: - (Members '[Embed IO, Input ClientState] r) => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (TFS.TeamFeatureStore Cassandra ': r) a -> Sem r a interpretTeamFeatureStoreToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Cassandra/TeamNotifications.hs b/services/galley/src/Galley/Cassandra/TeamNotifications.hs index 22416dbfcc..8c4137c7ba 100644 --- a/services/galley/src/Galley/Cassandra/TeamNotifications.hs +++ b/services/galley/src/Galley/Cassandra/TeamNotifications.hs @@ -48,7 +48,9 @@ import Polysemy.Input import Wire.API.Internal.Notification interpretTeamNotificationStoreToCassandra :: - Members '[Embed IO, Input ClientState] r => + ( Member (Embed IO) r, + Member (Input ClientState) r + ) => Sem (TeamNotificationStore ': r) a -> Sem r a interpretTeamNotificationStoreToCassandra = interpret $ \case diff --git a/services/galley/src/Galley/Effects/TeamStore.hs b/services/galley/src/Galley/Effects/TeamStore.hs index bc82c26808..cbca2cc43a 100644 --- a/services/galley/src/Galley/Effects/TeamStore.hs +++ b/services/galley/src/Galley/Effects/TeamStore.hs @@ -139,12 +139,10 @@ listTeams :: listTeams = listItems lookupBindingTeam :: - Members - '[ ErrorS 'TeamNotFound, - ErrorS 'NonBindingTeam, - TeamStore - ] - r => + ( Member (ErrorS 'TeamNotFound) r, + Member (ErrorS 'NonBindingTeam) r, + Member TeamStore r + ) => UserId -> Sem r TeamId lookupBindingTeam zusr = do diff --git a/services/galley/src/Galley/Effects/WaiRoutes/IO.hs b/services/galley/src/Galley/Effects/WaiRoutes/IO.hs index 358513d8da..740e43f996 100644 --- a/services/galley/src/Galley/Effects/WaiRoutes/IO.hs +++ b/services/galley/src/Galley/Effects/WaiRoutes/IO.hs @@ -28,7 +28,9 @@ import Polysemy import Polysemy.Error interpretWaiRoutes :: - Members '[Embed IO, Error InvalidInput] r => + ( Member (Embed IO) r, + Member (Error InvalidInput) r + ) => Sem (WaiRoutes ': r) a -> Sem r a interpretWaiRoutes = interpret $ \case diff --git a/services/galley/src/Galley/External.hs b/services/galley/src/Galley/External.hs index 1f41ca3b52..e265c15a9e 100644 --- a/services/galley/src/Galley/External.hs +++ b/services/galley/src/Galley/External.hs @@ -47,7 +47,9 @@ import Wire.API.Event.Conversation (Event) import Wire.API.Provider.Service (serviceRefId, serviceRefProvider) interpretExternalAccess :: - Members '[Embed IO, Input Env] r => + ( Member (Embed IO) r, + Member (Input Env) r + ) => Sem (ExternalAccess ': r) a -> Sem r a interpretExternalAccess = interpret $ \case diff --git a/services/galley/src/Galley/External/LegalHoldService.hs b/services/galley/src/Galley/External/LegalHoldService.hs index 550629638b..867097790c 100644 --- a/services/galley/src/Galley/External/LegalHoldService.hs +++ b/services/galley/src/Galley/External/LegalHoldService.hs @@ -52,12 +52,10 @@ import Wire.API.Team.LegalHold.External -- | Get /status from legal hold service; throw 'Wai.Error' if things go wrong. checkLegalHoldServiceStatus :: - Members - '[ ErrorS 'LegalHoldServiceBadResponse, - LegalHoldStore, - P.TinyLog - ] - r => + ( Member (ErrorS 'LegalHoldServiceBadResponse) r, + Member LegalHoldStore r, + Member P.TinyLog r + ) => Fingerprint Rsa -> HttpsUrl -> Sem r () @@ -77,13 +75,11 @@ checkLegalHoldServiceStatus fpr url = do -- | @POST /initiate@. requestNewDevice :: - Members - '[ ErrorS 'LegalHoldServiceBadResponse, - ErrorS 'LegalHoldServiceNotRegistered, - LegalHoldStore, - P.TinyLog - ] - r => + ( Member (ErrorS 'LegalHoldServiceBadResponse) r, + Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member LegalHoldStore r, + Member P.TinyLog r + ) => TeamId -> UserId -> Sem r NewLegalHoldClient @@ -105,7 +101,9 @@ requestNewDevice tid uid = do -- | @POST /confirm@ -- Confirm that a device has been linked to a user and provide an authorization token confirmLegalHold :: - Members '[ErrorS 'LegalHoldServiceNotRegistered, LegalHoldStore] r => + ( Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member LegalHoldStore r + ) => ClientId -> TeamId -> UserId -> @@ -125,7 +123,9 @@ confirmLegalHold clientId tid uid legalHoldAuthToken = do -- | @POST /remove@ -- Inform the LegalHold Service that a user's legalhold has been disabled. removeLegalHold :: - Members '[ErrorS 'LegalHoldServiceNotRegistered, LegalHoldStore] r => + ( Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member LegalHoldStore r + ) => TeamId -> UserId -> Sem r () @@ -146,7 +146,9 @@ removeLegalHold tid uid = do -- the TSL fingerprint via 'makeVerifiedRequest' and passes the token so the service can -- authenticate the request. makeLegalHoldServiceRequest :: - Members '[ErrorS 'LegalHoldServiceNotRegistered, LegalHoldStore] r => + ( Member (ErrorS 'LegalHoldServiceNotRegistered) r, + Member LegalHoldStore r + ) => TeamId -> (Http.Request -> Http.Request) -> Sem r (Http.Response LC8.ByteString) diff --git a/services/galley/src/Galley/Intra/Client.hs b/services/galley/src/Galley/Intra/Client.hs index 80caf13870..7a6f0558bf 100644 --- a/services/galley/src/Galley/Intra/Client.hs +++ b/services/galley/src/Galley/Intra/Client.hs @@ -110,7 +110,11 @@ notifyClientsAboutLegalHoldRequest requesterUid targetUid lastPrekey' = do -- | Calls 'Brig.User.API.Auth.legalHoldLoginH'. getLegalHoldAuthToken :: - Members '[Embed IO, Error InternalError, P.TinyLog, Input Env] r => + ( Member (Embed IO) r, + Member (Error InternalError) r, + Member P.TinyLog r, + Member (Input Env) r + ) => UserId -> Maybe PlainTextPassword -> Sem r OpaqueAuthToken diff --git a/services/galley/src/Galley/Intra/Effects.hs b/services/galley/src/Galley/Intra/Effects.hs index c42b7f1d63..87c019c755 100644 --- a/services/galley/src/Galley/Intra/Effects.hs +++ b/services/galley/src/Galley/Intra/Effects.hs @@ -43,7 +43,11 @@ import qualified Polysemy.TinyLog as P import qualified UnliftIO interpretBrigAccess :: - Members '[Embed IO, Error InternalError, P.TinyLog, Input Env] r => + ( Member (Embed IO) r, + Member (Error InternalError) r, + Member P.TinyLog r, + Member (Input Env) r + ) => Sem (BrigAccess ': r) a -> Sem r a interpretBrigAccess = interpret $ \case @@ -92,7 +96,9 @@ interpretBrigAccess = interpret $ \case embedApp $ updateSearchVisibilityInbound status interpretSparAccess :: - Members '[Embed IO, Input Env] r => + ( Member (Embed IO) r, + Member (Input Env) r + ) => Sem (SparAccess ': r) a -> Sem r a interpretSparAccess = interpret $ \case @@ -100,14 +106,18 @@ interpretSparAccess = interpret $ \case LookupScimUserInfos uids -> embedApp $ lookupScimUserInfos uids interpretBotAccess :: - Members '[Embed IO, Input Env] r => + ( Member (Embed IO) r, + Member (Input Env) r + ) => Sem (BotAccess ': r) a -> Sem r a interpretBotAccess = interpret $ \case DeleteBot cid bid -> embedApp $ deleteBot cid bid interpretGundeckAccess :: - Members '[Embed IO, Input Env] r => + ( Member (Embed IO) r, + Member (Input Env) r + ) => Sem (GundeckAccess ': r) a -> Sem r a interpretGundeckAccess = interpret $ \case diff --git a/services/galley/src/Galley/Intra/Federator.hs b/services/galley/src/Galley/Intra/Federator.hs index 1bba1d860c..1afab1b533 100644 --- a/services/galley/src/Galley/Intra/Federator.hs +++ b/services/galley/src/Galley/Intra/Federator.hs @@ -33,7 +33,9 @@ import Wire.API.Federation.Client import Wire.API.Federation.Error interpretFederatorAccess :: - Members '[Embed IO, Input Env] r => + ( Member (Embed IO) r, + Member (Input Env) r + ) => Sem (FederatorAccess ': r) a -> Sem r a interpretFederatorAccess = interpret $ \case diff --git a/services/galley/src/Galley/Intra/Journal.hs b/services/galley/src/Galley/Intra/Journal.hs index 7ae78d9a81..b864f174cc 100644 --- a/services/galley/src/Galley/Intra/Journal.hs +++ b/services/galley/src/Galley/Intra/Journal.hs @@ -54,13 +54,11 @@ import Wire.API.Team.Permission -- is started without journaling arguments teamActivate :: - Members - '[ Input Opts.Opts, - Input UTCTime, - TeamStore, - P.TinyLog - ] - r => + ( Member (Input Opts.Opts) r, + Member (Input UTCTime) r, + Member TeamStore r, + Member P.TinyLog r + ) => TeamId -> Natural -> Maybe Currency.Alpha -> @@ -71,7 +69,9 @@ teamActivate tid teamSize cur time = do journalEvent TeamEvent'TEAM_ACTIVATE tid (Just $ evData teamSize billingUserIds cur) time teamUpdate :: - Members '[TeamStore, Input UTCTime] r => + ( Member TeamStore r, + Member (Input UTCTime) r + ) => TeamId -> Natural -> [UserId] -> @@ -80,19 +80,25 @@ teamUpdate tid teamSize billingUserIds = journalEvent TeamEvent'TEAM_UPDATE tid (Just $ evData teamSize billingUserIds Nothing) Nothing teamDelete :: - Members '[TeamStore, Input UTCTime] r => + ( Member TeamStore r, + Member (Input UTCTime) r + ) => TeamId -> Sem r () teamDelete tid = journalEvent TeamEvent'TEAM_DELETE tid Nothing Nothing teamSuspend :: - Members '[TeamStore, Input UTCTime] r => + ( Member TeamStore r, + Member (Input UTCTime) r + ) => TeamId -> Sem r () teamSuspend tid = journalEvent TeamEvent'TEAM_SUSPEND tid Nothing Nothing journalEvent :: - Members '[TeamStore, Input UTCTime] r => + ( Member TeamStore r, + Member (Input UTCTime) r + ) => TeamEvent'EventType -> TeamId -> Maybe TeamEvent'EventData -> @@ -124,7 +130,10 @@ evData memberCount billingUserIds cur = -- 'getBillingTeamMembers'. This is required only until data is backfilled in the -- 'billing_team_user' table. getBillingUserIds :: - Members '[Input Opts.Opts, TeamStore, P.TinyLog] r => + ( Member (Input Opts.Opts) r, + Member TeamStore r, + Member P.TinyLog r + ) => TeamId -> Maybe TeamMemberList -> Sem r [UserId] @@ -153,7 +162,13 @@ getBillingUserIds tid maybeMemberList = do filterFromMembers list = pure $ map (view userId) $ filter (`hasPermission` SetBilling) (list ^. teamMembers) - handleList :: Members '[TeamStore, P.TinyLog] r => Bool -> TeamMemberList -> Sem r [UserId] + handleList :: + ( Member TeamStore r, + Member P.TinyLog r + ) => + Bool -> + TeamMemberList -> + Sem r [UserId] handleList enableIndexedBillingTeamMembers list = case list ^. teamMemberListType of ListTruncated -> diff --git a/services/galley/src/Galley/Monad.hs b/services/galley/src/Galley/Monad.hs index f880dfd498..83cb34e5ed 100644 --- a/services/galley/src/Galley/Monad.hs +++ b/services/galley/src/Galley/Monad.hs @@ -68,7 +68,9 @@ instance LC.MonadLogger App where log (env ^. applog) lvl (reqIdMsg (env ^. reqId) . m) embedApp :: - Members '[Embed IO, Input Env] r => + ( Member (Embed IO) r, + Member (Input Env) r + ) => App a -> Sem r a embedApp action = do diff --git a/services/spar/src/Spar/API.hs b/services/spar/src/Spar/API.hs index 0d07dabafb..2489bf38d8 100644 --- a/services/spar/src/Spar/API.hs +++ b/services/spar/src/Spar/API.hs @@ -118,32 +118,33 @@ app ctx = serve (Proxy @API) (hoistServer (Proxy @API) (runSparToHandler ctx) (api $ sparCtxOpts ctx) :: Server API) api :: - Members - '[ GalleyAccess, - BrigAccess, - Input Opts, - AssIDStore, - AReqIDStore, - VerdictFormatStore, - ScimExternalIdStore, - ScimUserTimesStore, - ScimTokenStore, - DefaultSsoCode, - IdPConfigStore, - IdPRawMetadataStore, - SAMLUserStore, - Random, - Error SparError, - SAML2, - Now, - SamlProtocolSettings, - Logger String, - Reporter, - -- TODO(sandy): Only necessary for 'fromExceptionSem' in 'apiScim' - Final IO, - Logger (Msg -> Msg) - ] - r => + ( Member GalleyAccess r, + Member BrigAccess r, + Member (Input Opts) r, + Member AssIDStore r, + Member AReqIDStore r, + Member VerdictFormatStore r, + Member ScimExternalIdStore r, + Member ScimUserTimesStore r, + Member ScimTokenStore r, + Member DefaultSsoCode r, + Member IdPConfigStore r, + Member IdPRawMetadataStore r, + Member SAMLUserStore r, + Member Random r, + Member (Error SparError) r, + Member SAML2 r, + Member Now r, + Member SamlProtocolSettings r, + Member (Logger String) r, + Member Reporter r, + Member + ( -- TODO(sandy): Only necessary for 'fromExceptionSem' in 'apiScim' + Final IO + ) + r, + Member (Logger (Msg -> Msg)) r + ) => Opts -> ServerT API (Sem r) api opts = @@ -153,25 +154,23 @@ api opts = :<|> apiINTERNAL apiSSO :: - Members - '[ GalleyAccess, - Logger String, - Input Opts, - BrigAccess, - AssIDStore, - VerdictFormatStore, - AReqIDStore, - ScimTokenStore, - DefaultSsoCode, - IdPConfigStore, - Random, - Error SparError, - SAML2, - SamlProtocolSettings, - Reporter, - SAMLUserStore - ] - r => + ( Member GalleyAccess r, + Member (Logger String) r, + Member (Input Opts) r, + Member BrigAccess r, + Member AssIDStore r, + Member VerdictFormatStore r, + Member AReqIDStore r, + Member ScimTokenStore r, + Member DefaultSsoCode r, + Member IdPConfigStore r, + Member Random r, + Member (Error SparError) r, + Member SAML2 r, + Member SamlProtocolSettings r, + Member Reporter r, + Member SAMLUserStore r + ) => Opts -> ServerT APISSO (Sem r) apiSSO opts = @@ -184,18 +183,16 @@ apiSSO opts = :<|> ssoSettings apiIDP :: - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - ScimTokenStore, - IdPConfigStore, - IdPRawMetadataStore, - SAMLUserStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member IdPConfigStore r, + Member IdPRawMetadataStore r, + Member SAMLUserStore r, + Member (Error SparError) r + ) => ServerT APIIDP (Sem r) apiIDP = idpGet @@ -206,15 +203,13 @@ apiIDP = :<|> idpDelete apiINTERNAL :: - Members - '[ ScimTokenStore, - DefaultSsoCode, - IdPConfigStore, - Error SparError, - SAMLUserStore, - ScimUserTimesStore - ] - r => + ( Member ScimTokenStore r, + Member DefaultSsoCode r, + Member IdPConfigStore r, + Member (Error SparError) r, + Member SAMLUserStore r, + Member ScimUserTimesStore r + ) => ServerT InternalAPI (Sem r) apiINTERNAL = internalStatus @@ -229,11 +224,9 @@ appName = "spar" -- SSO API authreqPrecheck :: - Members - '[ IdPConfigStore, - Error SparError - ] - r => + ( Member IdPConfigStore r, + Member (Error SparError) r + ) => Maybe URI.URI -> Maybe URI.URI -> SAML.IdPId -> @@ -244,19 +237,17 @@ authreqPrecheck msucc merr idpid = $> NoContent authreq :: - Members - '[ Random, - Input Opts, - Logger String, - AssIDStore, - VerdictFormatStore, - AReqIDStore, - SAML2, - SamlProtocolSettings, - Error SparError, - IdPConfigStore - ] - r => + ( Member Random r, + Member (Input Opts) r, + Member (Logger String) r, + Member AssIDStore r, + Member VerdictFormatStore r, + Member AReqIDStore r, + Member SAML2 r, + Member SamlProtocolSettings r, + Member (Error SparError) r, + Member IdPConfigStore r + ) => NominalDiffTime -> Maybe URI.URI -> Maybe URI.URI -> @@ -294,24 +285,22 @@ validateRedirectURL uri = do authresp :: forall r. - Members - '[ Random, - Logger String, - Input Opts, - GalleyAccess, - BrigAccess, - AssIDStore, - VerdictFormatStore, - AReqIDStore, - ScimTokenStore, - IdPConfigStore, - SAML2, - SamlProtocolSettings, - Error SparError, - Reporter, - SAMLUserStore - ] - r => + ( Member Random r, + Member (Logger String) r, + Member (Input Opts) r, + Member GalleyAccess r, + Member BrigAccess r, + Member AssIDStore r, + Member VerdictFormatStore r, + Member AReqIDStore r, + Member ScimTokenStore r, + Member IdPConfigStore r, + Member SAML2 r, + Member SamlProtocolSettings r, + Member (Error SparError) r, + Member Reporter r, + Member SAMLUserStore r + ) => Maybe TeamId -> SAML.AuthnResponseBody -> Sem r Void @@ -339,15 +328,13 @@ ssoSettings = -- IdPConfigStore API idpGet :: - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - IdPConfigStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member IdPConfigStore r, + Member (Error SparError) r + ) => Maybe UserId -> SAML.IdPId -> Sem r IdP @@ -357,14 +344,12 @@ idpGet zusr idpid = withDebugLog "idpGet" (Just . show . (^. SAML.idpId)) $ do pure idp idpGetRaw :: - Members - '[ GalleyAccess, - BrigAccess, - IdPConfigStore, - IdPRawMetadataStore, - Error SparError - ] - r => + ( Member GalleyAccess r, + Member BrigAccess r, + Member IdPConfigStore r, + Member IdPRawMetadataStore r, + Member (Error SparError) r + ) => Maybe UserId -> SAML.IdPId -> Sem r RawIdPMetadata @@ -376,15 +361,13 @@ idpGetRaw zusr idpid = do Nothing -> throwSparSem $ SparIdPNotFound (cs $ show idpid) idpGetAll :: - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - IdPConfigStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member IdPConfigStore r, + Member (Error SparError) r + ) => Maybe UserId -> Sem r IdPList idpGetAll zusr = withDebugLog "idpGetAll" (const Nothing) $ do @@ -402,18 +385,16 @@ idpGetAll zusr = withDebugLog "idpGetAll" (const Nothing) $ do -- https://github.com/zinfra/backend-issues/issues/1314 idpDelete :: forall r. - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - ScimTokenStore, - SAMLUserStore, - IdPConfigStore, - IdPRawMetadataStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member SAMLUserStore r, + Member IdPConfigStore r, + Member IdPRawMetadataStore r, + Member (Error SparError) r + ) => Maybe UserId -> SAML.IdPId -> Maybe Bool -> @@ -479,17 +460,15 @@ idpDelete mbzusr idpid (fromMaybe False -> purge) = withDebugLog "idpDelete" (co -- | This handler only does the json parsing, and leaves all authorization checks and -- application logic to 'idpCreateXML'. idpCreate :: - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - ScimTokenStore, - IdPRawMetadataStore, - IdPConfigStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member IdPRawMetadataStore r, + Member IdPConfigStore r, + Member (Error SparError) r + ) => Maybe UserId -> IdPMetadataInfo -> Maybe SAML.IdPId -> @@ -500,17 +479,15 @@ idpCreate zusr (IdPMetadataValue raw xml) = idpCreateXML zusr raw xml -- | We generate a new UUID for each IdP used as IdPConfig's path, thereby ensuring uniqueness. idpCreateXML :: - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - ScimTokenStore, - IdPConfigStore, - IdPRawMetadataStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member IdPConfigStore r, + Member IdPRawMetadataStore r, + Member (Error SparError) r + ) => Maybe UserId -> Text -> SAML.IdPMetadata -> @@ -535,12 +512,10 @@ idpCreateXML zusr raw idpmeta mReplaces (fromMaybe defWireIdPAPIVersion -> apive -- credentials can be created. To fix this, we need to implement a way to associate scim -- tokens with IdPs. https://wearezeta.atlassian.net/browse/SQSERVICES-165 assertNoScimOrNoIdP :: - Members - '[ ScimTokenStore, - Error SparError, - IdPConfigStore - ] - r => + ( Member ScimTokenStore r, + Member (Error SparError) r, + Member IdPConfigStore r + ) => TeamId -> Sem r () assertNoScimOrNoIdP teamid = do @@ -574,13 +549,11 @@ assertNoScimOrNoIdP teamid = do validateNewIdP :: forall m r. (HasCallStack, m ~ Sem r) => - Members - '[ Random, - Logger String, - IdPConfigStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member IdPConfigStore r, + Member (Error SparError) r + ) => WireIdPAPIVersion -> SAML.IdPMetadata -> TeamId -> @@ -619,16 +592,14 @@ validateNewIdP apiversion _idpMetadata teamId mReplaces handle = withDebugLog "v -- 'idpCreate', which is not a good reason. make this one function and pass around -- 'IdPMetadataInfo' directly where convenient. idpUpdate :: - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - IdPConfigStore, - IdPRawMetadataStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member IdPConfigStore r, + Member IdPRawMetadataStore r, + Member (Error SparError) r + ) => Maybe UserId -> IdPMetadataInfo -> SAML.IdPId -> @@ -637,16 +608,14 @@ idpUpdate :: idpUpdate zusr (IdPMetadataValue raw xml) = idpUpdateXML zusr raw xml idpUpdateXML :: - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - IdPConfigStore, - IdPRawMetadataStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member IdPConfigStore r, + Member IdPRawMetadataStore r, + Member (Error SparError) r + ) => Maybe UserId -> Text -> SAML.IdPMetadata -> @@ -679,15 +648,13 @@ idpUpdateXML zusr raw idpmeta idpid mHandle = withDebugLog "idpUpdateXML" (Just validateIdPUpdate :: forall m r. (HasCallStack, m ~ Sem r) => - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - IdPConfigStore, - Error SparError - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member IdPConfigStore r, + Member (Error SparError) r + ) => Maybe UserId -> SAML.IdPMetadata -> SAML.IdPId -> @@ -736,7 +703,12 @@ withDebugLog msg showval action = do pure val authorizeIdP :: - (HasCallStack, Members '[GalleyAccess, BrigAccess, Error SparError] r) => + ( HasCallStack, + ( Member GalleyAccess r, + Member BrigAccess r, + Member (Error SparError) r + ) + ) => Maybe UserId -> IdP -> Sem r (UserId, TeamId) @@ -759,18 +731,22 @@ internalStatus = pure NoContent -- | Cleanup handler that is called by Galley whenever a team is about to -- get deleted. -internalDeleteTeam :: Members '[ScimTokenStore, IdPConfigStore, SAMLUserStore] r => TeamId -> Sem r NoContent +internalDeleteTeam :: + ( Member ScimTokenStore r, + Member IdPConfigStore r, + Member SAMLUserStore r + ) => + TeamId -> + Sem r NoContent internalDeleteTeam team = do deleteTeam team pure NoContent internalPutSsoSettings :: - Members - '[ DefaultSsoCode, - Error SparError, - IdPConfigStore - ] - r => + ( Member DefaultSsoCode r, + Member (Error SparError) r, + Member IdPConfigStore r + ) => SsoSettings -> Sem r NoContent internalPutSsoSettings SsoSettings {defaultSsoCode = Nothing} = do @@ -784,7 +760,7 @@ internalPutSsoSettings SsoSettings {defaultSsoCode = Just code} = *> DefaultSsoCode.store code $> NoContent -internalGetScimUserInfo :: Members '[ScimUserTimesStore] r => UserSet -> Sem r ScimUserInfos +internalGetScimUserInfo :: Member ScimUserTimesStore r => UserSet -> Sem r ScimUserInfos internalGetScimUserInfo (UserSet uids) = do results <- ScimUserTimesStore.readMulti (Set.toList uids) let scimUserInfos = results <&> (\(uid, t, _) -> ScimUserInfo uid (Just t)) diff --git a/services/spar/src/Spar/App.hs b/services/spar/src/Spar/App.hs index e1540744c1..01b09bd099 100644 --- a/services/spar/src/Spar/App.hs +++ b/services/spar/src/Spar/App.hs @@ -129,12 +129,23 @@ data Env = Env -- https://github.com/wireapp/wire-server/pull/1418) -- -- FUTUREWORK: https://wearezeta.atlassian.net/browse/SQSERVICES-1655 -getUserByUrefUnsafe :: Members '[BrigAccess, SAMLUserStore] r => SAML.UserRef -> Sem r (Maybe User) +getUserByUrefUnsafe :: + ( Member BrigAccess r, + Member SAMLUserStore r + ) => + SAML.UserRef -> + Sem r (Maybe User) getUserByUrefUnsafe uref = do maybe (pure Nothing) (Intra.getBrigUser Intra.WithPendingInvitations) =<< SAMLUserStore.get uref -- FUTUREWORK: Remove and reinstatate getUser, in AuthID refactoring PR -getUserIdByScimExternalId :: Members '[BrigAccess, ScimExternalIdStore] r => TeamId -> Email -> Sem r (Maybe UserId) +getUserIdByScimExternalId :: + ( Member BrigAccess r, + Member ScimExternalIdStore r + ) => + TeamId -> + Email -> + Sem r (Maybe UserId) getUserIdByScimExternalId tid email = do muid <- ScimExternalIdStore.lookup tid email case muid of @@ -161,12 +172,10 @@ getUserIdByScimExternalId tid email = do -- users that have an sso id, unless the request comes from spar. then we can make users -- undeletable in the team admin page, and ask admins to go talk to their IdP system. createSamlUserWithId :: - Members - '[ Error SparError, - BrigAccess, - SAMLUserStore - ] - r => + ( Member (Error SparError) r, + Member BrigAccess r, + Member SAMLUserStore r + ) => TeamId -> UserId -> SAML.UserRef -> @@ -183,15 +192,13 @@ createSamlUserWithId teamid buid suid role = do -- https://wearezeta.atlassian.net/browse/SQSERVICES-1655) autoprovisionSamlUser :: forall r. - Members - '[ GalleyAccess, - BrigAccess, - ScimTokenStore, - IdPConfigStore, - Error SparError, - SAMLUserStore - ] - r => + ( Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member IdPConfigStore r, + Member (Error SparError) r, + Member SAMLUserStore r + ) => IdP -> UserId -> SAML.UserRef -> @@ -217,14 +224,29 @@ autoprovisionSamlUser idp buid suid = do -- | If user's 'NameID' is an email address and the team has email validation for SSO enabled, -- make brig initiate the email validate procedure. -validateEmailIfExists :: forall r. Members '[GalleyAccess, BrigAccess] r => UserId -> SAML.UserRef -> Sem r () +validateEmailIfExists :: + forall r. + ( Member GalleyAccess r, + Member BrigAccess r + ) => + UserId -> + SAML.UserRef -> + Sem r () validateEmailIfExists uid = \case (SAML.UserRef _ (view SAML.nameID -> UNameIDEmail email)) -> do mbTid <- Intra.getBrigUserTeam Intra.NoPendingInvitations uid validateEmail mbTid uid . Intra.emailFromSAML . CI.original $ email _ -> pure () -validateEmail :: forall r. Members '[GalleyAccess, BrigAccess] r => Maybe TeamId -> UserId -> Email -> Sem r () +validateEmail :: + forall r. + ( Member GalleyAccess r, + Member BrigAccess r + ) => + Maybe TeamId -> + UserId -> + Email -> + Sem r () validateEmail mbTid uid email = do enabled <- maybe (pure False) GalleyAccess.isEmailValidationEnabledTeam mbTid when enabled $ do @@ -241,20 +263,18 @@ validateEmail mbTid uid email = do -- latter. verdictHandler :: HasCallStack => - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - AReqIDStore, - VerdictFormatStore, - ScimTokenStore, - IdPConfigStore, - Error SparError, - Reporter, - SAMLUserStore - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member AReqIDStore r, + Member VerdictFormatStore r, + Member ScimTokenStore r, + Member IdPConfigStore r, + Member (Error SparError) r, + Member Reporter r, + Member SAMLUserStore r + ) => SAML.AuthnResponse -> SAML.AccessVerdict -> IdP -> @@ -285,18 +305,16 @@ data VerdictHandlerResult verdictHandlerResult :: HasCallStack => - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - ScimTokenStore, - IdPConfigStore, - Error SparError, - Reporter, - SAMLUserStore - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member IdPConfigStore r, + Member (Error SparError) r, + Member Reporter r, + Member SAMLUserStore r + ) => SAML.AccessVerdict -> IdP -> Sem r VerdictHandlerResult @@ -308,11 +326,9 @@ verdictHandlerResult verdict idp = do catchVerdictErrors :: forall r. - Members - '[ Reporter, - Error SparError - ] - r => + ( Member Reporter r, + Member (Error SparError) r + ) => Sem r VerdictHandlerResult -> Sem r VerdictHandlerResult catchVerdictErrors = (`catch` hndlr) @@ -331,13 +347,11 @@ catchVerdictErrors = (`catch` hndlr) -- FUTUREWORK: https://wearezeta.atlassian.net/browse/SQSERVICES-1655 getUserByUrefViaOldIssuerUnsafe :: forall r. - Members - '[ BrigAccess, - IdPConfigStore, - SAMLUserStore, - Error SparError - ] - r => + ( Member BrigAccess r, + Member IdPConfigStore r, + Member SAMLUserStore r, + Member (Error SparError) r + ) => IdP -> SAML.UserRef -> Sem r (Maybe (SAML.UserRef, User)) @@ -352,7 +366,14 @@ getUserByUrefViaOldIssuerUnsafe idp (SAML.UserRef _ subject) = do -- | After a user has been found using 'findUserWithOldIssuer', update it everywhere so that -- the old IdP is not needed any more next time. -moveUserToNewIssuer :: Members '[BrigAccess, SAMLUserStore] r => SAML.UserRef -> SAML.UserRef -> UserId -> Sem r () +moveUserToNewIssuer :: + ( Member BrigAccess r, + Member SAMLUserStore r + ) => + SAML.UserRef -> + SAML.UserRef -> + UserId -> + Sem r () moveUserToNewIssuer oldUserRef newUserRef uid = do SAMLUserStore.insert newUserRef uid BrigAccess.setVeid uid (UrefOnly newUserRef) @@ -360,17 +381,15 @@ moveUserToNewIssuer oldUserRef newUserRef uid = do verdictHandlerResultCore :: HasCallStack => - Members - '[ Random, - Logger String, - GalleyAccess, - BrigAccess, - ScimTokenStore, - IdPConfigStore, - Error SparError, - SAMLUserStore - ] - r => + ( Member Random r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member IdPConfigStore r, + Member (Error SparError) r, + Member SAMLUserStore r + ) => IdP -> SAML.AccessVerdict -> Sem r VerdictHandlerResult @@ -546,7 +565,12 @@ errorPage err mpInputs = -- | Delete all tokens belonging to a team. deleteTeam :: - (HasCallStack, Members '[ScimTokenStore, SAMLUserStore, IdPConfigStore] r) => + ( HasCallStack, + ( Member ScimTokenStore r, + Member SAMLUserStore r, + Member IdPConfigStore r + ) + ) => TeamId -> Sem r () deleteTeam team = do diff --git a/services/spar/src/Spar/Intra/BrigApp.hs b/services/spar/src/Spar/Intra/BrigApp.hs index 862bb9dd83..ad3c53310d 100644 --- a/services/spar/src/Spar/Intra/BrigApp.hs +++ b/services/spar/src/Spar/Intra/BrigApp.hs @@ -126,7 +126,14 @@ getBrigUserTeam ifpend = fmap (userTeam =<<) . getBrigUser ifpend -- permission check fails or the user is not in status 'Active'. getZUsrCheckPerm :: forall r perm. - (HasCallStack, Members '[BrigAccess, GalleyAccess, Error SparError] r, IsPerm perm, Show perm) => + ( HasCallStack, + ( Member BrigAccess r, + Member GalleyAccess r, + Member (Error SparError) r + ), + IsPerm perm, + Show perm + ) => Maybe UserId -> perm -> Sem r TeamId @@ -139,7 +146,12 @@ getZUsrCheckPerm (Just uid) perm = do authorizeScimTokenManagement :: forall r. - (HasCallStack, Members '[BrigAccess, GalleyAccess, Error SparError] r) => + ( HasCallStack, + ( Member BrigAccess r, + Member GalleyAccess r, + Member (Error SparError) r + ) + ) => Maybe UserId -> Sem r TeamId authorizeScimTokenManagement Nothing = throw $ SAML.CustomError SparMissingZUsr diff --git a/services/spar/src/Spar/Scim.hs b/services/spar/src/Spar/Scim.hs index d017d8faaf..43fba22000 100644 --- a/services/spar/src/Spar/Scim.hs +++ b/services/spar/src/Spar/Scim.hs @@ -110,25 +110,26 @@ configuration = Scim.Meta.empty apiScim :: forall r. - Members - '[ Random, - Input Opts, - Logger (Msg -> Msg), - Logger String, - Now, - Error SparError, - GalleyAccess, - BrigAccess, - ScimExternalIdStore, - ScimUserTimesStore, - ScimTokenStore, - Reporter, - IdPConfigStore, - -- TODO(sandy): Only necessary for 'fromExceptionSem'. But can these errors even happen? - Final IO, - SAMLUserStore - ] - r => + ( Member Random r, + Member (Input Opts) r, + Member (Logger (Msg -> Msg)) r, + Member (Logger String) r, + Member Now r, + Member (Error SparError) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimExternalIdStore r, + Member ScimUserTimesStore r, + Member ScimTokenStore r, + Member Reporter r, + Member IdPConfigStore r, + Member + ( -- TODO(sandy): Only necessary for 'fromExceptionSem'. But can these errors even happen? + Final IO + ) + r, + Member SAMLUserStore r + ) => ServerT APIScim (Sem r) apiScim = hoistScim (toServant (server configuration)) diff --git a/services/spar/src/Spar/Scim/Auth.hs b/services/spar/src/Spar/Scim/Auth.hs index 12081181f9..31c71987de 100644 --- a/services/spar/src/Spar/Scim/Auth.hs +++ b/services/spar/src/Spar/Scim/Auth.hs @@ -88,17 +88,15 @@ instance Member ScimTokenStore r => Scim.Class.Auth.AuthDB SparTag (Sem r) where -- | API for manipulating SCIM tokens (protected by normal Wire authentication and available -- only to team owners). apiScimToken :: - Members - '[ Random, - Input Opts, - GalleyAccess, - BrigAccess, - ScimTokenStore, - Now, - IdPConfigStore, - Error E.SparError - ] - r => + ( Member Random r, + Member (Input Opts) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member Now r, + Member IdPConfigStore r, + Member (Error E.SparError) r + ) => ServerT APIScimToken (Sem r) apiScimToken = createScimToken @@ -110,17 +108,15 @@ apiScimToken = -- Create a token for user's team. createScimToken :: forall r. - Members - '[ Random, - Input Opts, - GalleyAccess, - BrigAccess, - ScimTokenStore, - IdPConfigStore, - Now, - Error E.SparError - ] - r => + ( Member Random r, + Member (Input Opts) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member IdPConfigStore r, + Member Now r, + Member (Error E.SparError) r + ) => -- | Who is trying to create a token Maybe UserId -> -- | Request body @@ -171,7 +167,11 @@ createScimToken zusr Api.CreateScimToken {..} = do -- -- Delete a token belonging to user's team. deleteScimToken :: - Members '[GalleyAccess, BrigAccess, ScimTokenStore, Error E.SparError] r => + ( Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member (Error E.SparError) r + ) => -- | Who is trying to delete a token Maybe UserId -> ScimTokenId -> @@ -186,7 +186,11 @@ deleteScimToken zusr tokenid = do -- List all tokens belonging to user's team. Tokens themselves are not available, only -- metadata about them. listScimTokens :: - Members '[GalleyAccess, BrigAccess, ScimTokenStore, Error E.SparError] r => + ( Member GalleyAccess r, + Member BrigAccess r, + Member ScimTokenStore r, + Member (Error E.SparError) r + ) => -- | Who is trying to list tokens Maybe UserId -> Sem r ScimTokenList diff --git a/services/spar/src/Spar/Scim/User.hs b/services/spar/src/Spar/Scim/User.hs index 2215547ca4..e42b00d95c 100644 --- a/services/spar/src/Spar/Scim/User.hs +++ b/services/spar/src/Spar/Scim/User.hs @@ -116,20 +116,18 @@ import qualified Wire.Sem.Random as Random -- UserDB instance instance - Members - '[ Logger (Msg -> Msg), - Logger String, - Random, - Input Opts, - Now, - GalleyAccess, - BrigAccess, - ScimExternalIdStore, - ScimUserTimesStore, - IdPConfigStore, - SAMLUserStore - ] - r => + ( Member (Logger (Msg -> Msg)) r, + Member (Logger String) r, + Member Random r, + Member (Input Opts) r, + Member Now r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimExternalIdStore r, + Member ScimUserTimesStore r, + Member IdPConfigStore r, + Member SAMLUserStore r + ) => Scim.UserDB ST.SparTag (Sem r) where getUsers :: @@ -200,7 +198,9 @@ instance validateScimUser :: forall m r. (m ~ Scim.ScimHandler (Sem r)) => - Members '[Input Opts, IdPConfigStore] r => + ( Member (Input Opts) r, + Member IdPConfigStore r + ) => Text -> -- | Used to decide what IdP to assign the user to ScimTokenInfo -> @@ -427,19 +427,17 @@ veidEmail (ST.EmailOnly email) = Just email createValidScimUser :: forall m r. (m ~ Scim.ScimHandler (Sem r)) => - Members - '[ Random, - Now, - Input Opts, - Logger (Msg -> Msg), - Logger String, - GalleyAccess, - BrigAccess, - ScimExternalIdStore, - ScimUserTimesStore, - SAMLUserStore - ] - r => + ( Member Random r, + Member Now r, + Member (Input Opts) r, + Member (Logger (Msg -> Msg)) r, + Member (Logger String) r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimExternalIdStore r, + Member ScimUserTimesStore r, + Member SAMLUserStore r + ) => ScimTokenInfo -> ST.ValidScimUser -> m (Scim.StoredUser ST.SparTag) @@ -542,20 +540,18 @@ createValidScimUserSpar stiTeam uid storedUser veid = lift $ do -- TODO(arianvp): how do we get this safe w.r.t. race conditions / crashes? updateValidScimUser :: forall m r. - Members - '[ Random, - Input Opts, - Logger (Msg -> Msg), - Logger String, - Now, - GalleyAccess, - BrigAccess, - ScimExternalIdStore, - ScimUserTimesStore, - IdPConfigStore, - SAMLUserStore - ] - r => + ( Member Random r, + Member (Input Opts) r, + Member (Logger (Msg -> Msg)) r, + Member (Logger String) r, + Member Now r, + Member GalleyAccess r, + Member BrigAccess r, + Member ScimExternalIdStore r, + Member ScimUserTimesStore r, + Member IdPConfigStore r, + Member SAMLUserStore r + ) => (m ~ Scim.ScimHandler (Sem r)) => ScimTokenInfo -> UserId -> @@ -620,13 +616,11 @@ updateValidScimUser tokinfo@ScimTokenInfo {stiTeam} uid nvsu = Scim.getUser tokinfo uid updateVsuUref :: - Members - '[ GalleyAccess, - BrigAccess, - ScimExternalIdStore, - SAMLUserStore - ] - r => + ( Member GalleyAccess r, + Member BrigAccess r, + Member ScimExternalIdStore r, + Member SAMLUserStore r + ) => TeamId -> UserId -> ST.ValidExternalId -> @@ -697,15 +691,13 @@ updScimStoredUser' now usr (Scim.WithMeta meta (Scim.WithId scimuid _)) = } deleteScimUser :: - Members - '[ Logger (Msg -> Msg), - BrigAccess, - ScimExternalIdStore, - ScimUserTimesStore, - SAMLUserStore, - IdPConfigStore - ] - r => + ( Member (Logger (Msg -> Msg)) r, + Member BrigAccess r, + Member ScimExternalIdStore r, + Member ScimUserTimesStore r, + Member SAMLUserStore r, + Member IdPConfigStore r + ) => ScimTokenInfo -> UserId -> Scim.ScimHandler (Sem r) () @@ -759,13 +751,11 @@ deleteScimUser tokeninfo@ScimTokenInfo {stiTeam, stiIdP} uid = pure () where deleteUserInSpar :: - Members - '[ IdPConfigStore, - SAMLUserStore, - ScimExternalIdStore, - ScimUserTimesStore - ] - r => + ( Member IdPConfigStore r, + Member SAMLUserStore r, + Member ScimExternalIdStore r, + Member ScimUserTimesStore r + ) => User -> Scim.ScimHandler (Sem r) () deleteUserInSpar brigUser = do @@ -810,7 +800,10 @@ calculateVersion uid usr = Scim.Weak (Text.pack (show h)) -- ASSUMPTION: every scim user has a 'SAML.UserRef', and the `SAML.NameID` in it corresponds -- to a single `externalId`. assertExternalIdUnused :: - Members '[BrigAccess, ScimExternalIdStore, SAMLUserStore] r => + ( Member BrigAccess r, + Member ScimExternalIdStore r, + Member SAMLUserStore r + ) => TeamId -> ST.ValidExternalId -> Scim.ScimHandler (Sem r) () @@ -823,7 +816,15 @@ assertExternalIdUnused = -- -- ASSUMPTION: every scim user has a 'SAML.UserRef', and the `SAML.NameID` in it corresponds -- to a single `externalId`. -assertExternalIdNotUsedElsewhere :: Members '[BrigAccess, ScimExternalIdStore, SAMLUserStore] r => TeamId -> ST.ValidExternalId -> UserId -> Scim.ScimHandler (Sem r) () +assertExternalIdNotUsedElsewhere :: + ( Member BrigAccess r, + Member ScimExternalIdStore r, + Member SAMLUserStore r + ) => + TeamId -> + ST.ValidExternalId -> + UserId -> + Scim.ScimHandler (Sem r) () assertExternalIdNotUsedElsewhere tid veid wireUserId = assertExternalIdInAllowedValues [Nothing, Just wireUserId] @@ -831,7 +832,16 @@ assertExternalIdNotUsedElsewhere tid veid wireUserId = tid veid -assertExternalIdInAllowedValues :: Members '[BrigAccess, ScimExternalIdStore, SAMLUserStore] r => [Maybe UserId] -> Text -> TeamId -> ST.ValidExternalId -> Scim.ScimHandler (Sem r) () +assertExternalIdInAllowedValues :: + ( Member BrigAccess r, + Member ScimExternalIdStore r, + Member SAMLUserStore r + ) => + [Maybe UserId] -> + Text -> + TeamId -> + ST.ValidExternalId -> + Scim.ScimHandler (Sem r) () assertExternalIdInAllowedValues allowedValues errmsg tid veid = do isGood <- lift $ @@ -863,15 +873,13 @@ assertHandleNotUsedElsewhere uid hndl = do -- stamps. synthesizeStoredUser :: forall r. - Members - '[ Input Opts, - Now, - Logger (Msg -> Msg), - BrigAccess, - GalleyAccess, - ScimUserTimesStore - ] - r => + ( Member (Input Opts) r, + Member Now r, + Member (Logger (Msg -> Msg)) r, + Member BrigAccess r, + Member GalleyAccess r, + Member ScimUserTimesStore r + ) => UserAccount -> ST.ValidExternalId -> Scim.ScimHandler (Sem r) (Scim.StoredUser ST.SparTag) diff --git a/services/spar/src/Spar/Sem/AReqIDStore/Cassandra.hs b/services/spar/src/Spar/Sem/AReqIDStore/Cassandra.hs index 1f88807b0a..87a2ef9e55 100644 --- a/services/spar/src/Spar/Sem/AReqIDStore/Cassandra.hs +++ b/services/spar/src/Spar/Sem/AReqIDStore/Cassandra.hs @@ -41,7 +41,14 @@ import qualified Wire.Sem.Now as Now aReqIDStoreToCassandra :: forall m r a. - (MonadClient m, Members '[Embed m, Now, Error TTLError, Embed IO, Input Opts] r) => + ( MonadClient m, + ( Member (Embed m) r, + Member Now r, + Member (Error TTLError) r, + Member (Embed IO) r, + Member (Input Opts) r + ) + ) => Sem (AReqIDStore ': r) a -> Sem r a aReqIDStoreToCassandra = interpret $ \case diff --git a/services/spar/src/Spar/Sem/AssIDStore/Cassandra.hs b/services/spar/src/Spar/Sem/AssIDStore/Cassandra.hs index dd84c18209..877b2b3b6f 100644 --- a/services/spar/src/Spar/Sem/AssIDStore/Cassandra.hs +++ b/services/spar/src/Spar/Sem/AssIDStore/Cassandra.hs @@ -41,7 +41,14 @@ import qualified Wire.Sem.Now as Now assIDStoreToCassandra :: forall m r a. - (MonadClient m, Members '[Embed m, Now, Error TTLError, Embed IO, Input Opts] r) => + ( MonadClient m, + ( Member (Embed m) r, + Member Now r, + Member (Error TTLError) r, + Member (Embed IO) r, + Member (Input Opts) r + ) + ) => Sem (AssIDStore ': r) a -> Sem r a assIDStoreToCassandra = diff --git a/services/spar/src/Spar/Sem/BrigAccess/Http.hs b/services/spar/src/Spar/Sem/BrigAccess/Http.hs index 0cd47ba97d..0331cca84d 100644 --- a/services/spar/src/Spar/Sem/BrigAccess/Http.hs +++ b/services/spar/src/Spar/Sem/BrigAccess/Http.hs @@ -32,7 +32,10 @@ import qualified System.Logger as TinyLog import Wire.Sem.Logger (Logger) brigAccessToHttp :: - Members '[Logger (TinyLog.Msg -> TinyLog.Msg), Error SparError, Embed IO] r => + ( Member (Logger (TinyLog.Msg -> TinyLog.Msg)) r, + Member (Error SparError) r, + Member (Embed IO) r + ) => Bilge.Manager -> Bilge.Request -> Sem (BrigAccess ': r) a -> diff --git a/services/spar/src/Spar/Sem/GalleyAccess/Http.hs b/services/spar/src/Spar/Sem/GalleyAccess/Http.hs index f50e01bc25..793bac9c27 100644 --- a/services/spar/src/Spar/Sem/GalleyAccess/Http.hs +++ b/services/spar/src/Spar/Sem/GalleyAccess/Http.hs @@ -34,7 +34,10 @@ import qualified System.Logger as TinyLog import Wire.Sem.Logger (Logger) galleyAccessToHttp :: - Members '[Logger (TinyLog.Msg -> TinyLog.Msg), Error SparError, Embed IO] r => + ( Member (Logger (TinyLog.Msg -> TinyLog.Msg)) r, + Member (Error SparError) r, + Member (Embed IO) r + ) => Bilge.Manager -> Bilge.Request -> Sem (GalleyAccess ': r) a -> diff --git a/services/spar/src/Spar/Sem/Reporter/Wai.hs b/services/spar/src/Spar/Sem/Reporter/Wai.hs index a5ae93fe5c..e2d0b66ef6 100644 --- a/services/spar/src/Spar/Sem/Reporter/Wai.hs +++ b/services/spar/src/Spar/Sem/Reporter/Wai.hs @@ -27,7 +27,12 @@ import Polysemy.Input import Spar.Sem.Reporter import qualified System.Logger as TinyLog -reporterToTinyLogWai :: Members '[Embed IO, Input TinyLog.Logger] r => Sem (Reporter ': r) a -> Sem r a +reporterToTinyLogWai :: + ( Member (Embed IO) r, + Member (Input TinyLog.Logger) r + ) => + Sem (Reporter ': r) a -> + Sem r a reporterToTinyLogWai = interpret $ \case Report req err -> do logger <- input diff --git a/services/spar/src/Spar/Sem/SAML2/Library.hs b/services/spar/src/Spar/Sem/SAML2/Library.hs index 993b0fa407..3d2ac1a32a 100644 --- a/services/spar/src/Spar/Sem/SAML2/Library.hs +++ b/services/spar/src/Spar/Sem/SAML2/Library.hs @@ -46,7 +46,12 @@ import Wire.API.User.IdentityProvider (WireIdP) import Wire.Sem.Logger (Logger) import qualified Wire.Sem.Logger as Logger -wrapMonadClientSPImpl :: Members '[Error SparError, Final IO] r => Sem r a -> SPImpl r a +wrapMonadClientSPImpl :: + ( Member (Error SparError) r, + Member (Final IO) r + ) => + Sem r a -> + SPImpl r a wrapMonadClientSPImpl action = SPImpl action `Catch.catch` (SPImpl . throw . SAML.CustomError . SparCassandraError . cs . show @SomeException) @@ -68,7 +73,10 @@ newtype SPImpl r a = SPImpl {unSPImpl :: Sem r a} instance Member (Input Opts) r => HasConfig (SPImpl r) where getConfig = SPImpl $ inputs saml -instance Members '[Input Opts, Logger String] r => HasLogger (SPImpl r) where +instance + Member (Logger String) r => + HasLogger (SPImpl r) + where logger lvl = SPImpl . Logger.log (Logger.samlFromLevel lvl) instance Member (Embed IO) r => MonadIO (SPImpl r) where @@ -78,17 +86,35 @@ instance Member (Embed IO) r => HasCreateUUID (SPImpl r) instance Member (Embed IO) r => HasNow (SPImpl r) -instance Members '[Error SparError, Final IO, AReqIDStore] r => SPStoreID AuthnRequest (SPImpl r) where +instance + ( Member (Error SparError) r, + Member (Final IO) r, + Member AReqIDStore r + ) => + SPStoreID AuthnRequest (SPImpl r) + where storeID = (wrapMonadClientSPImpl .) . AReqIDStore.store unStoreID = wrapMonadClientSPImpl . AReqIDStore.unStore isAliveID = wrapMonadClientSPImpl . AReqIDStore.isAlive -instance Members '[Error SparError, Final IO, AssIDStore] r => SPStoreID Assertion (SPImpl r) where +instance + ( Member (Error SparError) r, + Member (Final IO) r, + Member AssIDStore r + ) => + SPStoreID Assertion (SPImpl r) + where storeID = (wrapMonadClientSPImpl .) . AssIDStore.store unStoreID = wrapMonadClientSPImpl . AssIDStore.unStore isAliveID = wrapMonadClientSPImpl . AssIDStore.isAlive -instance Members '[Error SparError, IdPConfigStore, Final IO] r => SPStoreIdP SparError (SPImpl r) where +instance + ( Member (Error SparError) r, + Member IdPConfigStore r, + Member (Final IO) r + ) => + SPStoreIdP SparError (SPImpl r) + where type IdPConfigExtra (SPImpl r) = WireIdP type IdPConfigSPId (SPImpl r) = TeamId @@ -107,17 +133,15 @@ instance Member (Error SparError) r => MonadError SparError (SPImpl r) where -- * https://reasonablypolymorphic.com/blog/tactics/ saml2ToSaml2WebSso :: forall r a. - Members - '[ AReqIDStore, - AssIDStore, - Error SparError, - IdPConfigStore, - Input Opts, - Logger String, - Embed IO, - Final IO - ] - r => + ( Member AReqIDStore r, + Member AssIDStore r, + Member (Error SparError) r, + Member IdPConfigStore r, + Member (Input Opts) r, + Member (Logger String) r, + Member (Embed IO) r, + Member (Final IO) r + ) => Sem (SAML2 ': r) a -> Sem r a saml2ToSaml2WebSso = @@ -147,17 +171,15 @@ saml2ToSaml2WebSso = liftT $ unSPImpl $ SAML.toggleCookie sbs mp inspectOrBomb :: - Members - '[ AReqIDStore, - AssIDStore, - Error SparError, - IdPConfigStore, - Logger String, - Input Opts, - Embed IO, - Final IO - ] - r => + ( Member AReqIDStore r, + Member AssIDStore r, + Member (Error SparError) r, + Member IdPConfigStore r, + Member (Logger String) r, + Member (Input Opts) r, + Member (Embed IO) r, + Member (Final IO) r + ) => Inspector f -> Sem (SAML2 : r) (f b) -> SPImpl r b diff --git a/services/spar/src/Spar/Sem/Utils.hs b/services/spar/src/Spar/Sem/Utils.hs index d6cb57d840..0f43096178 100644 --- a/services/spar/src/Spar/Sem/Utils.hs +++ b/services/spar/src/Spar/Sem/Utils.hs @@ -48,7 +48,9 @@ import qualified Wire.Sem.Logger as Logger -- | Run an embedded Cassandra 'Client' in @Final IO@. interpretClientToIO :: - Members '[Error SparError, Final IO] r => + ( Member (Error SparError) r, + Member (Final IO) r + ) => ClientState -> Sem (Embed Client ': r) a -> Sem r a @@ -89,7 +91,7 @@ semToRunHttp :: Sem r a -> RunHttp r a semToRunHttp = RunHttp . lift . lift . lift viaRunHttp :: - Members '[Error SparError, Embed IO] r => + Member (Error SparError) r => RunHttpEnv r -> RunHttp r a -> Sem r a @@ -102,12 +104,22 @@ viaRunHttp env m = do instance Member (Logger (TinyLog.Msg -> TinyLog.Msg)) r => TinyLog.MonadLogger (RunHttp r) where log lvl msg = semToRunHttp $ Logger.log (Logger.fromLevel lvl) msg -instance Members '[Logger (TinyLog.Msg -> TinyLog.Msg), Embed IO] r => MonadSparToGalley (RunHttp r) where +instance + ( Member (Logger (TinyLog.Msg -> TinyLog.Msg)) r, + Member (Embed IO) r + ) => + MonadSparToGalley (RunHttp r) + where call modreq = do req <- asks rheRequest httpLbs req modreq -instance Members '[Logger (TinyLog.Msg -> TinyLog.Msg), Embed IO] r => MonadSparToBrig (RunHttp r) where +instance + ( Member (Logger (TinyLog.Msg -> TinyLog.Msg)) r, + Member (Embed IO) r + ) => + MonadSparToBrig (RunHttp r) + where call modreq = do req <- asks rheRequest httpLbs req modreq diff --git a/services/spar/test/Test/Spar/Scim/UserSpec.hs b/services/spar/test/Test/Spar/Scim/UserSpec.hs index 271712d6ed..16dc0636a1 100644 --- a/services/spar/test/Test/Spar/Scim/UserSpec.hs +++ b/services/spar/test/Test/Spar/Scim/UserSpec.hs @@ -118,7 +118,7 @@ ignoringState f = fmap snd . f mockBrig :: forall (r :: EffectRow) a. - Members '[Embed IO] r => + Member (Embed IO) r => (UserId -> Maybe UserAccount) -> DeleteUserResult -> Sem (BrigAccess ': r) a ->