Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 3.7.1 #19189

Merged
merged 7 commits into from
Oct 9, 2020
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .docker/Dockerfile.rhel
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
FROM registry.access.redhat.com/rhscl/nodejs-8-rhel7

ENV RC_VERSION 3.7.0
ENV RC_VERSION 3.7.1

MAINTAINER buildmaster@rocket.chat

Expand Down
70 changes: 69 additions & 1 deletion .github/history.json
Original file line number Diff line number Diff line change
Expand Up @@ -50221,6 +50221,74 @@
"4.0"
],
"pull_requests": []
},
"3.7.1": {
"node_version": "12.18.4",
"npm_version": "6.14.8",
"apps_engine_version": "1.18.0",
"mongo_versions": [
"3.4",
"3.6",
"4.0"
],
"pull_requests": [
{
"pr": "19179",
"title": "[FIX] Adding missing custom fields translation in my account's profile",
"userLogin": "dougfabris",
"milestone": "3.7.1",
"contributors": [
"dougfabris"
]
},
{
"pr": "19181",
"title": "[FIX] Performance issues when using new Oplog implementation",
"userLogin": "rodrigok",
"description": "A missing configuration was not limiting the new oplog tailing to pool the database frequently even when no data was available, leading to both node and mongodb process been consuming high CPU even with low usage. This case was happening for installations using `mmapv1` database engine or when no admin access was granted to the database user, both preventing the usage of the new [Change Streams](https://docs.mongodb.com/manual/changeStreams/) implementation and fallbacking to our custom oplog implementation in replacement to the Meteor's one what was able to be disabled and use the native implementation via the environmental variable `USE_NATIVE_OPLOG=true`.",
"milestone": "3.7.1",
"contributors": [
"rodrigok",
"sampaiodiego"
]
},
{
"pr": "19101",
"title": "[FIX] Admin Sidebar overflowing",
"userLogin": "gabriellsh",
"milestone": "3.7.1",
"contributors": [
"gabriellsh"
]
},
{
"pr": "19133",
"title": "[FIX] VisitorAutoComplete component",
"userLogin": "renatobecker",
"milestone": "3.7.1",
"contributors": [
"renatobecker"
]
},
{
"pr": "19134",
"title": "[FIX] Omnichannel: triggers page not rendering.",
"userLogin": "gabriellsh",
"milestone": "3.7.1",
"contributors": [
"gabriellsh"
]
},
{
"pr": "19166",
"title": "[FIX] Missing \"Bio\" in user's profile view (#18821)",
"userLogin": "dougfabris",
"milestone": "3.7.1",
"contributors": [
"dougfabris"
]
}
]
}
}
}
}
2 changes: 1 addition & 1 deletion .snapcraft/resources/prepareRocketChat
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash

curl -SLf "https://releases.rocket.chat/3.7.0/download/" -o rocket.chat.tgz
curl -SLf "https://releases.rocket.chat/3.7.1/download/" -o rocket.chat.tgz

tar xf rocket.chat.tgz --strip 1

Expand Down
2 changes: 1 addition & 1 deletion .snapcraft/snap/snapcraft.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# 5. `snapcraft snap`

name: rocketchat-server
version: 3.7.0
version: 3.7.1
summary: Rocket.Chat server
description: Have your own Slack like online chat, built with Meteor. https://rocket.chat/
confinement: strict
Expand Down
111 changes: 66 additions & 45 deletions HISTORY.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,38 @@

# 3.7.1
`2020-10-09 · 6 🐛 · 5 👩‍💻👨‍💻`

### Engine versions
- Node: `12.18.4`
- NPM: `6.14.8`
- MongoDB: `3.4, 3.6, 4.0`
- Apps-Engine: `1.18.0`

### 🐛 Bug fixes


- Adding missing custom fields translation in my account's profile ([#19179](https://github.com/RocketChat/Rocket.Chat/pull/19179))

