diff --git a/app/lib/server/functions/notifications/desktop.js b/app/lib/server/functions/notifications/desktop.js index 0fdd5008b62..b2bb0a430b1 100644 --- a/app/lib/server/functions/notifications/desktop.js +++ b/app/lib/server/functions/notifications/desktop.js @@ -13,7 +13,7 @@ import { roomCoordinator } from '../../../../../server/lib/rooms/roomCoordinator * @param {string} notificationMessage The message text to send on notification body */ export function notifyDesktopUser({ userId, user, message, room, duration, notificationMessage }) { - const { title, text } = roomCoordinator.getRoomDirectives(room.t)?.getNotificationDetails(room, user, notificationMessage); + const { title, text } = roomCoordinator.getRoomDirectives(room.t)?.getNotificationDetails(room, user, notificationMessage, userId); metrics.notificationsSent.inc({ notification_type: 'desktop' }); Notifications.notifyUser(userId, 'notification', { diff --git a/app/lib/server/functions/notifications/mobile.js b/app/lib/server/functions/notifications/mobile.js index de170e31e0f..9edac0cd4bd 100644 --- a/app/lib/server/functions/notifications/mobile.js +++ b/app/lib/server/functions/notifications/mobile.js @@ -55,7 +55,7 @@ export async function getPushData({ }, roomName: settings.get('Push_show_username_room') && roomCoordinator.getRoomDirectives(room.t)?.isGroupChat(room) - ? `#${roomCoordinator.getRoomName(room.t, room)}` + ? `#${roomCoordinator.getRoomName(room.t, room, userId)}` : '', username, message: messageText, diff --git a/client/lib/rooms/roomTypes/direct.ts b/client/lib/rooms/roomTypes/direct.ts index 59f359a8f2d..0c8f8897c38 100644 --- a/client/lib/rooms/roomTypes/direct.ts +++ b/client/lib/rooms/roomTypes/direct.ts @@ -7,17 +7,16 @@ import { settings } from '../../../../app/settings/client'; import { getUserPreference } from '../../../../app/utils/client'; import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL'; import { getUserAvatarURL } from '../../../../app/utils/lib/getUserAvatarURL'; -import type { IRoom } from '../../../../definition/IRoom'; import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig'; import { RoomSettingsEnum, RoomMemberActions, UiTextContext } from '../../../../definition/IRoomTypeConfig'; -import type { AtLeast, ValueOf } from '../../../../definition/utils'; +import type { AtLeast } from '../../../../definition/utils'; import { getDirectMessageRoomType } from '../../../../lib/rooms/roomTypes/direct'; import { roomCoordinator } from '../roomCoordinator'; export const DirectMessageRoomType = getDirectMessageRoomType(roomCoordinator); roomCoordinator.add(DirectMessageRoomType, { - allowRoomSettingChange(_room: Partial, setting: ValueOf): boolean { + allowRoomSettingChange(_room, setting) { switch (setting) { case RoomSettingsEnum.TYPE: case RoomSettingsEnum.NAME: @@ -35,7 +34,7 @@ roomCoordinator.add(DirectMessageRoomType, { } }, - allowMemberAction(room: Partial, action: ValueOf): boolean { + allowMemberAction(room, action) { switch (action) { case RoomMemberActions.BLOCK: return !this.isGroupChat(room); @@ -44,7 +43,7 @@ roomCoordinator.add(DirectMessageRoomType, { } }, - roomName(roomData): string | undefined { + roomName(roomData) { const subscription = ((): { fname?: string; name?: string } | undefined => { if (roomData.fname || roomData.name) { return { @@ -71,11 +70,11 @@ roomCoordinator.add(DirectMessageRoomType, { return subscription.name; }, - isGroupChat(room: Partial): boolean { + isGroupChat(room) { return (room?.uids?.length || 0) > 2; }, - getUiText(context: ValueOf): string { + getUiText(context) { switch (context) { case UiTextContext.HIDE_WARNING: return 'Hide_Private_Warning'; @@ -86,12 +85,12 @@ roomCoordinator.add(DirectMessageRoomType, { } }, - condition(): boolean { + condition() { const groupByType = getUserPreference(Meteor.userId(), 'sidebarGroupByType'); return groupByType && hasAtLeastOnePermission(['view-d-room', 'view-joined-room']); }, - getAvatarPath(room): string { + getAvatarPath(room) { if (!room) { return ''; } @@ -117,7 +116,7 @@ roomCoordinator.add(DirectMessageRoomType, { return getUserAvatarURL(room.name || this.roomName(room)); }, - getIcon(room: Partial): string | undefined { + getIcon(room) { if (this.isGroupChat(room)) { return 'balloon'; } @@ -125,7 +124,7 @@ roomCoordinator.add(DirectMessageRoomType, { return DirectMessageRoomType.icon; }, - getUserStatus(roomId: string): string | undefined { + getUserStatus(roomId) { const subscription = Subscriptions.findOne({ rid: roomId }); if (!subscription) { return; @@ -134,7 +133,7 @@ roomCoordinator.add(DirectMessageRoomType, { return Session.get(`user_${subscription.name}_status`); }, - findRoom(identifier: string): IRoom | undefined { + findRoom(identifier) { if (!hasPermission('view-d-room')) { return; } diff --git a/client/lib/rooms/roomTypes/livechat.ts b/client/lib/rooms/roomTypes/livechat.ts index 82057daefd0..b7fe351939d 100644 --- a/client/lib/rooms/roomTypes/livechat.ts +++ b/client/lib/rooms/roomTypes/livechat.ts @@ -5,7 +5,7 @@ import { LivechatInquiry } from '../../../../app/livechat/client/collections/Liv import { ChatRoom, ChatSubscription } from '../../../../app/models/client'; import { settings } from '../../../../app/settings/client'; import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL'; -import type { IRoom, IOmnichannelRoom } from '../../../../definition/IRoom'; +import type { IOmnichannelRoom } from '../../../../definition/IRoom'; import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig'; import { RoomSettingsEnum, RoomMemberActions, UiTextContext } from '../../../../definition/IRoomTypeConfig'; import type { AtLeast, ValueOf } from '../../../../definition/utils'; @@ -15,7 +15,7 @@ import { roomCoordinator } from '../roomCoordinator'; export const LivechatRoomType = getLivechatRoomType(roomCoordinator); roomCoordinator.add(LivechatRoomType, { - allowRoomSettingChange(_room: Partial, setting: ValueOf): boolean { + allowRoomSettingChange(_room, setting) { switch (setting) { case RoomSettingsEnum.JOIN_CODE: return false; @@ -24,16 +24,17 @@ roomCoordinator.add(LivechatRoomType, { } }, - allowMemberAction(_room: Partial, action: ValueOf): boolean { + allowMemberAction(_room, action) { return ([RoomMemberActions.INVITE, RoomMemberActions.JOIN] as Array>).includes(action); }, - roomName(room: any): string | undefined { - return room.name || room.fname || room.label; + roomName(room) { + return room.name || room.fname || (room as any).label; }, - openCustomProfileTab(instance: any, room: IOmnichannelRoom, username: string): boolean { - if (!room?.v || (room.v as any).username !== username) { + openCustomProfileTab(instance, room, username) { + const omniRoom = room as IOmnichannelRoom; + if (!omniRoom?.v || (omniRoom.v as any).username !== username) { return false; } @@ -41,7 +42,7 @@ roomCoordinator.add(LivechatRoomType, { return true; }, - getUiText(context: ValueOf): string { + getUiText(context) { switch (context) { case UiTextContext.HIDE_WARNING: return 'Hide_Livechat_Warning'; @@ -52,15 +53,15 @@ roomCoordinator.add(LivechatRoomType, { } }, - condition(): boolean { + condition() { return settings.get('Livechat_enabled') && hasPermission('view-l-room'); }, - getAvatarPath(room): string { + getAvatarPath(room) { return getAvatarURL({ username: `@${this.roomName(room)}` }) || ''; }, - getUserStatus(rid: string): string | undefined { + getUserStatus(rid) { const room = Session.get(`roomData${rid}`); if (room) { return room.v && room.v.status; @@ -69,20 +70,20 @@ roomCoordinator.add(LivechatRoomType, { return inquiry?.v?.status; }, - findRoom(identifier: string): IRoom | undefined { + findRoom(identifier) { return ChatRoom.findOne({ _id: identifier }); }, - isLivechatRoom(): boolean { + isLivechatRoom() { return true; }, - canSendMessage(rid: string): boolean { + canSendMessage(rid) { const room = ChatRoom.findOne({ _id: rid }, { fields: { open: 1 } }); return Boolean(room?.open); }, - readOnly(rid: string, _user): boolean { + readOnly(rid, _user) { const room = ChatRoom.findOne({ _id: rid }, { fields: { open: 1, servedBy: 1 } }); if (!room || !room.open) { return true; diff --git a/client/lib/rooms/roomTypes/private.ts b/client/lib/rooms/roomTypes/private.ts index 66ff01e0173..58e2afd61ab 100644 --- a/client/lib/rooms/roomTypes/private.ts +++ b/client/lib/rooms/roomTypes/private.ts @@ -5,17 +5,16 @@ import { ChatRoom } from '../../../../app/models/client'; import { settings } from '../../../../app/settings/client'; import { getUserPreference } from '../../../../app/utils/client'; import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL'; -import type { IRoom } from '../../../../definition/IRoom'; import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig'; import { RoomSettingsEnum, RoomMemberActions, UiTextContext } from '../../../../definition/IRoomTypeConfig'; -import type { AtLeast, ValueOf } from '../../../../definition/utils'; +import type { AtLeast } from '../../../../definition/utils'; import { getPrivateRoomType } from '../../../../lib/rooms/roomTypes/private'; import { roomCoordinator } from '../roomCoordinator'; export const PrivateRoomType = getPrivateRoomType(roomCoordinator); roomCoordinator.add(PrivateRoomType, { - allowRoomSettingChange(room: Partial, setting: ValueOf): boolean { + allowRoomSettingChange(room, setting) { switch (setting) { case RoomSettingsEnum.JOIN_CODE: return false; @@ -33,7 +32,7 @@ roomCoordinator.add(PrivateRoomType, { } }, - allowMemberAction(_room: Partial, action: ValueOf): boolean { + allowMemberAction(_room, action) { switch (action) { case RoomMemberActions.BLOCK: return false; @@ -42,7 +41,7 @@ roomCoordinator.add(PrivateRoomType, { } }, - roomName(roomData: AtLeast): string | undefined { + roomName(roomData) { if (roomData.prid) { return roomData.fname; } @@ -53,11 +52,11 @@ roomCoordinator.add(PrivateRoomType, { return roomData.name; }, - isGroupChat(_room: Partial): boolean { + isGroupChat(_room) { return true; }, - getUiText(context: ValueOf): string { + getUiText(context) { switch (context) { case UiTextContext.HIDE_WARNING: return 'Hide_Group_Warning'; @@ -68,16 +67,16 @@ roomCoordinator.add(PrivateRoomType, { } }, - condition(): boolean { + condition() { const groupByType = getUserPreference(Meteor.userId(), 'sidebarGroupByType'); return groupByType && hasPermission('view-p-room'); }, - getAvatarPath(room): string { + getAvatarPath(room) { return getAvatarURL({ roomId: room._id, cache: room.avatarETag }) as string; }, - getIcon(room: Partial): string | undefined { + getIcon(room) { if (room.prid) { return 'discussion'; } @@ -88,7 +87,7 @@ roomCoordinator.add(PrivateRoomType, { return PrivateRoomType.icon; }, - findRoom(identifier: string): IRoom | undefined { + findRoom(identifier) { const query = { t: 'p', name: identifier, diff --git a/client/lib/rooms/roomTypes/public.ts b/client/lib/rooms/roomTypes/public.ts index f6204f3d637..a6e7a10eef6 100644 --- a/client/lib/rooms/roomTypes/public.ts +++ b/client/lib/rooms/roomTypes/public.ts @@ -5,17 +5,16 @@ import { ChatRoom } from '../../../../app/models/client'; import { settings } from '../../../../app/settings/client'; import { getUserPreference } from '../../../../app/utils/client'; import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL'; -import type { IRoom } from '../../../../definition/IRoom'; import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig'; import { RoomSettingsEnum, RoomMemberActions, UiTextContext } from '../../../../definition/IRoomTypeConfig'; -import type { AtLeast, ValueOf } from '../../../../definition/utils'; +import type { AtLeast } from '../../../../definition/utils'; import { getPublicRoomType } from '../../../../lib/rooms/roomTypes/public'; import { roomCoordinator } from '../roomCoordinator'; export const PublicRoomType = getPublicRoomType(roomCoordinator); roomCoordinator.add(PublicRoomType, { - allowRoomSettingChange(room: Partial, setting: ValueOf): boolean { + allowRoomSettingChange(room, setting) { switch (setting) { case RoomSettingsEnum.BROADCAST: return Boolean(room.broadcast); @@ -31,7 +30,7 @@ roomCoordinator.add(PublicRoomType, { } }, - allowMemberAction(_room: Partial, action: ValueOf): boolean { + allowMemberAction(_room, action) { switch (action) { case RoomMemberActions.BLOCK: return false; @@ -40,7 +39,7 @@ roomCoordinator.add(PublicRoomType, { } }, - roomName(roomData: AtLeast): string | undefined { + roomName(roomData) { if (roomData.prid) { return roomData.fname; } @@ -50,11 +49,11 @@ roomCoordinator.add(PublicRoomType, { return roomData.name; }, - isGroupChat(_room: Partial): boolean { + isGroupChat(_room) { return true; }, - getUiText(context: ValueOf): string { + getUiText(context) { switch (context) { case UiTextContext.HIDE_WARNING: return 'Hide_Room_Warning'; @@ -65,18 +64,18 @@ roomCoordinator.add(PublicRoomType, { } }, - condition(): boolean { + condition() { const groupByType = getUserPreference(Meteor.userId(), 'sidebarGroupByType'); return ( groupByType && (hasAtLeastOnePermission(['view-c-room', 'view-joined-room']) || settings.get('Accounts_AllowAnonymousRead') === true) ); }, - getAvatarPath(room): string { + getAvatarPath(room) { return getAvatarURL({ roomId: room._id, cache: room.avatarETag }) as string; }, - getIcon(room: Partial): string | undefined { + getIcon(room) { if (room.prid) { return 'discussion'; } @@ -87,7 +86,7 @@ roomCoordinator.add(PublicRoomType, { return PublicRoomType.icon; }, - findRoom(identifier: string): IRoom | undefined { + findRoom(identifier) { const query = { t: 'c', name: identifier, @@ -96,7 +95,7 @@ roomCoordinator.add(PublicRoomType, { return ChatRoom.findOne(query); }, - showJoinLink(roomId: string): boolean { + showJoinLink(roomId) { return !!ChatRoom.findOne({ _id: roomId, t: 'c' }); }, } as AtLeast); diff --git a/client/lib/rooms/roomTypes/voip.ts b/client/lib/rooms/roomTypes/voip.ts index de6c6f51bcb..6a266438f22 100644 --- a/client/lib/rooms/roomTypes/voip.ts +++ b/client/lib/rooms/roomTypes/voip.ts @@ -2,7 +2,6 @@ import { hasPermission } from '../../../../app/authorization/client'; import { ChatRoom } from '../../../../app/models/client'; import { settings } from '../../../../app/settings/client'; import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL'; -import type { IRoom } from '../../../../definition/IRoom'; import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig'; import type { AtLeast } from '../../../../definition/utils'; import { getVoipRoomType } from '../../../../lib/rooms/roomTypes/voip'; @@ -11,27 +10,27 @@ import { roomCoordinator } from '../roomCoordinator'; export const VoipRoomType = getVoipRoomType(roomCoordinator); roomCoordinator.add(VoipRoomType, { - roomName(room: any): string | undefined { - return room.name || room.fname || room.label; + roomName(room) { + return room.name || room.fname || (room as any).label; }, - condition(): boolean { + condition() { return settings.get('Livechat_enabled') && hasPermission('view-l-room'); }, - getAvatarPath(room): string { + getAvatarPath(room) { return getAvatarURL({ username: `@${this.roomName(room)}` }) || ''; }, - findRoom(identifier: string): IRoom | undefined { + findRoom(identifier) { return ChatRoom.findOne({ _id: identifier }); }, - canSendMessage(_rid: string): boolean { + canSendMessage(_rid) { return false; }, - readOnly(_rid: string, _user): boolean { + readOnly(_rid, _user) { return true; }, } as AtLeast); diff --git a/definition/IRoomTypeConfig.ts b/definition/IRoomTypeConfig.ts index d96ab2505dd..e7c9f5ca5da 100644 --- a/definition/IRoomTypeConfig.ts +++ b/definition/IRoomTypeConfig.ts @@ -90,7 +90,7 @@ export interface IRoomTypeServerDirectives { allowRoomSettingChange: (room: IRoom, setting: ValueOf) => boolean; allowMemberAction: (room: IRoom, action: ValueOf) => boolean; - roomName: (room: IRoom) => string | undefined; + roomName: (room: IRoom, userId?: string) => string | undefined; isGroupChat: (room: IRoom) => boolean; canBeDeleted: (hasPermission: (permissionId: string, rid?: string) => boolean, room: IRoom) => boolean; preventRenaming: () => boolean; @@ -98,8 +98,9 @@ export interface IRoomTypeServerDirectives { canAccessUploadedFile: (params: { rc_uid: string; rc_rid: string; rc_token: string }) => boolean; getNotificationDetails: ( room: IRoom, - user: AtLeast, + sender: AtLeast, notificationMessage: string, + userId: string, ) => { title: string | undefined; text: string }; getMsgSender: (senderId: IRocketChatRecord['_id']) => IRocketChatRecord | undefined; includeInRoomSearch: () => boolean; diff --git a/server/lib/rooms/roomCoordinator.ts b/server/lib/rooms/roomCoordinator.ts index b56eef3a04d..ef838467fbd 100644 --- a/server/lib/rooms/roomCoordinator.ts +++ b/server/lib/rooms/roomCoordinator.ts @@ -19,7 +19,7 @@ class RoomCoordinatorServer extends RoomCoordinator { allowMemberAction(_room: IRoom, _action: ValueOf): boolean { return false; }, - roomName(_room: IRoom): string { + roomName(_room: IRoom, _userId?: string): string { return ''; }, isGroupChat(_room: IRoom): boolean { @@ -42,11 +42,12 @@ class RoomCoordinatorServer extends RoomCoordinator { }, getNotificationDetails( room: IRoom, - user: AtLeast, + sender: AtLeast, notificationMessage: string, + userId: string, ): { title: string | undefined; text: string } { - const title = `#${this.roomName(room)}`; - const name = settings.get('UI_Use_Real_Name') ? user.name : user.username; + const title = `#${this.roomName(room, userId)}`; + const name = settings.get('UI_Use_Real_Name') ? sender.name : sender.username; const text = `${name}: ${notificationMessage}`; @@ -82,8 +83,8 @@ class RoomCoordinatorServer extends RoomCoordinator { return Object.keys(this.roomTypes).filter((key) => (this.roomTypes[key].directives as IRoomTypeServerDirectives).includeInDashboard()); } - getRoomName(roomType: string, roomData: IRoom): string { - return this.getRoomDirectives(roomType)?.roomName(roomData) ?? ''; + getRoomName(roomType: string, roomData: IRoom, userId?: string): string { + return this.getRoomDirectives(roomType)?.roomName(roomData, userId) ?? ''; } setRoomFind(roomType: string, roomFind: Required>['roomFind']): void { diff --git a/server/lib/rooms/roomTypes/direct.ts b/server/lib/rooms/roomTypes/direct.ts index 5664b8d08a0..2fa3d2392a4 100644 --- a/server/lib/rooms/roomTypes/direct.ts +++ b/server/lib/rooms/roomTypes/direct.ts @@ -2,18 +2,25 @@ import { Meteor } from 'meteor/meteor'; import { settings } from '../../../../app/settings/server'; import type { IRoom } from '../../../../definition/IRoom'; -import type { IUser } from '../../../../definition/IUser'; import type { IRoomTypeServerDirectives } from '../../../../definition/IRoomTypeConfig'; import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig'; -import type { AtLeast, ValueOf } from '../../../../definition/utils'; +import type { AtLeast } from '../../../../definition/utils'; import { getDirectMessageRoomType } from '../../../../lib/rooms/roomTypes/direct'; import { roomCoordinator } from '../roomCoordinator'; import { Subscriptions } from '../../../../app/models/server'; export const DirectMessageRoomType = getDirectMessageRoomType(roomCoordinator); +const getCurrentUserId = (): string | undefined => { + try { + return Meteor.userId() || undefined; + } catch (_e) { + // + } +}; + roomCoordinator.add(DirectMessageRoomType, { - allowRoomSettingChange(_room: IRoom, setting: ValueOf): boolean { + allowRoomSettingChange(_room, setting) { switch (setting) { case RoomSettingsEnum.TYPE: case RoomSettingsEnum.NAME: @@ -31,7 +38,7 @@ roomCoordinator.add(DirectMessageRoomType, { } }, - allowMemberAction(room: IRoom, action: ValueOf): boolean { + allowMemberAction(room: IRoom, action) { switch (action) { case RoomMemberActions.BLOCK: return !this.isGroupChat(room); @@ -40,7 +47,7 @@ roomCoordinator.add(DirectMessageRoomType, { } }, - roomName(room: IRoom): string | undefined { + roomName(room, userId?) { const subscription = ((): { fname?: string; name?: string } | undefined => { if (room.fname || room.name) { return { @@ -53,7 +60,13 @@ roomCoordinator.add(DirectMessageRoomType, { return undefined; } - return Subscriptions.findOneByRoomIdAndUserId(room._id, Meteor.userId()); + const uid = userId || getCurrentUserId(); + if (uid) { + return Subscriptions.findOneByRoomIdAndUserId(room._id, uid, { fields: { name: 1, fname: 1 } }); + } + + // If we don't know what user is requesting the roomName, then any subscription will do + return Subscriptions.findOne({ rid: room._id }, { fields: { name: 1, fname: 1 } }); })(); if (!subscription) { @@ -67,31 +80,27 @@ roomCoordinator.add(DirectMessageRoomType, { return subscription.name; }, - isGroupChat(room: IRoom): boolean { + isGroupChat(room) { return (room?.uids?.length || 0) > 2; }, - getNotificationDetails( - room: IRoom, - user: AtLeast, - notificationMessage: string, - ): { title: string | undefined; text: string } { + getNotificationDetails(room, sender, notificationMessage, userId) { const useRealName = settings.get('UI_Use_Real_Name'); - if (!this.isGroupChat(room)) { + if (this.isGroupChat(room)) { return { - title: this.roomName(room), - text: `${(useRealName && user.name) || user.username}: ${notificationMessage}`, + title: this.roomName(room, userId), + text: `${(useRealName && sender.name) || sender.username}: ${notificationMessage}`, }; } return { - title: (useRealName && user.name) || user.username, + title: (useRealName && sender.name) || sender.username, text: notificationMessage, }; }, - includeInDashboard(): boolean { + includeInDashboard() { return true; }, } as AtLeast); diff --git a/server/lib/rooms/roomTypes/livechat.ts b/server/lib/rooms/roomTypes/livechat.ts index bf88938629d..5bccde0fa63 100644 --- a/server/lib/rooms/roomTypes/livechat.ts +++ b/server/lib/rooms/roomTypes/livechat.ts @@ -1,5 +1,4 @@ import { LivechatRooms, LivechatVisitors } from '../../../../app/models/server'; -import type { IRoom } from '../../../../definition/IRoom'; import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig'; import type { IRoomTypeServerDirectives } from '../../../../definition/IRoomTypeConfig'; import type { AtLeast, ValueOf } from '../../../../definition/utils'; @@ -9,7 +8,7 @@ import { roomCoordinator } from '../roomCoordinator'; export const LivechatRoomType = getLivechatRoomType(roomCoordinator); roomCoordinator.add(LivechatRoomType, { - allowRoomSettingChange(_room, setting: ValueOf): boolean { + allowRoomSettingChange(_room, setting) { switch (setting) { case RoomSettingsEnum.JOIN_CODE: return false; @@ -18,20 +17,20 @@ roomCoordinator.add(LivechatRoomType, { } }, - allowMemberAction(_room, action: ValueOf): boolean { + allowMemberAction(_room, action) { return ([RoomMemberActions.INVITE, RoomMemberActions.JOIN] as Array>).includes(action); }, - roomName(room: any): string | undefined { - return room.name || room.fname || room.label; + roomName(room, _userId?) { + return room.name || room.fname || (room as any).label; }, - canAccessUploadedFile({ rc_token: token, rc_rid: rid }): boolean { + canAccessUploadedFile({ rc_token: token, rc_rid: rid }) { return token && rid && LivechatRooms.findOneOpenByRoomIdAndVisitorToken(rid, token); }, - getNotificationDetails(room: IRoom, _user, notificationMessage: string) { - const title = `[Omnichannel] ${this.roomName(room)}`; + getNotificationDetails(room, _sender, notificationMessage, userId) { + const title = `[Omnichannel] ${this.roomName(room, userId)}`; const text = notificationMessage; return { title, text }; @@ -41,8 +40,8 @@ roomCoordinator.add(LivechatRoomType, { return LivechatVisitors.findOneById(senderId); }, - getReadReceiptsExtraData(message: any) { - const { token } = message; + getReadReceiptsExtraData(message) { + const { token } = message as any; return { token }; }, } as AtLeast); diff --git a/server/lib/rooms/roomTypes/private.ts b/server/lib/rooms/roomTypes/private.ts index 5023f8aae6f..f76ecca1e65 100644 --- a/server/lib/rooms/roomTypes/private.ts +++ b/server/lib/rooms/roomTypes/private.ts @@ -1,14 +1,12 @@ import { settings } from '../../../../app/settings/server'; -import type { IRoom } from '../../../../definition/IRoom'; import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig'; -import type { ValueOf } from '../../../../definition/utils'; import { getPrivateRoomType } from '../../../../lib/rooms/roomTypes/private'; import { roomCoordinator } from '../roomCoordinator'; export const PrivateRoomType = getPrivateRoomType(roomCoordinator); roomCoordinator.add(PrivateRoomType, { - allowRoomSettingChange(room: IRoom, setting: ValueOf): boolean { + allowRoomSettingChange(room, setting) { switch (setting) { case RoomSettingsEnum.JOIN_CODE: return false; @@ -26,7 +24,7 @@ roomCoordinator.add(PrivateRoomType, { } }, - allowMemberAction(_room: IRoom, action: ValueOf): boolean { + allowMemberAction(_room, action) { switch (action) { case RoomMemberActions.BLOCK: return false; @@ -35,7 +33,7 @@ roomCoordinator.add(PrivateRoomType, { } }, - roomName(room: IRoom): string | undefined { + roomName(room, _userId?) { if (room.prid) { return room.fname; } @@ -46,11 +44,11 @@ roomCoordinator.add(PrivateRoomType, { return room.name; }, - isGroupChat(_room: IRoom): boolean { + isGroupChat(_room) { return true; }, - includeInDashboard(): boolean { + includeInDashboard() { return true; }, }); diff --git a/server/lib/rooms/roomTypes/public.ts b/server/lib/rooms/roomTypes/public.ts index a9d2157cf4e..7784517ff65 100644 --- a/server/lib/rooms/roomTypes/public.ts +++ b/server/lib/rooms/roomTypes/public.ts @@ -1,15 +1,14 @@ import { settings } from '../../../../app/settings/server'; -import type { IRoom, RoomType } from '../../../../definition/IRoom'; import type { IRoomTypeServerDirectives } from '../../../../definition/IRoomTypeConfig'; import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig'; -import type { AtLeast, ValueOf } from '../../../../definition/utils'; +import type { AtLeast } from '../../../../definition/utils'; import { getPublicRoomType } from '../../../../lib/rooms/roomTypes/public'; import { roomCoordinator } from '../roomCoordinator'; export const PublicRoomType = getPublicRoomType(roomCoordinator); roomCoordinator.add(PublicRoomType, { - allowRoomSettingChange(room: IRoom, setting: ValueOf): boolean { + allowRoomSettingChange(room, setting) { switch (setting) { case RoomSettingsEnum.BROADCAST: return Boolean(room.broadcast); @@ -25,7 +24,7 @@ roomCoordinator.add(PublicRoomType, { } }, - allowMemberAction(_room: IRoom, action: ValueOf): boolean { + allowMemberAction(_room, action) { switch (action) { case RoomMemberActions.BLOCK: return false; @@ -34,7 +33,7 @@ roomCoordinator.add(PublicRoomType, { } }, - roomName(room: IRoom): string | undefined { + roomName(room, _userId?) { if (room.prid) { return room.fname; } @@ -44,19 +43,19 @@ roomCoordinator.add(PublicRoomType, { return room.name; }, - isGroupChat(_room: IRoom): boolean { + isGroupChat(_room) { return true; }, - includeInDashboard(): boolean { + includeInDashboard() { return true; }, - getDiscussionType(): RoomType { + getDiscussionType() { return 'c'; }, - includeInRoomSearch(): boolean { + includeInRoomSearch() { return true; }, } as AtLeast); diff --git a/server/lib/rooms/roomTypes/voip.ts b/server/lib/rooms/roomTypes/voip.ts index 2a422cbac2a..3108cd6ea2b 100644 --- a/server/lib/rooms/roomTypes/voip.ts +++ b/server/lib/rooms/roomTypes/voip.ts @@ -1,6 +1,5 @@ import { Users } from '../../../../app/models/server'; import type { IRoomTypeServerDirectives } from '../../../../definition/IRoomTypeConfig'; -import type { IUser } from '../../../../definition/IUser'; import type { AtLeast } from '../../../../definition/utils'; import { getVoipRoomType } from '../../../../lib/rooms/roomTypes/voip'; import { roomCoordinator } from '../roomCoordinator'; @@ -8,18 +7,18 @@ import { roomCoordinator } from '../roomCoordinator'; export const VoipRoomType = getVoipRoomType(roomCoordinator); roomCoordinator.add(VoipRoomType, { - roomName(room: any): string | undefined { - return room.name || room.fname || room.label; + roomName(room, _userId?) { + return room.name || room.fname || (room as any).label; }, - getNotificationDetails(room, _user, notificationMessage: string) { - const title = `[Omnichannel] ${this.roomName(room)}`; + getNotificationDetails(room, _sender, notificationMessage, userId) { + const title = `[Omnichannel] ${this.roomName(room, userId)}`; const text = notificationMessage; return { title, text }; }, - getMsgSender(senderId: string): IUser { + getMsgSender(senderId) { return Users.findOneById(senderId); }, } as AtLeast); diff --git a/server/routes/avatar/room.js b/server/routes/avatar/room.js index a9dcbe3906f..9453ff4b4da 100644 --- a/server/routes/avatar/room.js +++ b/server/routes/avatar/room.js @@ -1,4 +1,5 @@ import { Meteor } from 'meteor/meteor'; +import { Cookies } from 'meteor/ostrio:cookies'; import { renderSVGLetters, serveAvatar, wasFallbackModified, setCacheAndDispositionHeaders } from './utils'; import { FileUpload } from '../../../app/file-upload'; @@ -6,6 +7,7 @@ import { Rooms } from '../../../app/models/server'; import { Avatars } from '../../../app/models/server/raw'; import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; +const cookie = new Cookies(); const getRoomAvatar = async (roomId) => { const room = Rooms.findOneById(roomId, { fields: { t: 1, prid: 1, name: 1, fname: 1 } }); if (!room) { @@ -32,6 +34,8 @@ export const roomAvatar = Meteor.bindEnvironment(async function (req, res /* , n return; } + const uid = req.headers.cookie && cookie.get('rc_uid', req.headers.cookie); + const reqModifiedHeader = req.headers['if-modified-since']; if (file) { res.setHeader('Content-Security-Policy', "default-src 'none'"); @@ -52,7 +56,7 @@ export const roomAvatar = Meteor.bindEnvironment(async function (req, res /* , n return FileUpload.get(file, req, res); } - const roomName = roomCoordinator.getRoomDirectives(room.t)?.roomName(room); + const roomName = roomCoordinator.getRoomName(room.t, room, uid); setCacheAndDispositionHeaders(req, res);