Skip to content

Commit 6264e1c

Browse files
fix: License validations for federated rooms (#37523)
1 parent cbc0953 commit 6264e1c

File tree

4 files changed

+79
-8
lines changed

4 files changed

+79
-8
lines changed

.changeset/lemon-garlics-check.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@rocket.chat/meteor": patch
3+
---
4+
5+
Fixes license add-on validations for federated rooms

apps/meteor/client/views/room/composer/ComposerContainer.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import ComposerAnonymous from './ComposerAnonymous';
88
import ComposerArchived from './ComposerArchived';
99
import ComposerBlocked from './ComposerBlocked';
1010
import ComposerFederation from './ComposerFederation';
11-
import ComposerFederationInvalidVersion from './ComposerFederation/ComposerFederationInvalidVersion';
1211
import ComposerJoinWithPassword from './ComposerJoinWithPassword';
1312
import type { ComposerMessageProps } from './ComposerMessage';
1413
import ComposerMessage from './ComposerMessage';
@@ -57,11 +56,7 @@ const ComposerContainer = ({ children, ...props }: ComposerMessageProps): ReactE
5756
}
5857

5958
if (isFederation) {
60-
if (isFederationBlocked) {
61-
return <ComposerFederationInvalidVersion />;
62-
}
63-
64-
return <ComposerFederation {...props} />;
59+
return <ComposerFederation blocked={isFederationBlocked} {...props} />;
6560
}
6661

6762
if (isAnonymous) {
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import type { LicenseModule } from '@rocket.chat/core-typings';
2+
import { mockAppRoot } from '@rocket.chat/mock-providers';
3+
import { render, screen } from '@testing-library/react';
4+
import type { ReactNode } from 'react';
5+
6+
import ComposerFederation from './ComposerFederation';
7+
import FakeRoomProvider from '../../../../../tests/mocks/client/FakeRoomProvider';
8+
import { createFakeLicenseInfo } from '../../../../../tests/mocks/data';
9+
10+
jest.mock('../ComposerMessage', () => ({
11+
__esModule: true,
12+
default: ({ children }: { children: ReactNode }) => <div data-testid='composer-message'>{children}</div>,
13+
}));
14+
15+
const appRoot = ({ enabled = true, activeModules = ['federation'] }: { enabled?: boolean; activeModules?: LicenseModule[] } = {}) =>
16+
mockAppRoot()
17+
.withJohnDoe()
18+
.withTranslations('en', 'core', {
19+
Federation_Matrix_Federated_Description_disabled: 'Federation is currently disabled on this workspace',
20+
Federation_Matrix_join_public_rooms_is_premium: 'Join federated rooms is a Premium feature',
21+
Federation_Matrix_Federated_Description_invalid_version:
22+
'This room was created by an old Federation version and its blocked indeterminately. <1>Click here</1> for more information about Matrix Federation support',
23+
})
24+
.withSetting('Federation_Matrix_enabled', enabled ?? true)
25+
.withEndpoint('GET', '/v1/licenses.info', () => ({
26+
license: createFakeLicenseInfo({ activeModules }),
27+
}))
28+
.wrap((children) => <FakeRoomProvider>{children}</FakeRoomProvider>)
29+
.build();
30+
31+
describe('ComposerFederation', () => {
32+
it('should display blocked composer if federation version is invalid', () => {
33+
render(<ComposerFederation blocked />, {
34+
wrapper: appRoot(),
35+
});
36+
37+
expect(screen.getByText(/This room was created by an old Federation version and its blocked indeterminately/)).toBeInTheDocument();
38+
});
39+
40+
it('should display disabled composer if federation is disabled', () => {
41+
render(<ComposerFederation />, {
42+
wrapper: appRoot({ enabled: false }),
43+
});
44+
45+
expect(screen.getByText('Federation is currently disabled on this workspace')).toBeInTheDocument();
46+
});
47+
48+
it('should display disabled composer with premium message if federation addon is missing', () => {
49+
render(<ComposerFederation />, {
50+
wrapper: appRoot({ activeModules: [] }),
51+
});
52+
53+
expect(screen.getByText('Join federated rooms is a Premium feature')).toBeInTheDocument();
54+
});
55+
56+
it('should display normal composer if federation is enabled and valid', async () => {
57+
render(<ComposerFederation />, { wrapper: appRoot() });
58+
59+
const composer = await screen.findByTestId('composer-message');
60+
expect(composer).toBeInTheDocument();
61+
});
62+
});

apps/meteor/client/views/room/composer/ComposerFederation/ComposerFederation.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,27 @@ import { useHasLicenseModule } from '../../../../hooks/useHasLicenseModule';
44
import type { ComposerMessageProps } from '../ComposerMessage';
55
import ComposerMessage from '../ComposerMessage';
66
import ComposerFederationDisabled from './ComposerFederationDisabled';
7+
import ComposerFederationInvalidVersion from './ComposerFederationInvalidVersion';
78
import ComposerFederationJoinRoomDisabled from './ComposerFederationJoinRoomDisabled';
89
import { useIsFederationEnabled } from '../../../../hooks/useIsFederationEnabled';
910

10-
const ComposerFederation = ({ subscription, children, ...props }: ComposerMessageProps): ReactElement => {
11+
type ComposerFederationProps = ComposerMessageProps & {
12+
blocked?: boolean;
13+
};
14+
15+
const ComposerFederation = ({ children, blocked, ...props }: ComposerFederationProps): ReactElement => {
1116
const federationEnabled = useIsFederationEnabled();
1217
const { data: federationModuleEnabled = false } = useHasLicenseModule('federation');
1318

19+
if (blocked) {
20+
return <ComposerFederationInvalidVersion />;
21+
}
22+
1423
if (!federationEnabled) {
1524
return <ComposerFederationDisabled />;
1625
}
1726

18-
if (!subscription && !federationModuleEnabled) {
27+
if (!federationModuleEnabled) {
1928
return <ComposerFederationJoinRoomDisabled />;
2029
}
2130

0 commit comments

Comments
 (0)