Skip to content

Commit 0f75d73

Browse files
change of approach: create a new setting to limit message parsing
1 parent f331822 commit 0f75d73

14 files changed

Lines changed: 54 additions & 52 deletions

File tree

apps/meteor/client/components/message/content/attachments/QuoteAttachment.spec.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { render, screen } from '@testing-library/react';
22

33
import { QuoteAttachment } from './QuoteAttachment';
44

5-
jest.mock('../../hooks/useMaxMessageParseSize', () => ({
6-
useMaxMessageParseSize: () => 100,
5+
jest.mock('../../hooks/useMaxMarkdownParseLength', () => ({
6+
useMaxMarkdownParseLength: () => 100,
77
}));
88

99
jest.mock('@rocket.chat/ui-contexts', () => ({
@@ -28,12 +28,12 @@ const baseAttachment = {
2828
};
2929

3030
describe('QuoteAttachment', () => {
31-
it('renders MessageContentBody when text length is within maxMessageParseSize', () => {
31+
it('renders MessageContentBody when text length is within maxMarkdownParseLength', () => {
3232
render(<QuoteAttachment attachment={baseAttachment as any} />);
3333
expect(screen.getByTestId('message-content-body')).toBeInTheDocument();
3434
});
3535

36-
it('renders plain text when text exceeds maxMessageParseSize', () => {
36+
it('renders plain text when text exceeds maxMarkdownParseLength', () => {
3737
const longText = 'a'.repeat(101);
3838
const attachment = { ...baseAttachment, text: longText };
3939

apps/meteor/client/components/message/content/attachments/QuoteAttachment.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import AttachmentAuthorName from './structure/AttachmentAuthorName';
1313
import AttachmentContent from './structure/AttachmentContent';
1414
import AttachmentDetails from './structure/AttachmentDetails';
1515
import AttachmentInner from './structure/AttachmentInner';
16-
import { useMaxMessageParseSize } from '../../hooks/useMaxMessageParseSize';
16+
import { useMaxMarkdownParseLength } from '../../hooks/useMaxMarkdownParseLength';
1717

1818
// TODO: remove this team collaboration
1919
const quoteStyles = css`
@@ -39,7 +39,7 @@ type QuoteAttachmentProps = {
3939
export const QuoteAttachment = ({ attachment }: QuoteAttachmentProps): ReactElement => {
4040
const formatTime = useTimeAgo();
4141
const displayAvatarPreference = useUserPreference<boolean>('displayAvatars');
42-
const maxMessageParseSize = useMaxMessageParseSize();
42+
const maxMarkdownParseLength = useMaxMarkdownParseLength();
4343

4444
return (
4545
<>
@@ -73,11 +73,7 @@ export const QuoteAttachment = ({ attachment }: QuoteAttachmentProps): ReactElem
7373
<Attachments attachments={attachment.attachments} id={attachment.attachments[0]?.title_link} />
7474
</AttachmentInner>
7575
)}
76-
{attachment.text.length <= maxMessageParseSize && attachment.md ? (
77-
<MessageContentBody md={attachment.md} />
78-
) : (
79-
attachment.text.substring(attachment.text.indexOf('\n') + 1)
80-
)}
76+
{attachment.text.length <= maxMarkdownParseLength && attachment.md ? <MessageContentBody md={attachment.md} /> : attachment.text}
8177
</AttachmentDetails>
8278
</AttachmentContent>
8379
</>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { useSetting } from '@rocket.chat/ui-contexts';
2+
import { useMemo } from 'react';
3+
4+
/**
5+
* Returns the maximum number of characters a message can have for markdown parsing.
6+
* Returns Infinity when the setting is 0 or negative, meaning the limit is disabled
7+
* and all messages will be parsed regardless of length.
8+
*/
9+
export const useMaxMarkdownParseLength = (): number => {
10+
const settingValue = useSetting('Message_MaxMarkdownParseLength', 0);
11+
12+
return useMemo(() => {
13+
if (typeof settingValue !== 'number' || settingValue <= 0) {
14+
return Infinity;
15+
}
16+
return settingValue;
17+
}, [settingValue]);
18+
};

apps/meteor/client/components/message/hooks/useMaxMessageParseSize.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.

apps/meteor/client/components/message/hooks/useNormalizedMessage.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ describe('useNormalizedMessage', () => {
3232
mockParseMessageTextToAstMarkdown.mockClear();
3333
});
3434

35-
it('should skip parsing and returns PARAGRAPH node when msg exceeds maxMessageParseSize', () => {
35+
it('should skip parsing and returns PARAGRAPH node when msg exceeds maxMarkdownParseLength', () => {
3636
const longMsg = 'a'.repeat(101);
3737
const message = { ...baseMessage, msg: longMsg };
3838

@@ -47,7 +47,7 @@ describe('useNormalizedMessage', () => {
4747
]);
4848
});
4949

50-
it('should call parseMessageTextToAstMarkdown when msg is within maxMessageParseSize', () => {
50+
it('should call parseMessageTextToAstMarkdown when msg is within maxMarkdownParseLength', () => {
5151
const message = { ...baseMessage, msg: 'Hello world' };
5252

5353
renderHook(() => useNormalizedMessage(message as any, 100));

apps/meteor/client/components/message/hooks/useNormalizedMessage.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ const normalizeAttachments = (attachments: MessageAttachment[], name?: string, t
5757
});
5858
};
5959

60-
export const useNormalizedMessage = <TMessage extends IMessage>(message: TMessage, maxMessageParseSize: number): MessageWithMdEnforced => {
60+
export const useNormalizedMessage = <TMessage extends IMessage>(
61+
message: TMessage,
62+
maxMarkdownParseLength: number,
63+
): MessageWithMdEnforced => {
6164
const katex = useMessageListKatex();
6265
const katexEnabled = !!katex;
6366
const customDomains = useAutoLinkDomains();
@@ -77,7 +80,7 @@ export const useNormalizedMessage = <TMessage extends IMessage>(message: TMessag
7780
}),
7881
};
7982

80-
if (message.msg && message.msg.length > maxMessageParseSize) {
83+
if (message.msg && message.msg.length > maxMarkdownParseLength) {
8184
return {
8285
...message,
8386
md: [
@@ -115,6 +118,6 @@ export const useNormalizedMessage = <TMessage extends IMessage>(message: TMessag
115118
katex?.parenthesisSyntaxEnabled,
116119
message,
117120
autoTranslateOptions,
118-
maxMessageParseSize,
121+
maxMarkdownParseLength,
119122
]);
120123
};

apps/meteor/client/components/message/variants/ThreadMessagePreview.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import { useGoToThread } from '../../../views/room/hooks/useGoToThread';
3131
import Emoji from '../../Emoji';
3232
import { useShowTranslated } from '../list/MessageListContext';
3333
import ThreadMessagePreviewBody from './threadPreview/ThreadMessagePreviewBody';
34-
import { useMaxMessageParseSize } from '../hooks/useMaxMessageParseSize';
34+
import { useMaxMarkdownParseLength } from '../hooks/useMaxMarkdownParseLength';
3535

3636
type ThreadMessagePreviewProps = {
3737
message: IThreadMessage;
@@ -53,8 +53,8 @@ const ThreadMessagePreview = ({ message, showUserAvatar, sequential, ...props }:
5353

5454
const messageType = parentMessage.isSuccess ? MessageTypes.getType(parentMessage.data) : null;
5555

56-
const maxMessageParseSize = useMaxMessageParseSize();
57-
const messageBody = useMessageBody(parentMessage.data, maxMessageParseSize);
56+
const maxMarkdownParseLength = useMaxMarkdownParseLength();
57+
const messageBody = useMessageBody(parentMessage.data, maxMarkdownParseLength);
5858

5959
const previewMessage = isParsedMessage(messageBody) ? { md: messageBody } : { msg: messageBody };
6060

apps/meteor/client/components/message/variants/room/RoomMessageContent.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import MessageActions from '../../content/MessageActions';
1818
import Reactions from '../../content/Reactions';
1919
import ThreadMetrics from '../../content/ThreadMetrics';
2020
import UrlPreviews from '../../content/UrlPreviews';
21-
import { useMaxMessageParseSize } from '../../hooks/useMaxMessageParseSize';
21+
import { useMaxMarkdownParseLength } from '../../hooks/useMaxMarkdownParseLength';
2222
import { useNormalizedMessage } from '../../hooks/useNormalizedMessage';
2323
import { useOembedLayout } from '../../hooks/useOembedLayout';
2424
import { useSubscriptionFromMessageQuery } from '../../hooks/useSubscriptionFromMessageQuery';
@@ -43,9 +43,9 @@ const RoomMessageContent = ({ message, unread, all, mention, searchText }: RoomM
4343
const messageUser = { ...message.u, roles: [], ...useUserPresence(message.u._id) };
4444
const chat = useChat();
4545
const { t } = useTranslation();
46-
const maxMessageParseSize = useMaxMessageParseSize();
46+
const maxMarkdownParseLength = useMaxMarkdownParseLength();
4747

48-
const normalizedMessage = useNormalizedMessage(message, maxMessageParseSize);
48+
const normalizedMessage = useNormalizedMessage(message, maxMarkdownParseLength);
4949
const isMessageEncrypted = encrypted && normalizedMessage?.e2e === 'pending';
5050

5151
const quotes = normalizedMessage?.attachments?.filter(isQuoteAttachment) || [];

apps/meteor/client/components/message/variants/thread/ThreadMessageContent.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import Location from '../../content/Location';
1515
import MessageActions from '../../content/MessageActions';
1616
import Reactions from '../../content/Reactions';
1717
import UrlPreviews from '../../content/UrlPreviews';
18-
import { useMaxMessageParseSize } from '../../hooks/useMaxMessageParseSize';
18+
import { useMaxMarkdownParseLength } from '../../hooks/useMaxMarkdownParseLength';
1919
import { useNormalizedMessage } from '../../hooks/useNormalizedMessage';
2020
import { useOembedLayout } from '../../hooks/useOembedLayout';
2121
import { useSubscriptionFromMessageQuery } from '../../hooks/useSubscriptionFromMessageQuery';
@@ -34,11 +34,11 @@ const ThreadMessageContent = ({ message }: ThreadMessageContentProps): ReactElem
3434
const uid = useUserId();
3535
const { enabled: readReceiptEnabled } = useMessageListReadReceipts();
3636
const messageUser = { ...message.u, roles: [], ...useUserPresence(message.u._id) };
37-
const maxMessageParseSize = useMaxMessageParseSize();
37+
const maxMarkdownParseLength = useMaxMarkdownParseLength();
3838

3939
const { t } = useTranslation();
4040

41-
const normalizedMessage = useNormalizedMessage(message, maxMessageParseSize);
41+
const normalizedMessage = useNormalizedMessage(message, maxMarkdownParseLength);
4242

4343
const isMessageEncrypted = encrypted && normalizedMessage?.e2e === 'pending';
4444

apps/meteor/client/lib/constants.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,3 @@ export const BIO_TEXT_MAX_LENGTH = 260;
33
export const VIDEOCONF_STACK_MAX_USERS = 6;
44
export const NAVIGATION_REGION_ID = 'navigation-region';
55
export const MAX_FILE_SIZE_PREVIEW = 10485760; // 10MB
6-
export const MESSAGE_PARSE_HARD_LIMIT = 20000;

0 commit comments

Comments
 (0)