{"record":{"id":"2e1144493086805f","repo":"RocketChat/Rocket.Chat","slug":"error-not-allowed-2e1144","errorCode":"error-not-allowed","errorMessage":"User participated in federation, this user can only be deactivated permanently","messagePattern":"User participated in federation, this user can only be deactivated permanently","errorType":"exception","errorClass":"Meteor.Error","httpStatus":null,"severity":"error","filePath":"apps/meteor/server/lib/users/deleteUser.ts","lineNumber":51,"sourceCode":"\nexport async function deleteUser(userId: string, confirmRelinquish = false, deletedBy?: IUser['_id']): Promise<{ deletedRooms: string[] }> {\n\tif (userId === 'rocket.cat') {\n\t\tthrow new Meteor.Error('error-action-not-allowed', 'Deleting the rocket.cat user is not allowed', {\n\t\t\tmethod: 'deleteUser',\n\t\t\taction: 'Delete_user',\n\t\t});\n\t}\n\n\tconst user = await Users.findOneById(userId, {\n\t\tprojection: { username: 1, avatarOrigin: 1, roles: 1, federated: 1 },\n\t});\n\n\tif (!user) {\n\t\treturn { deletedRooms: [] };\n\t}\n\n\tif (isUserFederated(user)) {\n\t\tthrow new Meteor.Error('error-not-allowed', 'User participated in federation, this user can only be deactivated permanently', {\n\t\t\tmethod: 'deleteUser',\n\t\t});\n\t}\n\n\tconst subscribedRooms = await getSubscribedRoomsForUserWithDetails(userId);\n\n\tif (shouldRemoveOrChangeOwner(subscribedRooms) && !confirmRelinquish) {\n\t\tconst rooms = await getUserSingleOwnedRooms(subscribedRooms);\n\t\tthrow new Meteor.Error('user-last-owner', '', rooms);\n\t}\n\n\tlet deletedRooms: string[] = [];\n\t// Users without username can't do anything, so there is nothing to remove\n\tif (user.username != null) {\n\t\tlet userToReplaceWhenUnlinking: IUser | null = null;\n\t\tconst nameAlias = i18n.t('Removed_User');\n\t\tdeletedRooms = await relinquishRoomOwnerships(userId, subscribedRooms, true);\n","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/RocketChat/Rocket.Chat/blob/b2c16d5842cbe6b69b59bdf6fc5e5f1afcd1f0b0/apps/meteor/server/lib/users/deleteUser.ts#L33-L69","documentation":"deleteUser throws error-not-allowed (method 'deleteUser') when isUserFederated(user) is true: the account has participated in federation and its identity is known to remote servers. Such users can only be deactivated, because deleting them would break federation references and remote history.","triggerScenarios":"Deleting a user who has exchanged federated DMs or joined federated rooms (federation app/EE enabled) via admin UI or REST user.delete.","commonSituations":"Offboarding scripts that delete rather than deactivate; federation piloted then abandoned, leaving federated flags on users nobody remembers.","solutions":["Deactivate instead of delete: setUserActive(userId, false) preserves the federation references","If deletion is mandatory, first remove the federation participation (leave federated rooms/DMs, purge federation data with guidance from Rocket.Chat support) and confirm the flag clears","Adjust offboarding automation to branch on the federated flag"],"exampleFix":"// before\nawait deleteUser(uid); // federated user -> error-not-allowed\n\n// after\nconst user = await Users.findOneById(uid, { projections: { federated: 1 } });\nif (isUserFederated(user)) {\n  await setUserActive(uid, false); // deactivate only\n} else {\n  await deleteUser(uid);\n}","handlingStrategy":"validation","validationCode":"const user = await Users.findOneById(uid, { projections: { federated: 1 } });\nif (user && isUserFederated(user)) {\n  await setUserActive(uid, false); // federated users may only be deactivated\n  return { deactivated: true };\n}\nawait deleteUser(uid);","typeGuard":"const isFederatedUser = (u: { federated?: boolean | { federated?: boolean } } | null): boolean =>\n  !!isUserFederated((u ?? {}) as IUser); // reuse server helper; flag shape varies","tryCatchPattern":"try {\n  await deleteUser(uid);\n} catch (e) {\n  if (isMeteorErrorCode(e, 'error-not-allowed') && /federation/i.test(e.reason ?? '')) {\n  \tawait setUserActive(uid, false); // fall back to deactivation\n  }\n}","preventionTips":["Branch offboarding flows on the federated flag: deactivate, never delete","Before deleting, check the user's federation participation (federated DMs/rooms)"],"tags":["users","deletion","federation","compliance"],"backgroundTag":"federated-user-restricted","analyzedSha":"b2c16d5842cbe6b69b59bdf6fc5e5f1afcd1f0b0","analyzedAt":"2026-08-18T15:26:39.429Z","contentChangedAt":"2026-08-18T15:26:39.429Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}