Merge pull request #25983 from overleaf/ii-managed-users-make-unmanaged-roles-access

[web] Prevent managers from removing/deleting themselves

GitOrigin-RevId: 9287dc06bab8024bf03fecff678a4118a9456919
This commit is contained in:
ilkin-overleaf
2025-06-13 08:05:46 +00:00
committed by Copybot
parent 277e59fbd5
commit cfc6ff0759
12 changed files with 181 additions and 6 deletions
@@ -162,6 +162,45 @@ const SubscriptionLocator = {
}
: null
},
async getUserSubscriptionStatus(userId) {
let usersSubscription = { personal: false, group: false }
if (!userId) {
return usersSubscription
}
const memberSubscriptions =
await SubscriptionLocator.getMemberSubscriptions(userId)
const hasActiveGroupSubscription = memberSubscriptions.some(
subscription =>
subscription.recurlyStatus?.state === 'active' && subscription.groupPlan
)
if (hasActiveGroupSubscription) {
// Member of a group plan
usersSubscription = { ...usersSubscription, group: true }
}
const personalSubscription =
await SubscriptionLocator.getUsersSubscription(userId)
if (personalSubscription) {
const hasActivePersonalSubscription =
personalSubscription.recurlyStatus?.state === 'active'
if (hasActivePersonalSubscription) {
if (personalSubscription.groupPlan) {
// Owner of a group plan
usersSubscription = { ...usersSubscription, group: true }
} else {
// Owner of an individual plan
usersSubscription = { ...usersSubscription, personal: true }
}
}
}
return usersSubscription
},
}
module.exports = {
@@ -132,6 +132,9 @@ async function viewInvite(req, res, next) {
logger.error({ err }, 'error getting subscription admin email')
}
const usersSubscription =
await SubscriptionLocator.promises.getUserSubscriptionStatus(userId)
return res.render('subscriptions/team/invite-managed', {
inviterName: invite.inviterName,
inviteToken: invite.token,
@@ -141,6 +144,7 @@ async function viewInvite(req, res, next) {
groupSSOActive,
subscriptionId: subscription._id.toString(),
user: sessionUser,
usersSubscription,
})
} else {
let currentManagedUserAdminEmail
@@ -31,8 +31,11 @@ async function manageGroupMembers(req, res, next) {
)
const ssoConfig = await SSOConfig.findById(subscription.ssoConfig).exec()
const plan = PlansLocator.findLocalPlanInSettings(subscription.planCode)
const userId = SessionManager.getLoggedInUserId(req.session)
const userId = SessionManager.getLoggedInUserId(req.session)?.toString()
const isAdmin = subscription.admin_id.toString() === userId
const isUserGroupManager =
Boolean(subscription.manager_ids?.some(id => id.toString() === userId)) &&
!isAdmin
const recurlySubscription = subscription.recurlySubscription_id
? await RecurlyClient.promises.getSubscription(
subscription.recurlySubscription_id
@@ -51,6 +54,7 @@ async function manageGroupMembers(req, res, next) {
users,
groupSize: subscription.membersLimit,
managedUsersActive: subscription.managedUsersEnabled,
isUserGroupManager,
groupSSOActive: ssoConfig?.enabled,
canUseFlexibleLicensing: plan?.canUseFlexibleLicensing,
canUseAddSeatsFeature,
@@ -13,6 +13,7 @@ block append meta
meta(name="ol-groupSSOActive" data-type="boolean" content=groupSSOActive)
meta(name="ol-subscriptionId" data-type="string" content=subscriptionId)
meta(name="ol-user" data-type="json" content=user)
meta(name="ol-usersSubscription" data-type="json" content=usersSubscription)
block content
main.content.content-alt.team-invite#invite-managed-root
@@ -10,6 +10,7 @@ block append meta
meta(name="ol-groupName", data-type="string", content=name)
meta(name="ol-groupSize", data-type="json", content=groupSize)
meta(name="ol-managedUsersActive", data-type="boolean", content=managedUsersActive)
meta(name="ol-isUserGroupManager", data-type="boolean", content=isUserGroupManager)
meta(name="ol-groupSSOActive", data-type="boolean", content=groupSSOActive)
meta(name="ol-canUseFlexibleLicensing", data-type="boolean", content=canUseFlexibleLicensing)
meta(name="ol-canUseAddSeatsFeature", data-type="boolean", content=canUseAddSeatsFeature)