[web] Add unlinking third-party logins ability from the admin-panel (#28201)

* Add `clearThirdPartyLogins`

Co-authored-by: Brian Gough <brian.gough@overleaf.com>

* Add a confirmation modal

* Show provider name from settings

* Replace "logins" by "identifiers" for consistency with current terminology

* Hide button if user has no third-party identifiers

* Update tests

* Add test "unlinks Google account"

---------

Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: 45b9b5ce6fa2cbeba9d4daeda97cd6e500c8266c
This commit is contained in:
Antoine Clausse
2025-09-04 11:37:06 +02:00
committed by Copybot
parent aae897a87e
commit 3d45cc601f
2 changed files with 23 additions and 0 deletions

View File

@@ -19,6 +19,7 @@ const NotificationsBuilder = require('../Notifications/NotificationsBuilder')
const _ = require('lodash')
const Modules = require('../../infrastructure/Modules')
const UserSessionsManager = require('./UserSessionsManager')
const ThirdPartyIdentityManager = require('./ThirdPartyIdentityManager')
async function _sendSecurityAlertPrimaryEmailChanged(
userId,
@@ -182,6 +183,26 @@ async function clearSAMLData(userId, auditLog, sendEmail) {
}
}
async function clearThirdPartyIdentifiers(userId, auditLog) {
const user = await UserGetter.promises.getUser(userId, {
thirdPartyIdentifiers: 1,
})
await UserAuditLogHandler.promises.addEntry(
userId,
'clear-third-party-identifiers',
auditLog.initiatorId,
auditLog.ipAddress,
{}
)
for (const thirdPartyIdentifier of user.thirdPartyIdentifiers || []) {
await ThirdPartyIdentityManager.promises.unlink(
userId,
thirdPartyIdentifier.providerId,
auditLog
)
}
}
/**
* set the default email address by setting the `email` attribute. The email
* must be one of the user's multiple emails (`emails` attribute)
@@ -665,6 +686,7 @@ module.exports = {
addEmailAddress,
changeEmailAddress,
clearSAMLData,
clearThirdPartyIdentifiers,
confirmEmail,
removeEmailAddress,
removeReconfirmFlag,

View File

@@ -135,6 +135,7 @@ describe('UserUpdater', function () {
'../Notifications/NotificationsBuilder': this.NotificationsBuilder,
'../../infrastructure/Modules': this.Modules,
'./UserSessionsManager': this.UserSessionsManager,
'./ThirdPartyIdentityManager': this.ThirdPartyIdentityManager,
},
})