- Admin Sidebar overflowing ([#19101](https://github.com/RocketChat/Rocket.Chat/pull/19101))

- Missing "Bio" in user's profile view (#18821) ([#19166](https://github.com/RocketChat/Rocket.Chat/pull/19166))

- Omnichannel: triggers page not rendering. ([#19134](https://github.com/RocketChat/Rocket.Chat/pull/19134))

- Performance issues when using new Oplog implementation ([#19181](https://github.com/RocketChat/Rocket.Chat/pull/19181))

A missing configuration was not limiting the new oplog tailing to pool the database frequently even when no data was available, leading to both node and mongodb process been consuming high CPU even with low usage. This case was happening for installations using `mmapv1` database engine or when no admin access was granted to the database user, both preventing the usage of the new [Change Streams](https://docs.mongodb.com/manual/changeStreams/) implementation and fallbacking to our custom oplog implementation in replacement to the Meteor's one what was able to be disabled and use the native implementation via the environmental variable `USE_NATIVE_OPLOG=true`.

- VisitorAutoComplete component ([#19133](https://github.com/RocketChat/Rocket.Chat/pull/19133))

### 👩‍💻👨‍💻 Core Team 🤓

- [@dougfabris](https://github.com/dougfabris)
- [@gabriellsh](https://github.com/gabriellsh)
- [@renatobecker](https://github.com/renatobecker)
- [@rodrigok](https://github.com/rodrigok)
- [@sampaiodiego](https://github.com/sampaiodiego)

# 3.7.0
`2020-09-28 · 10 🎉 · 3 🚀 · 39 🐛 · 26 🔍 · 22 👩‍💻👨‍💻`

Expand Down Expand Up @@ -373,10 +407,8 @@

- **2FA:** Password enforcement setting and 2FA protection when saving settings or resetting E2E encryption ([#18640](https://github.com/RocketChat/Rocket.Chat/pull/18640))

- Increase the 2FA remembering time from 5min to 30min

- Add new setting to enforce 2FA password fallback (enabled only for new installations)

- Increase the 2FA remembering time from 5min to 30min
- Add new setting to enforce 2FA password fallback (enabled only for new installations)
- Require 2FA to save settings and reset E2E Encryption keys

- **Omnichannel:** Allow set other agent status via method `livechat:changeLivechatStatus ` ([#18571](https://github.com/RocketChat/Rocket.Chat/pull/18571))
Expand All @@ -394,7 +426,7 @@

- 2FA by Email setting showing for the user even when disabled by the admin ([#18473](https://github.com/RocketChat/Rocket.Chat/pull/18473))

The option to disable/enable the **Two-factor authentication via Email** at `Account > Security > Two Factor Authentication
The option to disable/enable the **Two-factor authentication via Email** at `Account > Security > Two Factor Authentication
` was visible even when the setting **Enable Two Factor Authentication via Email** at `Admin > Accounts > Two Factor Authentication` was disabled leading to misbehavior since the functionality was disabled.

- Agents enabledDepartment attribute not set on collection ([#18614](https://github.com/RocketChat/Rocket.Chat/pull/18614) by [@paulobernardoaf](https://github.com/paulobernardoaf))
Expand Down Expand Up @@ -744,16 +776,13 @@

- Mention autocomplete UI and performance improvements ([#18309](https://github.com/RocketChat/Rocket.Chat/pull/18309))

* New setting to configure the number of suggestions `Admin > Layout > User Interface > Number of users' autocomplete suggestions` (default 5)

* The UI shows whenever the user is not a member of the room

* The UI shows when the suggestion came from the last messages for quick selection/reply

* The suggestions follow this order:
* The user with the exact username and member of the room
* The user with the exact username but not a member of the room (if allowed to list non-members)
* The users containing the text in username, name or nickname and member of the room
* New setting to configure the number of suggestions `Admin > Layout > User Interface > Number of users' autocomplete suggestions` (default 5)
* The UI shows whenever the user is not a member of the room
* The UI shows when the suggestion came from the last messages for quick selection/reply
* The suggestions follow this order:
* The user with the exact username and member of the room
* The user with the exact username but not a member of the room (if allowed to list non-members)
* The users containing the text in username, name or nickname and member of the room
* The users containing the text in username, name or nickname and not a member of the room (if allowed to list non-members)

- Message action styles ([#18190](https://github.com/RocketChat/Rocket.Chat/pull/18190))
Expand Down Expand Up @@ -1095,10 +1124,10 @@

- Split NOTIFICATIONS_SCHEDULE_DELAY into three separate variables ([#17669](https://github.com/RocketChat/Rocket.Chat/pull/17669) by [@jazztickets](https://github.com/jazztickets))

Email notification delay can now be customized with the following environment variables:
NOTIFICATIONS_SCHEDULE_DELAY_ONLINE
NOTIFICATIONS_SCHEDULE_DELAY_AWAY
NOTIFICATIONS_SCHEDULE_DELAY_OFFLINE
Email notification delay can now be customized with the following environment variables:
NOTIFICATIONS_SCHEDULE_DELAY_ONLINE
NOTIFICATIONS_SCHEDULE_DELAY_AWAY
NOTIFICATIONS_SCHEDULE_DELAY_OFFLINE
Setting the value to -1 disable notifications for that type.

- Threads ([#17416](https://github.com/RocketChat/Rocket.Chat/pull/17416))
Expand Down Expand Up @@ -1498,11 +1527,11 @@

- **ENTERPRISE:** Omnichannel Last-Chatted Agent Preferred option ([#17666](https://github.com/RocketChat/Rocket.Chat/pull/17666))

If activated, this feature will store the last agent that assisted each Omnichannel visitor when a conversation is taken. So, when a visitor returns(it works with any entry point, Livechat, Facebook, REST API, and so on) and starts a new chat, the routing system checks:

1 - The visitor object for any stored agent that the visitor has previously talked to;
2 - If a previous agent is not found, the system will try to find a previous conversation of the same visitor. If a room is found, the system will get the previous agent from the room;

If activated, this feature will store the last agent that assisted each Omnichannel visitor when a conversation is taken. So, when a visitor returns(it works with any entry point, Livechat, Facebook, REST API, and so on) and starts a new chat, the routing system checks:
1 - The visitor object for any stored agent that the visitor has previously talked to;
2 - If a previous agent is not found, the system will try to find a previous conversation of the same visitor. If a room is found, the system will get the previous agent from the room;
After this process, if an agent has been found, the system will check the agent's availability to assist the new chat. If it's not available, then the routing system will get the next available agent in the queue.

- **ENTERPRISE:** Support for custom Livechat registration form fields ([#17581](https://github.com/RocketChat/Rocket.Chat/pull/17581))
Expand Down Expand Up @@ -1607,12 +1636,9 @@

- Notification sounds ([#17616](https://github.com/RocketChat/Rocket.Chat/pull/17616))

* Global CDN config was ignored when loading the sound files

* Upload of custom sounds wasn't getting the file extension correctly

* Some translations were missing

* Global CDN config was ignored when loading the sound files
* Upload of custom sounds wasn't getting the file extension correctly
* Some translations were missing
* Edit and delete of custom sounds were not working correctly

- Omnichannel departments are not saved when the offline channel name is not defined ([#17553](https://github.com/RocketChat/Rocket.Chat/pull/17553))
Expand Down Expand Up @@ -1900,19 +1926,14 @@

- Better Push and Email Notification logic ([#17357](https://github.com/RocketChat/Rocket.Chat/pull/17357))

We are still using the same logic to define which notifications every new message will generate, it takes some servers' settings, users's preferences and subscriptions' settings in consideration to determine who will receive each notification type (desktop, audio, email and mobile push), but now it doesn't check the user's status (online, away, offline) for email and mobile push notifications but send those notifications to a new queue with the following rules:


- When the user is online the notification is scheduled to be sent in 120 seconds

- When the user is away the notification is scheduled to be sent in 120 seconds minus the amount of time he is away

- When the user is offline the notification is scheduled to be sent right away

- When the user reads a channel all the notifications for that user are removed (clear queue)

- When a notification is processed to be sent to a user and there are other scheduled notifications:
- All the scheduled notifications for that user are rescheduled to now
We are still using the same logic to define which notifications every new message will generate, it takes some servers' settings, users's preferences and subscriptions' settings in consideration to determine who will receive each notification type (desktop, audio, email and mobile push), but now it doesn't check the user's status (online, away, offline) for email and mobile push notifications but send those notifications to a new queue with the following rules:

- When the user is online the notification is scheduled to be sent in 120 seconds
- When the user is away the notification is scheduled to be sent in 120 seconds minus the amount of time he is away
- When the user is offline the notification is scheduled to be sent right away
- When the user reads a channel all the notifications for that user are removed (clear queue)
- When a notification is processed to be sent to a user and there are other scheduled notifications:
- All the scheduled notifications for that user are rescheduled to now
- The current notification goes back to the queue to be processed ordered by creation date

- Buttons to check/uncheck all users and channels on import ([#17207](https://github.com/RocketChat/Rocket.Chat/pull/17207))
Expand Down Expand Up @@ -2275,7 +2296,7 @@

- Translation via MS translate ([#16363](https://github.com/RocketChat/Rocket.Chat/pull/16363) by [@mrsimpson](https://github.com/mrsimpson))

Adds Microsoft's translation service (https://translator.microsoft.com/) as a provider for translation of messages.
Adds Microsoft's translation service (https://translator.microsoft.com/) as a provider for translation of messages.
In addition to implementing the interface (similar to google and DeepL), a small change has been done in order to display the translation provider on the UI.

- Two Factor authentication via email ([#15949](https://github.com/RocketChat/Rocket.Chat/pull/15949))
Expand Down Expand Up @@ -13775,4 +13796,4 @@
- [@graywolf336](https://github.com/graywolf336)
- [@marceloschmidt](https://github.com/marceloschmidt)
- [@rodrigok](https://github.com/rodrigok)
- [@sampaiodiego](https://github.com/sampaiodiego)
- [@sampaiodiego](https://github.com/sampaiodiego)
Expand Down
1 change: 1 addition & 0 deletions app/lib/server/functions/getFullUserData.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const defaultFields = {
utcOffset: 1,
type: 1,
active: 1,
bio: 1,
reason: 1,
statusText: 1,
avatarETag: 1,
Expand Down
2 changes: 1 addition & 1 deletion app/models/server/models/_oplogHandle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ class OplogHandle {

this.stream = oplogCollection.find(oplogSelector, {
tailable: true,
// awaitData: true,
awaitData: true,
}).stream();

// Prevent warning about many listeners, we add 11
Expand Down
2 changes: 1 addition & 1 deletion app/utils/rocketchat.info
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"version": "3.7.0"
"version": "3.7.1"
}
6 changes: 5 additions & 1 deletion client/account/sidebarItems.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { HTML } from 'meteor/htmljs';

import { hasPermission } from '../../app/authorization/client';
import { createTemplateForComponent } from '../reactAdapters';
import { settings } from '../../app/settings';
import { createSidebarItems } from '../helpers/createSidebarItems';

createTemplateForComponent('accountFlex', () => import('./AccountSidebar'));
createTemplateForComponent('accountFlex', () => import('./AccountSidebar'), {
renderContainerView: () => HTML.DIV({ style: 'height: 100%; position: relative;' }), // eslint-disable-line new-cap
});

export const {
registerSidebarItem: registerAccountSidebarItem,
Expand Down
5 changes: 4 additions & 1 deletion client/admin/sidebarItems.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { HTML } from 'meteor/htmljs';
import { Meteor } from 'meteor/meteor';

import { hasPermission, hasRole } from '../../app/authorization/client';
import { createTemplateForComponent } from '../reactAdapters';
import { createSidebarItems } from '../helpers/createSidebarItems';

createTemplateForComponent('adminFlex', () => import('./sidebar/AdminSidebar'));
createTemplateForComponent('adminFlex', () => import('./sidebar/AdminSidebar'), {
renderContainerView: () => HTML.DIV({ style: 'height: 100%; position: relative;' }), // eslint-disable-line new-cap
});

export const {
registerSidebarItem: registerAdminSidebarItem,
Expand Down
4 changes: 2 additions & 2 deletions client/components/CustomFieldsForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const CustomTextInput = ({ name, required, minLength, maxLength, setState, state
}, [state, required, minLength, t]);

return useMemo(() => <Field className={className}>
<Field.Label>{name}</Field.Label>
<Field.Label>{t(name)}</Field.Label>
<Field.Row>
<TextInput name={name} error={verify} maxLength={maxLength} flexGrow={1} value={state} required={required} onChange={(e) => setState(e.currentTarget.value)}/>
</Field.Row>
Expand All @@ -30,7 +30,7 @@ const CustomSelect = ({ name, required, options, setState, state, className }) =
const verify = useMemo(() => (!state.length && required ? t('Field_required') : ''), [required, state.length, t]);

return useMemo(() => <Field className={className}>
<Field.Label>{name}</Field.Label>
<Field.Label>{t(name)}</Field.Label>
<Field.Row>
<Select name={name} error={verify} flexGrow={1} value={state} options={mappedOptions} required={required} onChange={(val) => setState(val)}/>
</Field.Row>
Expand Down
2 changes: 1 addition & 1 deletion client/components/basic/Sidebar.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { useTranslation } from '../../contexts/TranslationContext';
import { useRoutePath } from '../../contexts/RouterContext';
import { ActionButton } from './Buttons/ActionButton';

const Sidebar = ({ children, ...props }) => <Box display='flex' flexDirection='column' h='100vh' {...props}>
const Sidebar = ({ children, ...props }) => <Box display='flex' flexDirection='column' h='full' {...props}>
{children}
</Box>;

Expand Down
6 changes: 5 additions & 1 deletion client/omnichannel/routes.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { HTML } from 'meteor/htmljs';

import { createTemplateForComponent } from '../reactAdapters';
import { createRouteGroup } from '../helpers/createRouteGroup';

createTemplateForComponent('omnichannelFlex', () => import('./sidebar/OmnichannelSidebar'));
createTemplateForComponent('omnichannelFlex', () => import('./sidebar/OmnichannelSidebar'), {
renderContainerView: () => HTML.DIV({ style: 'height: 100%; position: relative;' }), // eslint-disable-line new-cap
});

export const registerOmnichannelRoute = createRouteGroup('omnichannel', '/omnichannel', () => import('./OmnichannelRouter'));

Expand Down
4 changes: 2 additions & 2 deletions client/omnichannel/triggers/TriggersTable.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Table, Callout, Icon } from '@rocket.chat/fuselage';
import { useMutableCallback, Button } from '@rocket.chat/fuselage-hooks';
import { Table, Callout, Icon, Button } from '@rocket.chat/fuselage';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import React, { useState, memo, useMemo } from 'react';

import GenericTable from '../../components/GenericTable';
Expand Down
2 changes: 1 addition & 1 deletion ee/client/audit/VisitorAutoComplete.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const query = (term = '') => ({ selector: JSON.stringify({ term }) });
const VisitorAutoComplete = React.memo((props) => {
const [filter, setFilter] = useState('');
const { data } = useEndpointDataExperimental('livechat/visitors.autocomplete', useMemo(() => query(filter), [filter]));
const options = useMemo(() => (data && data.items.map((user) => ({ value: user.username, label: user.name }))) || [], [data]);
const options = useMemo(() => (data && data.items.map((user) => ({ value: user._id, label: user.name }))) || [], [data]);
return <AutoComplete
{...props}
filter={filter}
Expand Down
8 changes: 8 additions & 0 deletions mongodb.aug.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'mongodb';

declare module 'mongodb' {
// eslint-disable-next-line @typescript-eslint/interface-name-prefix
export interface FindOneOptions<T> {
awaitData?: boolean;
}
}