mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-05-23 09:09:36 +02:00
Merge pull request #14178 from overleaf/mf-admin-email-managed-group-alert
Add managed group admin email inside managed group alert on the subscription page & team invite page warning GitOrigin-RevId: 00929008170ef9302ddcbbf10aefd76f95e189a8
This commit is contained in:
@@ -40,6 +40,17 @@ const SubscriptionLocator = {
|
|||||||
.exec(callback)
|
.exec(callback)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getAdminEmail(subscriptionId, callback) {
|
||||||
|
Subscription.findById(subscriptionId)
|
||||||
|
.populate('admin_id', 'email')
|
||||||
|
.exec((err, subscription) => {
|
||||||
|
if (err) {
|
||||||
|
return callback(err)
|
||||||
|
}
|
||||||
|
callback(err, subscription?.admin_id?.email)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
getAdminEmailAndName(subscriptionId, callback) {
|
getAdminEmailAndName(subscriptionId, callback) {
|
||||||
Subscription.findById(subscriptionId)
|
Subscription.findById(subscriptionId)
|
||||||
.populate('admin_id', ['email', 'first_name', 'last_name'])
|
.populate('admin_id', ['email', 'first_name', 'last_name'])
|
||||||
@@ -122,6 +133,7 @@ SubscriptionLocator.promises = {
|
|||||||
SubscriptionLocator.getManagedGroupSubscriptions
|
SubscriptionLocator.getManagedGroupSubscriptions
|
||||||
),
|
),
|
||||||
getMemberSubscriptions: promisify(SubscriptionLocator.getMemberSubscriptions),
|
getMemberSubscriptions: promisify(SubscriptionLocator.getMemberSubscriptions),
|
||||||
|
getAdminEmail: promisify(SubscriptionLocator.getAdminEmail),
|
||||||
getAdminEmailAndName: promisify(SubscriptionLocator.getAdminEmailAndName),
|
getAdminEmailAndName: promisify(SubscriptionLocator.getAdminEmailAndName),
|
||||||
getSubscription: promisify(SubscriptionLocator.getSubscription),
|
getSubscription: promisify(SubscriptionLocator.getSubscription),
|
||||||
getSubscriptionByMemberIdAndId: promisify(
|
getSubscriptionByMemberIdAndId: promisify(
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
const settings = require('@overleaf/settings')
|
const settings = require('@overleaf/settings')
|
||||||
|
const logger = require('@overleaf/logger')
|
||||||
const TeamInvitesHandler = require('./TeamInvitesHandler')
|
const TeamInvitesHandler = require('./TeamInvitesHandler')
|
||||||
const SessionManager = require('../Authentication/SessionManager')
|
const SessionManager = require('../Authentication/SessionManager')
|
||||||
const SubscriptionLocator = require('./SubscriptionLocator')
|
const SubscriptionLocator = require('./SubscriptionLocator')
|
||||||
@@ -106,6 +107,14 @@ async function viewInvite(req, res, next) {
|
|||||||
validationStatus: Object.fromEntries(validationStatus),
|
validationStatus: Object.fromEntries(validationStatus),
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
let currentManagedUserAdminEmail
|
||||||
|
try {
|
||||||
|
currentManagedUserAdminEmail =
|
||||||
|
await SubscriptionLocator.promises.getAdminEmail(req.managedBy)
|
||||||
|
} catch (err) {
|
||||||
|
logger.error({ err }, 'error getting subscription admin email')
|
||||||
|
}
|
||||||
|
|
||||||
return res.render('subscriptions/team/invite', {
|
return res.render('subscriptions/team/invite', {
|
||||||
inviterName: invite.inviterName,
|
inviterName: invite.inviterName,
|
||||||
inviteToken: invite.token,
|
inviteToken: invite.token,
|
||||||
@@ -113,6 +122,7 @@ async function viewInvite(req, res, next) {
|
|||||||
appName: settings.appName,
|
appName: settings.appName,
|
||||||
expired: req.query.expired,
|
expired: req.query.expired,
|
||||||
userRestrictions: Array.from(req.userRestrictions || []),
|
userRestrictions: Array.from(req.userRestrictions || []),
|
||||||
|
currentManagedUserAdminEmail,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ const Settings = require('@overleaf/settings')
|
|||||||
const AuthenticationController = require('../Authentication/AuthenticationController')
|
const AuthenticationController = require('../Authentication/AuthenticationController')
|
||||||
const SessionManager = require('../Authentication/SessionManager')
|
const SessionManager = require('../Authentication/SessionManager')
|
||||||
const NewsletterManager = require('../Newsletter/NewsletterManager')
|
const NewsletterManager = require('../Newsletter/NewsletterManager')
|
||||||
|
const SubscriptionLocator = require('../Subscription/SubscriptionLocator')
|
||||||
const _ = require('lodash')
|
const _ = require('lodash')
|
||||||
const { expressify } = require('../../util/promises')
|
const { expressify } = require('../../util/promises')
|
||||||
const Features = require('../../infrastructure/Features')
|
const Features = require('../../infrastructure/Features')
|
||||||
@@ -81,6 +82,14 @@ async function settingsPage(req, res) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let currentManagedUserAdminEmail
|
||||||
|
try {
|
||||||
|
currentManagedUserAdminEmail =
|
||||||
|
await SubscriptionLocator.promises.getAdminEmail(req.managedBy)
|
||||||
|
} catch (err) {
|
||||||
|
logger.error({ err }, 'error getting subscription admin email')
|
||||||
|
}
|
||||||
|
|
||||||
res.render('user/settings', {
|
res.render('user/settings', {
|
||||||
title: 'account_settings',
|
title: 'account_settings',
|
||||||
user: {
|
user: {
|
||||||
@@ -128,6 +137,7 @@ async function settingsPage(req, res) {
|
|||||||
emailAddressLimit: Settings.emailAddressLimit,
|
emailAddressLimit: Settings.emailAddressLimit,
|
||||||
isManagedAccount: !!req.managedBy,
|
isManagedAccount: !!req.managedBy,
|
||||||
userRestrictions: Array.from(req.userRestrictions || []),
|
userRestrictions: Array.from(req.userRestrictions || []),
|
||||||
|
currentManagedUserAdminEmail,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ block content
|
|||||||
|
|
||||||
div(ng-show="view =='restrictedByManagedGroup'")
|
div(ng-show="view =='restrictedByManagedGroup'")
|
||||||
.alert.alert-info #{translate("restricted")}
|
.alert.alert-info #{translate("restricted")}
|
||||||
p #{translate("account_managed_by_group_administrator")}
|
p #{translate("account_managed_by_group_administrator", {admin: currentManagedUserAdminEmail})}
|
||||||
|
|
||||||
div(ng-show="view =='hasIndividualRecurlySubscription'")
|
div(ng-show="view =='hasIndividualRecurlySubscription'")
|
||||||
p #{translate("cancel_personal_subscription_first")}
|
p #{translate("cancel_personal_subscription_first")}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ block append meta
|
|||||||
meta(name="ol-showPersonalAccessToken", data-type="boolean" content=showPersonalAccessToken)
|
meta(name="ol-showPersonalAccessToken", data-type="boolean" content=showPersonalAccessToken)
|
||||||
meta(name="ol-personalAccessTokens", data-type="json" content=personalAccessTokens)
|
meta(name="ol-personalAccessTokens", data-type="json" content=personalAccessTokens)
|
||||||
meta(name="ol-emailAddressLimit", data-type="json", content=emailAddressLimit)
|
meta(name="ol-emailAddressLimit", data-type="json", content=emailAddressLimit)
|
||||||
|
meta(name="ol-currentManagedUserAdminEmail" data-type="string" content=currentManagedUserAdminEmail)
|
||||||
|
|
||||||
block content
|
block content
|
||||||
main.content.content-alt#settings-page-root
|
main.content.content-alt#settings-page-root
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
import { Trans, useTranslation } from 'react-i18next'
|
import { Trans } from 'react-i18next'
|
||||||
import getMeta from '../../../utils/meta'
|
import getMeta from '../../../utils/meta'
|
||||||
|
|
||||||
export default function ManagedAccountAlert() {
|
export default function ManagedAccountAlert() {
|
||||||
const { t } = useTranslation()
|
|
||||||
const isManaged = getMeta('ol-isManagedAccount', false)
|
const isManaged = getMeta('ol-isManagedAccount', false)
|
||||||
|
const currentManagedUserAdminEmail: string = getMeta(
|
||||||
|
'ol-currentManagedUserAdminEmail',
|
||||||
|
''
|
||||||
|
)
|
||||||
|
|
||||||
if (!isManaged) {
|
if (!isManaged) {
|
||||||
return null
|
return null
|
||||||
@@ -16,7 +19,14 @@ export default function ManagedAccountAlert() {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<strong>{t('account_managed_by_group_administrator')}</strong>
|
<strong>
|
||||||
|
<Trans
|
||||||
|
i18nKey="account_managed_by_group_administrator"
|
||||||
|
values={{
|
||||||
|
admin: currentManagedUserAdminEmail,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</strong>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<Trans
|
<Trans
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
"account_has_been_link_to_institution_account": "Your __appName__ account on <b>__email__</b> has been linked to your <b>__institutionName__</b> institutional account.",
|
"account_has_been_link_to_institution_account": "Your __appName__ account on <b>__email__</b> has been linked to your <b>__institutionName__</b> institutional account.",
|
||||||
"account_has_past_due_invoice_change_plan_warning": "Your account currently has a past due invoice. You will not be able to change your plan until this is resolved.",
|
"account_has_past_due_invoice_change_plan_warning": "Your account currently has a past due invoice. You will not be able to change your plan until this is resolved.",
|
||||||
"account_linking": "Account Linking",
|
"account_linking": "Account Linking",
|
||||||
"account_managed_by_group_administrator": "Your account is managed by your group administrator",
|
"account_managed_by_group_administrator": "Your account is managed by your group administrator (__admin__)",
|
||||||
"account_not_linked_to_dropbox": "Your account is not linked to Dropbox",
|
"account_not_linked_to_dropbox": "Your account is not linked to Dropbox",
|
||||||
"account_settings": "Account Settings",
|
"account_settings": "Account Settings",
|
||||||
"account_with_email_exists": "It looks like an <b>__appName__</b> account with the email <b>__email__</b> already exists.",
|
"account_with_email_exists": "It looks like an <b>__appName__</b> account with the email <b>__email__</b> already exists.",
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ describe('UserPagesController', function () {
|
|||||||
zotero: { encrypted: 'bbbb' },
|
zotero: { encrypted: 'bbbb' },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
this.adminEmail = 'group-admin-email@overleaf.com'
|
||||||
|
this.subscriptionViewModel = {
|
||||||
|
memberGroupSubscriptions: [],
|
||||||
|
}
|
||||||
|
|
||||||
this.UserGetter = {
|
this.UserGetter = {
|
||||||
getUser: sinon.stub(),
|
getUser: sinon.stub(),
|
||||||
@@ -73,6 +77,11 @@ describe('UserPagesController', function () {
|
|||||||
this.PersonalAccessTokenManager = {
|
this.PersonalAccessTokenManager = {
|
||||||
listTokens: sinon.stub().returns([]),
|
listTokens: sinon.stub().returns([]),
|
||||||
}
|
}
|
||||||
|
this.SubscriptionLocator = {
|
||||||
|
promises: {
|
||||||
|
getAdminEmail: sinon.stub().returns(this.adminEmail),
|
||||||
|
},
|
||||||
|
}
|
||||||
this.UserPagesController = SandboxedModule.require(modulePath, {
|
this.UserPagesController = SandboxedModule.require(modulePath, {
|
||||||
requires: {
|
requires: {
|
||||||
'@overleaf/settings': this.settings,
|
'@overleaf/settings': this.settings,
|
||||||
@@ -82,6 +91,7 @@ describe('UserPagesController', function () {
|
|||||||
'../Errors/ErrorController': this.ErrorController,
|
'../Errors/ErrorController': this.ErrorController,
|
||||||
'../Authentication/AuthenticationController':
|
'../Authentication/AuthenticationController':
|
||||||
this.AuthenticationController,
|
this.AuthenticationController,
|
||||||
|
'../Subscription/SubscriptionLocator': this.SubscriptionLocator,
|
||||||
'../../infrastructure/Features': this.Features,
|
'../../infrastructure/Features': this.Features,
|
||||||
'../../../../modules/oauth2-server/app/src/OAuthPersonalAccessTokenManager':
|
'../../../../modules/oauth2-server/app/src/OAuthPersonalAccessTokenManager':
|
||||||
this.PersonalAccessTokenManager,
|
this.PersonalAccessTokenManager,
|
||||||
@@ -325,6 +335,14 @@ describe('UserPagesController', function () {
|
|||||||
return this.UserPagesController.settingsPage(this.req, this.res)
|
return this.UserPagesController.settingsPage(this.req, this.res)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should send the correct managed user admin email', function (done) {
|
||||||
|
this.res.render = (page, opts) => {
|
||||||
|
expect(opts.currentManagedUserAdminEmail).to.equal(this.adminEmail)
|
||||||
|
return done()
|
||||||
|
}
|
||||||
|
return this.UserPagesController.settingsPage(this.req, this.res)
|
||||||
|
})
|
||||||
|
|
||||||
describe('when ldap.updateUserDetailsOnLogin is true', function () {
|
describe('when ldap.updateUserDetailsOnLogin is true', function () {
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
return (this.settings.ldap = { updateUserDetailsOnLogin: true })
|
return (this.settings.ldap = { updateUserDetailsOnLogin: true })
|
||||||
|
|||||||
Reference in New Issue
Block a user