fix: License validations for federated rooms (#37523)

This commit is contained in:
Aleksander Nicacio da Silva 2025-12-01 19:40:33 -03:00 committed by GitHub
parent cbc0953fd6
commit 6264e1cfd7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 79 additions and 8 deletions

View File

@ -0,0 +1,5 @@
---
"@rocket.chat/meteor": patch
---
Fixes license add-on validations for federated rooms

View File

@ -8,7 +8,6 @@ import ComposerAnonymous from './ComposerAnonymous';
import ComposerArchived from './ComposerArchived';
import ComposerBlocked from './ComposerBlocked';
import ComposerFederation from './ComposerFederation';
import ComposerFederationInvalidVersion from './ComposerFederation/ComposerFederationInvalidVersion';
import ComposerJoinWithPassword from './ComposerJoinWithPassword';
import type { ComposerMessageProps } from './ComposerMessage';
import ComposerMessage from './ComposerMessage';
@ -57,11 +56,7 @@ const ComposerContainer = ({ children, ...props }: ComposerMessageProps): ReactE
}
if (isFederation) {
if (isFederationBlocked) {
return <ComposerFederationInvalidVersion />;
}
return <ComposerFederation {...props} />;
return <ComposerFederation blocked={isFederationBlocked} {...props} />;
}
if (isAnonymous) {

View File

@ -0,0 +1,62 @@
import type { LicenseModule } from '@rocket.chat/core-typings';
import { mockAppRoot } from '@rocket.chat/mock-providers';
import { render, screen } from '@testing-library/react';
import type { ReactNode } from 'react';
import ComposerFederation from './ComposerFederation';
import FakeRoomProvider from '../../../../../tests/mocks/client/FakeRoomProvider';
import { createFakeLicenseInfo } from '../../../../../tests/mocks/data';
jest.mock('../ComposerMessage', () => ({
__esModule: true,
default: ({ children }: { children: ReactNode }) => <div data-testid='composer-message'>{children}</div>,
}));
const appRoot = ({ enabled = true, activeModules = ['federation'] }: { enabled?: boolean; activeModules?: LicenseModule[] } = {}) =>
mockAppRoot()
.withJohnDoe()
.withTranslations('en', 'core', {
Federation_Matrix_Federated_Description_disabled: 'Federation is currently disabled on this workspace',
Federation_Matrix_join_public_rooms_is_premium: 'Join federated rooms is a Premium feature',
Federation_Matrix_Federated_Description_invalid_version:
'This room was created by an old Federation version and its blocked indeterminately. <1>Click here</1> for more information about Matrix Federation support',
})
.withSetting('Federation_Matrix_enabled', enabled ?? true)
.withEndpoint('GET', '/v1/licenses.info', () => ({
license: createFakeLicenseInfo({ activeModules }),
}))
.wrap((children) => <FakeRoomProvider>{children}</FakeRoomProvider>)
.build();
describe('ComposerFederation', () => {
it('should display blocked composer if federation version is invalid', () => {
render(<ComposerFederation blocked />, {
wrapper: appRoot(),
});
expect(screen.getByText(/This room was created by an old Federation version and its blocked indeterminately/)).toBeInTheDocument();
});
it('should display disabled composer if federation is disabled', () => {
render(<ComposerFederation />, {
wrapper: appRoot({ enabled: false }),
});
expect(screen.getByText('Federation is currently disabled on this workspace')).toBeInTheDocument();
});
it('should display disabled composer with premium message if federation addon is missing', () => {
render(<ComposerFederation />, {
wrapper: appRoot({ activeModules: [] }),
});
expect(screen.getByText('Join federated rooms is a Premium feature')).toBeInTheDocument();
});
it('should display normal composer if federation is enabled and valid', async () => {
render(<ComposerFederation />, { wrapper: appRoot() });
const composer = await screen.findByTestId('composer-message');
expect(composer).toBeInTheDocument();
});
});

View File

@ -4,18 +4,27 @@ import { useHasLicenseModule } from '../../../../hooks/useHasLicenseModule';
import type { ComposerMessageProps } from '../ComposerMessage';
import ComposerMessage from '../ComposerMessage';
import ComposerFederationDisabled from './ComposerFederationDisabled';
import ComposerFederationInvalidVersion from './ComposerFederationInvalidVersion';
import ComposerFederationJoinRoomDisabled from './ComposerFederationJoinRoomDisabled';
import { useIsFederationEnabled } from '../../../../hooks/useIsFederationEnabled';
const ComposerFederation = ({ subscription, children, ...props }: ComposerMessageProps): ReactElement => {
type ComposerFederationProps = ComposerMessageProps & {
blocked?: boolean;
};
const ComposerFederation = ({ children, blocked, ...props }: ComposerFederationProps): ReactElement => {
const federationEnabled = useIsFederationEnabled();
const { data: federationModuleEnabled = false } = useHasLicenseModule('federation');
if (blocked) {
return <ComposerFederationInvalidVersion />;
}
if (!federationEnabled) {
return <ComposerFederationDisabled />;
}
if (!subscription && !federationModuleEnabled) {
if (!federationModuleEnabled) {
return <ComposerFederationJoinRoomDisabled />;
}