Files
overleaf-cep/services/web/app/src/Features/Subscription/SubscriptionGroupController.js
T
Alexandre Bourdin 71be7d47a2 Merge pull request #16550 from overleaf/ab-unlink-sso-user-leaves-group
[web] Unlink group SSO when user leaves/is removed from group

GitOrigin-RevId: a4515f8b6f0f0012fc4d9f47b11e6f711743c2ec
2024-01-19 09:05:23 +00:00

117 lines
3.0 KiB
JavaScript

// ts-check
const SubscriptionGroupHandler = require('./SubscriptionGroupHandler')
const OError = require('@overleaf/o-error')
const logger = require('@overleaf/logger')
const SubscriptionLocator = require('./SubscriptionLocator')
const SessionManager = require('../Authentication/SessionManager')
const UserAuditLogHandler = require('../User/UserAuditLogHandler')
const { expressify } = require('@overleaf/promise-utils')
const Modules = require('../../infrastructure/Modules')
/**
* @typedef {import("../../../../types/subscription/dashboard/subscription").Subscription} Subscription
*/
/**
* @param {import("express").Request} req
* @param {import("express").Response} res
* @returns {Promise<void>}
*/
async function removeUserFromGroup(req, res) {
const subscription = req.entity
const userToRemoveId = req.params.user_id
const loggedInUserId = SessionManager.getLoggedInUserId(req.session)
const subscriptionId = subscription._id
logger.debug(
{ subscriptionId, userToRemoveId },
'removing user from group subscription'
)
await _removeUserFromGroup(req, res, {
userToRemoveId,
loggedInUserId,
subscription,
})
}
/**
* @param {import("express").Request} req
* @param {import("express").Response} res
* @returns {Promise<void>}
*/
async function removeSelfFromGroup(req, res) {
const userToRemoveId = SessionManager.getLoggedInUserId(req.session)
const subscription = await SubscriptionLocator.promises.getSubscription(
req.query.subscriptionId
)
await _removeUserFromGroup(req, res, {
userToRemoveId,
loggedInUserId: userToRemoveId,
subscription,
})
}
/**
* @param {import("express").Request} req
* @param {import("express").Response} res
* @param {string} userToRemoveId
* @param {string} loggedInUserId
* @param {Subscription} subscription
* @returns {Promise<void>}
* @private
*/
async function _removeUserFromGroup(
req,
res,
{ userToRemoveId, loggedInUserId, subscription }
) {
const subscriptionId = subscription._id
const groupSSOActive = (
await Modules.promises.hooks.fire('hasGroupSSOEnabled', subscription)
)?.[0]
if (groupSSOActive) {
await Modules.promises.hooks.fire(
'unlinkUserFromGroupSSO',
userToRemoveId,
subscriptionId
)
}
try {
await UserAuditLogHandler.promises.addEntry(
userToRemoveId,
'remove-from-group-subscription',
loggedInUserId,
req.ip,
{ subscriptionId }
)
} catch (auditLogError) {
throw OError.tag(auditLogError, 'error adding audit log entry', {
userToRemoveId,
subscriptionId,
})
}
try {
await SubscriptionGroupHandler.promises.removeUserFromGroup(
subscriptionId,
userToRemoveId
)
} catch (error) {
logger.err(
{ err: error, userToRemoveId, subscriptionId },
'error removing self from group'
)
return res.sendStatus(500)
}
res.sendStatus(200)
}
module.exports = {
removeUserFromGroup: expressify(removeUserFromGroup),
removeSelfFromGroup: expressify(removeSelfFromGroup),
}