RocketChat/Rocket.Chat · error · Meteor.Error

error-action-not-allowed

error-action-not-allowed

Error message

Login neccessary

What it means

Thrown by 'autoTranslate.getProviderUiMetadata' when there is no authenticated user. Unlike its sibling methods it uses the code 'error-action-not-allowed' with the message 'Login neccessary' (typo present in source) instead of 'error-invalid-user' — code matching must target 'error-action-not-allowed'. It guards metadata (name/displayName) about registered auto-translate providers such as DeepL.

Source

Thrown at apps/meteor/server/meteor-methods/platform/getProviderUiMetadata.ts:16

import type { ServerMethods } from '@rocket.chat/ddp-client';
import { Meteor } from 'meteor/meteor';

import { TranslationProviderRegistry } from '../../lib/autotranslate/autotranslate';

declare module '@rocket.chat/ddp-client' {
	// eslint-disable-next-line @typescript-eslint/naming-convention
	interface ServerMethods {
		'autoTranslate.getProviderUiMetadata'(): Record<string, { name: string; displayName: string }>;
	}
}

Meteor.methods<ServerMethods>({
	'autoTranslate.getProviderUiMetadata'() {
		if (!Meteor.userId()) {
			throw new Meteor.Error('error-action-not-allowed', 'Login neccessary', {
				method: 'autoTranslate.getProviderUiMetadata',
			});
		}

		return Object.fromEntries(
			TranslationProviderRegistry.getProviders().map((provider) => {
				const { name, displayName } = provider._getProviderMetadata();
				return [name, { name, displayName }];
			}),
		);
	},
});

View on GitHub (pinned to b2c16d5842)

Solutions

  1. Ensure the user is logged in before requesting provider metadata
  2. Gate the call with Meteor.userId() and defer it until the session is ready
  3. When catching, match error.error === 'error-action-not-allowed' — not 'error-invalid-user'

Example fix

// before
const providers = await Meteor.callAsync('autoTranslate.getProviderUiMetadata');

// after
if (!Meteor.userId()) {
  // provider metadata requires a session; skip until logged in
  return {};
}
const providers = await Meteor.callAsync('autoTranslate.getProviderUiMetadata');
Defensive patterns

Strategy: validation

Validate before calling

// client: provider metadata requires a session
if (!Meteor.userId()) {
  // skip the metadata fetch until logged in
}

Type guard

import { Meteor } from 'meteor/meteor';

const isMeteorError = (err: unknown, code?: string): err is Meteor.Error =>
  err instanceof Meteor.Error && (code === undefined || err.error === code);

Try / catch

try {
  await Meteor.callAsync('autoTranslate.getProviderUiMetadata');
} catch (err) {
  // note: this method throws 'error-action-not-allowed', not 'error-invalid-user'
  if (isMeteorError(err, 'error-action-not-allowed')) {
    // re-authenticate, then refetch provider metadata
  } else {
    throw err;
  }
}

Prevention

When it happens

Trigger: Calling autoTranslate.getProviderUiMetadata anonymously; the auto-translate settings panel loads before the login state resolves; session expired while the admin translation settings were open.

Common situations: Settings screens fetched with a stale token; components mounting before user data is ready; translation provider metadata used in pre-login UI by mistake.

Related errors


AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18). Data as JSON: /api/errors/9a9b4337078a3204. Report an issue: GitHub.