Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/eighty-weeks-rush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@rocket.chat/meteor": patch
"@rocket.chat/ui-client": patch
"@rocket.chat/ui-voip": patch
---

Introduces in the call widget a quick link that redirects to the participant's direct message
5 changes: 5 additions & 0 deletions .changeset/purple-jobs-swim.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@rocket.chat/ui-voip": minor
---

Introduces realtime user presence updates for the selected user when starting/transferring a voice call.
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,17 @@ export async function getWorkspaceAccessToken(forceNew = false, scope = '', save

const workspaceCredentials = await WorkspaceCredentials.getCredentialByScope(scope);
if (workspaceCredentials && !hasWorkspaceAccessTokenExpired(workspaceCredentials) && !forceNew) {
SystemLogger.debug(
`Workspace credentials cache hit using scope: ${scope}. Avoiding generating a new access token from cloud services.`,
);
SystemLogger.debug({
msg: 'Workspace credentials cache hit. Avoiding generating a new access token from cloud services.',
scope,
});
return workspaceCredentials.accessToken;
}

SystemLogger.debug(`Workspace credentials cache miss using scope: ${scope}, fetching new access token from cloud services.`);
SystemLogger.debug({
msg: 'Workspace credentials cache miss, fetching new access token from cloud services.',
scope,
});

const accessToken = await getWorkspaceAccessTokenWithScope({ scope, throwOnError });

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,10 @@ const cacheValueInSettings = <T extends SettingValue>(
reset: (retry?: number) => Promise<T>;
} => {
const reset = async (retry?: number) => {
SystemLogger.debug(`Resetting cached value ${key} in settings`);
SystemLogger.debug({
msg: 'Resetting cached value in settings',
key,
});
const value = await fn(retry);

if (
Expand Down Expand Up @@ -181,7 +184,10 @@ const getSupportedVersionsToken = async (retry = 0) => {
5000 * Math.pow(2, retry),
);
} else {
SystemLogger.error(`Failed to get supported versions from cloud after ${retry} retries.`);
SystemLogger.error({
msg: 'Failed to get supported versions from cloud after retries.',
retry,
});
await buildVersionUpdateMessage(supportedVersions?.versions);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ Meteor.startup(() => {
throw new Error(`Invalid RocketChatStore type [${storeType}]`);
}

SystemLogger.info(`Using ${storeType} for custom sounds storage`);
SystemLogger.info({
msg: 'Using custom sounds storage',
storeType,
});

let path = '~/uploads';
if (settings.get('CustomSounds_FileSystemPath') != null) {
Expand Down
5 changes: 4 additions & 1 deletion apps/meteor/app/emoji-custom/server/startup/emoji-custom.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ Meteor.startup(() => {
throw new Error(`Invalid RocketChatStore type [${storeType}]`);
}

SystemLogger.info(`Using ${storeType} for custom emoji storage`);
SystemLogger.info({
msg: 'Using custom emoji storage',
storeType,
});

let path = '~/uploads';
if (settings.get('EmojiUpload_FileSystemPath') != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ const configStore = _.debounce(() => {
const store = settings.get('FileUpload_Storage_Type');

if (store) {
SystemLogger.info(`Setting default file store to ${store}`);
SystemLogger.info({
msg: 'Setting default file store',
store,
});
UploadFS.getStores().Avatars = UploadFS.getStore(`${store}:Avatars`);
UploadFS.getStores().Uploads = UploadFS.getStore(`${store}:Uploads`);
UploadFS.getStores().UserDataFiles = UploadFS.getStore(`${store}:UserDataFiles`);
Expand Down
9 changes: 7 additions & 2 deletions apps/meteor/app/file-upload/server/lib/FileUpload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -537,12 +537,17 @@ export const FileUpload = {

getStoreByName(handlerName?: string) {
if (!handlerName) {
SystemLogger.error(`Empty Upload handler does not exists`);
SystemLogger.error({
msg: 'Empty Upload handler does not exists',
});
throw new Error(`Empty Upload handler does not exists`);
}

if (this.handlers[handlerName] == null) {
SystemLogger.error(`Upload handler "${handlerName}" does not exists`);
SystemLogger.error({
msg: 'Upload handler does not exists',
handlerName,
});
}
return this.handlers[handlerName];
},
Expand Down
27 changes: 21 additions & 6 deletions apps/meteor/app/lib/server/functions/setUserAvatar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,11 @@ export async function setUserAvatar(
try {
response = await fetch(dataURI, { redirect: 'error' });
} catch (e) {
SystemLogger.info(`Not a valid response, from the avatar url: ${encodeURI(dataURI)}`);
SystemLogger.info({
msg: 'Not a valid response from the avatar url',
url: encodeURI(dataURI),
err: e,
});
throw new Meteor.Error('error-avatar-invalid-url', `Invalid avatar URL: ${encodeURI(dataURI)}`, {
function: 'setUserAvatar',
url: dataURI,
Expand All @@ -123,25 +127,36 @@ export async function setUserAvatar(

if (response.status !== 200) {
if (response.status !== 404) {
SystemLogger.info(`Error while handling the setting of the avatar from a url (${encodeURI(dataURI)}) for ${user.username}`);
SystemLogger.info({
msg: 'Error while handling the setting of the avatar from a url',
url: encodeURI(dataURI),
username: user.username,
status: response.status,
});
throw new Meteor.Error(
'error-avatar-url-handling',
`Error while handling avatar setting from a URL (${encodeURI(dataURI)}) for ${user.username}`,
{ function: 'RocketChat.setUserAvatar', url: dataURI, username: user.username },
);
}

SystemLogger.info(`Not a valid response, ${response.status}, from the avatar url: ${dataURI}`);
SystemLogger.info({
msg: 'Not a valid response from the avatar url',
status: response.status,
url: dataURI,
});
throw new Meteor.Error('error-avatar-invalid-url', `Invalid avatar URL: ${dataURI}`, {
function: 'setUserAvatar',
url: dataURI,
});
}

if (!/image\/.+/.test(response.headers.get('content-type') || '')) {
SystemLogger.info(
`Not a valid content-type from the provided url, ${response.headers.get('content-type')}, from the avatar url: ${dataURI}`,
);
SystemLogger.info({
msg: 'Not a valid content-type from the provided avatar url',
contentType: response.headers.get('content-type'),
url: dataURI,
});
throw new Meteor.Error('error-avatar-invalid-url', `Invalid avatar URL: ${dataURI}`, {
function: 'setUserAvatar',
url: dataURI,
Expand Down
6 changes: 5 additions & 1 deletion apps/meteor/app/livechat/server/sendMessageBySMS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,11 @@ callbacks.add(

try {
await SMSService.send(room.sms.from, visitor.phone[0].phoneNumber, message.msg, extraData);
callbackLogger.debug(`SMS message sent to ${visitor.phone[0].phoneNumber} via ${service}`);
callbackLogger.debug({
msg: 'SMS message sent',
phoneNumber: visitor.phone[0].phoneNumber,
service,
});
} catch (e) {
callbackLogger.error(e);
}
Expand Down
10 changes: 8 additions & 2 deletions apps/meteor/app/mail-messages/server/functions/sendMail.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,10 @@ export const sendMail = async function ({
email,
});

SystemLogger.debug(`Sending email to ${email}`);
SystemLogger.debug({
msg: 'Sending email',
email,
});
return Mailer.send({
to: email,
from,
Expand All @@ -83,7 +86,10 @@ export const sendMail = async function ({
name: escapeHTML(user.name || ''),
email: escapeHTML(email),
});
SystemLogger.debug(`Sending email to ${email}`);
SystemLogger.debug({
msg: 'Sending email',
email,
});
await Mailer.send({
to: email,
from,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ export const unreadMessages = async (userId: string, firstUnreadMessage?: Pick<I
return logger.debug('Provided message is already marked as unread');
}

logger.debug(`Updating unread message of ${originalMessage.ts} as the first unread`);
logger.debug({
msg: 'Updating unread message as the first unread',
timestamp: originalMessage.ts,
});
const setAsUnreadResponse = await Subscriptions.setAsUnreadByRoomIdAndUserId(originalMessage.rid, userId, originalMessage.ts);
if (setAsUnreadResponse.modifiedCount) {
void notifyOnSubscriptionChangedByRoomIdAndUserId(originalMessage.rid, userId);
Expand Down
5 changes: 4 additions & 1 deletion apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,10 @@ const convertRoleNamesToIds = async (roleNamesOrIds: string[]): Promise<IRole['_
const roles = (await Roles.findInIdsOrNames(normalizedRoleNamesOrIds).toArray()).map((role) => role._id);

if (roles.length !== normalizedRoleNamesOrIds.length) {
SystemLogger.warn(`Failed to convert some role names to ids: ${normalizedRoleNamesOrIds.join(', ')}`);
SystemLogger.warn({
msg: 'Failed to convert some role names to ids',
roles: normalizedRoleNamesOrIds,
});
}

if (!roles.length) {
Expand Down
5 changes: 4 additions & 1 deletion apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,10 @@ export const loadSamlServiceProviders = async function (): Promise<void> {
};

export const addSamlService = function (name: string): void {
SystemLogger.warn(`Adding ${name} is deprecated`);
SystemLogger.warn({
msg: 'Adding SAML service is deprecated',
serviceName: name,
});
};

export const addSettings = async function (name: string): Promise<void> {
Expand Down
7 changes: 5 additions & 2 deletions apps/meteor/app/meteor-accounts-saml/server/listener.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,17 @@ const middleware = async function (req: express.Request, res: ServerResponse, ne

const service = SAMLUtils.getServiceProviderOptions(samlObject.serviceName);
if (!service) {
SystemLogger.error(`${samlObject.serviceName} service provider not found`);
SystemLogger.error({
msg: 'SAML service provider not found',
serviceName: samlObject.serviceName,
});
throw new Error('SAML Service Provider not found.');
}

await SAML.processRequest(req, res, service, samlObject);
} catch (err) {
// @ToDo: Ideally we should send some error message to the client, but there's no way to do it on a redirect right now.
SystemLogger.error(err);
SystemLogger.error({ err });

const url = Meteor.absoluteUrl('home');
res.writeHead(302, {
Expand Down
16 changes: 13 additions & 3 deletions apps/meteor/app/push/server/apn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,17 @@ export const sendAPN = ({

void apnConnection.send(note, userToken).then((response) => {
response.failed.forEach((failure) => {
logger.debug(`Got error code ${failure.status} for token ${userToken}`);
logger.debug({
msg: 'Got error code for APN token',
status: failure.status,
token: userToken,
});

if (['400', '410'].includes(String(failure.status))) {
logger.debug(`Removing token ${userToken}`);
logger.debug({
msg: 'Removing APN token',
token: userToken,
});
_removeToken({
apn: userToken,
});
Expand Down Expand Up @@ -105,7 +112,10 @@ export const initAPN = ({ options, absoluteUrl }: { options: RequiredField<PushO
}
} else {
// Warn about gateways we dont know about
logger.warn(`WARNING: Push APN unknown gateway "${options.apn.gateway}"`);
logger.warn({
msg: 'WARNING: Push APN unknown gateway',
gateway: options.apn.gateway,
});
}
} else if (options.production) {
if (/http:\/\/localhost/.test(absoluteUrl)) {
Expand Down
21 changes: 17 additions & 4 deletions apps/meteor/app/push/server/push.ts
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ class PushClass {
return;
}

logger.error({ msg: `Error sending push to gateway (${tries} try) ->`, err: response });
logger.error({ msg: 'Error sending push to gateway', tries, err: response });

if (tries <= 4) {
// [1, 2, 4, 8, 16] minutes (total 31)
Expand Down Expand Up @@ -368,7 +368,11 @@ class PushClass {
throw new Error('Push.send: option "text" not a string');
}

logger.debug(`send message "${notification.title}" to userId`, notification.userId);
logger.debug({
msg: 'send message to userId',
title: notification.title,
userId: notification.userId,
});

const query = {
userId: notification.userId,
Expand All @@ -389,7 +393,12 @@ class PushClass {
}

if (settings.get('Log_Level') === '2') {
logger.debug(`Sent message "${notification.title}" to ${countApn.length} ios apps ${countGcm.length} android apps`);
logger.debug({
msg: 'Sent message to apps',
title: notification.title,
iosApps: countApn.length,
androidApps: countGcm.length,
});

// Add some verbosity about the send result, making sure the developer
// understands what just happened.
Expand Down Expand Up @@ -489,7 +498,11 @@ class PushClass {
try {
await this.sendNotification(notification);
} catch (error: any) {
logger.debug(`Could not send notification to user "${notification.userId}", Error: ${error.message}`);
logger.debug({
msg: 'Could not send notification to user',
userId: notification.userId,
err: error,
});
logger.debug(error.stack);
}
}
Expand Down
1 change: 1 addition & 0 deletions apps/meteor/client/providers/MediaCallProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const MediaCallProvider = ({ children }: { children: ReactNode }) => {
onToggleWidget: undefined,
onEndCall: undefined,
peerInfo: undefined,
setOpenRoomId: undefined,
}),
[],
);
Expand Down
3 changes: 3 additions & 0 deletions apps/meteor/client/views/room/Room.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { isInviteSubscription } from '@rocket.chat/core-typings';
import { ContextualbarSkeleton } from '@rocket.chat/ui-client';
import { useSetting, useRoomToolbox, useUserId } from '@rocket.chat/ui-contexts';
import { useMediaCallOpenRoomTracker } from '@rocket.chat/ui-voip';
import type { ReactElement } from 'react';
import { createElement, lazy, memo, Suspense } from 'react';
import { FocusScope } from 'react-aria';
Expand Down Expand Up @@ -34,6 +35,8 @@ const Room = (): ReactElement => {
const roomLabel =
room.t === 'd' ? t('Conversation_with__roomName__', { roomName: room.name }) : t('Channel__roomName__', { roomName: room.name });

useMediaCallOpenRoomTracker(room._id);

if (subscription && isInviteSubscription(subscription)) {
return (
<FocusScope>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ describe('useUserMediaCallAction', () => {
onToggleWidget: undefined,
onEndCall: undefined,
peerInfo: undefined,
setOpenRoomId: undefined,
});

const { result } = renderHook(() => useUserMediaCallAction(fakeUser, mockRid), { wrapper: mockAppRoot().build() });
Expand Down Expand Up @@ -114,6 +115,7 @@ describe('useUserMediaCallAction', () => {
onToggleWidget: mockOnToggleWidget,
peerInfo: undefined,
onEndCall: () => undefined,
setOpenRoomId: () => undefined,
});

const { result } = renderHook(() => useUserMediaCallAction(fakeUser, mockRid));
Expand All @@ -133,6 +135,7 @@ describe('useUserMediaCallAction', () => {
onToggleWidget: jest.fn(),
peerInfo: undefined,
onEndCall: () => undefined,
setOpenRoomId: () => undefined,
});

const { result } = renderHook(() => useUserMediaCallAction(fakeUser, mockRid));
Expand Down
Loading
Loading