{"record":{"id":"e61b99046ff53994","repo":"RocketChat/Rocket.Chat","slug":"error-federated-users-in-non-federated-rooms-e61b99","errorCode":"error-federated-users-in-non-federated-rooms","errorMessage":"Cannot add federated users to non-federated rooms","messagePattern":"Cannot add federated users to non-federated rooms","errorType":"exception","errorClass":"Meteor.Error","httpStatus":null,"severity":"error","filePath":"apps/meteor/server/lib/rooms/createRoom.ts","lineNumber":168,"sourceCode":"\toptions?: ICreateRoomParams['options'],\n): Promise<\n\tICreatedRoom & {\n\t\trid: string;\n\t}\n> => {\n\tconst { teamId, ...extraData } = roomExtraData || ({} as IRoom);\n\n\t// TODO: use a shared helper to check whether a user is federated\n\tconst hasFederatedMembers = members.some((member) => {\n\t\tif (typeof member === 'string') {\n\t\t\treturn member.includes(':') && member.includes('@');\n\t\t}\n\t\treturn member.username?.includes(':') && member.username?.includes('@');\n\t});\n\n\t// Prevent adding federated users to rooms that are not marked as federated explicitly\n\tif (hasFederatedMembers && extraData.federated !== true) {\n\t\tthrow new Meteor.Error('error-federated-users-in-non-federated-rooms', 'Cannot add federated users to non-federated rooms', {\n\t\t\tmethod: 'createRoom',\n\t\t});\n\t}\n\n\tawait prepareCreateRoomCallback.run({\n\t\ttype,\n\t\t// name,\n\t\t// owner: ownerUsername,\n\t\t// members,\n\t\t// readOnly,\n\t\textraData,\n\t\t// options,\n\t});\n\n\tconst shouldBeHandledByFederation = extraData.federated === true;\n\n\tif (shouldBeHandledByFederation && owner && !isUserNativeFederated(owner) && !(await FederationMatrix.canUserAccessFederation(owner))) {\n\t\tthrow new Meteor.Error('error-not-authorized-federation', 'Not authorized to access federation', {","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/RocketChat/Rocket.Chat/blob/b2c16d5842cbe6b69b59bdf6fc5e5f1afcd1f0b0/apps/meteor/server/lib/rooms/createRoom.ts#L150-L186","documentation":"createRoom refuses to add federated members (usernames containing '@' and ':', the Matrix-style identifier shape) unless the room is explicitly marked federated (extraData.federated === true). This guard prevents accidentally mixing remote users into a purely local room.","triggerScenarios":"Calling createRoom (type other than 'd') with a members array containing a string like 'user:server.tld@external-host' or a user object whose username contains ':' and '@', while roomExtraData is omitted or federated is not exactly true.","commonSituations":"Apps or REST/API callers copying a member list that includes federated usernames but forgetting { federated: true } in roomExtraData; federation recently enabled and existing automation reusing old payloads; string vs boolean coercion bugs where federated is passed as 'true' or 1.","solutions":["Pass federated: true in roomExtraData when any member is a federated user","Filter federated usernames out of members when creating a local-only room","Validate member usernames before calling createRoom and fail early with a clear message"],"exampleFix":"// before\ncreateRoom('c', name, owner, ['alice', 'bob:matrix.org@remote'], {});\n\n// after\ncreateRoom('c', name, owner, ['alice', 'bob:matrix.org@remote'], { federated: true });","handlingStrategy":"type-guard","validationCode":"const FEDERATED_RE = /[:@]/;\nconst membersAreFederated = members.some(m =>\n  typeof m === 'string' ? FEDERATED_RE.test(m) : Boolean(m.username && m.includes(':') && m.includes('@'))\n);\nif (membersAreFederated && extraData?.federated !== true) {\n  extraData = { ...extraData, federated: true };\n}","typeGuard":"const isFederatedUsername = (username: string): boolean => username.includes(':') && username.includes('@');","tryCatchPattern":"try {\n  await createRoom(type, name, owner, members, extraData);\n} catch (err) {\n  if (err instanceof Meteor.Error && err.error === 'error-federated-users-in-non-federated-rooms') {\n    // decide: drop federated members OR set extraData.federated = true and retry\n  }\n  throw err;\n}","preventionTips":["Centralize a isFederatedUsername helper instead of inline string checks","Validate member shapes at the API boundary (REST schema) so federated flags cannot be forgotten","Add tests covering mixed local/remote member lists"],"tags":["federation","room-creation","validation","members"],"backgroundTag":"invalid-request-parameters","analyzedSha":"b2c16d5842cbe6b69b59bdf6fc5e5f1afcd1f0b0","analyzedAt":"2026-08-18T15:26:39.429Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}