-
{{_ "Backup_codes"}}
-
-
{{codesRemaining}}
-
{{_ "Regenerate_codes"}}
-
+
+
{{_ "Backup_codes"}}
+
+
{{codesRemaining}}
+
{{_ "Regenerate_codes"}}
-
+
{{/if}}
{{/if}}
diff --git a/packages/rocketchat-2fa/client/accountSecurity.js b/packages/rocketchat-2fa/client/accountSecurity.js
index 6b9c15d0ec9a..b99fb2fc3e49 100644
--- a/packages/rocketchat-2fa/client/accountSecurity.js
+++ b/packages/rocketchat-2fa/client/accountSecurity.js
@@ -1,3 +1,9 @@
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Template } from 'meteor/templating';
+import { modal } from 'meteor/rocketchat:ui';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { t } from 'meteor/rocketchat:utils';
import toastr from 'toastr';
import qrcode from 'yaqrcode';
diff --git a/packages/rocketchat-2fa/client/index.js b/packages/rocketchat-2fa/client/index.js
new file mode 100644
index 000000000000..c5b1485a073b
--- /dev/null
+++ b/packages/rocketchat-2fa/client/index.js
@@ -0,0 +1,3 @@
+import './accountSecurity.html';
+import './accountSecurity';
+import './TOTPPassword';
diff --git a/packages/rocketchat-2fa/package.js b/packages/rocketchat-2fa/package.js
index 4bc9d05c3687..71f3cf76599f 100644
--- a/packages/rocketchat-2fa/package.js
+++ b/packages/rocketchat-2fa/package.js
@@ -14,22 +14,10 @@ Package.onUse(function(api) {
'rocketchat:lib',
'sha',
'random',
+ 'rocketchat:ui',
+ 'rocketchat:utils',
]);
- api.addFiles('client/accountSecurity.html', 'client');
- api.addFiles('client/accountSecurity.js', 'client');
- api.addFiles('client/TOTPPassword.js', 'client');
-
- api.addFiles('server/lib/totp.js', 'server');
-
- api.addFiles('server/methods/checkCodesRemaining.js', 'server');
- api.addFiles('server/methods/disable.js', 'server');
- api.addFiles('server/methods/enable.js', 'server');
- api.addFiles('server/methods/regenerateCodes.js', 'server');
- api.addFiles('server/methods/validateTempToken.js', 'server');
-
- api.addFiles('server/models/users.js', 'server');
-
- api.addFiles('server/startup/settings.js', 'server');
- api.addFiles('server/loginHandler.js', 'server');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-2fa/server/index.js b/packages/rocketchat-2fa/server/index.js
new file mode 100644
index 000000000000..2f088d337986
--- /dev/null
+++ b/packages/rocketchat-2fa/server/index.js
@@ -0,0 +1,9 @@
+import './startup/settings';
+import './lib/totp';
+import './models/users';
+import './methods/checkCodesRemaining';
+import './methods/disable';
+import './methods/enable';
+import './methods/regenerateCodes';
+import './methods/validateTempToken';
+import './loginHandler';
diff --git a/packages/rocketchat-2fa/server/lib/totp.js b/packages/rocketchat-2fa/server/lib/totp.js
index f245d209f5d3..8d794d9ec359 100644
--- a/packages/rocketchat-2fa/server/lib/totp.js
+++ b/packages/rocketchat-2fa/server/lib/totp.js
@@ -1,3 +1,6 @@
+import { SHA256 } from 'meteor/sha';
+import { Random } from 'meteor/random';
+import { RocketChat } from 'meteor/rocketchat:lib';
import speakeasy from 'speakeasy';
RocketChat.TOTP = {
diff --git a/packages/rocketchat-2fa/server/loginHandler.js b/packages/rocketchat-2fa/server/loginHandler.js
index b0752ff46238..1060d218cb7a 100644
--- a/packages/rocketchat-2fa/server/loginHandler.js
+++ b/packages/rocketchat-2fa/server/loginHandler.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Accounts } from 'meteor/accounts-base';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Accounts.registerLoginHandler('totp', function(options) {
if (!options.totp || !options.totp.code) {
return;
diff --git a/packages/rocketchat-2fa/server/methods/checkCodesRemaining.js b/packages/rocketchat-2fa/server/methods/checkCodesRemaining.js
index 5deec43f7d19..63222c87da75 100644
--- a/packages/rocketchat-2fa/server/methods/checkCodesRemaining.js
+++ b/packages/rocketchat-2fa/server/methods/checkCodesRemaining.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+
Meteor.methods({
'2fa:checkCodesRemaining'() {
if (!Meteor.userId()) {
diff --git a/packages/rocketchat-2fa/server/methods/disable.js b/packages/rocketchat-2fa/server/methods/disable.js
index a47005cddb4b..ac68d9ddc5eb 100644
--- a/packages/rocketchat-2fa/server/methods/disable.js
+++ b/packages/rocketchat-2fa/server/methods/disable.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
'2fa:disable'(code) {
if (!Meteor.userId()) {
diff --git a/packages/rocketchat-2fa/server/methods/enable.js b/packages/rocketchat-2fa/server/methods/enable.js
index c655fead80ba..a2b984a4c1f1 100644
--- a/packages/rocketchat-2fa/server/methods/enable.js
+++ b/packages/rocketchat-2fa/server/methods/enable.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
'2fa:enable'() {
if (!Meteor.userId()) {
diff --git a/packages/rocketchat-2fa/server/methods/regenerateCodes.js b/packages/rocketchat-2fa/server/methods/regenerateCodes.js
index 379558db3cb1..750879b8c60b 100644
--- a/packages/rocketchat-2fa/server/methods/regenerateCodes.js
+++ b/packages/rocketchat-2fa/server/methods/regenerateCodes.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
'2fa:regenerateCodes'(userToken) {
if (!Meteor.userId()) {
diff --git a/packages/rocketchat-2fa/server/methods/validateTempToken.js b/packages/rocketchat-2fa/server/methods/validateTempToken.js
index 69fdc0470f2f..a224f7b88b03 100644
--- a/packages/rocketchat-2fa/server/methods/validateTempToken.js
+++ b/packages/rocketchat-2fa/server/methods/validateTempToken.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
'2fa:validateTempToken'(userToken) {
if (!Meteor.userId()) {
diff --git a/packages/rocketchat-2fa/server/models/users.js b/packages/rocketchat-2fa/server/models/users.js
index 21093c6a77fc..80190c9cc3a1 100644
--- a/packages/rocketchat-2fa/server/models/users.js
+++ b/packages/rocketchat-2fa/server/models/users.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.models.Users.disable2FAAndSetTempSecretByUserId = function(userId, tempToken) {
return this.update({
_id: userId,
diff --git a/packages/rocketchat-2fa/server/startup/settings.js b/packages/rocketchat-2fa/server/startup/settings.js
index a7a1fad77749..63d5c6e37b15 100644
--- a/packages/rocketchat-2fa/server/startup/settings.js
+++ b/packages/rocketchat-2fa/server/startup/settings.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.settings.addGroup('Accounts', function() {
this.section('Two Factor Authentication', function() {
this.add('Accounts_TwoFactorAuthentication_Enabled', true, {
diff --git a/packages/rocketchat-action-links/both/lib/actionLinks.js b/packages/rocketchat-action-links/both/lib/actionLinks.js
index 0927f319d24f..1ca27418a05a 100644
--- a/packages/rocketchat-action-links/both/lib/actionLinks.js
+++ b/packages/rocketchat-action-links/both/lib/actionLinks.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
// Action Links namespace creation.
RocketChat.actionLinks = {
actions: {},
diff --git a/packages/rocketchat-action-links/client/index.js b/packages/rocketchat-action-links/client/index.js
new file mode 100644
index 000000000000..940c2db77dcc
--- /dev/null
+++ b/packages/rocketchat-action-links/client/index.js
@@ -0,0 +1,3 @@
+import '../both/lib/actionLinks';
+import './lib/actionLinks';
+import './init';
diff --git a/packages/rocketchat-action-links/client/init.js b/packages/rocketchat-action-links/client/init.js
index 6ef0a25fc88f..67332f38482b 100644
--- a/packages/rocketchat-action-links/client/init.js
+++ b/packages/rocketchat-action-links/client/init.js
@@ -1,4 +1,8 @@
-/* globals fireGlobalEvent */
+import { Blaze } from 'meteor/blaze';
+import { Template } from 'meteor/templating';
+import { RocketChat, handleError } from 'meteor/rocketchat:lib';
+import { fireGlobalEvent } from 'meteor/rocketchat:ui';
+
Template.room.events({
'click .action-link'(event, instance) {
event.preventDefault();
diff --git a/packages/rocketchat-action-links/client/lib/actionLinks.js b/packages/rocketchat-action-links/client/lib/actionLinks.js
index 4b32d9cd5d58..fdda77593980 100644
--- a/packages/rocketchat-action-links/client/lib/actionLinks.js
+++ b/packages/rocketchat-action-links/client/lib/actionLinks.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat, handleError } from 'meteor/rocketchat:lib';
// Action Links Handler. This method will be called off the client.
RocketChat.actionLinks.run = (name, messageId, instance) => {
diff --git a/packages/rocketchat-action-links/package.js b/packages/rocketchat-action-links/package.js
index b1376bfc7488..87870adc7f60 100644
--- a/packages/rocketchat-action-links/package.js
+++ b/packages/rocketchat-action-links/package.js
@@ -6,18 +6,14 @@ Package.describe({
});
Package.onUse(function(api) {
- api.use('ecmascript');
- api.use('templating');
- api.use('rocketchat:lib');
- api.use('rocketchat:theme');
- api.use('rocketchat:ui');
-
- api.addFiles('both/lib/actionLinks.js');
-
- api.addFiles('client/lib/actionLinks.js', 'client');
- api.addFiles('client/init.js', 'client');
-
+ api.use([
+ 'ecmascript',
+ 'templating',
+ 'rocketchat:lib',
+ 'rocketchat:theme',
+ 'rocketchat:ui',
+ ]);
api.addFiles('client/stylesheets/actionLinks.css', 'client');
-
- api.addFiles('server/actionLinkHandler.js', 'server');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-action-links/server/actionLinkHandler.js b/packages/rocketchat-action-links/server/actionLinkHandler.js
index 6e9dc818df71..7fd102c29436 100644
--- a/packages/rocketchat-action-links/server/actionLinkHandler.js
+++ b/packages/rocketchat-action-links/server/actionLinkHandler.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
// Action Links Handler. This method will be called off the client.
Meteor.methods({
diff --git a/packages/rocketchat-action-links/server/index.js b/packages/rocketchat-action-links/server/index.js
new file mode 100644
index 000000000000..8db8549e10d7
--- /dev/null
+++ b/packages/rocketchat-action-links/server/index.js
@@ -0,0 +1,2 @@
+import '../both/lib/actionLinks';
+import './actionLinkHandler';
diff --git a/packages/rocketchat-analytics/client/index.js b/packages/rocketchat-analytics/client/index.js
new file mode 100644
index 000000000000..ec016dc3b595
--- /dev/null
+++ b/packages/rocketchat-analytics/client/index.js
@@ -0,0 +1,2 @@
+import './loadScript';
+import './trackEvents';
diff --git a/packages/rocketchat-analytics/client/loadScript.js b/packages/rocketchat-analytics/client/loadScript.js
index 53573177267c..19c7f95b8413 100644
--- a/packages/rocketchat-analytics/client/loadScript.js
+++ b/packages/rocketchat-analytics/client/loadScript.js
@@ -1,3 +1,8 @@
+import { Meteor } from 'meteor/meteor';
+import { Tracker } from 'meteor/tracker';
+import { Template } from 'meteor/templating';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Template.body.onRendered(() => {
Tracker.autorun((c) => {
const piwikUrl = RocketChat.settings.get('PiwikAnalytics_enabled') && RocketChat.settings.get('PiwikAnalytics_url');
diff --git a/packages/rocketchat-analytics/client/trackEvents.js b/packages/rocketchat-analytics/client/trackEvents.js
index 3252ca0c9dd8..ac44c92b1fbb 100644
--- a/packages/rocketchat-analytics/client/trackEvents.js
+++ b/packages/rocketchat-analytics/client/trackEvents.js
@@ -1,3 +1,9 @@
+import { Meteor } from 'meteor/meteor';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { ChatRoom } from 'meteor/rocketchat:ui';
+import { Tracker } from 'meteor/tracker';
+
function trackEvent(category, action, label) {
if (window._paq) {
window._paq.push(['trackEvent', category, action, label]);
@@ -97,7 +103,7 @@ if (!window._paq || window.ga) {
(() => {
let oldUserId = null;
- Meteor.autorun(() => {
+ Tracker.autorun(() => {
const newUserId = Meteor.userId();
if (oldUserId === null && newUserId) {
if (window._paq && RocketChat.settings.get('Analytics_features_users')) {
diff --git a/packages/rocketchat-analytics/package.js b/packages/rocketchat-analytics/package.js
index ae5fb384d1e4..3c5f1e62a65e 100644
--- a/packages/rocketchat-analytics/package.js
+++ b/packages/rocketchat-analytics/package.js
@@ -8,9 +8,16 @@ Package.describe({
// Note: Piwik respects Google Chrome's No Track: http://piwik.org/docs/privacy/#step-4-respect-donottrack-preference
Package.onUse(function(api) {
- api.use(['ecmascript', 'rocketchat:lib']);
- api.use(['templating', 'kadira:flow-router'], 'client');
+ api.use([
+ 'ecmascript',
+ 'rocketchat:lib',
+ 'tracker',
+ ]);
+ api.use([
+ 'templating',
+ 'kadira:flow-router',
+ ], 'client');
- api.addFiles(['client/loadScript.js', 'client/trackEvents.js'], 'client');
- api.addFiles(['server/settings.js'], 'server');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-analytics/server/index.js b/packages/rocketchat-analytics/server/index.js
new file mode 100644
index 000000000000..97097791afdc
--- /dev/null
+++ b/packages/rocketchat-analytics/server/index.js
@@ -0,0 +1 @@
+import './settings';
diff --git a/packages/rocketchat-analytics/server/settings.js b/packages/rocketchat-analytics/server/settings.js
index 009e4f77b48a..d37d2a561497 100644
--- a/packages/rocketchat-analytics/server/settings.js
+++ b/packages/rocketchat-analytics/server/settings.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.settings.addGroup('Analytics', function addSettings() {
this.section('Piwik', function() {
const enableQuery = { _id: 'PiwikAnalytics_enabled', value: true };
diff --git a/packages/rocketchat-api/package.js b/packages/rocketchat-api/package.js
index 7101ecc7bf10..12cdcb5e2473 100644
--- a/packages/rocketchat-api/package.js
+++ b/packages/rocketchat-api/package.js
@@ -8,45 +8,11 @@ Package.describe({
Package.onUse(function(api) {
api.use([
'ecmascript',
- 'rocketchat:lib',
'nimble:restivus',
+ 'rocketchat:lib',
+ 'rocketchat:integrations',
+ 'rocketchat:file-upload',
]);
- api.addFiles('server/api.js', 'server');
- api.addFiles('server/settings.js', 'server');
-
- // Register helpers
- api.addFiles('server/helpers/composeRoomWithLastMessage.js', 'server');
- api.addFiles('server/helpers/requestParams.js', 'server');
- api.addFiles('server/helpers/getPaginationItems.js', 'server');
- api.addFiles('server/helpers/getUserFromParams.js', 'server');
- api.addFiles('server/helpers/getUserInfo.js', 'server');
- api.addFiles('server/helpers/isUserFromParams.js', 'server');
- api.addFiles('server/helpers/parseJsonQuery.js', 'server');
- api.addFiles('server/helpers/deprecationWarning.js', 'server');
- api.addFiles('server/helpers/getLoggedInUser.js', 'server');
- api.addFiles('server/helpers/insertUserObject.js', 'server');
-
- // Add default routes
- api.addFiles('server/default/info.js', 'server');
-
- // Add v1 routes
- api.addFiles('server/v1/channels.js', 'server');
- api.addFiles('server/v1/roles.js', 'server');
- api.addFiles('server/v1/rooms.js', 'server');
- api.addFiles('server/v1/subscriptions.js', 'server');
- api.addFiles('server/v1/chat.js', 'server');
- api.addFiles('server/v1/commands.js', 'server');
- api.addFiles('server/v1/emoji-custom.js', 'server');
- api.addFiles('server/v1/groups.js', 'server');
- api.addFiles('server/v1/im.js', 'server');
- api.addFiles('server/v1/integrations.js', 'server');
- api.addFiles('server/v1/misc.js', 'server');
- api.addFiles('server/v1/permissions.js', 'server');
- api.addFiles('server/v1/push.js', 'server');
- api.addFiles('server/v1/settings.js', 'server');
- api.addFiles('server/v1/stats.js', 'server');
- api.addFiles('server/v1/users.js', 'server');
- api.addFiles('server/v1/assets.js', 'server');
- api.addFiles('server/v1/e2e.js', 'server');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-api/server/api.js b/packages/rocketchat-api/server/api.js
index 9a47a947d0b6..d28a95d95f49 100644
--- a/packages/rocketchat-api/server/api.js
+++ b/packages/rocketchat-api/server/api.js
@@ -1,5 +1,12 @@
-/* global Restivus, DDP, DDPCommon */
+import { Meteor } from 'meteor/meteor';
+import { DDPCommon } from 'meteor/ddp-common';
+import { DDP } from 'meteor/ddp';
+import { Accounts } from 'meteor/accounts-base';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { Restivus } from 'meteor/nimble:restivus';
+import { Logger } from 'meteor/rocketchat:logger';
import _ from 'underscore';
+
const logger = new Logger('API', {});
class API extends Restivus {
@@ -379,7 +386,7 @@ const defaultOptionsEndpoint = function _defaultOptionsEndpoint() {
if (RocketChat.settings.get('API_Enable_CORS') === true) {
this.response.writeHead(200, {
'Access-Control-Allow-Origin': RocketChat.settings.get('API_CORS_Origin'),
- 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept, X-User-Id, X-Auth-Token',
+ 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept, X-User-Id, X-Auth-Token, x-visitor-token',
});
} else {
this.response.writeHead(405);
diff --git a/packages/rocketchat-api/server/default/info.js b/packages/rocketchat-api/server/default/info.js
index 2e0957049efa..97b372dd42ad 100644
--- a/packages/rocketchat-api/server/default/info.js
+++ b/packages/rocketchat-api/server/default/info.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.default.addRoute('info', { authRequired: false }, {
get() {
const user = this.getLoggedInUser();
diff --git a/packages/rocketchat-api/server/helpers/composeRoomWithLastMessage.js b/packages/rocketchat-api/server/helpers/composeRoomWithLastMessage.js
index 34f38bb675a5..f9a8e3a702c8 100644
--- a/packages/rocketchat-api/server/helpers/composeRoomWithLastMessage.js
+++ b/packages/rocketchat-api/server/helpers/composeRoomWithLastMessage.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.helperMethods.set('composeRoomWithLastMessage', function _composeRoomWithLastMessage(room, userId) {
if (room.lastMessage) {
room.lastMessage = RocketChat.composeMessageObjectWithUser(room.lastMessage, userId);
diff --git a/packages/rocketchat-api/server/helpers/deprecationWarning.js b/packages/rocketchat-api/server/helpers/deprecationWarning.js
index 3f7052c3abbc..ad2cb11a5131 100644
--- a/packages/rocketchat-api/server/helpers/deprecationWarning.js
+++ b/packages/rocketchat-api/server/helpers/deprecationWarning.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.helperMethods.set('deprecationWarning', function _deprecationWarning({ endpoint, versionWillBeRemove, response }) {
const warningMessage = `The endpoint "${ endpoint }" is deprecated and will be removed after version ${ versionWillBeRemove }`;
console.warn(warningMessage);
diff --git a/packages/rocketchat-api/server/helpers/getLoggedInUser.js b/packages/rocketchat-api/server/helpers/getLoggedInUser.js
index 5126d2b67748..1ff50826b928 100644
--- a/packages/rocketchat-api/server/helpers/getLoggedInUser.js
+++ b/packages/rocketchat-api/server/helpers/getLoggedInUser.js
@@ -1,3 +1,6 @@
+import { Accounts } from 'meteor/accounts-base';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.helperMethods.set('getLoggedInUser', function _getLoggedInUser() {
let user;
diff --git a/packages/rocketchat-api/server/helpers/getPaginationItems.js b/packages/rocketchat-api/server/helpers/getPaginationItems.js
index a03e6b47dbde..f7d3cff75d1e 100644
--- a/packages/rocketchat-api/server/helpers/getPaginationItems.js
+++ b/packages/rocketchat-api/server/helpers/getPaginationItems.js
@@ -1,6 +1,7 @@
// If the count query param is higher than the "API_Upper_Count_Limit" setting, then we limit that
// If the count query param isn't defined, then we set it to the "API_Default_Count" setting
// If the count is zero, then that means unlimited and is only allowed if the setting "API_Allow_Infinite_Count" is true
+import { RocketChat } from 'meteor/rocketchat:lib';
RocketChat.API.helperMethods.set('getPaginationItems', function _getPaginationItems() {
const hardUpperLimit = RocketChat.settings.get('API_Upper_Count_Limit') <= 0 ? 100 : RocketChat.settings.get('API_Upper_Count_Limit');
diff --git a/packages/rocketchat-api/server/helpers/getUserFromParams.js b/packages/rocketchat-api/server/helpers/getUserFromParams.js
index b9e918b59439..54b884de6059 100644
--- a/packages/rocketchat-api/server/helpers/getUserFromParams.js
+++ b/packages/rocketchat-api/server/helpers/getUserFromParams.js
@@ -1,4 +1,7 @@
// Convenience method, almost need to turn it into a middleware of sorts
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.helperMethods.set('getUserFromParams', function _getUserFromParams() {
const doesntExist = { _doesntExist: true };
let user;
diff --git a/packages/rocketchat-api/server/helpers/getUserInfo.js b/packages/rocketchat-api/server/helpers/getUserInfo.js
index 64dee79284ab..c573a336ddd1 100644
--- a/packages/rocketchat-api/server/helpers/getUserInfo.js
+++ b/packages/rocketchat-api/server/helpers/getUserInfo.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
const getInfoFromUserObject = (user) => {
const {
_id,
diff --git a/packages/rocketchat-api/server/helpers/insertUserObject.js b/packages/rocketchat-api/server/helpers/insertUserObject.js
index 0011c292dcad..dfa6322099b9 100644
--- a/packages/rocketchat-api/server/helpers/insertUserObject.js
+++ b/packages/rocketchat-api/server/helpers/insertUserObject.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.helperMethods.set('insertUserObject', function _addUserToObject({ object, userId }) {
const user = RocketChat.models.Users.findOneById(userId);
object.user = { };
diff --git a/packages/rocketchat-api/server/helpers/isUserFromParams.js b/packages/rocketchat-api/server/helpers/isUserFromParams.js
index 194011d93d91..79f3b90f3aef 100644
--- a/packages/rocketchat-api/server/helpers/isUserFromParams.js
+++ b/packages/rocketchat-api/server/helpers/isUserFromParams.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.helperMethods.set('isUserFromParams', function _isUserFromParams() {
const params = this.requestParams();
diff --git a/packages/rocketchat-api/server/helpers/parseJsonQuery.js b/packages/rocketchat-api/server/helpers/parseJsonQuery.js
index 64b22724cdf8..6b9caf541987 100644
--- a/packages/rocketchat-api/server/helpers/parseJsonQuery.js
+++ b/packages/rocketchat-api/server/helpers/parseJsonQuery.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { EJSON } from 'meteor/ejson';
+
RocketChat.API.helperMethods.set('parseJsonQuery', function _parseJsonQuery() {
let sort;
if (this.queryParams.sort) {
@@ -47,7 +51,7 @@ RocketChat.API.helperMethods.set('parseJsonQuery', function _parseJsonQuery() {
let query = {};
if (this.queryParams.query) {
try {
- query = JSON.parse(this.queryParams.query);
+ query = EJSON.parse(this.queryParams.query);
} catch (e) {
this.logger.warn(`Invalid query parameter provided "${ this.queryParams.query }":`, e);
throw new Meteor.Error('error-invalid-query', `Invalid query parameter provided: "${ this.queryParams.query }"`, { helperMethod: 'parseJsonQuery' });
diff --git a/packages/rocketchat-api/server/helpers/requestParams.js b/packages/rocketchat-api/server/helpers/requestParams.js
index aa4290c00b6d..fe70278dd463 100644
--- a/packages/rocketchat-api/server/helpers/requestParams.js
+++ b/packages/rocketchat-api/server/helpers/requestParams.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.helperMethods.set('requestParams', function _requestParams() {
return ['POST', 'PUT'].includes(this.request.method) ? this.bodyParams : this.queryParams;
});
diff --git a/packages/rocketchat-api/server/index.js b/packages/rocketchat-api/server/index.js
new file mode 100644
index 000000000000..836012fb140e
--- /dev/null
+++ b/packages/rocketchat-api/server/index.js
@@ -0,0 +1,32 @@
+import './settings';
+import './api';
+import './helpers/composeRoomWithLastMessage';
+import './helpers/deprecationWarning';
+import './helpers/getLoggedInUser';
+import './helpers/getPaginationItems';
+import './helpers/getUserFromParams';
+import './helpers/getUserInfo';
+import './helpers/insertUserObject';
+import './helpers/isUserFromParams';
+import './helpers/parseJsonQuery';
+import './helpers/requestParams';
+import './default/info';
+import './v1/assets';
+import './v1/channels';
+import './v1/chat';
+import './v1/commands';
+import './v1/e2e';
+import './v1/emoji-custom';
+import './v1/groups';
+import './v1/im';
+import './v1/integrations';
+import './v1/import';
+import './v1/misc';
+import './v1/permissions';
+import './v1/push';
+import './v1/roles';
+import './v1/rooms';
+import './v1/settings';
+import './v1/stats';
+import './v1/subscriptions';
+import './v1/users';
diff --git a/packages/rocketchat-api/server/settings.js b/packages/rocketchat-api/server/settings.js
index 53f021f789c7..6b4c06e7a83a 100644
--- a/packages/rocketchat-api/server/settings.js
+++ b/packages/rocketchat-api/server/settings.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.settings.addGroup('General', function() {
this.section('REST API', function() {
this.add('API_Upper_Count_Limit', 100, { type: 'int', public: false });
diff --git a/packages/rocketchat-api/server/v1/assets.js b/packages/rocketchat-api/server/v1/assets.js
index 9a475fbe6b1b..774ee3c8d58f 100644
--- a/packages/rocketchat-api/server/v1/assets.js
+++ b/packages/rocketchat-api/server/v1/assets.js
@@ -1,4 +1,6 @@
+import { Meteor } from 'meteor/meteor';
import Busboy from 'busboy';
+import { RocketChat } from 'meteor/rocketchat:lib';
RocketChat.API.v1.addRoute('assets.setAsset', { authRequired: true }, {
post() {
diff --git a/packages/rocketchat-api/server/v1/channels.js b/packages/rocketchat-api/server/v1/channels.js
index 2a6416650b8c..6332e0ef840e 100644
--- a/packages/rocketchat-api/server/v1/channels.js
+++ b/packages/rocketchat-api/server/v1/channels.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
// Returns the channel IF found otherwise it will return the failure of why it didn't. Check the `statusCode` property
diff --git a/packages/rocketchat-api/server/v1/chat.js b/packages/rocketchat-api/server/v1/chat.js
index 1d3e8621cad5..f6f92ae02444 100644
--- a/packages/rocketchat-api/server/v1/chat.js
+++ b/packages/rocketchat-api/server/v1/chat.js
@@ -1,4 +1,7 @@
-/* global processWebhookMessage */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { Match, check } from 'meteor/check';
+import { processWebhookMessage } from 'meteor/rocketchat:integrations';
RocketChat.API.v1.addRoute('chat.delete', { authRequired: true }, {
post() {
@@ -18,7 +21,7 @@ RocketChat.API.v1.addRoute('chat.delete', { authRequired: true }, {
return RocketChat.API.v1.failure('The room id provided does not match where the message is from.');
}
- if (this.bodyParams.asUser && msg.u._id !== this.userId && !RocketChat.authz.hasPermission(Meteor.userId(), 'force-delete-message', msg.rid)) {
+ if (this.bodyParams.asUser && msg.u._id !== this.userId && !RocketChat.authz.hasPermission(this.userId, 'force-delete-message', msg.rid)) {
return RocketChat.API.v1.failure('Unauthorized. You must have the permission "force-delete-message" to delete other\'s message as them.');
}
@@ -339,3 +342,36 @@ RocketChat.API.v1.addRoute('chat.ignoreUser', { authRequired: true }, {
return RocketChat.API.v1.success();
},
});
+
+RocketChat.API.v1.addRoute('chat.getDeletedMessages', { authRequired: true }, {
+ get() {
+ const { roomId, since } = this.queryParams;
+ const { offset, count } = this.getPaginationItems();
+
+ if (!roomId) {
+ throw new Meteor.Error('The required "roomId" query param is missing.');
+ }
+
+ if (!since) {
+ throw new Meteor.Error('The required "since" query param is missing.');
+ } else if (isNaN(Date.parse(since))) {
+ throw new Meteor.Error('The "since" query parameter must be a valid date.');
+ }
+ const cursor = RocketChat.models.Messages.trashFindDeletedAfter(new Date(since), { rid: roomId }, {
+ skip: offset,
+ limit: count,
+ fields: { _id: 1 },
+ });
+
+ const total = cursor.count();
+
+ const messages = cursor.fetch();
+
+ return RocketChat.API.v1.success({
+ messages,
+ count: messages.length,
+ offset,
+ total,
+ });
+ },
+});
diff --git a/packages/rocketchat-api/server/v1/commands.js b/packages/rocketchat-api/server/v1/commands.js
index 2d4b8a4e0479..bfac0b17d5aa 100644
--- a/packages/rocketchat-api/server/v1/commands.js
+++ b/packages/rocketchat-api/server/v1/commands.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Random } from 'meteor/random';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.v1.addRoute('commands.get', { authRequired: true }, {
get() {
const params = this.queryParams;
diff --git a/packages/rocketchat-api/server/v1/e2e.js b/packages/rocketchat-api/server/v1/e2e.js
index eb180cb1283a..f21f55e6e294 100644
--- a/packages/rocketchat-api/server/v1/e2e.js
+++ b/packages/rocketchat-api/server/v1/e2e.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.v1.addRoute('e2e.fetchMyKeys', { authRequired: true }, {
get() {
let result;
diff --git a/packages/rocketchat-api/server/v1/emoji-custom.js b/packages/rocketchat-api/server/v1/emoji-custom.js
index de05c96412cd..65b9ea6fc8fd 100644
--- a/packages/rocketchat-api/server/v1/emoji-custom.js
+++ b/packages/rocketchat-api/server/v1/emoji-custom.js
@@ -1,6 +1,10 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.v1.addRoute('emoji-custom', { authRequired: true }, {
get() {
- const emojis = Meteor.call('listEmojiCustom');
+ const { query } = this.parseJsonQuery();
+ const emojis = Meteor.call('listEmojiCustom', query);
return RocketChat.API.v1.success({ emojis });
},
diff --git a/packages/rocketchat-api/server/v1/groups.js b/packages/rocketchat-api/server/v1/groups.js
index bfb6c67fc96b..fc5430c1f6ce 100644
--- a/packages/rocketchat-api/server/v1/groups.js
+++ b/packages/rocketchat-api/server/v1/groups.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
// Returns the private group subscription IF found otherwise it will return the failure of why it didn't. Check the `statusCode` property
@@ -149,10 +151,8 @@ RocketChat.API.v1.addRoute('groups.counters', { authRequired: true }, {
const lm = room.lm ? room.lm : room._updatedAt;
if (typeof subscription !== 'undefined' && subscription.open) {
- if (subscription.ls) {
- unreads = RocketChat.models.Messages.countVisibleByRoomIdBetweenTimestampsInclusive(subscription.rid, subscription.ls, lm);
- unreadsFrom = subscription.ls;
- }
+ unreads = RocketChat.models.Messages.countVisibleByRoomIdBetweenTimestampsInclusive(subscription.rid, (subscription.ls || subscription.ts), lm);
+ unreadsFrom = subscription.ls || subscription.ts;
userMentions = subscription.userMentions;
joined = true;
}
diff --git a/packages/rocketchat-api/server/v1/im.js b/packages/rocketchat-api/server/v1/im.js
index 35ad3849d9db..f560bed0449e 100644
--- a/packages/rocketchat-api/server/v1/im.js
+++ b/packages/rocketchat-api/server/v1/im.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
function findDirectMessageRoom(params, user) {
if ((!params.roomId || !params.roomId.trim()) && (!params.username || !params.username.trim())) {
throw new Meteor.Error('error-room-param-not-provided', 'Body param "roomId" or "username" is required');
diff --git a/packages/rocketchat-api/server/v1/import.js b/packages/rocketchat-api/server/v1/import.js
new file mode 100644
index 000000000000..da48c9b90433
--- /dev/null
+++ b/packages/rocketchat-api/server/v1/import.js
@@ -0,0 +1,42 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
+RocketChat.API.v1.addRoute('uploadImportFile', { authRequired: true }, {
+ post() {
+ const { binaryContent, contentType, fileName, importerKey } = this.bodyParams;
+
+ Meteor.runAsUser(this.userId, () => {
+ RocketChat.API.v1.success(Meteor.call('uploadImportFile', binaryContent, contentType, fileName, importerKey));
+ });
+
+ return RocketChat.API.v1.success();
+ },
+
+});
+
+RocketChat.API.v1.addRoute('downloadPublicImportFile', { authRequired: true }, {
+ post() {
+ const { fileUrl, importerKey } = this.bodyParams;
+
+ Meteor.runAsUser(this.userId, () => {
+ RocketChat.API.v1.success(Meteor.call('downloadPublicImportFile', fileUrl, importerKey));
+ });
+
+ return RocketChat.API.v1.success();
+ },
+
+});
+
+RocketChat.API.v1.addRoute('getImportFileData', { authRequired: true }, {
+ get() {
+ const { importerKey } = this.requestParams();
+ let result;
+ Meteor.runAsUser(this.userId, () => {
+ result = Meteor.call('getImportFileData', importerKey);
+ });
+
+ return RocketChat.API.v1.success(result);
+ },
+
+});
+
diff --git a/packages/rocketchat-api/server/v1/integrations.js b/packages/rocketchat-api/server/v1/integrations.js
index f0f6db93cfd7..8b47074daa6a 100644
--- a/packages/rocketchat-api/server/v1/integrations.js
+++ b/packages/rocketchat-api/server/v1/integrations.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match, check } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.v1.addRoute('integrations.create', { authRequired: true }, {
post() {
check(this.bodyParams, Match.ObjectIncluding({
diff --git a/packages/rocketchat-api/server/v1/misc.js b/packages/rocketchat-api/server/v1/misc.js
index d29c230b2d96..97efb021f569 100644
--- a/packages/rocketchat-api/server/v1/misc.js
+++ b/packages/rocketchat-api/server/v1/misc.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { check } from 'meteor/check';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { RocketChat } from 'meteor/rocketchat:lib';
RocketChat.API.v1.addRoute('info', { authRequired: false }, {
get() {
diff --git a/packages/rocketchat-api/server/v1/permissions.js b/packages/rocketchat-api/server/v1/permissions.js
index 1517a86b7b55..4bbe0707336b 100644
--- a/packages/rocketchat-api/server/v1/permissions.js
+++ b/packages/rocketchat-api/server/v1/permissions.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match, check } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
/**
This API returns all permissions that exists
on the server, with respective roles.
@@ -16,13 +20,46 @@ RocketChat.API.v1.addRoute('permissions', { authRequired: true }, {
},
});
+// DEPRECATED
+// TODO: Remove this after three versions have been released. That means at 0.85 this should be gone.
RocketChat.API.v1.addRoute('permissions.list', { authRequired: true }, {
get() {
const result = Meteor.runAsUser(this.userId, () => Meteor.call('permissions/get'));
- return RocketChat.API.v1.success({
- permissions: result,
- });
+ return RocketChat.API.v1.success(this.deprecationWarning({
+ endpoint: 'permissions.list',
+ versionWillBeRemove: '0.85',
+ response: {
+ permissions: result,
+ },
+ }));
+ },
+});
+
+RocketChat.API.v1.addRoute('permissions.listAll', { authRequired: true }, {
+ get() {
+ const { updatedSince } = this.queryParams;
+
+ let updatedSinceDate;
+ if (updatedSince) {
+ if (isNaN(Date.parse(updatedSince))) {
+ throw new Meteor.Error('error-roomId-param-invalid', 'The "updatedSince" query parameter must be a valid date.');
+ } else {
+ updatedSinceDate = new Date(updatedSince);
+ }
+ }
+
+ let result;
+ Meteor.runAsUser(this.userId, () => result = Meteor.call('permissions/get', updatedSinceDate));
+
+ if (Array.isArray(result)) {
+ result = {
+ update: result,
+ remove: [],
+ };
+ }
+
+ return RocketChat.API.v1.success(result);
},
});
diff --git a/packages/rocketchat-api/server/v1/push.js b/packages/rocketchat-api/server/v1/push.js
index c32be4663be2..50b46f79e62a 100644
--- a/packages/rocketchat-api/server/v1/push.js
+++ b/packages/rocketchat-api/server/v1/push.js
@@ -1,4 +1,7 @@
-/* globals Push */
+import { Meteor } from 'meteor/meteor';
+import { Random } from 'meteor/random';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { Push } from 'meteor/rocketchat:push';
RocketChat.API.v1.addRoute('push.token', { authRequired: true }, {
post() {
diff --git a/packages/rocketchat-api/server/v1/roles.js b/packages/rocketchat-api/server/v1/roles.js
index 1172ae7f1551..08addfb62d80 100644
--- a/packages/rocketchat-api/server/v1/roles.js
+++ b/packages/rocketchat-api/server/v1/roles.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match, check } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.v1.addRoute('roles.list', { authRequired: true }, {
get() {
const roles = RocketChat.models.Roles.find({}, { fields: { _updatedAt: 0 } }).fetch();
diff --git a/packages/rocketchat-api/server/v1/rooms.js b/packages/rocketchat-api/server/v1/rooms.js
index b758901385a3..b913fe18ea0e 100644
--- a/packages/rocketchat-api/server/v1/rooms.js
+++ b/packages/rocketchat-api/server/v1/rooms.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { FileUpload } from 'meteor/rocketchat:file-upload';
import Busboy from 'busboy';
function findRoomByIdOrName({ params, checkedArchived = true }) {
@@ -193,3 +196,24 @@ RocketChat.API.v1.addRoute('rooms.cleanHistory', { authRequired: true }, {
},
});
+RocketChat.API.v1.addRoute('rooms.info', { authRequired: true }, {
+ get() {
+ const room = findRoomByIdOrName({ params: this.requestParams() });
+ const { fields } = this.parseJsonQuery();
+ if (!Meteor.call('canAccessRoom', room._id, this.userId, {})) {
+ return RocketChat.API.v1.failure('not-allowed', 'Not Allowed');
+ }
+ return RocketChat.API.v1.success({ room: RocketChat.models.Rooms.findOneByIdOrName(room._id, { fields }) });
+ },
+});
+
+RocketChat.API.v1.addRoute('rooms.leave', { authRequired: true }, {
+ post() {
+ const room = findRoomByIdOrName({ params: this.bodyParams });
+ Meteor.runAsUser(this.userId, () => {
+ Meteor.call('leaveRoom', room._id);
+ });
+
+ return RocketChat.API.v1.success();
+ },
+});
diff --git a/packages/rocketchat-api/server/v1/settings.js b/packages/rocketchat-api/server/v1/settings.js
index 270b396b4a9f..3ed2a54e11e8 100644
--- a/packages/rocketchat-api/server/v1/settings.js
+++ b/packages/rocketchat-api/server/v1/settings.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match, check } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { ServiceConfiguration } from 'meteor/service-configuration';
import _ from 'underscore';
// settings endpoints
diff --git a/packages/rocketchat-api/server/v1/stats.js b/packages/rocketchat-api/server/v1/stats.js
index d9ec61b92e68..d21a1a66174c 100644
--- a/packages/rocketchat-api/server/v1/stats.js
+++ b/packages/rocketchat-api/server/v1/stats.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.v1.addRoute('statistics', { authRequired: true }, {
get() {
let refresh = false;
diff --git a/packages/rocketchat-api/server/v1/subscriptions.js b/packages/rocketchat-api/server/v1/subscriptions.js
index 65d425168af7..9f82c57cf90f 100644
--- a/packages/rocketchat-api/server/v1/subscriptions.js
+++ b/packages/rocketchat-api/server/v1/subscriptions.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { check } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.API.v1.addRoute('subscriptions.get', { authRequired: true }, {
get() {
const { updatedSince } = this.queryParams;
diff --git a/packages/rocketchat-api/server/v1/users.js b/packages/rocketchat-api/server/v1/users.js
index 35a11b8e4f0d..d571360e022a 100644
--- a/packages/rocketchat-api/server/v1/users.js
+++ b/packages/rocketchat-api/server/v1/users.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match, check } from 'meteor/check';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
import Busboy from 'busboy';
@@ -113,7 +117,8 @@ RocketChat.API.v1.addRoute('users.getPresence', { authRequired: true }, {
RocketChat.API.v1.addRoute('users.info', { authRequired: true }, {
get() {
const { username } = this.getUserFromParams();
-
+ const { fields } = this.parseJsonQuery();
+ let user = {};
let result;
Meteor.runAsUser(this.userId, () => {
result = Meteor.call('getFullUserData', { username, limit: 1 });
@@ -123,8 +128,24 @@ RocketChat.API.v1.addRoute('users.info', { authRequired: true }, {
return RocketChat.API.v1.failure(`Failed to get the user data for the userId of "${ username }".`);
}
+ user = result[0];
+ if (fields.userRooms === 1 && RocketChat.authz.hasPermission(this.userId, 'view-other-user-channels')) {
+ user.rooms = RocketChat.models.Subscriptions.findByUserId(user._id, {
+ fields: {
+ rid: 1,
+ name: 1,
+ t: 1,
+ roles: 1,
+ },
+ sort: {
+ t: 1,
+ name: 1,
+ },
+ }).fetch();
+ }
+
return RocketChat.API.v1.success({
- user: result[0],
+ user,
});
},
});
@@ -251,7 +272,8 @@ RocketChat.API.v1.addRoute('users.setAvatar', { authRequired: true }, {
if (!user) {
return callback(new Meteor.Error('error-invalid-user', 'The optional "userId" or "username" param provided does not match any users'));
}
- if (!RocketChat.authz.hasPermission(this.userId, 'edit-other-user-info')) {
+ const isAnotherUser = this.userId !== user._id;
+ if (isAnotherUser && !RocketChat.authz.hasPermission(this.userId, 'edit-other-user-info')) {
return callback(new Meteor.Error('error-not-allowed', 'Not allowed'));
}
}
@@ -400,7 +422,6 @@ RocketChat.API.v1.addRoute('users.setPreferences', { authRequired: true }, {
muteFocusedConversations: Match.Optional(Boolean),
}),
});
-
const userId = this.bodyParams.userId ? this.bodyParams.userId : this.userId;
const userData = {
_id: userId,
@@ -416,13 +437,23 @@ RocketChat.API.v1.addRoute('users.setPreferences', { authRequired: true }, {
}
Meteor.runAsUser(this.userId, () => RocketChat.saveUser(this.userId, userData));
+ const user = RocketChat.models.Users.findOneById(userId, {
+ fields: {
+ 'settings.preferences': 1,
+ language: 1,
+ },
+ });
return RocketChat.API.v1.success({
- user: RocketChat.models.Users.findOneById(userId, {
- fields: {
- 'settings.preferences': 1,
+ user: {
+ _id: user._id,
+ settings: {
+ preferences: {
+ ...user.settings.preferences,
+ language: user.language,
+ },
},
- }),
+ },
});
},
});
@@ -476,8 +507,8 @@ RocketChat.API.v1.addRoute('users.regeneratePersonalAccessToken', { authRequired
RocketChat.API.v1.addRoute('users.getPersonalAccessTokens', { authRequired: true }, {
get() {
- if (!RocketChat.settings.get('API_Enable_Personal_Access_Tokens')) {
- throw new Meteor.Error('error-personal-access-tokens-are-current-disabled', 'Personal Access Tokens are currently disabled');
+ if (!RocketChat.authz.hasPermission(this.userId, 'create-personal-access-tokens')) {
+ throw new Meteor.Error('not-authorized', 'Not Authorized');
}
const loginTokens = RocketChat.models.Users.getLoginTokensByUserId(this.userId).fetch()[0];
const getPersonalAccessTokens = () => loginTokens.services.resume.loginTokens
diff --git a/packages/rocketchat-apps/client/admin/appInstall.js b/packages/rocketchat-apps/client/admin/appInstall.js
index 498410a3de3c..f5e15623ef51 100644
--- a/packages/rocketchat-apps/client/admin/appInstall.js
+++ b/packages/rocketchat-apps/client/admin/appInstall.js
@@ -7,6 +7,9 @@
// if you're developing it and using a rest api with a particular parameter passed
// then it will be enabled by default for development reasons. The server prefers a url
// over the passed in body, so if both are found it will only use the url.
+import { ReactiveVar } from 'meteor/reactive-var';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { Template } from 'meteor/templating';
Template.appInstall.helpers({
appFile() {
diff --git a/packages/rocketchat-apps/client/admin/appLogs.html b/packages/rocketchat-apps/client/admin/appLogs.html
index 431f9a85eef2..a41ac81412e7 100644
--- a/packages/rocketchat-apps/client/admin/appLogs.html
+++ b/packages/rocketchat-apps/client/admin/appLogs.html
@@ -18,7 +18,7 @@
{{/if}}
-
+
{{#if isReady}}
{{#each log in logs}}
diff --git a/packages/rocketchat-apps/client/admin/appLogs.js b/packages/rocketchat-apps/client/admin/appLogs.js
index 611edd82d013..865bf4dcbfab 100644
--- a/packages/rocketchat-apps/client/admin/appLogs.js
+++ b/packages/rocketchat-apps/client/admin/appLogs.js
@@ -1,3 +1,7 @@
+import { ReactiveVar } from 'meteor/reactive-var';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { Template } from 'meteor/templating';
+import { TAPi18n } from 'meteor/tap:i18n';
import moment from 'moment';
import hljs from 'highlight.js';
diff --git a/packages/rocketchat-apps/client/admin/appManage.html b/packages/rocketchat-apps/client/admin/appManage.html
index 292a0d740d43..c4cd79c91e4f 100644
--- a/packages/rocketchat-apps/client/admin/appManage.html
+++ b/packages/rocketchat-apps/client/admin/appManage.html
@@ -275,8 +275,8 @@
{{_ "Settings"}}
{{> CodeMirror name=id options=getEditorOptions code=value }}
- Full Screen
- Exit Full Screen
+ {{_ "Full_Screen"}}
+ {{_ "Exit_Full_Screen"}}
{{/if}}
diff --git a/packages/rocketchat-apps/client/admin/appManage.js b/packages/rocketchat-apps/client/admin/appManage.js
index 70d984839576..f47ec13b217f 100644
--- a/packages/rocketchat-apps/client/admin/appManage.js
+++ b/packages/rocketchat-apps/client/admin/appManage.js
@@ -1,3 +1,9 @@
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { Template } from 'meteor/templating';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { TAPi18next } from 'meteor/tap:i18n';
import _ from 'underscore';
import s from 'underscore.string';
import toastr from 'toastr';
diff --git a/packages/rocketchat-apps/client/admin/appWhatIsIt.js b/packages/rocketchat-apps/client/admin/appWhatIsIt.js
index 969f21b1f5ec..5da60b4b05b9 100644
--- a/packages/rocketchat-apps/client/admin/appWhatIsIt.js
+++ b/packages/rocketchat-apps/client/admin/appWhatIsIt.js
@@ -1,3 +1,8 @@
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { Template } from 'meteor/templating';
+
Template.appWhatIsIt.onCreated(function() {
this.isLoading = new ReactiveVar(false);
this.hasError = new ReactiveVar(false);
diff --git a/packages/rocketchat-apps/client/admin/apps.js b/packages/rocketchat-apps/client/admin/apps.js
index 5def7c5e4bdd..a12d2a77db9d 100644
--- a/packages/rocketchat-apps/client/admin/apps.js
+++ b/packages/rocketchat-apps/client/admin/apps.js
@@ -1,6 +1,10 @@
import toastr from 'toastr';
-
+import { ReactiveVar } from 'meteor/reactive-var';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { Template } from 'meteor/templating';
+import { t } from 'meteor/rocketchat:utils';
import { AppEvents } from '../communication';
+
const ENABLED_STATUS = ['auto_enabled', 'manually_enabled'];
const HOST = 'https://marketplace.rocket.chat';
const enabled = ({ status }) => ENABLED_STATUS.includes(status);
diff --git a/packages/rocketchat-apps/client/communication/websockets.js b/packages/rocketchat-apps/client/communication/websockets.js
index 3152d0d5b261..a43c8312c62a 100644
--- a/packages/rocketchat-apps/client/communication/websockets.js
+++ b/packages/rocketchat-apps/client/communication/websockets.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+
export const AppEvents = Object.freeze({
APP_ADDED: 'app/added',
APP_REMOVED: 'app/removed',
diff --git a/packages/rocketchat-apps/client/orchestrator.js b/packages/rocketchat-apps/client/orchestrator.js
index 07e01d02068f..fb85e8da85a6 100644
--- a/packages/rocketchat-apps/client/orchestrator.js
+++ b/packages/rocketchat-apps/client/orchestrator.js
@@ -1,5 +1,9 @@
+import { Meteor } from 'meteor/meteor';
import { AppWebsocketReceiver } from './communication';
import { Utilities } from '../lib/misc/Utilities';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { BlazeLayout } from 'meteor/kadira:blaze-layout';
+import { TAPi18next } from 'meteor/tap:i18n';
class AppClientOrchestrator {
constructor() {
diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js
index 434209f02327..82f2f351214c 100644
--- a/packages/rocketchat-apps/package.js
+++ b/packages/rocketchat-apps/package.js
@@ -8,10 +8,11 @@ Package.onUse(function(api) {
'ecmascript',
'rocketchat:lib',
'rocketchat:api',
+ 'rocketchat:utils',
'templating',
]);
- api.use(['reactive-var', 'kadira:flow-router', 'underscore'], 'client');
+ api.use(['reactive-var', 'kadira:flow-router', 'kadira:blaze-layout', 'underscore'], 'client');
api.addFiles('lib/Apps.js', ['client', 'server']);
diff --git a/packages/rocketchat-apps/server/bridges/api.js b/packages/rocketchat-apps/server/bridges/api.js
index 2d275cd4a9d1..346e574ee586 100644
--- a/packages/rocketchat-apps/server/bridges/api.js
+++ b/packages/rocketchat-apps/server/bridges/api.js
@@ -1,3 +1,4 @@
+import { Meteor } from 'meteor/meteor';
import express from 'express';
import { WebApp } from 'meteor/webapp';
diff --git a/packages/rocketchat-apps/server/bridges/commands.js b/packages/rocketchat-apps/server/bridges/commands.js
index 381179dfd6ec..cc59dea68346 100644
--- a/packages/rocketchat-apps/server/bridges/commands.js
+++ b/packages/rocketchat-apps/server/bridges/commands.js
@@ -1,3 +1,4 @@
+import { Meteor } from 'meteor/meteor';
import { SlashCommandContext } from '@rocket.chat/apps-engine/definition/slashcommands';
import { Utilities } from '../../lib/misc/Utilities';
diff --git a/packages/rocketchat-apps/server/bridges/environmental.js b/packages/rocketchat-apps/server/bridges/environmental.js
index 2cf4a47715be..57b28437c532 100644
--- a/packages/rocketchat-apps/server/bridges/environmental.js
+++ b/packages/rocketchat-apps/server/bridges/environmental.js
@@ -7,11 +7,11 @@ export class AppEnvironmentalVariableBridge {
async getValueByName(envVarName, appId) {
console.log(`The App ${ appId } is getting the environmental variable value ${ envVarName }.`);
- if (this.isReadable(envVarName, appId)) {
- return process.env[envVarName];
+ if (!(await this.isReadable(envVarName, appId))) {
+ throw new Error(`The environmental variable "${ envVarName }" is not readable.`);
}
- throw new Error(`The environmental variable "${ envVarName }" is not readable.`);
+ return process.env[envVarName];
}
async isReadable(envVarName, appId) {
@@ -23,10 +23,10 @@ export class AppEnvironmentalVariableBridge {
async isSet(envVarName, appId) {
console.log(`The App ${ appId } is checking if the environmental variable is set ${ envVarName }.`);
- if (this.isReadable(envVarName, appId)) {
- return typeof process.env[envVarName] !== 'undefined';
+ if (!(await this.isReadable(envVarName, appId))) {
+ throw new Error(`The environmental variable "${ envVarName }" is not readable.`);
}
- throw new Error(`The environmental variable "${ envVarName }" is not readable.`);
+ return typeof process.env[envVarName] !== 'undefined';
}
}
diff --git a/packages/rocketchat-apps/server/bridges/http.js b/packages/rocketchat-apps/server/bridges/http.js
index 4d32f265950d..dcb51ec6ce9c 100644
--- a/packages/rocketchat-apps/server/bridges/http.js
+++ b/packages/rocketchat-apps/server/bridges/http.js
@@ -1,3 +1,5 @@
+import { HTTP } from 'meteor/http';
+
export class AppHttpBridge {
async call(info) {
if (!info.request.content && typeof info.request.data === 'object') {
diff --git a/packages/rocketchat-apps/server/bridges/messages.js b/packages/rocketchat-apps/server/bridges/messages.js
index 82ad9c58ae4b..de3b0a89d9ca 100644
--- a/packages/rocketchat-apps/server/bridges/messages.js
+++ b/packages/rocketchat-apps/server/bridges/messages.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { Random } from 'meteor/random';
+
export class AppMessageBridge {
constructor(orch) {
this.orch = orch;
diff --git a/packages/rocketchat-apps/server/bridges/persistence.js b/packages/rocketchat-apps/server/bridges/persistence.js
index e65fd609a6e2..9119807a708d 100644
--- a/packages/rocketchat-apps/server/bridges/persistence.js
+++ b/packages/rocketchat-apps/server/bridges/persistence.js
@@ -92,4 +92,19 @@ export class AppPersistenceBridge {
throw new Error('Not implemented.');
}
+
+ async updateByAssociation(association, data, upsert, appId) {
+ console.log(`The App ${ appId } is updating the record with association to data as follows:`, association, data);
+
+ if (typeof data !== 'object') {
+ throw new Error('Attempted to store an invalid data type, it must be an object.');
+ }
+
+ const query = {
+ appId,
+ associations: association,
+ };
+
+ return this.orch.getPersistenceModel().upsert(query, { $set: { data } }, { upsert });
+ }
}
diff --git a/packages/rocketchat-apps/server/bridges/rooms.js b/packages/rocketchat-apps/server/bridges/rooms.js
index 873e279dc5ba..9ae44a587200 100644
--- a/packages/rocketchat-apps/server/bridges/rooms.js
+++ b/packages/rocketchat-apps/server/bridges/rooms.js
@@ -1,3 +1,4 @@
+import { Meteor } from 'meteor/meteor';
import { RoomType } from '@rocket.chat/apps-engine/definition/rooms';
export class AppRoomBridge {
@@ -18,8 +19,11 @@ export class AppRoomBridge {
case RoomType.PRIVATE_GROUP:
method = 'createPrivateGroup';
break;
+ case RoomType.DIRECT_MESSAGE:
+ method = 'createDirectMessage';
+ break;
default:
- throw new Error('Only channels and private groups can be created.');
+ throw new Error('Only channels, private groups and direct messages can be created.');
}
let rid;
@@ -29,7 +33,13 @@ export class AppRoomBridge {
delete extraData.t;
delete extraData.ro;
delete extraData.customFields;
- const info = Meteor.call(method, rcRoom.name, members, rcRoom.ro, rcRoom.customFields, extraData);
+ let info;
+ if (room.type === RoomType.DIRECT_MESSAGE) {
+ members.splice(members.indexOf(room.creator.username), 1);
+ info = Meteor.call(method, members[0]);
+ } else {
+ info = Meteor.call(method, rcRoom.name, members, rcRoom.ro, rcRoom.customFields, extraData);
+ }
rid = info.rid;
});
@@ -72,6 +82,21 @@ export class AppRoomBridge {
return this.orch.getConverters().get('users').convertById(room.u._id);
}
+ async getMembers(roomId, appId) {
+ console.log(`The App ${ appId } is getting the room's members by room id: "${ roomId }"`);
+ const subscriptions = await RocketChat.models.Subscriptions.findByRoomId(roomId);
+ return subscriptions.map((sub) => this.orch.getConverters().get('users').convertById(sub.u && sub.u._id));
+ }
+
+ async getDirectByUsernames(usernames, appId) {
+ console.log(`The App ${ appId } is getting direct room by usernames: "${ usernames }"`);
+ const room = await RocketChat.models.Rooms.findDirectRoomContainingAllUsernames(usernames);
+ if (!room) {
+ return undefined;
+ }
+ return this.orch.getConverters().get('rooms').convertRoom(room);
+ }
+
async update(room, members = [], appId) {
console.log(`The App ${ appId } is updating a room.`);
diff --git a/packages/rocketchat-apps/server/communication/methods.js b/packages/rocketchat-apps/server/communication/methods.js
index ae32a126bb50..1f67d6e77d79 100644
--- a/packages/rocketchat-apps/server/communication/methods.js
+++ b/packages/rocketchat-apps/server/communication/methods.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+
const waitToLoad = function(orch) {
return new Promise((resolve) => {
let id = setInterval(() => {
diff --git a/packages/rocketchat-apps/server/communication/rest.js b/packages/rocketchat-apps/server/communication/rest.js
index 2c0d4deb1c51..68d30c1bf470 100644
--- a/packages/rocketchat-apps/server/communication/rest.js
+++ b/packages/rocketchat-apps/server/communication/rest.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { HTTP } from 'meteor/http';
import Busboy from 'busboy';
export class AppsRestApi {
diff --git a/packages/rocketchat-apps/server/communication/websockets.js b/packages/rocketchat-apps/server/communication/websockets.js
index 436012d1e0fd..94b9c22765a7 100644
--- a/packages/rocketchat-apps/server/communication/websockets.js
+++ b/packages/rocketchat-apps/server/communication/websockets.js
@@ -1,3 +1,4 @@
+import { Meteor } from 'meteor/meteor';
import { AppStatus, AppStatusUtils } from '@rocket.chat/apps-engine/definition/AppStatus';
export const AppEvents = Object.freeze({
diff --git a/packages/rocketchat-apps/server/converters/messages.js b/packages/rocketchat-apps/server/converters/messages.js
index e1bbc5a9b88c..d53cc5d297bb 100644
--- a/packages/rocketchat-apps/server/converters/messages.js
+++ b/packages/rocketchat-apps/server/converters/messages.js
@@ -1,3 +1,5 @@
+import { Random } from 'meteor/random';
+
export class AppMessagesConverter {
constructor(orch) {
this.orch = orch;
diff --git a/packages/rocketchat-apps/server/orchestrator.js b/packages/rocketchat-apps/server/orchestrator.js
index 840bc775bab9..b8dd4e494cf9 100644
--- a/packages/rocketchat-apps/server/orchestrator.js
+++ b/packages/rocketchat-apps/server/orchestrator.js
@@ -1,3 +1,4 @@
+import { Meteor } from 'meteor/meteor';
import { RealAppBridges } from './bridges';
import { AppMethods, AppsRestApi, AppServerNotifier } from './communication';
import { AppMessagesConverter, AppRoomsConverter, AppSettingsConverter, AppUsersConverter } from './converters';
diff --git a/packages/rocketchat-assets/package.js b/packages/rocketchat-assets/package.js
index be683753e1d7..79b76ed1c1c8 100644
--- a/packages/rocketchat-assets/package.js
+++ b/packages/rocketchat-assets/package.js
@@ -14,5 +14,5 @@ Package.onUse(function(api) {
'webapp-hashing',
]);
- api.addFiles('server/assets.js', 'server');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-assets/server/assets.js b/packages/rocketchat-assets/server/assets.js
index 7d48f7b7ebe9..7f41d6624b2d 100644
--- a/packages/rocketchat-assets/server/assets.js
+++ b/packages/rocketchat-assets/server/assets.js
@@ -1,6 +1,10 @@
-/* global WebAppHashing, WebAppInternals */
+import { Meteor } from 'meteor/meteor';
+import { WebApp } from 'meteor/webapp';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RocketChatFile } from 'meteor/rocketchat:file';
+import { WebAppHashing } from 'meteor/webapp-hashing';
+import { WebAppInternals } from 'meteor/webapp';
import _ from 'underscore';
-
import sizeOf from 'image-size';
import mime from 'mime-type/with-db';
import crypto from 'crypto';
@@ -390,8 +394,6 @@ WebAppHashing.calculateClientHash = function(manifest, includeFilter, runtimeCon
size: value.cache.size,
hash: value.cache.hash,
};
- WebAppInternals.staticFiles[`/__cordova/assets/${ key }`] = value.cache;
- WebAppInternals.staticFiles[`/__cordova/assets/${ key }.${ value.cache.extension }`] = value.cache;
} else {
const extension = value.defaultUrl.split('.').pop();
cache = {
@@ -403,9 +405,6 @@ WebAppHashing.calculateClientHash = function(manifest, includeFilter, runtimeCon
url: `/assets/${ key }.${ extension }?v3`,
hash: 'v3',
};
-
- WebAppInternals.staticFiles[`/__cordova/assets/${ key }`] = WebAppInternals.staticFiles[`/__cordova/${ value.defaultUrl }`];
- WebAppInternals.staticFiles[`/__cordova/assets/${ key }.${ extension }`] = WebAppInternals.staticFiles[`/__cordova/${ value.defaultUrl }`];
}
const manifestItem = _.findWhere(manifest, {
diff --git a/packages/rocketchat-assets/server/index.js b/packages/rocketchat-assets/server/index.js
new file mode 100644
index 000000000000..5b8e85c9ffd4
--- /dev/null
+++ b/packages/rocketchat-assets/server/index.js
@@ -0,0 +1 @@
+import './assets';
diff --git a/packages/rocketchat-authorization/client/hasPermission.js b/packages/rocketchat-authorization/client/hasPermission.js
index 134a014e34a4..ca714683ff6e 100644
--- a/packages/rocketchat-authorization/client/hasPermission.js
+++ b/packages/rocketchat-authorization/client/hasPermission.js
@@ -1,4 +1,7 @@
-/* globals ChatPermissions */
+import { Meteor } from 'meteor/meteor';
+import { Template } from 'meteor/templating';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { ChatPermissions } from './lib/ChatPermissions';
function atLeastOne(permissions = [], scope) {
return permissions.some((permissionId) => {
@@ -52,7 +55,8 @@ RocketChat.authz.hasAllPermission = function(permissions, scope) {
return hasPermission(permissions, scope, all);
};
+RocketChat.authz.hasPermission = RocketChat.authz.hasAllPermission;
+
RocketChat.authz.hasAtLeastOnePermission = function(permissions, scope) {
return hasPermission(permissions, scope, atLeastOne);
};
-
diff --git a/packages/rocketchat-authorization/client/hasRole.js b/packages/rocketchat-authorization/client/hasRole.js
index 858662b46c68..60a3b0e56800 100644
--- a/packages/rocketchat-authorization/client/hasRole.js
+++ b/packages/rocketchat-authorization/client/hasRole.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.authz.hasRole = function(userId, roleNames, scope) {
roleNames = [].concat(roleNames);
return RocketChat.models.Roles.isUserInRoles(userId, roleNames, scope);
diff --git a/packages/rocketchat-authorization/client/index.js b/packages/rocketchat-authorization/client/index.js
new file mode 100644
index 000000000000..c48b4ca7d074
--- /dev/null
+++ b/packages/rocketchat-authorization/client/index.js
@@ -0,0 +1,14 @@
+import '../lib/rocketchat';
+import './lib/models/Roles';
+import './lib/models/Users';
+import './lib/models/Subscriptions';
+import './hasPermission';
+import './hasRole';
+import './usersNameChanged';
+import './requiresPermission.html';
+import './route';
+import './startup';
+import './views/permissions.html';
+import './views/permissions';
+import './views/permissionsRole.html';
+import './views/permissionsRole';
diff --git a/packages/rocketchat-authorization/client/lib/ChatPermissions.js b/packages/rocketchat-authorization/client/lib/ChatPermissions.js
index 9812e4de42b5..7c6c0dbd41e2 100644
--- a/packages/rocketchat-authorization/client/lib/ChatPermissions.js
+++ b/packages/rocketchat-authorization/client/lib/ChatPermissions.js
@@ -1,6 +1,8 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.authz.cachedCollection = new RocketChat.CachedCollection({
name: 'permissions',
eventType: 'onLogged',
});
-this.ChatPermissions = RocketChat.authz.cachedCollection.collection;
+export const ChatPermissions = RocketChat.authz.cachedCollection.collection;
diff --git a/packages/rocketchat-authorization/client/lib/models/Roles.js b/packages/rocketchat-authorization/client/lib/models/Roles.js
index f00332c0aba9..e98dd63d5aeb 100644
--- a/packages/rocketchat-authorization/client/lib/models/Roles.js
+++ b/packages/rocketchat-authorization/client/lib/models/Roles.js
@@ -1,3 +1,6 @@
+import { Mongo } from 'meteor/mongo';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.models.Roles = new Mongo.Collection('rocketchat_roles');
Object.assign(RocketChat.models.Roles, {
diff --git a/packages/rocketchat-authorization/client/lib/models/Subscriptions.js b/packages/rocketchat-authorization/client/lib/models/Subscriptions.js
index 3ed954b0fff7..341bf0a33ac7 100644
--- a/packages/rocketchat-authorization/client/lib/models/Subscriptions.js
+++ b/packages/rocketchat-authorization/client/lib/models/Subscriptions.js
@@ -1,3 +1,4 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
if (_.isUndefined(RocketChat.models.Subscriptions)) {
diff --git a/packages/rocketchat-authorization/client/lib/models/Users.js b/packages/rocketchat-authorization/client/lib/models/Users.js
index 56a7adbc6697..632ec2e93e71 100644
--- a/packages/rocketchat-authorization/client/lib/models/Users.js
+++ b/packages/rocketchat-authorization/client/lib/models/Users.js
@@ -1,3 +1,4 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
if (_.isUndefined(RocketChat.models.Users)) {
diff --git a/packages/rocketchat-authorization/client/route.js b/packages/rocketchat-authorization/client/route.js
index f4fa37fe0195..8e9805ac1583 100644
--- a/packages/rocketchat-authorization/client/route.js
+++ b/packages/rocketchat-authorization/client/route.js
@@ -1,3 +1,7 @@
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { BlazeLayout } from 'meteor/kadira:blaze-layout';
+import { t } from 'meteor/rocketchat:utils';
+
FlowRouter.route('/admin/permissions', {
name: 'admin-permissions',
action(/* params*/) {
diff --git a/packages/rocketchat-authorization/client/startup.js b/packages/rocketchat-authorization/client/startup.js
index 0fe60e50a2c6..8f1f8c16aa90 100644
--- a/packages/rocketchat-authorization/client/startup.js
+++ b/packages/rocketchat-authorization/client/startup.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.CachedCollectionManager.onLogin(() => {
Meteor.subscribe('roles');
});
diff --git a/packages/rocketchat-authorization/client/usersNameChanged.js b/packages/rocketchat-authorization/client/usersNameChanged.js
index 720577e05d0b..0c632b888b54 100644
--- a/packages/rocketchat-authorization/client/usersNameChanged.js
+++ b/packages/rocketchat-authorization/client/usersNameChanged.js
@@ -1,4 +1,7 @@
-/* globals RoomRoles */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RoomRoles } from 'meteor/rocketchat:ui';
+
Meteor.startup(function() {
RocketChat.Notifications.onLogged('Users:NameChanged', function({ _id, name }) {
RoomRoles.update({
diff --git a/packages/rocketchat-authorization/client/views/permissions.js b/packages/rocketchat-authorization/client/views/permissions.js
index 45cfbd206dc2..d351068502ca 100644
--- a/packages/rocketchat-authorization/client/views/permissions.js
+++ b/packages/rocketchat-authorization/client/views/permissions.js
@@ -1,5 +1,12 @@
-/* globals ChatPermissions */
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Tracker } from 'meteor/tracker';
+import { Template } from 'meteor/templating';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { ChatPermissions } from '../lib/ChatPermissions';
+
import { permissionLevel } from '../../lib/rocketchat';
+import { t } from 'meteor/rocketchat:utils';
const whereNotSetting = {
$where: function() {
diff --git a/packages/rocketchat-authorization/client/views/permissionsRole.html b/packages/rocketchat-authorization/client/views/permissionsRole.html
index 4aaa9f692431..403d69ec50fc 100644
--- a/packages/rocketchat-authorization/client/views/permissionsRole.html
+++ b/packages/rocketchat-authorization/client/views/permissionsRole.html
@@ -21,6 +21,11 @@
{{_ "Global"}}
{{_ "Rooms"}}
+
+
+
{{_ "Users must use Two Factor Authentication"}} :
+
+
{{#if editable}}
{{_ "Delete"}}
diff --git a/packages/rocketchat-authorization/client/views/permissionsRole.js b/packages/rocketchat-authorization/client/views/permissionsRole.js
index 9b3401861235..4f06f256f718 100644
--- a/packages/rocketchat-authorization/client/views/permissionsRole.js
+++ b/packages/rocketchat-authorization/client/views/permissionsRole.js
@@ -1,3 +1,11 @@
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { Template } from 'meteor/templating';
+import { modal } from 'meteor/rocketchat:ui';
+import { t } from 'meteor/rocketchat:utils';
+import { RocketChat, handleError } from 'meteor/rocketchat:lib';
+
import toastr from 'toastr';
Template.permissionsRole.helpers({
@@ -138,6 +146,7 @@ Template.permissionsRole.events({
const roleData = {
description: e.currentTarget.elements.description.value,
scope: e.currentTarget.elements.scope.value,
+ mandatory2fa: e.currentTarget.elements.mandatory2fa.checked,
};
if (this._id) {
diff --git a/packages/rocketchat-authorization/lib/rocketchat.js b/packages/rocketchat-authorization/lib/rocketchat.js
index ab0d6deb341d..2773c50b1a27 100644
--- a/packages/rocketchat-authorization/lib/rocketchat.js
+++ b/packages/rocketchat-authorization/lib/rocketchat.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.authz = {};
export const permissionLevel = {
diff --git a/packages/rocketchat-authorization/package.js b/packages/rocketchat-authorization/package.js
index 94e59df87e2f..2aab4bc7e2e0 100644
--- a/packages/rocketchat-authorization/package.js
+++ b/packages/rocketchat-authorization/package.js
@@ -10,64 +10,16 @@ Package.onUse(function(api) {
api.use([
'ecmascript',
'rocketchat:lib',
+ 'mongo',
+ 'rocketchat:utils',
]);
-
- api.use('mongo', ['client', 'server']);
- api.use('kadira:flow-router', 'client');
- api.use('tracker', 'client');
-
- api.use('templating', 'client');
-
- api.addFiles('lib/rocketchat.js', ['server', 'client']);
-
- api.addFiles('client/lib/ChatPermissions.js', ['client']);
- api.addFiles('client/lib/models/Roles.js', ['client']);
- api.addFiles('client/lib/models/Users.js', ['client']);
- api.addFiles('client/lib/models/Subscriptions.js', ['client']);
-
- api.addFiles('client/startup.js', ['client']);
- api.addFiles('client/hasPermission.js', ['client']);
- api.addFiles('client/hasRole.js', ['client']);
- api.addFiles('client/requiresPermission.html', ['client']);
-
- api.addFiles('client/route.js', ['client']);
- api.addFiles('client/usersNameChanged.js', ['client']);
-
- // views
- api.addFiles('client/views/permissions.html', ['client']);
- api.addFiles('client/views/permissions.js', ['client']);
- api.addFiles('client/views/permissionsRole.html', ['client']);
- api.addFiles('client/views/permissionsRole.js', ['client']);
-
- // stylesheets
+ api.use([
+ 'templating',
+ 'tracker',
+ 'kadira:flow-router',
+ 'kadira:blaze-layout',
+ ], 'client');
api.addFiles('client/stylesheets/permissions.css', 'client');
-
- api.addFiles('server/models/Permissions.js', ['server']);
- api.addFiles('server/models/Roles.js', ['server']);
- api.addFiles('server/models/Base.js', ['server']);
- api.addFiles('server/models/Users.js', ['server']);
- api.addFiles('server/models/Subscriptions.js', ['server']);
-
- api.addFiles('server/functions/addUserRoles.js', ['server']);
- api.addFiles('server/functions/canAccessRoom.js', ['server']);
- api.addFiles('server/functions/getRoles.js', ['server']);
- api.addFiles('server/functions/getUsersInRole.js', ['server']);
- api.addFiles('server/functions/hasPermission.js', ['server']);
- api.addFiles('server/functions/hasRole.js', ['server']);
- api.addFiles('server/functions/removeUserFromRoles.js', ['server']);
-
- // publications
- api.addFiles('server/publications/permissions.js', 'server');
- api.addFiles('server/publications/roles.js', 'server');
- api.addFiles('server/publications/usersInRole.js', 'server');
-
- // methods
- api.addFiles('server/methods/addUserToRole.js', 'server');
- api.addFiles('server/methods/deleteRole.js', 'server');
- api.addFiles('server/methods/removeUserFromRole.js', 'server');
- api.addFiles('server/methods/saveRole.js', 'server');
- api.addFiles('server/methods/addPermissionToRole.js', 'server');
- api.addFiles('server/methods/removeRoleFromPermission.js', 'server');
-
- api.addFiles('server/startup.js', ['server']);
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-authorization/server/functions/addUserRoles.js b/packages/rocketchat-authorization/server/functions/addUserRoles.js
index 59870b8c8cff..044533078d73 100644
--- a/packages/rocketchat-authorization/server/functions/addUserRoles.js
+++ b/packages/rocketchat-authorization/server/functions/addUserRoles.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
RocketChat.authz.addUserRoles = function(userId, roleNames, scope) {
diff --git a/packages/rocketchat-authorization/server/functions/canAccessRoom.js b/packages/rocketchat-authorization/server/functions/canAccessRoom.js
index 3d0e1eb0f6ee..dc83d5652648 100644
--- a/packages/rocketchat-authorization/server/functions/canAccessRoom.js
+++ b/packages/rocketchat-authorization/server/functions/canAccessRoom.js
@@ -1,4 +1,5 @@
-/* globals RocketChat */
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.authz.roomAccessValidators = [
function(room, user = {}) {
if (room && room.t === 'c') {
@@ -9,22 +10,22 @@ RocketChat.authz.roomAccessValidators = [
return RocketChat.authz.hasPermission(user._id, 'view-c-room');
}
},
- function(room, user = {}) {
+ function(room, user) {
if (!room || !user) {
return;
}
const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(room._id, user._id);
if (subscription) {
- return RocketChat.models.Rooms.findOneById(subscription.rid);
+ return true;
}
},
];
RocketChat.authz.canAccessRoom = function(room, user, extraData) {
- return RocketChat.authz.roomAccessValidators.some((validator) => validator.call(this, room, user, extraData));
+ return RocketChat.authz.roomAccessValidators.some((validator) => validator(room, user, extraData));
};
RocketChat.authz.addRoomAccessValidator = function(validator) {
- RocketChat.authz.roomAccessValidators.push(validator);
+ RocketChat.authz.roomAccessValidators.push(validator.bind(this));
};
diff --git a/packages/rocketchat-authorization/server/functions/getRoles.js b/packages/rocketchat-authorization/server/functions/getRoles.js
index 7fe235157f3e..eb2bb2846a56 100644
--- a/packages/rocketchat-authorization/server/functions/getRoles.js
+++ b/packages/rocketchat-authorization/server/functions/getRoles.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.authz.getRoles = function() {
return RocketChat.models.Roles.find().fetch();
};
diff --git a/packages/rocketchat-authorization/server/functions/getUsersInRole.js b/packages/rocketchat-authorization/server/functions/getUsersInRole.js
index 40d6aedbd95e..f38e1b90cd0b 100644
--- a/packages/rocketchat-authorization/server/functions/getUsersInRole.js
+++ b/packages/rocketchat-authorization/server/functions/getUsersInRole.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.authz.getUsersInRole = function(roleName, scope, options) {
return RocketChat.models.Roles.findUsersInRole(roleName, scope, options);
};
diff --git a/packages/rocketchat-authorization/server/functions/hasPermission.js b/packages/rocketchat-authorization/server/functions/hasPermission.js
index 7c11f9c8447d..7aee1113ea31 100644
--- a/packages/rocketchat-authorization/server/functions/hasPermission.js
+++ b/packages/rocketchat-authorization/server/functions/hasPermission.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
function atLeastOne(userId, permissions = [], scope) {
return permissions.some((permissionId) => {
const permission = RocketChat.models.Permissions.findOne(permissionId);
@@ -16,16 +18,20 @@ function hasPermission(userId, permissions, scope, strategy) {
if (!userId) {
return false;
}
-
- permissions = [].concat(permissions);
- return strategy(userId, permissions, scope);
+ return strategy(userId, [].concat(permissions), scope);
}
RocketChat.authz.hasAllPermission = function(userId, permissions, scope) {
return hasPermission(userId, permissions, scope, all);
};
-RocketChat.authz.hasPermission = RocketChat.authz.hasAllPermission;
+RocketChat.authz.hasPermission = (userId, permissionId, scope) => {
+ if (!userId) {
+ return false;
+ }
+ const permission = RocketChat.models.Permissions.findOne(permissionId);
+ return RocketChat.models.Roles.isUserInRoles(userId, permission.roles, scope);
+};
RocketChat.authz.hasAtLeastOnePermission = function(userId, permissions, scope) {
return hasPermission(userId, permissions, scope, atLeastOne);
diff --git a/packages/rocketchat-authorization/server/functions/hasRole.js b/packages/rocketchat-authorization/server/functions/hasRole.js
index 858662b46c68..60a3b0e56800 100644
--- a/packages/rocketchat-authorization/server/functions/hasRole.js
+++ b/packages/rocketchat-authorization/server/functions/hasRole.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.authz.hasRole = function(userId, roleNames, scope) {
roleNames = [].concat(roleNames);
return RocketChat.models.Roles.isUserInRoles(userId, roleNames, scope);
diff --git a/packages/rocketchat-authorization/server/functions/removeUserFromRoles.js b/packages/rocketchat-authorization/server/functions/removeUserFromRoles.js
index d761e60462a3..150ebbd61d00 100644
--- a/packages/rocketchat-authorization/server/functions/removeUserFromRoles.js
+++ b/packages/rocketchat-authorization/server/functions/removeUserFromRoles.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
RocketChat.authz.removeUserFromRoles = function(userId, roleNames, scope) {
diff --git a/packages/rocketchat-authorization/server/index.js b/packages/rocketchat-authorization/server/index.js
new file mode 100644
index 000000000000..e44ac205433b
--- /dev/null
+++ b/packages/rocketchat-authorization/server/index.js
@@ -0,0 +1,24 @@
+import '../lib/rocketchat';
+import './models/Base';
+import './models/Permissions';
+import './models/Roles';
+import './models/Subscriptions';
+import './models/Users';
+import './functions/addUserRoles';
+import './functions/canAccessRoom';
+import './functions/getRoles';
+import './functions/getUsersInRole';
+import './functions/hasPermission';
+import './functions/hasRole';
+import './functions/removeUserFromRoles';
+import './functions/removeUserFromRoles';
+import './methods/addPermissionToRole';
+import './methods/addUserToRole';
+import './methods/deleteRole';
+import './methods/removeRoleFromPermission';
+import './methods/removeUserFromRole';
+import './methods/saveRole';
+import './publications/permissions';
+import './publications/roles';
+import './publications/usersInRole';
+import './startup';
diff --git a/packages/rocketchat-authorization/server/methods/addPermissionToRole.js b/packages/rocketchat-authorization/server/methods/addPermissionToRole.js
index 525f42984105..7fdf36e37311 100644
--- a/packages/rocketchat-authorization/server/methods/addPermissionToRole.js
+++ b/packages/rocketchat-authorization/server/methods/addPermissionToRole.js
@@ -1,5 +1,8 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import { permissionLevel } from '../../lib/rocketchat';
+
Meteor.methods({
'authorization:addPermissionToRole'(permission, role) {
if (!Meteor.userId() || !RocketChat.authz.hasPermission(Meteor.userId(), 'access-permissions')
diff --git a/packages/rocketchat-authorization/server/methods/addUserToRole.js b/packages/rocketchat-authorization/server/methods/addUserToRole.js
index 4efd345e9fa0..d76b18d916de 100644
--- a/packages/rocketchat-authorization/server/methods/addUserToRole.js
+++ b/packages/rocketchat-authorization/server/methods/addUserToRole.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
Meteor.methods({
diff --git a/packages/rocketchat-authorization/server/methods/deleteRole.js b/packages/rocketchat-authorization/server/methods/deleteRole.js
index 888a56952f52..2363cbabf29b 100644
--- a/packages/rocketchat-authorization/server/methods/deleteRole.js
+++ b/packages/rocketchat-authorization/server/methods/deleteRole.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
'authorization:deleteRole'(roleName) {
if (!Meteor.userId() || !RocketChat.authz.hasPermission(Meteor.userId(), 'access-permissions')) {
diff --git a/packages/rocketchat-authorization/server/methods/removeRoleFromPermission.js b/packages/rocketchat-authorization/server/methods/removeRoleFromPermission.js
index aaaf92b07154..24b81b1a6c0b 100644
--- a/packages/rocketchat-authorization/server/methods/removeRoleFromPermission.js
+++ b/packages/rocketchat-authorization/server/methods/removeRoleFromPermission.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import { permissionLevel } from '../../lib/rocketchat';
Meteor.methods({
diff --git a/packages/rocketchat-authorization/server/methods/removeUserFromRole.js b/packages/rocketchat-authorization/server/methods/removeUserFromRole.js
index 36b0e2153d1a..94a50b4a309d 100644
--- a/packages/rocketchat-authorization/server/methods/removeUserFromRole.js
+++ b/packages/rocketchat-authorization/server/methods/removeUserFromRole.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
Meteor.methods({
diff --git a/packages/rocketchat-authorization/server/methods/saveRole.js b/packages/rocketchat-authorization/server/methods/saveRole.js
index b828dabbef85..89f218850b95 100644
--- a/packages/rocketchat-authorization/server/methods/saveRole.js
+++ b/packages/rocketchat-authorization/server/methods/saveRole.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
'authorization:saveRole'(roleData) {
if (!Meteor.userId() || !RocketChat.authz.hasPermission(Meteor.userId(), 'access-permissions')) {
@@ -17,7 +20,7 @@ Meteor.methods({
roleData.scope = 'Users';
}
- const update = RocketChat.models.Roles.createOrUpdate(roleData.name, roleData.scope, roleData.description);
+ const update = RocketChat.models.Roles.createOrUpdate(roleData.name, roleData.scope, roleData.description, false, roleData.mandatory2fa);
if (RocketChat.settings.get('UI_DisplayRoles')) {
RocketChat.Notifications.notifyLogged('roles-change', {
type: 'changed',
diff --git a/packages/rocketchat-authorization/server/models/Base.js b/packages/rocketchat-authorization/server/models/Base.js
index c625370304f7..f3e8b8283468 100644
--- a/packages/rocketchat-authorization/server/models/Base.js
+++ b/packages/rocketchat-authorization/server/models/Base.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
RocketChat.models._Base.prototype.roleBaseQuery = function(/* userId, scope*/) {
diff --git a/packages/rocketchat-authorization/server/models/Permissions.js b/packages/rocketchat-authorization/server/models/Permissions.js
index 0e84bf19c254..d4f787639318 100644
--- a/packages/rocketchat-authorization/server/models/Permissions.js
+++ b/packages/rocketchat-authorization/server/models/Permissions.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
class ModelPermissions extends RocketChat.models._Base {
constructor(...args) {
super(...args);
diff --git a/packages/rocketchat-authorization/server/models/Roles.js b/packages/rocketchat-authorization/server/models/Roles.js
index c470f8c5664d..af660b6c3130 100644
--- a/packages/rocketchat-authorization/server/models/Roles.js
+++ b/packages/rocketchat-authorization/server/models/Roles.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
class ModelRoles extends RocketChat.models._Base {
constructor(...args) {
super(...args);
@@ -24,7 +26,7 @@ class ModelRoles extends RocketChat.models._Base {
});
}
- createOrUpdate(name, scope = 'Users', description, protectedRole) {
+ createOrUpdate(name, scope = 'Users', description, protectedRole, mandatory2fa) {
const updateData = {};
updateData.name = name;
updateData.scope = scope;
@@ -37,6 +39,10 @@ class ModelRoles extends RocketChat.models._Base {
updateData.protected = protectedRole;
}
+ if (mandatory2fa != null) {
+ updateData.mandatory2fa = mandatory2fa;
+ }
+
this.upsert({ _id: name }, { $set: updateData });
}
diff --git a/packages/rocketchat-authorization/server/models/Subscriptions.js b/packages/rocketchat-authorization/server/models/Subscriptions.js
index b436866381c6..257b75f75e57 100644
--- a/packages/rocketchat-authorization/server/models/Subscriptions.js
+++ b/packages/rocketchat-authorization/server/models/Subscriptions.js
@@ -1,3 +1,4 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
RocketChat.models.Subscriptions.roleBaseQuery = function(userId, scope) {
diff --git a/packages/rocketchat-authorization/server/models/Users.js b/packages/rocketchat-authorization/server/models/Users.js
index a29b3e1f7b36..d6d4132a85cc 100644
--- a/packages/rocketchat-authorization/server/models/Users.js
+++ b/packages/rocketchat-authorization/server/models/Users.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.models.Users.roleBaseQuery = function(userId) {
return { _id: userId };
};
diff --git a/packages/rocketchat-authorization/server/publications/permissions.js b/packages/rocketchat-authorization/server/publications/permissions.js
index b98f489db737..56f038db3ea1 100644
--- a/packages/rocketchat-authorization/server/publications/permissions.js
+++ b/packages/rocketchat-authorization/server/publications/permissions.js
@@ -1,5 +1,8 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import { permissionLevel } from '../../lib/rocketchat';
+
Meteor.methods({
'permissions/get'(updatedAt) {
this.unblock();
diff --git a/packages/rocketchat-authorization/server/publications/roles.js b/packages/rocketchat-authorization/server/publications/roles.js
index a7e8625c9f23..f585c4b1d7cb 100644
--- a/packages/rocketchat-authorization/server/publications/roles.js
+++ b/packages/rocketchat-authorization/server/publications/roles.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.publish('roles', function() {
if (!this.userId) {
return this.ready();
diff --git a/packages/rocketchat-authorization/server/publications/usersInRole.js b/packages/rocketchat-authorization/server/publications/usersInRole.js
index d0444ccc63a2..c98efb7ab779 100644
--- a/packages/rocketchat-authorization/server/publications/usersInRole.js
+++ b/packages/rocketchat-authorization/server/publications/usersInRole.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.publish('usersInRole', function(roleName, scope, limit = 50) {
if (!this.userId) {
return this.ready();
diff --git a/packages/rocketchat-authorization/server/startup.js b/packages/rocketchat-authorization/server/startup.js
index cc709e9d5a04..e0e8b25fb372 100644
--- a/packages/rocketchat-authorization/server/startup.js
+++ b/packages/rocketchat-authorization/server/startup.js
@@ -1,7 +1,8 @@
/* eslint no-multi-spaces: 0 */
-/* globals SystemLogger */
-
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import { permissionLevel } from '../lib/rocketchat';
+import { SystemLogger } from 'meteor/rocketchat:logger';
Meteor.startup(function() {
// Note:
@@ -23,6 +24,7 @@ Meteor.startup(function() {
{ _id: 'create-c', roles : ['admin', 'user', 'bot'] },
{ _id: 'create-d', roles : ['admin', 'user', 'bot'] },
{ _id: 'create-p', roles : ['admin', 'user', 'bot'] },
+ { _id: 'create-personal-access-tokens', roles : ['admin', 'user'] },
{ _id: 'create-user', roles : ['admin'] },
{ _id: 'clean-channel-history', roles : ['admin'] },
{ _id: 'delete-c', roles : ['admin', 'owner'] },
@@ -51,6 +53,7 @@ Meteor.startup(function() {
{ _id: 'mention-here', roles : ['admin', 'owner', 'moderator', 'user'] },
{ _id: 'mute-user', roles : ['admin', 'owner', 'moderator'] },
{ _id: 'remove-user', roles : ['admin', 'owner', 'moderator'] },
+ { _id: 'reset-other-user-e2e-key', roles : ['admin'] },
{ _id: 'run-import', roles : ['admin'] },
{ _id: 'run-migration', roles : ['admin'] },
{ _id: 'set-moderator', roles : ['admin', 'owner'] },
diff --git a/packages/rocketchat-autolinker/client/client.js b/packages/rocketchat-autolinker/client/client.js
index 15acc510527b..2afe8f89f7c0 100644
--- a/packages/rocketchat-autolinker/client/client.js
+++ b/packages/rocketchat-autolinker/client/client.js
@@ -1,4 +1,6 @@
+import { Meteor } from 'meteor/meteor';
import s from 'underscore.string';
+import { RocketChat } from 'meteor/rocketchat:lib';
//
// AutoLinker is a named function that will replace links on messages
diff --git a/packages/rocketchat-autolinker/client/index.js b/packages/rocketchat-autolinker/client/index.js
new file mode 100644
index 000000000000..d99e4ed77352
--- /dev/null
+++ b/packages/rocketchat-autolinker/client/index.js
@@ -0,0 +1 @@
+import './client';
diff --git a/packages/rocketchat-autolinker/package.js b/packages/rocketchat-autolinker/package.js
index 72b44813b7ef..d9fc4b56e131 100644
--- a/packages/rocketchat-autolinker/package.js
+++ b/packages/rocketchat-autolinker/package.js
@@ -6,10 +6,10 @@ Package.describe({
});
Package.onUse(function(api) {
- api.use('ecmascript');
- api.use('rocketchat:lib');
-
- api.addFiles('client/client.js', 'client');
-
- api.addFiles('server/settings.js', 'server');
+ api.use([
+ 'ecmascript',
+ 'rocketchat:lib',
+ ]);
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-autolinker/server/index.js b/packages/rocketchat-autolinker/server/index.js
new file mode 100644
index 000000000000..97097791afdc
--- /dev/null
+++ b/packages/rocketchat-autolinker/server/index.js
@@ -0,0 +1 @@
+import './settings';
diff --git a/packages/rocketchat-autolinker/server/settings.js b/packages/rocketchat-autolinker/server/settings.js
index 95ef08bc30a5..03e94fd74888 100644
--- a/packages/rocketchat-autolinker/server/settings.js
+++ b/packages/rocketchat-autolinker/server/settings.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(function() {
const enableQuery = {
_id: 'AutoLinker',
diff --git a/packages/rocketchat-autotranslate/client/index.js b/packages/rocketchat-autotranslate/client/index.js
new file mode 100644
index 000000000000..e09da56abcf4
--- /dev/null
+++ b/packages/rocketchat-autotranslate/client/index.js
@@ -0,0 +1,5 @@
+import './lib/actionButton';
+import './lib/autotranslate';
+import './lib/tabBar';
+import './views/autoTranslateFlexTab.html';
+import './views/autoTranslateFlexTab';
diff --git a/packages/rocketchat-autotranslate/client/lib/actionButton.js b/packages/rocketchat-autotranslate/client/lib/actionButton.js
index e5cfd07effdf..f6e727e76f44 100644
--- a/packages/rocketchat-autotranslate/client/lib/actionButton.js
+++ b/packages/rocketchat-autotranslate/client/lib/actionButton.js
@@ -1,4 +1,7 @@
-/* globals RocketChat */
+import { Meteor } from 'meteor/meteor';
+import { Tracker } from 'meteor/tracker';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(function() {
Tracker.autorun(function() {
if (RocketChat.settings.get('AutoTranslate_Enabled') && RocketChat.authz.hasAtLeastOnePermission(['auto-translate'])) {
diff --git a/packages/rocketchat-autotranslate/client/lib/autotranslate.js b/packages/rocketchat-autotranslate/client/lib/autotranslate.js
index 523bee4891b3..f8f8bc625548 100644
--- a/packages/rocketchat-autotranslate/client/lib/autotranslate.js
+++ b/packages/rocketchat-autotranslate/client/lib/autotranslate.js
@@ -1,4 +1,6 @@
-/* globals RocketChat */
+import { Meteor } from 'meteor/meteor';
+import { Tracker } from 'meteor/tracker';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
RocketChat.AutoTranslate = {
diff --git a/packages/rocketchat-autotranslate/client/lib/tabBar.js b/packages/rocketchat-autotranslate/client/lib/tabBar.js
index 7007121097d9..170c37c04bb4 100644
--- a/packages/rocketchat-autotranslate/client/lib/tabBar.js
+++ b/packages/rocketchat-autotranslate/client/lib/tabBar.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Tracker } from 'meteor/tracker';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(function() {
Tracker.autorun(function() {
if (RocketChat.settings.get('AutoTranslate_Enabled') && RocketChat.authz.hasAtLeastOnePermission(['auto-translate'])) {
diff --git a/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.js b/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.js
index ef79dfd76dd6..4ffcc9cae97c 100644
--- a/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.js
+++ b/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.js
@@ -1,4 +1,10 @@
-/* globals ChatSubscription, RocketChat */
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Random } from 'meteor/random';
+import { Template } from 'meteor/templating';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { ChatSubscription } from 'meteor/rocketchat:ui';
+import { t } from 'meteor/rocketchat:utils';
import _ from 'underscore';
import toastr from 'toastr';
diff --git a/packages/rocketchat-autotranslate/package.js b/packages/rocketchat-autotranslate/package.js
index 6679f2c5312f..114979eadb7f 100644
--- a/packages/rocketchat-autotranslate/package.js
+++ b/packages/rocketchat-autotranslate/package.js
@@ -10,6 +10,8 @@ Package.onUse(function(api) {
'ecmascript',
'ddp-rate-limiter',
'rocketchat:lib',
+ 'templating',
+ 'rocketchat:utils',
]);
api.use('templating', 'client');
@@ -38,6 +40,8 @@ Package.onUse(function(api) {
'server/methods/translateMessage.js',
'server/methods/getSupportedLanguages.js',
], 'server');
+
+ api.mainModule('client/index.js', 'client');
api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-autotranslate/server/autotranslate.js b/packages/rocketchat-autotranslate/server/autotranslate.js
index 4b2bb37a0941..88849469f189 100644
--- a/packages/rocketchat-autotranslate/server/autotranslate.js
+++ b/packages/rocketchat-autotranslate/server/autotranslate.js
@@ -1,8 +1,8 @@
-/* globals SystemLogger, RocketChat */
-
-import s from 'underscore.string';
-import _ from 'underscore';
+import { Meteor } from 'meteor/meteor';
import { RocketChat } from 'meteor/rocketchat:lib';
+import { SystemLogger } from 'meteor/rocketchat:logger';
+import _ from 'underscore';
+import s from 'underscore.string';
export class TranslationProviderRegistry {
diff --git a/packages/rocketchat-autotranslate/server/dbsTranslate.js b/packages/rocketchat-autotranslate/server/dbsTranslate.js
index f8c12a3696ab..86f13f8afc23 100644
--- a/packages/rocketchat-autotranslate/server/dbsTranslate.js
+++ b/packages/rocketchat-autotranslate/server/dbsTranslate.js
@@ -2,9 +2,14 @@
* @author Vigneshwaran Odayappan
*/
+import { Meteor } from 'meteor/meteor';
import { TranslationProviderRegistry, AutoTranslate } from 'meteor/rocketchat:autotranslate';
import { SystemLogger } from 'meteor/rocketchat:logger';
import { Promise } from 'meteor/promise';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { HTTP } from 'meteor/http';
+
+
import _ from 'underscore';
const cld = Npm.require('cld'); // import the local package dependencies
diff --git a/packages/rocketchat-autotranslate/server/deeplTranslate.js b/packages/rocketchat-autotranslate/server/deeplTranslate.js
index 1936882ef4cf..39f9d9137e40 100644
--- a/packages/rocketchat-autotranslate/server/deeplTranslate.js
+++ b/packages/rocketchat-autotranslate/server/deeplTranslate.js
@@ -4,6 +4,8 @@
import { TranslationProviderRegistry, AutoTranslate } from 'meteor/rocketchat:autotranslate';
import { SystemLogger } from 'meteor/rocketchat:logger';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { HTTP } from 'meteor/http';
import _ from 'underscore';
/**
diff --git a/packages/rocketchat-autotranslate/server/googleTranslate.js b/packages/rocketchat-autotranslate/server/googleTranslate.js
index f53b862bd1df..87d71d955176 100644
--- a/packages/rocketchat-autotranslate/server/googleTranslate.js
+++ b/packages/rocketchat-autotranslate/server/googleTranslate.js
@@ -6,6 +6,8 @@
import { AutoTranslate, TranslationProviderRegistry } from './autotranslate';
import { SystemLogger } from 'meteor/rocketchat:logger';
import _ from 'underscore';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { HTTP } from 'meteor/http';
/**
* Represents google translate class
diff --git a/packages/rocketchat-autotranslate/server/index.js b/packages/rocketchat-autotranslate/server/index.js
index c15cc2f097d6..e5e202f05aa5 100644
--- a/packages/rocketchat-autotranslate/server/index.js
+++ b/packages/rocketchat-autotranslate/server/index.js
@@ -3,8 +3,22 @@
* @module AutoTranslate, TranslationProviderRegistry
*/
+import './models/Messages';
+import './models/Subscriptions';
+import './settings';
+import './permissions';
+import './autotranslate';
+import './methods/getSupportedLanguages';
+import './methods/saveSettings';
+import './methods/translateMessage';
+
import { AutoTranslate, TranslationProviderRegistry } from './autotranslate';
+import './googleTranslate';
+import './deeplTranslate';
+import './dbsTranslate';
+import './models/Settings';
+
export {
AutoTranslate,
TranslationProviderRegistry,
diff --git a/packages/rocketchat-autotranslate/server/methods/getProviderUiMetadata.js b/packages/rocketchat-autotranslate/server/methods/getProviderUiMetadata.js
index 3af84d143f68..4878e23906e4 100644
--- a/packages/rocketchat-autotranslate/server/methods/getProviderUiMetadata.js
+++ b/packages/rocketchat-autotranslate/server/methods/getProviderUiMetadata.js
@@ -1,4 +1,5 @@
import { TranslationProviderRegistry } from '../autotranslate';
+import { Meteor } from 'meteor/meteor';
Meteor.methods({
'autoTranslate.getProviderUiMetadata'() {
diff --git a/packages/rocketchat-autotranslate/server/methods/getSupportedLanguages.js b/packages/rocketchat-autotranslate/server/methods/getSupportedLanguages.js
index 17e84b7230aa..b2b79b9c7522 100644
--- a/packages/rocketchat-autotranslate/server/methods/getSupportedLanguages.js
+++ b/packages/rocketchat-autotranslate/server/methods/getSupportedLanguages.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { DDPRateLimiter } from 'meteor/ddp-rate-limiter';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
'autoTranslate.getSupportedLanguages'(targetLanguage) {
if (!RocketChat.authz.hasPermission(Meteor.userId(), 'auto-translate')) {
diff --git a/packages/rocketchat-autotranslate/server/methods/saveSettings.js b/packages/rocketchat-autotranslate/server/methods/saveSettings.js
index 5a948cd4f090..0298c39a784e 100644
--- a/packages/rocketchat-autotranslate/server/methods/saveSettings.js
+++ b/packages/rocketchat-autotranslate/server/methods/saveSettings.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { check } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
'autoTranslate.saveSettings'(rid, field, value, options) {
if (!Meteor.userId()) {
diff --git a/packages/rocketchat-autotranslate/server/methods/translateMessage.js b/packages/rocketchat-autotranslate/server/methods/translateMessage.js
index 9a5819b45bc8..77f1dce763be 100644
--- a/packages/rocketchat-autotranslate/server/methods/translateMessage.js
+++ b/packages/rocketchat-autotranslate/server/methods/translateMessage.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
'autoTranslate.translateMessage'(message, targetLanguage) {
const room = RocketChat.models.Rooms.findOneById(message && message.rid);
diff --git a/packages/rocketchat-autotranslate/server/models/Subscriptions.js b/packages/rocketchat-autotranslate/server/models/Subscriptions.js
index 703623ea6923..28bd43da9ebc 100644
--- a/packages/rocketchat-autotranslate/server/models/Subscriptions.js
+++ b/packages/rocketchat-autotranslate/server/models/Subscriptions.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.models.Subscriptions.updateAutoTranslateById = function(_id, autoTranslate) {
const query = {
_id,
diff --git a/packages/rocketchat-autotranslate/server/permissions.js b/packages/rocketchat-autotranslate/server/permissions.js
index 03c306e2e2ec..35536af4427a 100644
--- a/packages/rocketchat-autotranslate/server/permissions.js
+++ b/packages/rocketchat-autotranslate/server/permissions.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(() => {
if (RocketChat.models && RocketChat.models.Permissions) {
if (!RocketChat.models.Permissions.findOne({ _id: 'auto-translate' })) {
diff --git a/packages/rocketchat-autotranslate/server/settings.js b/packages/rocketchat-autotranslate/server/settings.js
index 80cce120f36c..6684b11132bc 100644
--- a/packages/rocketchat-autotranslate/server/settings.js
+++ b/packages/rocketchat-autotranslate/server/settings.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(function() {
RocketChat.settings.add('AutoTranslate_Enabled', false, {
type: 'boolean',
diff --git a/packages/rocketchat-bot-helpers/package.js b/packages/rocketchat-bot-helpers/package.js
index 7c36c0d6d34d..f5d8654dd4e1 100644
--- a/packages/rocketchat-bot-helpers/package.js
+++ b/packages/rocketchat-bot-helpers/package.js
@@ -6,13 +6,10 @@ Package.describe({
});
Package.onUse(function(api) {
- api.use('ecmascript');
- api.use('rocketchat:lib');
- api.use('accounts-base');
- // api.mainModule('server/index.js', 'server'); // when 1.3
- // api.mainModule('client/index.js', 'client'); // when 1.3
- api.addFiles([
- 'server/index.js',
- 'server/settings.js',
- ], ['server']);
+ api.use([
+ 'ecmascript',
+ 'rocketchat:lib',
+ 'accounts-base',
+ ]);
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-bot-helpers/server/index.js b/packages/rocketchat-bot-helpers/server/index.js
index c43182a12a5c..085a85284353 100644
--- a/packages/rocketchat-bot-helpers/server/index.js
+++ b/packages/rocketchat-bot-helpers/server/index.js
@@ -1,3 +1,6 @@
+import './settings';
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
/**
diff --git a/packages/rocketchat-bot-helpers/server/settings.js b/packages/rocketchat-bot-helpers/server/settings.js
index c14f62286233..f2dab1624e96 100644
--- a/packages/rocketchat-bot-helpers/server/settings.js
+++ b/packages/rocketchat-bot-helpers/server/settings.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(function() {
RocketChat.settings.addGroup('Bots', function() {
this.add('BotHelpers_userFields', '_id, name, username, emails, language, utcOffset', {
diff --git a/packages/rocketchat-cas/client/cas_client.js b/packages/rocketchat-cas/client/cas_client.js
index b56d594e806a..4811ef8bb5fb 100644
--- a/packages/rocketchat-cas/client/cas_client.js
+++ b/packages/rocketchat-cas/client/cas_client.js
@@ -1,3 +1,8 @@
+import { Meteor } from 'meteor/meteor';
+import { Accounts } from 'meteor/accounts-base';
+import { Random } from 'meteor/random';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
const openCenteredPopup = function(url, width, height) {
const screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft;
diff --git a/packages/rocketchat-cas/client/index.js b/packages/rocketchat-cas/client/index.js
new file mode 100644
index 000000000000..75213558d6d8
--- /dev/null
+++ b/packages/rocketchat-cas/client/index.js
@@ -0,0 +1 @@
+import './cas_client';
diff --git a/packages/rocketchat-cas/package.js b/packages/rocketchat-cas/package.js
index a599f42ed3e6..25096d4fd1f5 100644
--- a/packages/rocketchat-cas/package.js
+++ b/packages/rocketchat-cas/package.js
@@ -6,21 +6,15 @@ Package.describe({
});
Package.onUse(function(api) {
- // Server libs
- api.use('rocketchat:lib', 'server');
- api.use('rocketchat:logger', 'server');
- api.use('service-configuration', 'server');
- api.use('routepolicy', 'server');
- api.use('webapp', 'server');
- api.use('accounts-base', 'server');
-
- api.use('ecmascript');
-
- // Server files
- api.add_files('server/cas_rocketchat.js', 'server');
- api.add_files('server/cas_server.js', 'server');
- api.add_files('server/models/CredentialTokens.js', 'server');
-
- // Client files
- api.add_files('client/cas_client.js', 'client');
+ api.use([
+ 'ecmascript',
+ 'rocketchat:lib',
+ 'rocketchat:logger',
+ 'service-configuration',
+ 'routepolicy',
+ 'webapp',
+ 'accounts-base',
+ ]);
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-cas/server/cas_rocketchat.js b/packages/rocketchat-cas/server/cas_rocketchat.js
index f8f6e4b0520f..3d96e1d4d39d 100644
--- a/packages/rocketchat-cas/server/cas_rocketchat.js
+++ b/packages/rocketchat-cas/server/cas_rocketchat.js
@@ -1,6 +1,8 @@
-/* globals logger:true */
-
-logger = new Logger('CAS', {});
+import { Meteor } from 'meteor/meteor';
+import { Logger } from 'meteor/rocketchat:logger';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { ServiceConfiguration } from 'meteor/service-configuration';
+export const logger = new Logger('CAS', {});
Meteor.startup(function() {
RocketChat.settings.addGroup('CAS', function() {
diff --git a/packages/rocketchat-cas/server/cas_server.js b/packages/rocketchat-cas/server/cas_server.js
index ac7a7fbf37b0..e52283ca7579 100644
--- a/packages/rocketchat-cas/server/cas_server.js
+++ b/packages/rocketchat-cas/server/cas_server.js
@@ -1,5 +1,10 @@
-/* globals RoutePolicy, logger */
-/* jshint newcap: false */
+import { Meteor } from 'meteor/meteor';
+import { Accounts } from 'meteor/accounts-base';
+import { Random } from 'meteor/random';
+import { WebApp } from 'meteor/webapp';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RoutePolicy } from 'meteor/routepolicy';
+import { logger } from './cas_rocketchat';
import _ from 'underscore';
import fiber from 'fibers';
@@ -155,19 +160,35 @@ Accounts.registerLoginHandler(function(options) {
_.each(attr_map, function(source, int_name) {
// Source is our String to interpolate
if (_.isString(source)) {
+ let replacedValue = source;
_.each(ext_attrs, function(value, ext_name) {
- source = source.replace(`%${ ext_name }%`, ext_attrs[ext_name]);
+ replacedValue = replacedValue.replace(`%${ ext_name }%`, ext_attrs[ext_name]);
});
- int_attrs[int_name] = source;
- logger.debug(`Sourced internal attribute: ${ int_name } = ${ source }`);
+ if (source !== replacedValue) {
+ int_attrs[int_name] = replacedValue;
+ logger.debug(`Sourced internal attribute: ${ int_name } = ${ replacedValue }`);
+ } else {
+ logger.debug(`Sourced internal attribute: ${ int_name } skipped.`);
+ }
}
});
}
// Search existing user by its external service id
logger.debug(`Looking up user by id: ${ result.username }`);
+ // First, look for a user that has logged in from CAS with this username before
let user = Meteor.users.findOne({ 'services.cas.external_id': result.username });
+ if (!user) {
+ // If that user was not found, check if there's any CAS user that is currently using that username on Rocket.Chat
+ // With this, CAS login will continue to work if the user is renamed on both sides and also if the user is renamed only on Rocket.Chat.
+ const username = new RegExp(`^${ result.username }$`, 'i');
+ user = Meteor.users.findOne({ 'services.cas.external_id': { $exists: true }, username });
+ if (user) {
+ // Update the user's external_id to reflect this new username.
+ Meteor.users.update(user, { $set: { 'services.cas.external_id': result.username } });
+ }
+ }
if (user) {
logger.debug(`Using existing user for '${ result.username }' with id: ${ user._id }`);
diff --git a/packages/rocketchat-cas/server/index.js b/packages/rocketchat-cas/server/index.js
new file mode 100644
index 000000000000..451c7d5a8aa0
--- /dev/null
+++ b/packages/rocketchat-cas/server/index.js
@@ -0,0 +1,3 @@
+import './models/CredentialTokens';
+import './cas_rocketchat';
+import './cas_server';
diff --git a/packages/rocketchat-cas/server/models/CredentialTokens.js b/packages/rocketchat-cas/server/models/CredentialTokens.js
index 63d00ff423ff..a484eb978b39 100644
--- a/packages/rocketchat-cas/server/models/CredentialTokens.js
+++ b/packages/rocketchat-cas/server/models/CredentialTokens.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.models.CredentialTokens = new class extends RocketChat.models._Base {
constructor() {
super('credential_tokens');
diff --git a/packages/rocketchat-channel-settings-mail-messages/client/index.js b/packages/rocketchat-channel-settings-mail-messages/client/index.js
new file mode 100644
index 000000000000..82a489dbed7e
--- /dev/null
+++ b/packages/rocketchat-channel-settings-mail-messages/client/index.js
@@ -0,0 +1,3 @@
+import './lib/startup';
+import './views/mailMessagesInstructions.html';
+import './views/mailMessagesInstructions';
diff --git a/packages/rocketchat-channel-settings-mail-messages/client/lib/startup.js b/packages/rocketchat-channel-settings-mail-messages/client/lib/startup.js
index 7f83b2a6de9c..d255479029d7 100644
--- a/packages/rocketchat-channel-settings-mail-messages/client/lib/startup.js
+++ b/packages/rocketchat-channel-settings-mail-messages/client/lib/startup.js
@@ -1,4 +1,7 @@
// import resetSelection from '../resetSelection';
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(() => {
RocketChat.TabBar.addButton({
groups: ['channel', 'group', 'direct'],
diff --git a/packages/rocketchat-channel-settings-mail-messages/client/resetSelection.js b/packages/rocketchat-channel-settings-mail-messages/client/resetSelection.js
index a8493df545d0..ef62124d9c7c 100644
--- a/packages/rocketchat-channel-settings-mail-messages/client/resetSelection.js
+++ b/packages/rocketchat-channel-settings-mail-messages/client/resetSelection.js
@@ -1,3 +1,5 @@
+import { Blaze } from 'meteor/blaze';
+
export default function resetSelection(reset) {
const [el] = $('.messages-box');
if (!el) {
diff --git a/packages/rocketchat-channel-settings-mail-messages/client/views/mailMessagesInstructions.js b/packages/rocketchat-channel-settings-mail-messages/client/views/mailMessagesInstructions.js
index 3fd4e2a39ded..83ae7802056d 100644
--- a/packages/rocketchat-channel-settings-mail-messages/client/views/mailMessagesInstructions.js
+++ b/packages/rocketchat-channel-settings-mail-messages/client/views/mailMessagesInstructions.js
@@ -1,4 +1,13 @@
-/* global AutoComplete Deps */
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Blaze } from 'meteor/blaze';
+import { Session } from 'meteor/session';
+import { Template } from 'meteor/templating';
+import { AutoComplete } from 'meteor/mizzao:autocomplete';
+import { RocketChat, handleError } from 'meteor/rocketchat:lib';
+import { ChatRoom } from 'meteor/rocketchat:ui';
+import { t } from 'meteor/rocketchat:utils';
+import { Deps } from 'meteor/deps';
import toastr from 'toastr';
import resetSelection from '../resetSelection';
@@ -41,7 +50,7 @@ Template.mailMessagesInstructions.helpers({
},
roomName() {
const room = ChatRoom.findOne(Session.get('openedRoom'));
- return room && room.name;
+ return room && RocketChat.roomTypes.getRoomName(room.t, room);
},
erroredEmails() {
const instance = Template.instance();
diff --git a/packages/rocketchat-channel-settings-mail-messages/package.js b/packages/rocketchat-channel-settings-mail-messages/package.js
index ddb5ed278493..efd2f3c6e2b8 100644
--- a/packages/rocketchat-channel-settings-mail-messages/package.js
+++ b/packages/rocketchat-channel-settings-mail-messages/package.js
@@ -13,18 +13,10 @@ Package.onUse(function(api) {
'less',
'rocketchat:lib',
'rocketchat:channel-settings',
+ 'mizzao:autocomplete',
'mongo',
+ 'rocketchat:utils',
]);
-
- api.addFiles([
- 'client/lib/startup.js',
- 'client/views/mailMessagesInstructions.html',
- 'client/views/mailMessagesInstructions.js',
- ], 'client');
-
-
- api.addFiles([
- 'server/lib/startup.js',
- 'server/methods/mailMessages.js',
- ], 'server');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-channel-settings-mail-messages/server/index.js b/packages/rocketchat-channel-settings-mail-messages/server/index.js
new file mode 100644
index 000000000000..465e185b386a
--- /dev/null
+++ b/packages/rocketchat-channel-settings-mail-messages/server/index.js
@@ -0,0 +1,2 @@
+import './lib/startup';
+import './methods/mailMessages';
diff --git a/packages/rocketchat-channel-settings-mail-messages/server/lib/startup.js b/packages/rocketchat-channel-settings-mail-messages/server/lib/startup.js
index ae2edc7c6ee1..80c7f8e63595 100644
--- a/packages/rocketchat-channel-settings-mail-messages/server/lib/startup.js
+++ b/packages/rocketchat-channel-settings-mail-messages/server/lib/startup.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(function() {
const permission = {
_id: 'mail-messages',
diff --git a/packages/rocketchat-channel-settings-mail-messages/server/methods/mailMessages.js b/packages/rocketchat-channel-settings-mail-messages/server/methods/mailMessages.js
index 930c946d08e1..1ad34a81a0f8 100644
--- a/packages/rocketchat-channel-settings-mail-messages/server/methods/mailMessages.js
+++ b/packages/rocketchat-channel-settings-mail-messages/server/methods/mailMessages.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { Match, check } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
import moment from 'moment';
import * as Mailer from 'meteor/rocketchat:mailer';
diff --git a/packages/rocketchat-channel-settings/client/index.js b/packages/rocketchat-channel-settings/client/index.js
new file mode 100644
index 000000000000..78bfbc38ef21
--- /dev/null
+++ b/packages/rocketchat-channel-settings/client/index.js
@@ -0,0 +1,6 @@
+import './startup/messageTypes';
+import './startup/tabBar';
+import './startup/trackSettingsChange';
+import './lib/ChannelSettings';
+import './views/channelSettings.html';
+import './views/channelSettings';
diff --git a/packages/rocketchat-channel-settings/client/lib/ChannelSettings.js b/packages/rocketchat-channel-settings/client/lib/ChannelSettings.js
index 92ff8d7d0ef7..f643d2c6674b 100644
--- a/packages/rocketchat-channel-settings/client/lib/ChannelSettings.js
+++ b/packages/rocketchat-channel-settings/client/lib/ChannelSettings.js
@@ -1,4 +1,8 @@
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Tracker } from 'meteor/tracker';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
+
RocketChat.ChannelSettings = new class {
constructor() {
this.options = new ReactiveVar({});
diff --git a/packages/rocketchat-channel-settings/client/startup/messageTypes.js b/packages/rocketchat-channel-settings/client/startup/messageTypes.js
index 357adb2abc85..1fe5f21590ed 100644
--- a/packages/rocketchat-channel-settings/client/startup/messageTypes.js
+++ b/packages/rocketchat-channel-settings/client/startup/messageTypes.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { t } from 'meteor/rocketchat:utils';
import s from 'underscore.string';
Meteor.startup(function() {
diff --git a/packages/rocketchat-channel-settings/client/startup/tabBar.js b/packages/rocketchat-channel-settings/client/startup/tabBar.js
index ba3038584f52..4f61bca98c57 100644
--- a/packages/rocketchat-channel-settings/client/startup/tabBar.js
+++ b/packages/rocketchat-channel-settings/client/startup/tabBar.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(() => {
RocketChat.TabBar.addButton({
groups: ['channel', 'group', 'direct'],
diff --git a/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.js b/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.js
index 8df8addd789f..5827d5c16f42 100644
--- a/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.js
+++ b/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.js
@@ -1,3 +1,10 @@
+import { Meteor } from 'meteor/meteor';
+import { Tracker } from 'meteor/tracker';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { Session } from 'meteor/session';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { ChatRoom, RoomManager } from 'meteor/rocketchat:ui';
+
Meteor.startup(function() {
const roomSettingsChangedCallback = (msg) => {
Tracker.nonreactive(() => {
diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.js b/packages/rocketchat-channel-settings/client/views/channelSettings.js
index 57f28e3df8bb..7afff0bf10ad 100644
--- a/packages/rocketchat-channel-settings/client/views/channelSettings.js
+++ b/packages/rocketchat-channel-settings/client/views/channelSettings.js
@@ -1,8 +1,13 @@
-/* globals popover */
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Template } from 'meteor/templating';
+import { TAPi18n } from 'meteor/tap:i18n';
import toastr from 'toastr';
import moment from 'moment';
import s from 'underscore.string';
import { call, erase, hide, leave, RocketChat, RoomSettingsEnum } from 'meteor/rocketchat:lib';
+import { modal, ChatRoom, popover } from 'meteor/rocketchat:ui';
+import { t } from 'meteor/rocketchat:utils';
const common = {
canLeaveRoom() {
diff --git a/packages/rocketchat-channel-settings/package.js b/packages/rocketchat-channel-settings/package.js
index 0826b364130b..80bc0b90d365 100644
--- a/packages/rocketchat-channel-settings/package.js
+++ b/packages/rocketchat-channel-settings/package.js
@@ -12,31 +12,10 @@ Package.onUse(function(api) {
'tracker',
'templating',
'rocketchat:lib',
+ 'rocketchat:ui',
+ 'rocketchat:utils',
]);
-
- api.addFiles([
- 'client/lib/ChannelSettings.js',
- 'client/startup/messageTypes.js',
- 'client/startup/tabBar.js',
- 'client/startup/trackSettingsChange.js',
- 'client/views/channelSettings.html',
- 'client/views/channelSettings.js',
- 'client/stylesheets/channel-settings.css',
- ], 'client');
-
- api.addFiles([
- 'server/functions/saveReactWhenReadOnly.js',
- 'server/functions/saveRoomType.js',
- 'server/functions/saveRoomTopic.js',
- 'server/functions/saveRoomCustomFields.js',
- 'server/functions/saveRoomAnnouncement.js',
- 'server/functions/saveRoomName.js',
- 'server/functions/saveRoomReadOnly.js',
- 'server/functions/saveRoomDescription.js',
- 'server/functions/saveRoomSystemMessages.js',
- 'server/methods/saveRoomSettings.js',
- 'server/models/Messages.js',
- 'server/models/Rooms.js',
- 'server/startup.js',
- ], 'server');
+ api.addFiles('client/stylesheets/channel-settings.css', 'client');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-channel-settings/server/functions/saveReactWhenReadOnly.js b/packages/rocketchat-channel-settings/server/functions/saveReactWhenReadOnly.js
index 61cf8128df04..23237f9316bf 100644
--- a/packages/rocketchat-channel-settings/server/functions/saveReactWhenReadOnly.js
+++ b/packages/rocketchat-channel-settings/server/functions/saveReactWhenReadOnly.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.saveReactWhenReadOnly = function(rid, allowReact) {
if (!Match.test(rid, String)) {
throw new Meteor.Error('invalid-room', 'Invalid room', { function: 'RocketChat.saveReactWhenReadOnly' });
diff --git a/packages/rocketchat-channel-settings/server/functions/saveRoomAnnouncement.js b/packages/rocketchat-channel-settings/server/functions/saveRoomAnnouncement.js
index eb48b2f680b5..82c7621936a2 100644
--- a/packages/rocketchat-channel-settings/server/functions/saveRoomAnnouncement.js
+++ b/packages/rocketchat-channel-settings/server/functions/saveRoomAnnouncement.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.saveRoomAnnouncement = function(rid, roomAnnouncement, user, sendMessage = true) {
if (!Match.test(rid, String)) {
throw new Meteor.Error('invalid-room', 'Invalid room', { function: 'RocketChat.saveRoomAnnouncement' });
diff --git a/packages/rocketchat-channel-settings/server/functions/saveRoomCustomFields.js b/packages/rocketchat-channel-settings/server/functions/saveRoomCustomFields.js
index f5d20696c0ff..c39dc662a7f6 100644
--- a/packages/rocketchat-channel-settings/server/functions/saveRoomCustomFields.js
+++ b/packages/rocketchat-channel-settings/server/functions/saveRoomCustomFields.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.saveRoomCustomFields = function(rid, roomCustomFields) {
if (!Match.test(rid, String)) {
throw new Meteor.Error('invalid-room', 'Invalid room', {
diff --git a/packages/rocketchat-channel-settings/server/functions/saveRoomDescription.js b/packages/rocketchat-channel-settings/server/functions/saveRoomDescription.js
index f266ea90a34b..c515e6b44eaf 100644
--- a/packages/rocketchat-channel-settings/server/functions/saveRoomDescription.js
+++ b/packages/rocketchat-channel-settings/server/functions/saveRoomDescription.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.saveRoomDescription = function(rid, roomDescription, user) {
if (!Match.test(rid, String)) {
throw new Meteor.Error('invalid-room', 'Invalid room', {
diff --git a/packages/rocketchat-channel-settings/server/functions/saveRoomName.js b/packages/rocketchat-channel-settings/server/functions/saveRoomName.js
index 925354cbe2e4..32c9f9aaf7a1 100644
--- a/packages/rocketchat-channel-settings/server/functions/saveRoomName.js
+++ b/packages/rocketchat-channel-settings/server/functions/saveRoomName.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
RocketChat.saveRoomName = function(rid, displayName, user, sendMessage = true) {
const room = RocketChat.models.Rooms.findOneById(rid);
diff --git a/packages/rocketchat-channel-settings/server/functions/saveRoomReadOnly.js b/packages/rocketchat-channel-settings/server/functions/saveRoomReadOnly.js
index 7c377e9b5865..7db4b0610afd 100644
--- a/packages/rocketchat-channel-settings/server/functions/saveRoomReadOnly.js
+++ b/packages/rocketchat-channel-settings/server/functions/saveRoomReadOnly.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.saveRoomReadOnly = function(rid, readOnly) {
if (!Match.test(rid, String)) {
throw new Meteor.Error('invalid-room', 'Invalid room', {
diff --git a/packages/rocketchat-channel-settings/server/functions/saveRoomSystemMessages.js b/packages/rocketchat-channel-settings/server/functions/saveRoomSystemMessages.js
index 74ebe7b46e56..26bc61e1e03d 100644
--- a/packages/rocketchat-channel-settings/server/functions/saveRoomSystemMessages.js
+++ b/packages/rocketchat-channel-settings/server/functions/saveRoomSystemMessages.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.saveRoomSystemMessages = function(rid, systemMessages) {
if (!Match.test(rid, String)) {
throw new Meteor.Error('invalid-room', 'Invalid room', {
diff --git a/packages/rocketchat-channel-settings/server/functions/saveRoomTopic.js b/packages/rocketchat-channel-settings/server/functions/saveRoomTopic.js
index 39e61c6c4063..7a76f6fb6f97 100644
--- a/packages/rocketchat-channel-settings/server/functions/saveRoomTopic.js
+++ b/packages/rocketchat-channel-settings/server/functions/saveRoomTopic.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.saveRoomTopic = function(rid, roomTopic, user, sendMessage = true) {
if (!Match.test(rid, String)) {
throw new Meteor.Error('invalid-room', 'Invalid room', {
diff --git a/packages/rocketchat-channel-settings/server/functions/saveRoomType.js b/packages/rocketchat-channel-settings/server/functions/saveRoomType.js
index a4319609dbd6..a495c2b270b8 100644
--- a/packages/rocketchat-channel-settings/server/functions/saveRoomType.js
+++ b/packages/rocketchat-channel-settings/server/functions/saveRoomType.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { RocketChat } from 'meteor/rocketchat:lib';
RocketChat.saveRoomType = function(rid, roomType, user, sendMessage = true) {
if (!Match.test(rid, String)) {
diff --git a/packages/rocketchat-channel-settings/server/index.js b/packages/rocketchat-channel-settings/server/index.js
new file mode 100644
index 000000000000..02ce04779f0d
--- /dev/null
+++ b/packages/rocketchat-channel-settings/server/index.js
@@ -0,0 +1,13 @@
+import './startup';
+import './models/Messages';
+import './models/Rooms';
+import './functions/saveReactWhenReadOnly';
+import './functions/saveRoomAnnouncement';
+import './functions/saveRoomCustomFields';
+import './functions/saveRoomDescription';
+import './functions/saveRoomName';
+import './functions/saveRoomReadOnly';
+import './functions/saveRoomSystemMessages';
+import './functions/saveRoomTopic';
+import './functions/saveRoomType';
+import './methods/saveRoomSettings';
diff --git a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.js b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.js
index adb44bcc21ef..ec4370040806 100644
--- a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.js
+++ b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { Match, check } from 'meteor/check';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
const fields = ['roomName', 'roomTopic', 'roomAnnouncement', 'roomCustomFields', 'roomDescription', 'roomType', 'readOnly', 'reactWhenReadOnly', 'systemMessages', 'default', 'joinCode', 'tokenpass', 'streamingOptions', 'retentionEnabled', 'retentionMaxAge', 'retentionExcludePinned', 'retentionFilesOnly', 'retentionOverrideGlobal', 'encrypted'];
Meteor.methods({
saveRoomSettings(rid, settings, value) {
@@ -35,16 +39,16 @@ Meteor.methods({
const room = RocketChat.models.Rooms.findOneById(rid);
- if (room.broadcast && (settings.readOnly || settings.reactWhenReadOnly)) {
- throw new Meteor.Error('error-action-not-allowed', 'Editing readOnly/reactWhenReadOnly are not allowed for broadcast rooms', {
+ if (!room) {
+ throw new Meteor.Error('error-invalid-room', 'Invalid room', {
method: 'saveRoomSettings',
- action: 'Editing_room',
});
}
- if (!room) {
- throw new Meteor.Error('error-invalid-room', 'Invalid room', {
+ if (room.broadcast && (settings.readOnly || settings.reactWhenReadOnly)) {
+ throw new Meteor.Error('error-action-not-allowed', 'Editing readOnly/reactWhenReadOnly are not allowed for broadcast rooms', {
method: 'saveRoomSettings',
+ action: 'Editing_room',
});
}
diff --git a/packages/rocketchat-channel-settings/server/models/Messages.js b/packages/rocketchat-channel-settings/server/models/Messages.js
index 6f4e473375b3..2e8b4ee5812c 100644
--- a/packages/rocketchat-channel-settings/server/models/Messages.js
+++ b/packages/rocketchat-channel-settings/server/models/Messages.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser = function(type, roomId, message, user, extraData) {
return this.createWithTypeRoomIdMessageAndUser(type, roomId, message, user, extraData);
};
diff --git a/packages/rocketchat-channel-settings/server/models/Rooms.js b/packages/rocketchat-channel-settings/server/models/Rooms.js
index 5f61ff7fce4c..6dae5225e441 100644
--- a/packages/rocketchat-channel-settings/server/models/Rooms.js
+++ b/packages/rocketchat-channel-settings/server/models/Rooms.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.models.Rooms.setDescriptionById = function(_id, description) {
const query = {
_id,
diff --git a/packages/rocketchat-channel-settings/server/startup.js b/packages/rocketchat-channel-settings/server/startup.js
index 39a5ccc15933..81e6fde8d366 100644
--- a/packages/rocketchat-channel-settings/server/startup.js
+++ b/packages/rocketchat-channel-settings/server/startup.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(function() {
RocketChat.models.Permissions.upsert('post-readonly', { $setOnInsert: { roles: ['admin', 'owner', 'moderator'] } });
RocketChat.models.Permissions.upsert('set-readonly', { $setOnInsert: { roles: ['admin', 'owner'] } });
diff --git a/packages/rocketchat-cloud/client/admin/callback.html b/packages/rocketchat-cloud/client/admin/callback.html
new file mode 100644
index 000000000000..5d6c9c432f4c
--- /dev/null
+++ b/packages/rocketchat-cloud/client/admin/callback.html
@@ -0,0 +1,16 @@
+
+
+
+ {{> header sectionName="Cloud_connect"}}
+
+ {{#requiresPermission 'manage-cloud'}}
+ {{#if callbackError.error}}
+
{{_ "Cloud_error_in_authenticating"}}
+
+
{{_ "Cloud_error_code"}} {{ callbackError.errorCode }}
+ {{/if}}
+ {{/requiresPermission}}
+
+
+
+
diff --git a/packages/rocketchat-cloud/client/admin/callback.js b/packages/rocketchat-cloud/client/admin/callback.js
new file mode 100644
index 000000000000..adf4bac1d211
--- /dev/null
+++ b/packages/rocketchat-cloud/client/admin/callback.js
@@ -0,0 +1,37 @@
+import './callback.html';
+
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Template } from 'meteor/templating';
+
+import { FlowRouter } from 'meteor/kadira:flow-router';
+
+import queryString from 'query-string';
+
+Template.cloudCallback.onCreated(function() {
+ const instance = this;
+
+ instance.loading = new ReactiveVar(true);
+ instance.callbackError = new ReactiveVar({ error: false });
+
+ const params = queryString.parse(location.search);
+
+ if (params.error_code) {
+ instance.callbackError.set({ error: true, errorCode: params.error_code });
+ } else {
+ Meteor.call('cloud:finishOAuthAuthorization', params.code, params.state, (error) => {
+ if (error) {
+ console.warn('cloud:finishOAuthAuthorization', error);
+ return;
+ }
+
+ FlowRouter.go('/admin/cloud');
+ });
+ }
+});
+
+Template.cloudCallback.helpers({
+ callbackError() {
+ return Template.instance().callbackError.get();
+ },
+});
diff --git a/packages/rocketchat-cloud/client/admin/cloud.html b/packages/rocketchat-cloud/client/admin/cloud.html
new file mode 100644
index 000000000000..c09e1281a77e
--- /dev/null
+++ b/packages/rocketchat-cloud/client/admin/cloud.html
@@ -0,0 +1,83 @@
+
+
+
+ {{> header sectionName="Cloud_connect"}}
+
+ {{#requiresPermission 'manage-cloud'}}
+
+
+
+ {{_ "Cloud_what_is_it"}}
+
+
+
+
+
{{_ "Cloud_what_is_it_description"}}
+
+
+
+ {{#if info.registeredWithWizard}}
+ {{#if info.workspaceConnected}}
+
+ {{#if info.userAssociated}}
+
{{_ "Cloud_workspace_connected_plus_account"}}
+ {{else}}
+
{{_ "Cloud_workspace_connected_without_account"}}
+
+ {{/if}}
+
+ {{else}}
+
+
+
+
+
{{ registeredWithWizard }}
+
+
+
+
+ {{/if}}
+ {{else}}
+
+
+ {{_ "Cloud_registration_required"}}
+
+
+
+
{{_ "Cloud_registration_required_description"}}
+
{{_ "Cloud_registration_requried_link_text"}}
+
+ {{/if}}
+
+ {{/requiresPermission}}
+
+
+
+
diff --git a/packages/rocketchat-cloud/client/admin/cloud.js b/packages/rocketchat-cloud/client/admin/cloud.js
new file mode 100644
index 000000000000..e68f0e890532
--- /dev/null
+++ b/packages/rocketchat-cloud/client/admin/cloud.js
@@ -0,0 +1,93 @@
+import './cloud.html';
+
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Template } from 'meteor/templating';
+import { t } from 'meteor/rocketchat:utils';
+
+import queryString from 'query-string';
+import toastr from 'toastr';
+
+Template.cloud.onCreated(function() {
+ const instance = this;
+ instance.info = new ReactiveVar();
+ instance.loading = new ReactiveVar(true);
+
+ instance.loadRegStatus = function _loadRegStatus() {
+ Meteor.call('cloud:checkRegisterStatus', (error, info) => {
+ if (error) {
+ console.warn('cloud:checkRegisterStatus', error);
+ return;
+ }
+
+ instance.info.set(info);
+ instance.loading.set(false);
+ });
+ };
+
+ instance.connectWorkspace = function _connectWorkspace(token) {
+ Meteor.call('cloud:connectWorkspace', token, (error, success) => {
+ if (error) {
+ toastr.error(error);
+ instance.loadRegStatus();
+ return;
+ }
+
+ if (!success) {
+ toastr.error('Invalid token');
+ instance.loadRegStatus();
+ return;
+ }
+
+ toastr.success(t('Connected'));
+
+ instance.loadRegStatus();
+ });
+ };
+
+ const params = queryString.parse(location.search);
+
+ if (params.token) {
+ instance.connectWorkspace();
+ } else {
+ instance.loadRegStatus();
+ }
+});
+
+Template.cloud.helpers({
+ info() {
+ return Template.instance().info.get();
+ },
+});
+
+Template.cloud.events({
+ 'click .update-email-btn'() {
+ const val = $('input[name=cloudEmail]').val();
+
+ Meteor.call('cloud:updateEmail', val, (error) => {
+ if (error) {
+ console.warn(error);
+ return;
+ }
+
+ toastr.success(t('Saved'));
+ });
+ },
+
+ 'click .login-btn'() {
+ Meteor.call('cloud:getOAuthAuthorizationUrl', (error, url) => {
+ if (error) {
+ console.warn(error);
+ return;
+ }
+
+ window.location.href = url;
+ });
+ },
+
+ 'click .connect-btn'(e, i) {
+ const token = $('input[name=cloudToken]').val();
+
+ i.connectWorkspace(token);
+ },
+});
diff --git a/packages/rocketchat-cloud/client/index.js b/packages/rocketchat-cloud/client/index.js
new file mode 100644
index 000000000000..e5dddf8944bf
--- /dev/null
+++ b/packages/rocketchat-cloud/client/index.js
@@ -0,0 +1,28 @@
+import './admin/callback';
+import './admin/cloud';
+
+import { BlazeLayout } from 'meteor/kadira:blaze-layout';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+
+FlowRouter.route('/admin/cloud', {
+ name: 'cloud-config',
+ action() {
+ BlazeLayout.render('main', { center: 'cloud', old: true });
+ },
+});
+
+FlowRouter.route('/admin/cloud/oauth-callback', {
+ name: 'cloud-oauth-callback',
+ action() {
+ BlazeLayout.render('main', { center: 'cloudCallback', old: true });
+ },
+});
+
+RocketChat.AdminBox.addOption({
+ icon: 'cloud-plus',
+ href: 'admin/cloud',
+ i18nLabel: 'Cloud',
+ permissionGranted() {
+ return RocketChat.authz.hasAtLeastOnePermission(['manage-cloud']);
+ },
+});
diff --git a/packages/rocketchat-cloud/package.js b/packages/rocketchat-cloud/package.js
new file mode 100644
index 000000000000..52480e9e66d6
--- /dev/null
+++ b/packages/rocketchat-cloud/package.js
@@ -0,0 +1,17 @@
+Package.describe({
+ name: 'rocketchat:cloud',
+ version: '0.0.1',
+ summary: 'Package which interacts with the Rocket.Chat Cloud offerings.',
+ git: '',
+});
+
+Package.onUse(function(api) {
+ api.use([
+ 'ecmascript',
+ 'rocketchat:lib',
+ 'templating',
+ ]);
+
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
+});
diff --git a/packages/rocketchat-cloud/server/functions/connectWorkspace.js b/packages/rocketchat-cloud/server/functions/connectWorkspace.js
new file mode 100644
index 000000000000..f34cecd22449
--- /dev/null
+++ b/packages/rocketchat-cloud/server/functions/connectWorkspace.js
@@ -0,0 +1,70 @@
+import querystring from 'querystring';
+import { HTTP } from 'meteor/http';
+
+import { getRedirectUri } from './getRedirectUri';
+import { retrieveRegistrationStatus } from './retrieveRegistrationStatus';
+
+export function connectWorkspace(token) {
+ const { registeredWithWizard } = retrieveRegistrationStatus();
+ if (!registeredWithWizard) {
+ return false;
+ }
+
+ const redirectUri = getRedirectUri();
+
+ const regInfo = {
+ email: RocketChat.settings.get('Organization_Email'),
+ client_name: RocketChat.settings.get('Site_Name'),
+ redirect_uris: [redirectUri],
+ };
+
+ const cloudUrl = RocketChat.settings.get('Cloud_Url');
+ let result;
+ try {
+ result = HTTP.post(`${ cloudUrl }/api/oauth/clients`, {
+ headers: {
+ Authorization: `Bearer ${ token }`,
+ },
+ data: regInfo,
+ });
+ } catch (e) {
+ return false;
+ }
+
+ const { data } = result;
+
+ if (!data) {
+ return false;
+ }
+
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Id', data.workspaceId);
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Name', data.client_name);
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Client_Id', data.client_id);
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Client_Secret', data.client_secret);
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Client_Secret_Expires_At', data.client_secret_expires_at);
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Registration_Client_Uri', data.registration_client_uri);
+
+ // Now that we have the client id and secret, let's get the access token
+ let authTokenResult;
+ try {
+ authTokenResult = HTTP.post(`${ cloudUrl }/api/oauth/token`, {
+ data: {},
+ query: querystring.stringify({
+ client_id: data.client_id,
+ client_secret: data.client_secret,
+ grant_type: 'client_credentials',
+ redirect_uri: redirectUri,
+ }),
+ });
+ } catch (e) {
+ return false;
+ }
+
+ const expiresAt = new Date();
+ expiresAt.setSeconds(expiresAt.getSeconds() + authTokenResult.data.expires_in);
+
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Access_Token', authTokenResult.data.access_token);
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Access_Token_Expires_At', expiresAt);
+
+ return true;
+}
diff --git a/packages/rocketchat-cloud/server/functions/finishOAuthAuthorization.js b/packages/rocketchat-cloud/server/functions/finishOAuthAuthorization.js
new file mode 100644
index 000000000000..80e2a67e17ea
--- /dev/null
+++ b/packages/rocketchat-cloud/server/functions/finishOAuthAuthorization.js
@@ -0,0 +1,50 @@
+import querystring from 'querystring';
+
+import { Meteor } from 'meteor/meteor';
+import { HTTP } from 'meteor/http';
+
+import { getRedirectUri } from './getRedirectUri';
+
+export function finishOAuthAuthorization(code, state) {
+ if (RocketChat.settings.get('Cloud_Workspace_Registration_State') !== state) {
+ throw new Meteor.Error('error-invalid-state', 'Invalid state provided', { method: 'cloud:finishOAuthAuthorization' });
+ }
+
+ const cloudUrl = RocketChat.settings.get('Cloud_Url');
+ const clientId = RocketChat.settings.get('Cloud_Workspace_Client_Id');
+ const clientSecret = RocketChat.settings.get('Cloud_Workspace_Client_Secret');
+
+ let result;
+ try {
+ result = HTTP.post(`${ cloudUrl }/api/oauth/token`, {
+ data: {},
+ query: querystring.stringify({
+ client_id: clientId,
+ client_secret: clientSecret,
+ grant_type: 'authorization_code',
+ code,
+ redirect_uri: getRedirectUri(),
+ }),
+ });
+ } catch (e) {
+ return false;
+ }
+
+ const expiresAt = new Date();
+ expiresAt.setSeconds(expiresAt.getSeconds() + result.data.expires_in);
+
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Account_Associated', true);
+ RocketChat.models.Users.update({ _id: Meteor.userId() }, {
+ $set: {
+ 'services.cloud': {
+ accessToken: result.data.access_token,
+ expiresAt,
+ scope: result.data.scope,
+ tokenType: result.data.token_type,
+ refreshToken: result.data.refresh_token,
+ },
+ },
+ });
+
+ return true;
+}
diff --git a/packages/rocketchat-cloud/server/functions/getOAuthAuthorizationUrl.js b/packages/rocketchat-cloud/server/functions/getOAuthAuthorizationUrl.js
new file mode 100644
index 000000000000..b3edc95090f9
--- /dev/null
+++ b/packages/rocketchat-cloud/server/functions/getOAuthAuthorizationUrl.js
@@ -0,0 +1,15 @@
+import { Random } from 'meteor/random';
+
+import { getRedirectUri } from './getRedirectUri';
+
+export function getOAuthAuthorizationUrl() {
+ const state = Random.id();
+
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Registration_State', state);
+
+ const cloudUrl = RocketChat.settings.get('Cloud_Url');
+ const client_id = RocketChat.settings.get('Cloud_Workspace_Client_Id');
+ const redirectUri = getRedirectUri();
+
+ return `${ cloudUrl }/authorize?response_type=code&client_id=${ client_id }&redirect_uri=${ redirectUri }&scope=offline_access&state=${ state }`;
+}
diff --git a/packages/rocketchat-cloud/server/functions/getRedirectUri.js b/packages/rocketchat-cloud/server/functions/getRedirectUri.js
new file mode 100644
index 000000000000..21a219791c9e
--- /dev/null
+++ b/packages/rocketchat-cloud/server/functions/getRedirectUri.js
@@ -0,0 +1,3 @@
+export function getRedirectUri() {
+ return `${ RocketChat.settings.get('Site_Url') }/admin/cloud/oauth-callback`.replace(/\/\/admin+/g, '/admin');
+}
diff --git a/packages/rocketchat-cloud/server/functions/getWorkspaceAccessTokens.js b/packages/rocketchat-cloud/server/functions/getWorkspaceAccessTokens.js
new file mode 100644
index 000000000000..d853ce5b6df3
--- /dev/null
+++ b/packages/rocketchat-cloud/server/functions/getWorkspaceAccessTokens.js
@@ -0,0 +1,50 @@
+import querystring from 'querystring';
+import { HTTP } from 'meteor/http';
+
+import { getRedirectUri } from './getRedirectUri';
+
+export function getWorkspaceAccessToken() {
+ if (!RocketChat.settings.get('Register_Server')) {
+ return '';
+ }
+
+ const client_id = RocketChat.settings.get('Cloud_Workspace_Client_Id');
+ if (!client_id) {
+ return '';
+ }
+
+ const expires = RocketChat.models.Settings.findOneById('Cloud_Workspace_Access_Token_Expires_At');
+ const now = new Date();
+
+ if (now < expires.value) {
+ return RocketChat.settings.get('Cloud_Workspace_Access_Token');
+ }
+
+ const cloudUrl = RocketChat.settings.get('Cloud_Url');
+ const client_secret = RocketChat.settings.get('Cloud_Workspace_Client_Secret');
+ const redirectUri = getRedirectUri();
+
+ let authTokenResult;
+ try {
+ authTokenResult = HTTP.post(`${ cloudUrl }/api/oauth/token`, {
+ data: {},
+ query: querystring.stringify({
+ client_id,
+ client_secret,
+ grant_type: 'client_credentials',
+ redirect_uri: redirectUri,
+ }),
+ });
+ } catch (e) {
+ return '';
+ }
+
+ const expiresAt = new Date();
+ expiresAt.setSeconds(expiresAt.getSeconds() + authTokenResult.data.expires_in);
+
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Access_Token', authTokenResult.data.access_token);
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_Access_Token_Expires_At', expiresAt);
+
+
+ return authTokenResult.data.access_token;
+}
diff --git a/packages/rocketchat-cloud/server/functions/getWorkspaceLicense.js b/packages/rocketchat-cloud/server/functions/getWorkspaceLicense.js
new file mode 100644
index 000000000000..d9278a65d519
--- /dev/null
+++ b/packages/rocketchat-cloud/server/functions/getWorkspaceLicense.js
@@ -0,0 +1,34 @@
+import { HTTP } from 'meteor/http';
+
+import { getWorkspaceAccessToken } from './getWorkspaceAccessToken';
+
+export function getWorkspaceLicense() {
+ const token = getWorkspaceAccessToken();
+
+ if (!token) {
+ return { updated: false, license: '' };
+ }
+
+
+ let licenseResult;
+ try {
+ licenseResult = HTTP.get(`${ RocketChat.settings.get('Cloud_Workspace_Registration_Client_Uri') }/license`, {
+ headers: {
+ Authorization: `Bearer ${ token }`,
+ },
+ });
+ } catch (e) {
+ return { updated: false, license: '' };
+ }
+
+ const remoteLicense = licenseResult.data;
+ const currentLicense = RocketChat.settings.get('Cloud_Workspace_License');
+
+ if (remoteLicense.updatedAt <= currentLicense._updatedAt) {
+ return { updated: false, license: '' };
+ }
+
+ RocketChat.models.Settings.updateValueById('Cloud_Workspace_License', remoteLicense.license);
+
+ return { updated: true, license: remoteLicense.license };
+}
diff --git a/packages/rocketchat-cloud/server/functions/retrieveRegistrationStatus.js b/packages/rocketchat-cloud/server/functions/retrieveRegistrationStatus.js
new file mode 100644
index 000000000000..dd109853234e
--- /dev/null
+++ b/packages/rocketchat-cloud/server/functions/retrieveRegistrationStatus.js
@@ -0,0 +1,18 @@
+export function retrieveRegistrationStatus() {
+ const info = {
+ registeredWithWizard: RocketChat.settings.get('Register_Server'),
+ workspaceConnected: (RocketChat.settings.get('Cloud_Workspace_Client_Id')) ? true : false,
+ userAssociated: (RocketChat.settings.get('Cloud_Workspace_Account_Associated')) ? true : false,
+ token: '',
+ email: '',
+ };
+
+ const firstUser = RocketChat.models.Users.getOldest({ emails: 1 });
+ info.email = firstUser && firstUser.emails[0].address;
+
+ if (RocketChat.settings.get('Organization_Email')) {
+ info.email = RocketChat.settings.get('Organization_Email');
+ }
+
+ return info;
+}
diff --git a/packages/rocketchat-cloud/server/index.js b/packages/rocketchat-cloud/server/index.js
new file mode 100644
index 000000000000..c64f14941528
--- /dev/null
+++ b/packages/rocketchat-cloud/server/index.js
@@ -0,0 +1,11 @@
+import './methods';
+import { getWorkspaceAccessToken } from './functions/getWorkspaceAccessTokens';
+
+if (RocketChat.models && RocketChat.models.Permissions) {
+ RocketChat.models.Permissions.createOrUpdate('manage-cloud', ['admin']);
+}
+
+// Ensure the client/workspace access token is valid
+getWorkspaceAccessToken();
+
+export { getWorkspaceAccessToken };
diff --git a/packages/rocketchat-cloud/server/methods.js b/packages/rocketchat-cloud/server/methods.js
new file mode 100644
index 000000000000..480274bd14ab
--- /dev/null
+++ b/packages/rocketchat-cloud/server/methods.js
@@ -0,0 +1,72 @@
+import { Meteor } from 'meteor/meteor';
+import { check } from 'meteor/check';
+
+import { retrieveRegistrationStatus } from './functions/retrieveRegistrationStatus';
+import { connectWorkspace } from './functions/connectWorkspace';
+import { getOAuthAuthorizationUrl } from './functions/getOAuthAuthorizationUrl';
+import { finishOAuthAuthorization } from './functions/finishOAuthAuthorization';
+
+Meteor.methods({
+ 'cloud:checkRegisterStatus'() {
+ if (!Meteor.userId()) {
+ throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'cloud:checkRegisterStatus' });
+ }
+
+ if (!RocketChat.authz.hasPermission(Meteor.userId(), 'manage-cloud')) {
+ throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'cloud:checkRegisterStatus' });
+ }
+
+ return retrieveRegistrationStatus();
+ },
+ 'cloud:updateEmail'(email) {
+ check(email, String);
+
+ if (!Meteor.userId()) {
+ throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'cloud:updateEmail' });
+ }
+
+ if (!RocketChat.authz.hasPermission(Meteor.userId(), 'manage-cloud')) {
+ throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'cloud:updateEmail' });
+ }
+
+ RocketChat.models.Settings.updateValueById('Organization_Email', email);
+ },
+ 'cloud:connectWorkspace'(token) {
+ check(token, String);
+
+ if (!Meteor.userId()) {
+ throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'cloud:connectServer' });
+ }
+
+ if (!RocketChat.authz.hasPermission(Meteor.userId(), 'manage-cloud')) {
+ throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'cloud:connectServer' });
+ }
+
+ return connectWorkspace(token);
+ },
+ 'cloud:getOAuthAuthorizationUrl'() {
+ if (!Meteor.userId()) {
+ throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'cloud:connectServer' });
+ }
+
+ if (!RocketChat.authz.hasPermission(Meteor.userId(), 'manage-cloud')) {
+ throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'cloud:connectServer' });
+ }
+
+ return getOAuthAuthorizationUrl();
+ },
+ 'cloud:finishOAuthAuthorization'(code, state) {
+ check(code, String);
+ check(state, String);
+
+ if (!Meteor.userId()) {
+ throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'cloud:finishOAuthAuthorization' });
+ }
+
+ if (!RocketChat.authz.hasPermission(Meteor.userId(), 'manage-cloud')) {
+ throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'cloud:connectServer' });
+ }
+
+ return finishOAuthAuthorization(code, state);
+ },
+});
diff --git a/packages/rocketchat-colors/client/client.js b/packages/rocketchat-colors/client/client.js
index 98f08fe9cc68..e257c90cd2d9 100644
--- a/packages/rocketchat-colors/client/client.js
+++ b/packages/rocketchat-colors/client/client.js
@@ -1,3 +1,4 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
import s from 'underscore.string';
//
diff --git a/packages/rocketchat-colors/client/index.js b/packages/rocketchat-colors/client/index.js
new file mode 100644
index 000000000000..d99e4ed77352
--- /dev/null
+++ b/packages/rocketchat-colors/client/index.js
@@ -0,0 +1 @@
+import './client';
diff --git a/packages/rocketchat-colors/package.js b/packages/rocketchat-colors/package.js
index 980411478848..e7513c0b5114 100644
--- a/packages/rocketchat-colors/package.js
+++ b/packages/rocketchat-colors/package.js
@@ -6,10 +6,11 @@ Package.describe({
});
Package.onUse(function(api) {
- api.use('rocketchat:lib');
- api.use('ecmascript');
-
- api.addFiles('client/client.js', 'client');
+ api.use([
+ 'ecmascript',
+ 'rocketchat:lib',
+ ]);
api.addFiles('client/style.css', 'client');
- api.addFiles('server/settings.js', 'server');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-colors/server/index.js b/packages/rocketchat-colors/server/index.js
new file mode 100644
index 000000000000..97097791afdc
--- /dev/null
+++ b/packages/rocketchat-colors/server/index.js
@@ -0,0 +1 @@
+import './settings';
diff --git a/packages/rocketchat-colors/server/settings.js b/packages/rocketchat-colors/server/settings.js
index d2d347ea0a72..96b69bce9ce7 100644
--- a/packages/rocketchat-colors/server/settings.js
+++ b/packages/rocketchat-colors/server/settings.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.settings.add('HexColorPreview_Enabled', true, {
type: 'boolean',
i18nLabel: 'Enabled',
diff --git a/packages/rocketchat-cors/client/index.js b/packages/rocketchat-cors/client/index.js
new file mode 100644
index 000000000000..e44dbe195eff
--- /dev/null
+++ b/packages/rocketchat-cors/client/index.js
@@ -0,0 +1 @@
+import '../lib/common';
diff --git a/packages/rocketchat-cors/common.js b/packages/rocketchat-cors/lib/common.js
similarity index 62%
rename from packages/rocketchat-cors/common.js
rename to packages/rocketchat-cors/lib/common.js
index 3c90f3d1896c..ffc05767ff76 100644
--- a/packages/rocketchat-cors/common.js
+++ b/packages/rocketchat-cors/lib/common.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(function() {
RocketChat.settings.onload('Force_SSL', function(key, value) {
Meteor.absoluteUrl.defaultOptions.secure = value;
diff --git a/packages/rocketchat-cors/package.js b/packages/rocketchat-cors/package.js
index 04d26f3bbd31..72a4c4c28a6c 100644
--- a/packages/rocketchat-cors/package.js
+++ b/packages/rocketchat-cors/package.js
@@ -10,8 +10,9 @@ Package.onUse(function(api) {
'ecmascript',
'webapp',
'mongo',
+ 'rocketchat:lib',
]);
- api.addFiles('cors.js', 'server');
- api.addFiles('common.js');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-cors/cors.js b/packages/rocketchat-cors/server/cors.js
similarity index 96%
rename from packages/rocketchat-cors/cors.js
rename to packages/rocketchat-cors/server/cors.js
index 33bfeaed1060..6beb29788fed 100644
--- a/packages/rocketchat-cors/cors.js
+++ b/packages/rocketchat-cors/server/cors.js
@@ -1,9 +1,10 @@
-/* globals WebAppInternals */
-import _ from 'underscore';
+import { Meteor } from 'meteor/meteor';
+import { WebApp, WebAppInternals } from 'meteor/webapp';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { Mongo } from 'meteor/mongo';
+import _ from 'underscore';
import url from 'url';
-
-import { Mongo } from 'meteor/mongo';
import tls from 'tls';
// FIX For TLS error see more here https://github.com/RocketChat/Rocket.Chat/issues/9316
// TODO: Remove after NodeJS fix it, more information https://github.com/nodejs/node/issues/16196 https://github.com/nodejs/node/pull/16853
diff --git a/packages/rocketchat-cors/server/index.js b/packages/rocketchat-cors/server/index.js
new file mode 100644
index 000000000000..95faa2aa07cf
--- /dev/null
+++ b/packages/rocketchat-cors/server/index.js
@@ -0,0 +1,2 @@
+import './cors';
+import '../lib/common';
diff --git a/packages/rocketchat-crowd/client/index.js b/packages/rocketchat-crowd/client/index.js
new file mode 100644
index 000000000000..fecf898e1ae4
--- /dev/null
+++ b/packages/rocketchat-crowd/client/index.js
@@ -0,0 +1 @@
+import './loginHelper';
diff --git a/packages/rocketchat-crowd/client/loginHelper.js b/packages/rocketchat-crowd/client/loginHelper.js
index 3767f50ccd4f..a7056d5d2ffe 100644
--- a/packages/rocketchat-crowd/client/loginHelper.js
+++ b/packages/rocketchat-crowd/client/loginHelper.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { Accounts } from 'meteor/accounts-base';
+
Meteor.loginWithCrowd = function(...args) {
// Pull username and password
const username = args.shift();
diff --git a/packages/rocketchat-crowd/package.js b/packages/rocketchat-crowd/package.js
index 567567d05bdc..83c5bcd53537 100644
--- a/packages/rocketchat-crowd/package.js
+++ b/packages/rocketchat-crowd/package.js
@@ -6,19 +6,17 @@ Package.describe({
});
Package.onUse(function(api) {
- api.use('rocketchat:logger');
- api.use('rocketchat:lib');
- api.use('ecmascript');
- api.use('sha');
+ api.use([
+ 'rocketchat:logger',
+ 'rocketchat:lib',
+ 'ecmascript',
+ 'sha',
+ 'templating',
+ 'accounts-base',
+ 'accounts-password',
+ 'littledata:synced-cron',
+ ]);
- api.use('templating', 'client');
-
- api.use('accounts-base', 'server');
- api.use('accounts-password', 'server');
-
- api.addFiles('client/loginHelper.js', 'client');
- api.addFiles('server/crowd.js', 'server');
- api.addFiles('server/settings.js', 'server');
-
- api.export('CROWD', 'server');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-crowd/server/crowd.js b/packages/rocketchat-crowd/server/crowd.js
index a636878407e0..dafef53d226f 100644
--- a/packages/rocketchat-crowd/server/crowd.js
+++ b/packages/rocketchat-crowd/server/crowd.js
@@ -1,5 +1,11 @@
-/* globals:CROWD:true */
-/* eslint new-cap: [2, {"capIsNewExceptions": ["SHA256"]}] */
+import { Meteor } from 'meteor/meteor';
+import { SHA256 } from 'meteor/sha';
+import { SyncedCron } from 'meteor/littledata:synced-cron';
+import { Accounts } from 'meteor/accounts-base';
+import { Logger } from 'meteor/rocketchat:logger';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import _ from 'underscore';
+
const logger = new Logger('CROWD', {});
function fallbackDefaultAccountSystem(bind, username, password) {
@@ -24,19 +30,14 @@ function fallbackDefaultAccountSystem(bind, username, password) {
return Accounts._runLoginHandlers(bind, loginRequest);
}
-const CROWD = class CROWD {
+export class CROWD {
constructor() {
const AtlassianCrowd = require('atlassian-crowd');
let url = RocketChat.settings.get('CROWD_URL');
- const urlLastChar = url.slice(-1);
-
- if (urlLastChar !== '/') {
- url += '/';
- }
this.options = {
crowd: {
- base: url,
+ base: (!/\/$/.test(url) ? url += '/' : url),
},
application: {
name: RocketChat.settings.get('CROWD_APP_USERNAME'),
@@ -49,6 +50,7 @@ const CROWD = class CROWD {
this.crowdClient.user.authenticateSync = Meteor.wrapAsync(this.crowdClient.user.authenticate, this);
this.crowdClient.user.findSync = Meteor.wrapAsync(this.crowdClient.user.find, this);
+ this.crowdClient.searchSync = Meteor.wrapAsync(this.crowdClient.search, this);
this.crowdClient.pingSync = Meteor.wrapAsync(this.crowdClient.ping, this);
}
@@ -56,6 +58,17 @@ const CROWD = class CROWD {
this.crowdClient.pingSync();
}
+ fetchCrowdUser(username) {
+ const userResponse = this.crowdClient.user.findSync(username);
+
+ return {
+ displayname: userResponse['display-name'],
+ username: userResponse.name,
+ email: userResponse.email,
+ active: userResponse.active,
+ };
+ }
+
authenticate(username, password) {
if (!username || !password) {
logger.error('No username or password');
@@ -69,30 +82,34 @@ const CROWD = class CROWD {
return;
}
- const userResponse = this.crowdClient.user.findSync(username);
+ const crowdUser = this.fetchCrowdUser(username);
- const user = {
- displayname: userResponse['display-name'],
- username: userResponse.name,
- email: userResponse.email,
- password,
- active: userResponse.active,
- };
+ crowdUser.password = password;
- return user;
+ return crowdUser;
}
syncDataToUser(crowdUser, id) {
+ const self = this;
const user = {
- username: crowdUser.username,
+ username: self.cleanUsername(crowdUser.username),
+ crowd_username: crowdUser.username,
emails: [{
address : crowdUser.email,
verified: true,
}],
- password: crowdUser.password,
active: crowdUser.active,
+ crowd: true,
};
+ if (crowdUser.password) {
+ Accounts.setPassword(id, crowdUser.password, {
+ logout: false,
+ });
+
+ RocketChat.models.Users.unsetRequirePasswordChange(id);
+ }
+
if (crowdUser.displayname) {
RocketChat._setRealName(id, crowdUser.displayname);
}
@@ -103,40 +120,60 @@ const CROWD = class CROWD {
}
sync() {
+ // if crowd is disabled bail out
if (RocketChat.settings.get('CROWD_Enable') !== true) {
return;
}
const self = this;
- logger.info('Sync started');
-
- const users = RocketChat.models.Users.findCrowdUsers();
- if (users) {
- users.forEach(function(user) {
- logger.info('Syncing user', user.username);
- const userResponse = self.crowdClient.user.findSync(user.username);
- if (userResponse) {
- const crowdUser = {
- displayname: userResponse['display-name'],
- username: userResponse.name,
- email: userResponse.email,
- password: userResponse.password,
- active: userResponse.active,
- };
-
- self.syncDataToUser(crowdUser, user._id);
+ const users = RocketChat.models.Users.findCrowdUsers() || [];
+
+ logger.info('Sync started...');
+
+ users.forEach(function(user) {
+ let username = user.hasOwnProperty('crowd_username') ? user.crowd_username : user.username;
+ logger.info('Syncing user', username);
+
+ let crowdUser = null;
+
+ try {
+ crowdUser = self.fetchCrowdUser(username);
+ } catch (error) {
+ logger.debug(error);
+ logger.error('Could not sync user with username', username);
+
+ const email = user.emails[0].address;
+ logger.info('Attempting to find for user by email', email);
+
+ const response = self.crowdClient.searchSync('user', `email=" ${ email } "`);
+ if (!response || response.users.length === 0) {
+ logger.warning('Could not find user in CROWD with username or email:', username, email);
+ return;
}
- });
+ username = response.users[0].name;
+ logger.info('User found. Syncing user', username);
+
+ crowdUser = self.fetchCrowdUser(response.users[0].name);
+ }
+
+ self.syncDataToUser(crowdUser, user._id);
+ });
+ }
+
+ cleanUsername(username) {
+ if (RocketChat.settings.get('CROWD_Clean_Usernames') === true) {
+ return username.split('@')[0];
}
+ return username;
}
- addNewUser(crowdUser) {
+ updateUserCollection(crowdUser) {
const userQuery = {
crowd: true,
username: crowdUser.username,
};
- // find our existinmg user if they exist
+ // find our existing user if they exist
const user = Meteor.users.findOne(userQuery);
if (user) {
@@ -154,29 +191,23 @@ const CROWD = class CROWD {
userId: user._id,
token: stampedToken.token,
};
- } else {
- try {
- crowdUser._id = Accounts.createUser(crowdUser);
- } catch (error) {
- logger.info('Error creating new user for crowd user', error);
- }
+ }
- const updateUser = {
- name: crowdUser.displayname,
- crowd: true,
- active: crowdUser.active,
- };
+ // Attempt to create the new user
+ try {
+ crowdUser._id = Accounts.createUser(crowdUser);
- Meteor.users.update(crowdUser._id, {
- $set: updateUser,
- });
- }
+ // sync the user data
+ this.syncDataToUser(crowdUser, crowdUser._id);
- return {
- userId: crowdUser._id,
- };
+ return {
+ userId: crowdUser._id,
+ };
+ } catch (error) {
+ logger.error('Error creating new crowd user.', error.message);
+ }
}
-};
+}
Accounts.registerLoginHandler('crowd', function(loginRequest) {
if (!loginRequest.crowd) {
@@ -189,38 +220,50 @@ Accounts.registerLoginHandler('crowd', function(loginRequest) {
return fallbackDefaultAccountSystem(this, loginRequest.username, loginRequest.crowdPassword);
}
- const crowd = new CROWD();
- let user;
try {
- user = crowd.authenticate(loginRequest.username, loginRequest.crowdPassword);
+ const crowd = new CROWD();
+ const user = crowd.authenticate(loginRequest.username, loginRequest.crowdPassword);
+
+ return crowd.updateUserCollection(user);
} catch (error) {
+ logger.debug(error);
logger.error('Crowd user not authenticated due to an error, falling back');
- }
-
- if (!user) {
return fallbackDefaultAccountSystem(this, loginRequest.username, loginRequest.crowdPassword);
}
-
- return crowd.addNewUser(user);
});
-let interval;
-let timeout;
-RocketChat.settings.get('CROWD_Sync_User_Data', function(key, value) {
- Meteor.clearInterval(interval);
- Meteor.clearTimeout(timeout);
+const jobName = 'CROWD_Sync';
- if (value === true) {
- const crowd = new CROWD();
- logger.info('Enabling CROWD user sync');
- Meteor.setInterval(crowd.sync, 1000 * 60 * 60);
- Meteor.setTimeout(function() {
- crowd.sync();
- }, 1000 * 30);
- } else {
- logger.info('Disabling CROWD user sync');
+const addCronJob = _.debounce(Meteor.bindEnvironment(function addCronJobDebounced() {
+ if (RocketChat.settings.get('CROWD_Sync_User_Data') !== true) {
+ logger.info('Disabling CROWD Background Sync');
+ if (SyncedCron.nextScheduledAtDate(jobName)) {
+ SyncedCron.remove(jobName);
+ }
+ return;
+ }
+
+ const crowd = new CROWD();
+
+ if (RocketChat.settings.get('CROWD_Sync_Interval')) {
+ logger.info('Enabling CROWD Background Sync');
+ SyncedCron.add({
+ name: jobName,
+ schedule: (parser) => parser.text(RocketChat.settings.get('CROWD_Sync_Interval')),
+ job() {
+ crowd.sync();
+ },
+ });
+ SyncedCron.start();
}
+}), 500);
+
+Meteor.startup(() => {
+ Meteor.defer(() => {
+ RocketChat.settings.get('CROWD_Sync_Interval', addCronJob);
+ RocketChat.settings.get('CROWD_Sync_User_Data', addCronJob);
+ });
});
Meteor.methods({
@@ -238,18 +281,43 @@ Meteor.methods({
throw new Meteor.Error('crowd_disabled');
}
- const crowd = new CROWD();
-
try {
+ const crowd = new CROWD();
crowd.checkConnection();
+
+ return {
+ message: 'Connection success',
+ params: [],
+ };
} catch (error) {
logger.error('Invalid crowd connection details, check the url and application username/password and make sure this server is allowed to speak to crowd');
throw new Meteor.Error('Invalid connection details', '', { method: 'crowd_test_connection' });
}
+ },
+ crowd_sync_users() {
+ const user = Meteor.user();
+ if (RocketChat.settings.get('CROWD_Enable') !== true) {
+ throw new Meteor.Error('crowd_disabled');
+ }
- return {
- message: 'Connection success',
- params: [],
- };
+ if (!RocketChat.authz.hasRole(user._id, 'admin')) {
+ throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'crowd_sync_users' });
+ }
+
+ try {
+ const crowd = new CROWD();
+ const startTime = Date.now();
+ crowd.sync();
+ const stopTime = Date.now();
+ const actual = Math.ceil((stopTime - startTime) / 1000);
+
+ return {
+ message: `User data synced in ${ actual } seconds`,
+ params: [],
+ };
+ } catch (error) {
+ logger.error('Error syncing user data. ', error.message);
+ throw new Meteor.Error('Error syncing user data', '', { method: 'crowd_sync_users' });
+ }
},
});
diff --git a/packages/rocketchat-crowd/server/index.js b/packages/rocketchat-crowd/server/index.js
new file mode 100644
index 000000000000..33b6eab8d4f7
--- /dev/null
+++ b/packages/rocketchat-crowd/server/index.js
@@ -0,0 +1,7 @@
+import './settings';
+import { CROWD } from './crowd';
+
+export {
+ CROWD,
+};
+
diff --git a/packages/rocketchat-crowd/server/settings.js b/packages/rocketchat-crowd/server/settings.js
index 7cf9aaa33904..960a80f687dc 100644
--- a/packages/rocketchat-crowd/server/settings.js
+++ b/packages/rocketchat-crowd/server/settings.js
@@ -1,12 +1,20 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(function() {
RocketChat.settings.addGroup('AtlassianCrowd', function() {
const enableQuery = { _id: 'CROWD_Enable', value: true };
+ const enableSyncQuery = [enableQuery, { _id: 'CROWD_Sync_User_Data', value: true }];
+
this.add('CROWD_Enable', false, { type: 'boolean', public: true, i18nLabel: 'Enabled' });
this.add('CROWD_URL', '', { type: 'string', enableQuery, i18nLabel: 'URL' });
this.add('CROWD_Reject_Unauthorized', true, { type: 'boolean', enableQuery });
this.add('CROWD_APP_USERNAME', '', { type: 'string', enableQuery, i18nLabel: 'Username' });
this.add('CROWD_APP_PASSWORD', '', { type: 'password', enableQuery, i18nLabel: 'Password' });
this.add('CROWD_Sync_User_Data', false, { type: 'boolean', enableQuery, i18nLabel: 'Sync_Users' });
+ this.add('CROWD_Sync_Interval', 'Every 60 mins', { type: 'string', enableQuery: enableSyncQuery, i18nLabel: 'Sync_Interval', i18nDescription: 'Crowd_sync_interval_Description' });
+ this.add('CROWD_Clean_Usernames', true, { type: 'boolean', enableQuery, i18nLabel: 'Clean_Usernames', i18nDescription: 'Crowd_clean_usernames_Description' });
this.add('CROWD_Test_Connection', 'crowd_test_connection', { type: 'action', actionText: 'Test_Connection', i18nLabel: 'Test_Connection' });
+ this.add('CROWD_Sync_Users', 'crowd_sync_users', { type: 'action', actionText: 'Sync_Users', i18nLabel: 'Sync_Users' });
});
});
diff --git a/packages/rocketchat-custom-oauth/client/custom_oauth_client.js b/packages/rocketchat-custom-oauth/client/custom_oauth_client.js
index 2f2a506b8f25..91405d86b5d3 100644
--- a/packages/rocketchat-custom-oauth/client/custom_oauth_client.js
+++ b/packages/rocketchat-custom-oauth/client/custom_oauth_client.js
@@ -1,4 +1,9 @@
-/* globals OAuth*/
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { Accounts } from 'meteor/accounts-base';
+import { Random } from 'meteor/random';
+import { ServiceConfiguration } from 'meteor/service-configuration';
+import { OAuth } from 'meteor/oauth';
import s from 'underscore.string';
// Request custom OAuth credentials for the user
diff --git a/packages/rocketchat-custom-oauth/package.js b/packages/rocketchat-custom-oauth/package.js
index 61959f683b9d..2bc7cb80ca7a 100644
--- a/packages/rocketchat-custom-oauth/package.js
+++ b/packages/rocketchat-custom-oauth/package.js
@@ -12,6 +12,7 @@ Package.onUse(function(api) {
api.use('ecmascript');
api.use('accounts-oauth');
api.use('service-configuration');
+ api.use('rocketchat:logger');
api.use('templating', 'client');
diff --git a/packages/rocketchat-custom-oauth/server/custom_oauth_server.js b/packages/rocketchat-custom-oauth/server/custom_oauth_server.js
index 416f87128adc..5f31776d85c1 100644
--- a/packages/rocketchat-custom-oauth/server/custom_oauth_server.js
+++ b/packages/rocketchat-custom-oauth/server/custom_oauth_server.js
@@ -1,4 +1,10 @@
-/* globals OAuth*/
+import { Meteor } from 'meteor/meteor';
+import { Match } from 'meteor/check';
+import { Accounts } from 'meteor/accounts-base';
+import { OAuth } from 'meteor/oauth';
+import { HTTP } from 'meteor/http';
+import { ServiceConfiguration } from 'meteor/service-configuration';
+import { Logger } from 'meteor/rocketchat:logger';
import _ from 'underscore';
const logger = new Logger('CustomOAuth');
diff --git a/packages/rocketchat-custom-sounds/client/admin/adminSounds.js b/packages/rocketchat-custom-sounds/client/admin/adminSounds.js
index a1f8ecf28c0a..aeacec75b331 100644
--- a/packages/rocketchat-custom-sounds/client/admin/adminSounds.js
+++ b/packages/rocketchat-custom-sounds/client/admin/adminSounds.js
@@ -1,6 +1,11 @@
-import s from 'underscore.string';
-
+import { ReactiveVar } from 'meteor/reactive-var';
import { RocketChatTabBar } from 'meteor/rocketchat:lib';
+import { Tracker } from 'meteor/tracker';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { Template } from 'meteor/templating';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { SideNav } from 'meteor/rocketchat:ui';
+import s from 'underscore.string';
Template.adminSounds.helpers({
isReady() {
diff --git a/packages/rocketchat-custom-sounds/client/admin/route.js b/packages/rocketchat-custom-sounds/client/admin/route.js
index da8f9214515c..cf12f9949f6a 100644
--- a/packages/rocketchat-custom-sounds/client/admin/route.js
+++ b/packages/rocketchat-custom-sounds/client/admin/route.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { BlazeLayout } from 'meteor/kadira:blaze-layout';
+
FlowRouter.route('/admin/custom-sounds', {
name: 'custom-sounds',
subscriptions(/* params, queryParams*/) {
diff --git a/packages/rocketchat-custom-sounds/client/admin/soundEdit.js b/packages/rocketchat-custom-sounds/client/admin/soundEdit.js
index adfad401baf8..4caa4cb55235 100644
--- a/packages/rocketchat-custom-sounds/client/admin/soundEdit.js
+++ b/packages/rocketchat-custom-sounds/client/admin/soundEdit.js
@@ -1,3 +1,8 @@
+import { Meteor } from 'meteor/meteor';
+import { Template } from 'meteor/templating';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { t } from 'meteor/rocketchat:utils';
+import { handleError } from 'meteor/rocketchat:lib';
import toastr from 'toastr';
import s from 'underscore.string';
diff --git a/packages/rocketchat-custom-sounds/client/admin/soundInfo.js b/packages/rocketchat-custom-sounds/client/admin/soundInfo.js
index ca40311d815b..9a22be4b34b2 100644
--- a/packages/rocketchat-custom-sounds/client/admin/soundInfo.js
+++ b/packages/rocketchat-custom-sounds/client/admin/soundInfo.js
@@ -1,3 +1,10 @@
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Template } from 'meteor/templating';
+import { modal } from 'meteor/rocketchat:ui';
+import { t } from 'meteor/rocketchat:utils';
+import { handleError } from 'meteor/rocketchat:lib';
+
Template.soundInfo.helpers({
name() {
const sound = Template.instance().sound.get();
diff --git a/packages/rocketchat-custom-sounds/client/admin/startup.js b/packages/rocketchat-custom-sounds/client/admin/startup.js
index e17d7389925b..c9e888e96850 100644
--- a/packages/rocketchat-custom-sounds/client/admin/startup.js
+++ b/packages/rocketchat-custom-sounds/client/admin/startup.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.AdminBox.addOption({
href: 'custom-sounds',
i18nLabel: 'Custom_Sounds',
diff --git a/packages/rocketchat-custom-sounds/client/index.js b/packages/rocketchat-custom-sounds/client/index.js
new file mode 100644
index 000000000000..4199d882e842
--- /dev/null
+++ b/packages/rocketchat-custom-sounds/client/index.js
@@ -0,0 +1,14 @@
+import './lib/CustomSounds';
+import './models/CustomSounds';
+import './notifications/deleteCustomSound';
+import './notifications/updateCustomSound';
+import './admin/adminSoundEdit.html';
+import './admin/adminSoundInfo.html';
+import './admin/adminSounds.html';
+import './admin/adminSounds';
+import './admin/soundEdit.html';
+import './admin/soundEdit';
+import './admin/soundInfo.html';
+import './admin/soundInfo';
+import './admin/route';
+import './admin/startup';
diff --git a/packages/rocketchat-custom-sounds/client/lib/CustomSounds.js b/packages/rocketchat-custom-sounds/client/lib/CustomSounds.js
index 4bce88b54dc9..69bf7c7c6acb 100644
--- a/packages/rocketchat-custom-sounds/client/lib/CustomSounds.js
+++ b/packages/rocketchat-custom-sounds/client/lib/CustomSounds.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
class CustomSounds {
diff --git a/packages/rocketchat-custom-sounds/client/models/CustomSounds.js b/packages/rocketchat-custom-sounds/client/models/CustomSounds.js
index 59c847dd1b79..b43ee109d9f7 100644
--- a/packages/rocketchat-custom-sounds/client/models/CustomSounds.js
+++ b/packages/rocketchat-custom-sounds/client/models/CustomSounds.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
class CustomSounds extends RocketChat.models._Base {
constructor() {
super();
diff --git a/packages/rocketchat-custom-sounds/client/notifications/deleteCustomSound.js b/packages/rocketchat-custom-sounds/client/notifications/deleteCustomSound.js
index 2ba76233e4f4..91560d7d28df 100644
--- a/packages/rocketchat-custom-sounds/client/notifications/deleteCustomSound.js
+++ b/packages/rocketchat-custom-sounds/client/notifications/deleteCustomSound.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(() =>
RocketChat.CachedCollectionManager.onLogin(() =>
RocketChat.Notifications.onAll('deleteCustomSound', (data) => RocketChat.CustomSounds.remove(data.soundData))
diff --git a/packages/rocketchat-custom-sounds/client/notifications/updateCustomSound.js b/packages/rocketchat-custom-sounds/client/notifications/updateCustomSound.js
index ef1252b658e6..75903369bd06 100644
--- a/packages/rocketchat-custom-sounds/client/notifications/updateCustomSound.js
+++ b/packages/rocketchat-custom-sounds/client/notifications/updateCustomSound.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(() =>
RocketChat.CachedCollectionManager.onLogin(() =>
RocketChat.Notifications.onAll('updateCustomSound', (data) => RocketChat.CustomSounds.update(data.soundData))
diff --git a/packages/rocketchat-custom-sounds/package.js b/packages/rocketchat-custom-sounds/package.js
index aa68853798c4..79d876e0e230 100644
--- a/packages/rocketchat-custom-sounds/package.js
+++ b/packages/rocketchat-custom-sounds/package.js
@@ -10,42 +10,14 @@ Package.onUse(function(api) {
'ecmascript',
'rocketchat:file',
'rocketchat:lib',
+ 'rocketchat:utils',
'templating',
'reactive-var',
'webapp',
+ 'kadira:flow-router',
+ 'kadira:blaze-layout',
]);
-
- api.use('kadira:flow-router', 'client');
-
- api.addFiles('server/startup/custom-sounds.js', 'server');
- api.addFiles('server/startup/permissions.js', 'server');
- api.addFiles('server/startup/settings.js', 'server');
-
- api.addFiles('server/models/CustomSounds.js', 'server');
- api.addFiles('server/publications/customSounds.js', 'server');
-
- api.addFiles([
- 'server/methods/deleteCustomSound.js',
- 'server/methods/insertOrUpdateSound.js',
- 'server/methods/listCustomSounds.js',
- 'server/methods/uploadCustomSound.js',
- ], 'server');
-
api.addFiles('assets/stylesheets/customSoundsAdmin.css', 'client');
-
- api.addFiles('client/admin/startup.js', 'client');
- api.addFiles('client/admin/adminSounds.html', 'client');
- api.addFiles('client/admin/adminSounds.js', 'client');
- api.addFiles('client/admin/adminSoundEdit.html', 'client');
- api.addFiles('client/admin/adminSoundInfo.html', 'client');
- api.addFiles('client/admin/soundEdit.html', 'client');
- api.addFiles('client/admin/soundEdit.js', 'client');
- api.addFiles('client/admin/soundInfo.html', 'client');
- api.addFiles('client/admin/soundInfo.js', 'client');
- api.addFiles('client/admin/route.js', 'client');
-
- api.addFiles('client/lib/CustomSounds.js', 'client');
- api.addFiles('client/models/CustomSounds.js', 'client');
- api.addFiles('client/notifications/updateCustomSound.js', 'client');
- api.addFiles('client/notifications/deleteCustomSound.js', 'client');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-custom-sounds/server/index.js b/packages/rocketchat-custom-sounds/server/index.js
new file mode 100644
index 000000000000..9caeb06c2abe
--- /dev/null
+++ b/packages/rocketchat-custom-sounds/server/index.js
@@ -0,0 +1,9 @@
+import './startup/custom-sounds';
+import './startup/permissions';
+import './startup/settings';
+import './models/CustomSounds';
+import './methods/deleteCustomSound';
+import './methods/insertOrUpdateSound';
+import './methods/listCustomSounds';
+import './methods/uploadCustomSound';
+import './publications/customSounds';
diff --git a/packages/rocketchat-custom-sounds/server/methods/deleteCustomSound.js b/packages/rocketchat-custom-sounds/server/methods/deleteCustomSound.js
index f9fca4fcafca..d74871c90ca9 100644
--- a/packages/rocketchat-custom-sounds/server/methods/deleteCustomSound.js
+++ b/packages/rocketchat-custom-sounds/server/methods/deleteCustomSound.js
@@ -1,4 +1,7 @@
-/* globals RocketChatFileCustomSoundsInstance */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RocketChatFileCustomSoundsInstance } from '../startup/custom-sounds';
+
Meteor.methods({
deleteCustomSound(_id) {
let sound = null;
diff --git a/packages/rocketchat-custom-sounds/server/methods/insertOrUpdateSound.js b/packages/rocketchat-custom-sounds/server/methods/insertOrUpdateSound.js
index 1bd3e4c618af..cad6c03d1e85 100644
--- a/packages/rocketchat-custom-sounds/server/methods/insertOrUpdateSound.js
+++ b/packages/rocketchat-custom-sounds/server/methods/insertOrUpdateSound.js
@@ -1,4 +1,6 @@
-/* globals RocketChatFileCustomSoundsInstance */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RocketChatFileCustomSoundsInstance } from '../startup/custom-sounds';
import s from 'underscore.string';
Meteor.methods({
diff --git a/packages/rocketchat-custom-sounds/server/methods/listCustomSounds.js b/packages/rocketchat-custom-sounds/server/methods/listCustomSounds.js
index f1b721301b65..9b38e382fbd1 100644
--- a/packages/rocketchat-custom-sounds/server/methods/listCustomSounds.js
+++ b/packages/rocketchat-custom-sounds/server/methods/listCustomSounds.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
listCustomSounds() {
return RocketChat.models.CustomSounds.find({}).fetch();
diff --git a/packages/rocketchat-custom-sounds/server/methods/uploadCustomSound.js b/packages/rocketchat-custom-sounds/server/methods/uploadCustomSound.js
index 4e265740821a..2cc8bf2404a9 100644
--- a/packages/rocketchat-custom-sounds/server/methods/uploadCustomSound.js
+++ b/packages/rocketchat-custom-sounds/server/methods/uploadCustomSound.js
@@ -1,4 +1,8 @@
-/* globals RocketChatFileCustomSoundsInstance */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RocketChatFile } from 'meteor/rocketchat:file';
+import { RocketChatFileCustomSoundsInstance } from '../startup/custom-sounds';
+
Meteor.methods({
uploadCustomSound(binaryContent, contentType, soundData) {
if (!RocketChat.authz.hasPermission(this.userId, 'manage-sounds')) {
diff --git a/packages/rocketchat-custom-sounds/server/models/CustomSounds.js b/packages/rocketchat-custom-sounds/server/models/CustomSounds.js
index 8447d7d5e750..9c05dab8a6fa 100644
--- a/packages/rocketchat-custom-sounds/server/models/CustomSounds.js
+++ b/packages/rocketchat-custom-sounds/server/models/CustomSounds.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
class CustomSounds extends RocketChat.models._Base {
constructor() {
super('custom_sounds');
diff --git a/packages/rocketchat-custom-sounds/server/publications/customSounds.js b/packages/rocketchat-custom-sounds/server/publications/customSounds.js
index 6ab9afaedfdd..2da7176ef499 100644
--- a/packages/rocketchat-custom-sounds/server/publications/customSounds.js
+++ b/packages/rocketchat-custom-sounds/server/publications/customSounds.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import s from 'underscore.string';
Meteor.publish('customSounds', function(filter, limit) {
diff --git a/packages/rocketchat-custom-sounds/server/startup/custom-sounds.js b/packages/rocketchat-custom-sounds/server/startup/custom-sounds.js
index 33cbc7d3b84c..1d6fb8a79ba5 100644
--- a/packages/rocketchat-custom-sounds/server/startup/custom-sounds.js
+++ b/packages/rocketchat-custom-sounds/server/startup/custom-sounds.js
@@ -1,6 +1,11 @@
-/* globals RocketChatFileCustomSoundsInstance */
+import { Meteor } from 'meteor/meteor';
+import { WebApp } from 'meteor/webapp';
+import { RocketChatFile } from 'meteor/rocketchat:file';
+import { RocketChat } from 'meteor/rocketchat:lib';
import _ from 'underscore';
+export let RocketChatFileCustomSoundsInstance;
+
Meteor.startup(function() {
let storeType = 'GridFS';
@@ -23,13 +28,11 @@ Meteor.startup(function() {
}
}
- this.RocketChatFileCustomSoundsInstance = new RocketChatStore({
+ RocketChatFileCustomSoundsInstance = new RocketChatStore({
name: 'custom_sounds',
absolutePath: path,
});
- self = this;
-
return WebApp.connectHandlers.use('/custom-sounds/', Meteor.bindEnvironment(function(req, res/* , next*/) {
const params =
{ sound: decodeURIComponent(req.url.replace(/^\//, '').replace(/\?.*$/, '')) };
diff --git a/packages/rocketchat-custom-sounds/server/startup/permissions.js b/packages/rocketchat-custom-sounds/server/startup/permissions.js
index c86644103c97..90c5ca5dffdb 100644
--- a/packages/rocketchat-custom-sounds/server/startup/permissions.js
+++ b/packages/rocketchat-custom-sounds/server/startup/permissions.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.startup(() => {
if (RocketChat.models && RocketChat.models.Permissions) {
RocketChat.models.Permissions.createOrUpdate('manage-sounds', ['admin']);
diff --git a/packages/rocketchat-custom-sounds/server/startup/settings.js b/packages/rocketchat-custom-sounds/server/startup/settings.js
index 4d04f2d8b2a3..67c1fbeb769e 100644
--- a/packages/rocketchat-custom-sounds/server/startup/settings.js
+++ b/packages/rocketchat-custom-sounds/server/startup/settings.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.settings.addGroup('CustomSoundsFilesystem', function() {
this.add('CustomSounds_Storage_Type', 'GridFS', {
type: 'select',
diff --git a/packages/rocketchat-dolphin/client/index.js b/packages/rocketchat-dolphin/client/index.js
new file mode 100644
index 000000000000..e44dbe195eff
--- /dev/null
+++ b/packages/rocketchat-dolphin/client/index.js
@@ -0,0 +1 @@
+import '../lib/common';
diff --git a/packages/rocketchat-dolphin/login-button.css b/packages/rocketchat-dolphin/client/login-button.css
similarity index 100%
rename from packages/rocketchat-dolphin/login-button.css
rename to packages/rocketchat-dolphin/client/login-button.css
diff --git a/packages/rocketchat-dolphin/common.js b/packages/rocketchat-dolphin/lib/common.js
similarity index 88%
rename from packages/rocketchat-dolphin/common.js
rename to packages/rocketchat-dolphin/lib/common.js
index 28426895cfbe..7d7b634c7880 100644
--- a/packages/rocketchat-dolphin/common.js
+++ b/packages/rocketchat-dolphin/lib/common.js
@@ -1,5 +1,8 @@
-// Dolphin OAuth2
-/* globals CustomOAuth */
+import { Meteor } from 'meteor/meteor';
+import { Tracker } from 'meteor/tracker';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { ServiceConfiguration } from 'meteor/service-configuration';
+import { CustomOAuth } from 'meteor/rocketchat:custom-oauth';
const config = {
serverURL: '',
diff --git a/packages/rocketchat-dolphin/package.js b/packages/rocketchat-dolphin/package.js
index 10c3b6fdcd42..751718742c4e 100644
--- a/packages/rocketchat-dolphin/package.js
+++ b/packages/rocketchat-dolphin/package.js
@@ -7,13 +7,14 @@ Package.describe({
Package.onUse(function(api) {
api.versionsFrom('1.0');
- api.use('ecmascript');
- api.use('service-configuration');
- api.use('rocketchat:lib@0.0.1');
- api.use('rocketchat:custom-oauth');
- api.addFiles('common.js');
- api.addFiles('login-button.css', 'client');
- api.addFiles('startup.js', 'server');
-
- api.use('templating', 'client');
+ api.use([
+ 'ecmascript',
+ 'service-configuration',
+ 'rocketchat:lib@0.0.1',
+ 'rocketchat:custom-oauth',
+ 'templating',
+ ]);
+ api.addFiles('client/login-button.css', 'client');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-dolphin/server/index.js b/packages/rocketchat-dolphin/server/index.js
new file mode 100644
index 000000000000..d4fffe60273a
--- /dev/null
+++ b/packages/rocketchat-dolphin/server/index.js
@@ -0,0 +1,2 @@
+import './startup';
+import '../lib/common';
diff --git a/packages/rocketchat-dolphin/startup.js b/packages/rocketchat-dolphin/server/startup.js
similarity index 96%
rename from packages/rocketchat-dolphin/startup.js
rename to packages/rocketchat-dolphin/server/startup.js
index 4110c5f59a75..c993175df623 100644
--- a/packages/rocketchat-dolphin/startup.js
+++ b/packages/rocketchat-dolphin/server/startup.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.settings.add('Accounts_OAuth_Dolphin_URL', '', { type: 'string', group: 'OAuth', public: true, section: 'Dolphin', i18nLabel: 'URL' });
RocketChat.settings.add('Accounts_OAuth_Dolphin', false, { type: 'boolean', group: 'OAuth', section: 'Dolphin', i18nLabel: 'Accounts_OAuth_Custom_Enable' });
RocketChat.settings.add('Accounts_OAuth_Dolphin_id', '', { type: 'string', group: 'OAuth', section: 'Dolphin', i18nLabel: 'Accounts_OAuth_Custom_id' });
diff --git a/packages/rocketchat-drupal/client/index.js b/packages/rocketchat-drupal/client/index.js
new file mode 100644
index 000000000000..e44dbe195eff
--- /dev/null
+++ b/packages/rocketchat-drupal/client/index.js
@@ -0,0 +1 @@
+import '../lib/common';
diff --git a/packages/rocketchat-drupal/login-button.css b/packages/rocketchat-drupal/client/login-button.css
similarity index 100%
rename from packages/rocketchat-drupal/login-button.css
rename to packages/rocketchat-drupal/client/login-button.css
diff --git a/packages/rocketchat-drupal/common.js b/packages/rocketchat-drupal/lib/common.js
similarity index 84%
rename from packages/rocketchat-drupal/common.js
rename to packages/rocketchat-drupal/lib/common.js
index 338854cd2a32..6386d9de4061 100644
--- a/packages/rocketchat-drupal/common.js
+++ b/packages/rocketchat-drupal/lib/common.js
@@ -1,4 +1,7 @@
-/* global CustomOAuth */
+import { Meteor } from 'meteor/meteor';
+import { Tracker } from 'meteor/tracker';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { CustomOAuth } from 'meteor/rocketchat:custom-oauth';
// Drupal Server CallBack URL needs to be http(s)://{rocketchat.server}[:port]/_oauth/drupal
// In RocketChat -> Administration the URL needs to be http(s)://{drupal.server}/
diff --git a/packages/rocketchat-drupal/package.js b/packages/rocketchat-drupal/package.js
index e84e9c543c83..5841812c23e7 100644
--- a/packages/rocketchat-drupal/package.js
+++ b/packages/rocketchat-drupal/package.js
@@ -6,17 +6,15 @@ Package.describe({
Package.onUse(function(api) {
api.versionsFrom('1.0');
- api.use('ecmascript');
- api.use('service-configuration');
- api.use('rocketchat:lib@0.0.1');
- api.use('rocketchat:custom-oauth');
-
- // api.use('templating', 'client');
-
- api.addFiles('common.js');
- api.addFiles('login-button.css', 'client');
- api.addFiles('startup.js', 'server');
-
- api.use('templating', 'client');
+ api.use([
+ 'ecmascript',
+ 'service-configuration',
+ 'rocketchat:lib@0.0.1',
+ 'rocketchat:custom-oauth',
+ 'templating',
+ ]);
+ api.addFiles('client/login-button.css', 'client');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-drupal/server/index.js b/packages/rocketchat-drupal/server/index.js
new file mode 100644
index 000000000000..d4fffe60273a
--- /dev/null
+++ b/packages/rocketchat-drupal/server/index.js
@@ -0,0 +1,2 @@
+import './startup';
+import '../lib/common';
diff --git a/packages/rocketchat-drupal/startup.js b/packages/rocketchat-drupal/server/startup.js
similarity index 92%
rename from packages/rocketchat-drupal/startup.js
rename to packages/rocketchat-drupal/server/startup.js
index 21bc942a3d06..389c2d06dbf1 100644
--- a/packages/rocketchat-drupal/startup.js
+++ b/packages/rocketchat-drupal/server/startup.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.settings.addGroup('OAuth', function() {
this.section('Drupal', function() {
const enableQuery = {
diff --git a/packages/rocketchat-e2e/.eslintrc b/packages/rocketchat-e2e/.eslintrc
deleted file mode 100644
index 625a0007ef14..000000000000
--- a/packages/rocketchat-e2e/.eslintrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "extends": ["@rocket.chat/eslint-config"],
- "root": true
-}
diff --git a/packages/rocketchat-e2e/client/accountEncryption.js b/packages/rocketchat-e2e/client/accountEncryption.js
index 9b09ebbf6d41..77a927bba701 100644
--- a/packages/rocketchat-e2e/client/accountEncryption.js
+++ b/packages/rocketchat-e2e/client/accountEncryption.js
@@ -1,7 +1,9 @@
-/* globals Template, t, ReactiveVar */
+import { Template } from 'meteor/templating';
+import { ReactiveVar } from 'meteor/reactive-var';
import toastr from 'toastr';
import s from 'underscore.string';
import { RocketChat } from 'meteor/rocketchat:lib';
+import { t } from 'meteor/rocketchat:utils';
import { e2e } from 'meteor/rocketchat:e2e';
Template.accountEncryption.helpers({
diff --git a/packages/rocketchat-e2e/client/rocketchat.e2e.js b/packages/rocketchat-e2e/client/rocketchat.e2e.js
index 8a401a6b8f2c..2ef8992bd0ab 100644
--- a/packages/rocketchat-e2e/client/rocketchat.e2e.js
+++ b/packages/rocketchat-e2e/client/rocketchat.e2e.js
@@ -1,7 +1,3 @@
-/* globals alerts, modal */
-
-import './stylesheets/e2e';
-
import { Meteor } from 'meteor/meteor';
import { Random } from 'meteor/random';
import { ReactiveVar } from 'meteor/reactive-var';
@@ -67,6 +63,10 @@ class E2E {
_id: roomId,
});
+ if (!room) {
+ return;
+ }
+
if (room.encrypted !== true) {
return;
}
@@ -185,6 +185,7 @@ class E2E {
}
async stopClient() {
+ console.log('E2E -> Stop Client');
// This flag is used to avoid closing unrelated alerts.
if (showingE2EAlert) {
alerts.close();
@@ -192,7 +193,16 @@ class E2E {
localStorage.removeItem('public_key');
localStorage.removeItem('private_key');
+ this.instancesByRoomId = {};
+ this.privateKey = null;
+ this.enabled.set(false);
+ this._ready.set(false);
this.started = false;
+
+ this.readyPromise = new Deferred();
+ this.readyPromise.then(() => {
+ this._ready.set(true);
+ });
}
setupListeners() {
@@ -236,6 +246,7 @@ class E2E {
async loadKeysFromDB() {
try {
const { public_key, private_key } = await call('e2e.fetchMyKeys');
+
this.db_public_key = public_key;
this.db_private_key = private_key;
} catch (error) {
@@ -280,6 +291,12 @@ class E2E {
} catch (error) {
return console.error('E2E -> Error exporting private key: ', error);
}
+
+ this.requestSubscriptionKeys();
+ }
+
+ async requestSubscriptionKeys() {
+ call('e2e.requestSubscriptionKeys');
}
createRandomPassword() {
diff --git a/packages/rocketchat-e2e/package.js b/packages/rocketchat-e2e/package.js
index 2122c143727d..bb189c659e59 100644
--- a/packages/rocketchat-e2e/package.js
+++ b/packages/rocketchat-e2e/package.js
@@ -1,5 +1,3 @@
-/* globals Package: false */
-
Package.describe({
name: 'rocketchat:e2e',
version: '0.0.1',
@@ -13,10 +11,11 @@ Package.onUse(function(api) {
'less',
'mizzao:timesync',
'rocketchat:lib',
+ 'rocketchat:utils',
'templating',
'sha',
]);
-
+ api.addFiles('client/stylesheets/e2e.less', 'client');
api.mainModule('client/rocketchat.e2e.js', 'client');
api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-e2e/server/index.js b/packages/rocketchat-e2e/server/index.js
index 9380368df0e2..c7167c3f6fd3 100644
--- a/packages/rocketchat-e2e/server/index.js
+++ b/packages/rocketchat-e2e/server/index.js
@@ -9,6 +9,8 @@ import './methods/getUsersOfRoomWithoutKey';
import './methods/updateGroupKey';
import './methods/setRoomKeyID';
import './methods/fetchMyKeys';
+import './methods/resetUserE2EKey';
+import './methods/requestSubscriptionKeys';
RocketChat.callbacks.add('afterJoinRoom', (user, room) => {
RocketChat.Notifications.notifyRoom('e2e.keyRequest', room._id, room.e2eKeyId);
diff --git a/packages/rocketchat-e2e/server/methods/requestSubscriptionKeys.js b/packages/rocketchat-e2e/server/methods/requestSubscriptionKeys.js
new file mode 100644
index 000000000000..50d15ce4814d
--- /dev/null
+++ b/packages/rocketchat-e2e/server/methods/requestSubscriptionKeys.js
@@ -0,0 +1,33 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
+Meteor.methods({
+ 'e2e.requestSubscriptionKeys'() {
+ if (!Meteor.userId()) {
+ throw new Meteor.Error('error-invalid-user', 'Invalid user', {
+ method: 'requestSubscriptionKeys',
+ });
+ }
+
+ // Get all encrypted rooms that the user is subscribed to and has no E2E key yet
+ const subscriptions = RocketChat.models.Subscriptions.findByUserIdWithoutE2E(Meteor.userId());
+ const roomIds = subscriptions.map((subscription) => subscription.rid);
+
+ // For all subscriptions without E2E key, get the rooms that have encryption enabled
+ const query = {
+ e2eKeyId : {
+ $exists: true,
+ },
+ _id : {
+ $in: roomIds,
+ },
+ };
+
+ const rooms = RocketChat.models.Rooms.find(query);
+ rooms.forEach((room) => {
+ RocketChat.Notifications.notifyRoom('e2e.keyRequest', room._id, room.e2eKeyId);
+ });
+
+ return true;
+ },
+});
diff --git a/packages/rocketchat-e2e/server/methods/resetUserE2EKey.js b/packages/rocketchat-e2e/server/methods/resetUserE2EKey.js
new file mode 100644
index 000000000000..53599f16d284
--- /dev/null
+++ b/packages/rocketchat-e2e/server/methods/resetUserE2EKey.js
@@ -0,0 +1,25 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
+Meteor.methods({
+ 'e2e.resetUserE2EKey'(userId) {
+ if (!Meteor.userId()) {
+ throw new Meteor.Error('error-invalid-user', 'Invalid user', {
+ method: 'resetUserE2EKey',
+ });
+ }
+
+ if (RocketChat.authz.hasPermission(Meteor.userId(), 'reset-other-user-e2e-key') !== true) {
+ throw new Meteor.Error('error-not-allowed', 'Not allowed', {
+ method: 'resetUserE2EKey',
+ });
+ }
+
+ RocketChat.models.Users.resetE2EKey(userId);
+ RocketChat.models.Subscriptions.resetUserE2EKey(userId);
+
+ // Force the user to logout, so that the keys can be generated again
+ RocketChat.models.Users.removeResumeService(userId);
+ return true;
+ },
+});
diff --git a/packages/rocketchat-e2e/server/models/Subscriptions.js b/packages/rocketchat-e2e/server/models/Subscriptions.js
index 88af4c7d357b..2ab46b438e54 100644
--- a/packages/rocketchat-e2e/server/models/Subscriptions.js
+++ b/packages/rocketchat-e2e/server/models/Subscriptions.js
@@ -17,3 +17,24 @@ RocketChat.models.Subscriptions.findByRidWithoutE2EKey = function(rid, options)
return this.find(query, options);
};
+
+RocketChat.models.Subscriptions.resetUserE2EKey = function(userId) {
+ this.update({ 'u._id': userId }, {
+ $unset: {
+ E2EKey: '',
+ },
+ }, {
+ multi: true,
+ });
+};
+
+RocketChat.models.Subscriptions.findByUserIdWithoutE2E = function(userId, options) {
+ const query = {
+ 'u._id': userId,
+ E2EKey: {
+ $exists: false,
+ },
+ };
+
+ return this.find(query, options);
+};
diff --git a/packages/rocketchat-e2e/server/models/Users.js b/packages/rocketchat-e2e/server/models/Users.js
index ac072f960d45..3a099808b0d9 100644
--- a/packages/rocketchat-e2e/server/models/Users.js
+++ b/packages/rocketchat-e2e/server/models/Users.js
@@ -34,3 +34,11 @@ RocketChat.models.Users.findByIdsWithPublicE2EKey = function(ids, options) {
return this.find(query, options);
};
+
+RocketChat.models.Users.resetE2EKey = function(userId) {
+ this.update({ _id: userId }, {
+ $unset: {
+ e2e: '',
+ },
+ });
+};
diff --git a/packages/rocketchat-emoji-custom/admin/adminEmoji.html b/packages/rocketchat-emoji-custom/client/admin/adminEmoji.html
similarity index 100%
rename from packages/rocketchat-emoji-custom/admin/adminEmoji.html
rename to packages/rocketchat-emoji-custom/client/admin/adminEmoji.html
diff --git a/packages/rocketchat-emoji-custom/admin/adminEmoji.js b/packages/rocketchat-emoji-custom/client/admin/adminEmoji.js
similarity index 90%
rename from packages/rocketchat-emoji-custom/admin/adminEmoji.js
rename to packages/rocketchat-emoji-custom/client/admin/adminEmoji.js
index aee72d545616..b73fe2b8829a 100644
--- a/packages/rocketchat-emoji-custom/admin/adminEmoji.js
+++ b/packages/rocketchat-emoji-custom/client/admin/adminEmoji.js
@@ -1,7 +1,11 @@
+import { ReactiveVar } from 'meteor/reactive-var';
+import { RocketChat, RocketChatTabBar } from 'meteor/rocketchat:lib';
+import { Tracker } from 'meteor/tracker';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { Template } from 'meteor/templating';
+import { SideNav } from 'meteor/rocketchat:ui';
import s from 'underscore.string';
-import { RocketChatTabBar } from 'meteor/rocketchat:lib';
-
Template.adminEmoji.helpers({
isReady() {
if (Template.instance().ready != null) {
diff --git a/packages/rocketchat-emoji-custom/admin/adminEmojiEdit.html b/packages/rocketchat-emoji-custom/client/admin/adminEmojiEdit.html
similarity index 100%
rename from packages/rocketchat-emoji-custom/admin/adminEmojiEdit.html
rename to packages/rocketchat-emoji-custom/client/admin/adminEmojiEdit.html
diff --git a/packages/rocketchat-emoji-custom/admin/adminEmojiInfo.html b/packages/rocketchat-emoji-custom/client/admin/adminEmojiInfo.html
similarity index 100%
rename from packages/rocketchat-emoji-custom/admin/adminEmojiInfo.html
rename to packages/rocketchat-emoji-custom/client/admin/adminEmojiInfo.html
diff --git a/packages/rocketchat-emoji-custom/admin/emojiEdit.html b/packages/rocketchat-emoji-custom/client/admin/emojiEdit.html
similarity index 100%
rename from packages/rocketchat-emoji-custom/admin/emojiEdit.html
rename to packages/rocketchat-emoji-custom/client/admin/emojiEdit.html
diff --git a/packages/rocketchat-emoji-custom/admin/emojiEdit.js b/packages/rocketchat-emoji-custom/client/admin/emojiEdit.js
similarity index 93%
rename from packages/rocketchat-emoji-custom/admin/emojiEdit.js
rename to packages/rocketchat-emoji-custom/client/admin/emojiEdit.js
index b6b12d5701fe..b318029e4dd6 100644
--- a/packages/rocketchat-emoji-custom/admin/emojiEdit.js
+++ b/packages/rocketchat-emoji-custom/client/admin/emojiEdit.js
@@ -1,3 +1,8 @@
+import { Meteor } from 'meteor/meteor';
+import { Template } from 'meteor/templating';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { handleError } from 'meteor/rocketchat:lib';
+import { t } from 'meteor/rocketchat:utils';
import toastr from 'toastr';
import s from 'underscore.string';
diff --git a/packages/rocketchat-emoji-custom/admin/emojiInfo.html b/packages/rocketchat-emoji-custom/client/admin/emojiInfo.html
similarity index 100%
rename from packages/rocketchat-emoji-custom/admin/emojiInfo.html
rename to packages/rocketchat-emoji-custom/client/admin/emojiInfo.html
diff --git a/packages/rocketchat-emoji-custom/admin/emojiInfo.js b/packages/rocketchat-emoji-custom/client/admin/emojiInfo.js
similarity index 89%
rename from packages/rocketchat-emoji-custom/admin/emojiInfo.js
rename to packages/rocketchat-emoji-custom/client/admin/emojiInfo.js
index 17ca686acfb1..3fb81a237eeb 100644
--- a/packages/rocketchat-emoji-custom/admin/emojiInfo.js
+++ b/packages/rocketchat-emoji-custom/client/admin/emojiInfo.js
@@ -1,3 +1,10 @@
+import { Meteor } from 'meteor/meteor';
+import { ReactiveVar } from 'meteor/reactive-var';
+import { Template } from 'meteor/templating';
+import { handleError } from 'meteor/rocketchat:lib';
+import { modal } from 'meteor/rocketchat:ui';
+import { t } from 'meteor/rocketchat:utils';
+
Template.emojiInfo.helpers({
name() {
const emoji = Template.instance().emoji.get();
diff --git a/packages/rocketchat-emoji-custom/admin/emojiPreview.html b/packages/rocketchat-emoji-custom/client/admin/emojiPreview.html
similarity index 100%
rename from packages/rocketchat-emoji-custom/admin/emojiPreview.html
rename to packages/rocketchat-emoji-custom/client/admin/emojiPreview.html
diff --git a/packages/rocketchat-emoji-custom/admin/route.js b/packages/rocketchat-emoji-custom/client/admin/route.js
similarity index 63%
rename from packages/rocketchat-emoji-custom/admin/route.js
rename to packages/rocketchat-emoji-custom/client/admin/route.js
index b84f0afaec0e..7c45afaa4a03 100644
--- a/packages/rocketchat-emoji-custom/admin/route.js
+++ b/packages/rocketchat-emoji-custom/client/admin/route.js
@@ -1,3 +1,7 @@
+import { Meteor } from 'meteor/meteor';
+import { FlowRouter } from 'meteor/kadira:flow-router';
+import { BlazeLayout } from 'meteor/kadira:blaze-layout';
+
FlowRouter.route('/admin/emoji-custom', {
name: 'emoji-custom',
subscriptions(/* params, queryParams*/) {
diff --git a/packages/rocketchat-emoji-custom/admin/startup.js b/packages/rocketchat-emoji-custom/client/admin/startup.js
similarity index 54%
rename from packages/rocketchat-emoji-custom/admin/startup.js
rename to packages/rocketchat-emoji-custom/client/admin/startup.js
index b9c1dc0a1938..0d6b232eb9a5 100644
--- a/packages/rocketchat-emoji-custom/admin/startup.js
+++ b/packages/rocketchat-emoji-custom/client/admin/startup.js
@@ -1,8 +1,10 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.AdminBox.addOption({
href: 'emoji-custom',
i18nLabel: 'Custom_Emoji',
icon: 'emoji',
permissionGranted() {
- return RocketChat.authz.hasAtLeastOnePermission(['manage-emoji']);
+ return RocketChat.authz.hasPermission('manage-emoji');
},
});
diff --git a/packages/rocketchat-emoji-custom/client/index.js b/packages/rocketchat-emoji-custom/client/index.js
new file mode 100644
index 000000000000..9688848698dd
--- /dev/null
+++ b/packages/rocketchat-emoji-custom/client/index.js
@@ -0,0 +1,15 @@
+import './models/EmojiCustom';
+import './lib/emojiCustom';
+import './notifications/deleteEmojiCustom';
+import './notifications/updateEmojiCustom';
+import './admin/startup';
+import './admin/adminEmoji.html';
+import './admin/adminEmoji';
+import './admin/adminEmojiEdit.html';
+import './admin/adminEmojiInfo.html';
+import './admin/emojiEdit.html';
+import './admin/emojiEdit';
+import './admin/emojiInfo.html';
+import './admin/emojiInfo';
+import './admin/emojiPreview.html';
+import './admin/route';
diff --git a/packages/rocketchat-emoji-custom/client/lib/emojiCustom.js b/packages/rocketchat-emoji-custom/client/lib/emojiCustom.js
index a48cbe20ad22..ca927a938fa5 100644
--- a/packages/rocketchat-emoji-custom/client/lib/emojiCustom.js
+++ b/packages/rocketchat-emoji-custom/client/lib/emojiCustom.js
@@ -1,36 +1,11 @@
-/* globals getEmojiUrlFromName:true, updateEmojiCustom:true, deleteEmojiCustom:true, isSetNotNull */
-RocketChat.emoji.packages.emojiCustom = {
- emojiCategories: { rocket: 'Custom' },
- toneList: {},
- list: [],
-
- render(html) {
- const regShortNames = new RegExp(`]*>.*?<\/object>|]*>.*?<\/span>|<(?:object|embed|svg|img|div|span|p|a)[^>]*>|(${ RocketChat.emoji.packages.emojiCustom.list.join('|') })`, 'gi');
-
- // replace regular shortnames first
- html = html.replace(regShortNames, function(shortname) {
- // console.log('shortname (preif) ->', shortname, html);
- if ((typeof shortname === 'undefined') || (shortname === '') || (RocketChat.emoji.packages.emojiCustom.list.indexOf(shortname) === -1)) {
- // if the shortname doesnt exist just return the entire match
- return shortname;
- } else {
- let emojiAlias = shortname.replace(/:/g, '');
-
- let dataCheck = RocketChat.emoji.list[shortname];
- if (dataCheck.hasOwnProperty('aliasOf')) {
- emojiAlias = dataCheck.aliasOf;
- dataCheck = RocketChat.emoji.list[`:${ emojiAlias }:`];
- }
-
- return `${ shortname } `;
- }
- });
-
- return html;
- },
-};
-
-getEmojiUrlFromName = function(name, extension) {
+import { Meteor } from 'meteor/meteor';
+import { Blaze } from 'meteor/blaze';
+import { Session } from 'meteor/session';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { isSetNotNull } from '../lib/function-isSet';
+import { RoomManager } from 'meteor/rocketchat:ui';
+
+export const getEmojiUrlFromName = function(name, extension) {
Session.get;
const key = `emoji_random_${ name }`;
@@ -49,7 +24,7 @@ getEmojiUrlFromName = function(name, extension) {
Blaze.registerHelper('emojiUrlFromName', getEmojiUrlFromName);
-deleteEmojiCustom = function(emojiData) {
+export const deleteEmojiCustom = function(emojiData) {
delete RocketChat.emoji.list[`:${ emojiData.name }:`];
const arrayIndex = RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.indexOf(emojiData.name);
if (arrayIndex !== -1) {
@@ -71,7 +46,7 @@ deleteEmojiCustom = function(emojiData) {
RocketChat.EmojiPicker.updateRecent();
};
-updateEmojiCustom = function(emojiData) {
+export const updateEmojiCustom = function(emojiData) {
let key = `emoji_random_${ emojiData.name }`;
Session.set(key, Math.round(Math.random() * 1000));
@@ -147,6 +122,37 @@ updateEmojiCustom = function(emojiData) {
RocketChat.EmojiPicker.updateRecent();
};
+RocketChat.emoji.packages.emojiCustom = {
+ emojiCategories: { rocket: 'Custom' },
+ toneList: {},
+ list: [],
+
+ render(html) {
+ const regShortNames = new RegExp(`]*>.*?<\/object>|]*>.*?<\/span>|<(?:object|embed|svg|img|div|span|p|a)[^>]*>|(${ RocketChat.emoji.packages.emojiCustom.list.join('|') })`, 'gi');
+
+ // replace regular shortnames first
+ html = html.replace(regShortNames, function(shortname) {
+ // console.log('shortname (preif) ->', shortname, html);
+ if ((typeof shortname === 'undefined') || (shortname === '') || (RocketChat.emoji.packages.emojiCustom.list.indexOf(shortname) === -1)) {
+ // if the shortname doesnt exist just return the entire match
+ return shortname;
+ } else {
+ let emojiAlias = shortname.replace(/:/g, '');
+
+ let dataCheck = RocketChat.emoji.list[shortname];
+ if (dataCheck.hasOwnProperty('aliasOf')) {
+ emojiAlias = dataCheck.aliasOf;
+ dataCheck = RocketChat.emoji.list[`:${ emojiAlias }:`];
+ }
+
+ return `${ shortname } `;
+ }
+ });
+
+ return html;
+ },
+};
+
Meteor.startup(() =>
RocketChat.CachedCollectionManager.onLogin(() => {
Meteor.call('listEmojiCustom', (error, result) => {
@@ -167,5 +173,3 @@ Meteor.startup(() =>
});
})
);
-
-/* exported getEmojiUrlFromName, updateEmojiCustom, deleteEmojiCustom */
diff --git a/packages/rocketchat-emoji-custom/function-isSet.js b/packages/rocketchat-emoji-custom/client/lib/function-isSet.js
similarity index 70%
rename from packages/rocketchat-emoji-custom/function-isSet.js
rename to packages/rocketchat-emoji-custom/client/lib/function-isSet.js
index 4181bb827f2f..1dd2e6e7e8a0 100644
--- a/packages/rocketchat-emoji-custom/function-isSet.js
+++ b/packages/rocketchat-emoji-custom/client/lib/function-isSet.js
@@ -1,6 +1,5 @@
-/* globals isSet:true, isSetNotNull:true */
// http://stackoverflow.com/a/26990347 function isSet() from Gajus
-isSet = function(fn) {
+export const isSet = function(fn) {
let value;
try {
value = fn();
@@ -11,7 +10,7 @@ isSet = function(fn) {
}
};
-isSetNotNull = function(fn) {
+export const isSetNotNull = function(fn) {
let value;
try {
value = fn();
@@ -21,5 +20,3 @@ isSetNotNull = function(fn) {
return value !== null && value !== undefined;
}
};
-
-/* exported isSet, isSetNotNull */
diff --git a/packages/rocketchat-emoji-custom/client/models/EmojiCustom.js b/packages/rocketchat-emoji-custom/client/models/EmojiCustom.js
index c9a99a80cbfe..79794f59848e 100644
--- a/packages/rocketchat-emoji-custom/client/models/EmojiCustom.js
+++ b/packages/rocketchat-emoji-custom/client/models/EmojiCustom.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
class EmojiCustom extends RocketChat.models._Base {
constructor() {
super();
diff --git a/packages/rocketchat-emoji-custom/client/notifications/deleteEmojiCustom.js b/packages/rocketchat-emoji-custom/client/notifications/deleteEmojiCustom.js
index 7be855ba884f..bcff8efd765e 100644
--- a/packages/rocketchat-emoji-custom/client/notifications/deleteEmojiCustom.js
+++ b/packages/rocketchat-emoji-custom/client/notifications/deleteEmojiCustom.js
@@ -1,4 +1,7 @@
-/* globals deleteEmojiCustom */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { deleteEmojiCustom } from '../lib/emojiCustom';
+
Meteor.startup(() =>
RocketChat.Notifications.onLogged('deleteEmojiCustom', (data) => deleteEmojiCustom(data.emojiData))
);
diff --git a/packages/rocketchat-emoji-custom/client/notifications/updateEmojiCustom.js b/packages/rocketchat-emoji-custom/client/notifications/updateEmojiCustom.js
index afabb4786e00..f6e33743339d 100644
--- a/packages/rocketchat-emoji-custom/client/notifications/updateEmojiCustom.js
+++ b/packages/rocketchat-emoji-custom/client/notifications/updateEmojiCustom.js
@@ -1,4 +1,7 @@
-/* globals updateEmojiCustom */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { updateEmojiCustom } from '../lib/emojiCustom';
+
Meteor.startup(() =>
RocketChat.Notifications.onLogged('updateEmojiCustom', (data) => updateEmojiCustom(data.emojiData))
);
diff --git a/packages/rocketchat-emoji-custom/package.js b/packages/rocketchat-emoji-custom/package.js
index 07c245609109..87f122eb2bc3 100644
--- a/packages/rocketchat-emoji-custom/package.js
+++ b/packages/rocketchat-emoji-custom/package.js
@@ -11,47 +11,13 @@ Package.onUse(function(api) {
'rocketchat:emoji',
'rocketchat:file',
'rocketchat:lib',
+ 'rocketchat:utils',
'templating',
'webapp',
+ 'kadira:flow-router',
+ 'kadira:blaze-layout',
]);
-
- api.use('kadira:flow-router', 'client');
-
- api.addFiles('function-isSet.js');
-
- api.addFiles('server/startup/emoji-custom.js', 'server');
- api.addFiles('server/startup/settings.js', 'server');
-
- api.addFiles('server/models/EmojiCustom.js', 'server');
- api.addFiles('server/publications/fullEmojiData.js', 'server');
-
- api.addFiles([
- 'server/methods/listEmojiCustom.js',
- 'server/methods/deleteEmojiCustom.js',
- 'server/methods/insertOrUpdateEmoji.js',
- 'server/methods/uploadEmojiCustom.js',
- ], 'server');
-
api.addFiles('assets/stylesheets/emojiCustomAdmin.css', 'client');
-
- api.addFiles([
- 'admin/startup.js',
- 'admin/adminEmoji.html',
- 'admin/adminEmoji.js',
- 'admin/adminEmojiEdit.html',
- 'admin/adminEmojiInfo.html',
- 'admin/emojiPreview.html',
- 'admin/emojiEdit.html',
- 'admin/emojiEdit.js',
- 'admin/emojiInfo.html',
- 'admin/emojiInfo.js',
- 'admin/route.js',
- ], 'client');
-
- api.addFiles([
- 'client/lib/emojiCustom.js',
- 'client/models/EmojiCustom.js',
- 'client/notifications/updateEmojiCustom.js',
- 'client/notifications/deleteEmojiCustom.js',
- ], 'client');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-emoji-custom/server/index.js b/packages/rocketchat-emoji-custom/server/index.js
new file mode 100644
index 000000000000..cc0b89be8d5b
--- /dev/null
+++ b/packages/rocketchat-emoji-custom/server/index.js
@@ -0,0 +1,8 @@
+import './startup/emoji-custom';
+import './startup/settings';
+import './models/EmojiCustom';
+import './publications/fullEmojiData';
+import './methods/listEmojiCustom';
+import './methods/deleteEmojiCustom';
+import './methods/insertOrUpdateEmoji';
+import './methods/uploadEmojiCustom';
diff --git a/packages/rocketchat-emoji-custom/server/methods/deleteEmojiCustom.js b/packages/rocketchat-emoji-custom/server/methods/deleteEmojiCustom.js
index fa06e0a5e514..38d4b6c6ee15 100644
--- a/packages/rocketchat-emoji-custom/server/methods/deleteEmojiCustom.js
+++ b/packages/rocketchat-emoji-custom/server/methods/deleteEmojiCustom.js
@@ -1,4 +1,7 @@
-/* globals RocketChatFileEmojiCustomInstance */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom';
+
Meteor.methods({
deleteEmojiCustom(emojiID) {
let emoji = null;
diff --git a/packages/rocketchat-emoji-custom/server/methods/insertOrUpdateEmoji.js b/packages/rocketchat-emoji-custom/server/methods/insertOrUpdateEmoji.js
index aea09ed452df..09112918bb5b 100644
--- a/packages/rocketchat-emoji-custom/server/methods/insertOrUpdateEmoji.js
+++ b/packages/rocketchat-emoji-custom/server/methods/insertOrUpdateEmoji.js
@@ -1,4 +1,6 @@
-/* globals RocketChatFileEmojiCustomInstance */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom';
import _ from 'underscore';
import s from 'underscore.string';
diff --git a/packages/rocketchat-emoji-custom/server/methods/listEmojiCustom.js b/packages/rocketchat-emoji-custom/server/methods/listEmojiCustom.js
index 8eb0f7d61062..876555266596 100644
--- a/packages/rocketchat-emoji-custom/server/methods/listEmojiCustom.js
+++ b/packages/rocketchat-emoji-custom/server/methods/listEmojiCustom.js
@@ -1,5 +1,8 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
Meteor.methods({
- listEmojiCustom() {
- return RocketChat.models.EmojiCustom.find({}).fetch();
+ listEmojiCustom(options = {}) {
+ return RocketChat.models.EmojiCustom.find(options).fetch();
},
});
diff --git a/packages/rocketchat-emoji-custom/server/methods/uploadEmojiCustom.js b/packages/rocketchat-emoji-custom/server/methods/uploadEmojiCustom.js
index 84e8022a873f..a99da17ffa23 100644
--- a/packages/rocketchat-emoji-custom/server/methods/uploadEmojiCustom.js
+++ b/packages/rocketchat-emoji-custom/server/methods/uploadEmojiCustom.js
@@ -1,4 +1,8 @@
-/* globals RocketChatFileEmojiCustomInstance */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RocketChatFile } from 'meteor/rocketchat:file';
+import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom';
+
Meteor.methods({
uploadEmojiCustom(binaryContent, contentType, emojiData) {
if (!RocketChat.authz.hasPermission(this.userId, 'manage-emoji')) {
diff --git a/packages/rocketchat-emoji-custom/server/models/EmojiCustom.js b/packages/rocketchat-emoji-custom/server/models/EmojiCustom.js
index 43d1136e12fe..babaf960fba0 100644
--- a/packages/rocketchat-emoji-custom/server/models/EmojiCustom.js
+++ b/packages/rocketchat-emoji-custom/server/models/EmojiCustom.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
class EmojiCustom extends RocketChat.models._Base {
constructor() {
super('custom_emoji');
diff --git a/packages/rocketchat-emoji-custom/server/publications/fullEmojiData.js b/packages/rocketchat-emoji-custom/server/publications/fullEmojiData.js
index 4e8c658708cf..daffef5d2b52 100644
--- a/packages/rocketchat-emoji-custom/server/publications/fullEmojiData.js
+++ b/packages/rocketchat-emoji-custom/server/publications/fullEmojiData.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
import s from 'underscore.string';
Meteor.publish('fullEmojiData', function(filter, limit) {
diff --git a/packages/rocketchat-emoji-custom/server/startup/emoji-custom.js b/packages/rocketchat-emoji-custom/server/startup/emoji-custom.js
index 96e46c5b0beb..7d4ea3b7906c 100644
--- a/packages/rocketchat-emoji-custom/server/startup/emoji-custom.js
+++ b/packages/rocketchat-emoji-custom/server/startup/emoji-custom.js
@@ -1,6 +1,11 @@
-/* globals RocketChatFileEmojiCustomInstance */
+import { Meteor } from 'meteor/meteor';
+import { WebApp } from 'meteor/webapp';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { RocketChatFile } from 'meteor/rocketchat:file';
import _ from 'underscore';
+export let RocketChatFileEmojiCustomInstance;
+
Meteor.startup(function() {
let storeType = 'GridFS';
@@ -23,11 +28,12 @@ Meteor.startup(function() {
}
}
- this.RocketChatFileEmojiCustomInstance = new RocketChatStore({
+ RocketChatFileEmojiCustomInstance = new RocketChatStore({
name: 'custom_emoji',
absolutePath: path,
});
+
return WebApp.connectHandlers.use('/emoji-custom/', Meteor.bindEnvironment(function(req, res/* , next*/) {
const params =
{ emoji: decodeURIComponent(req.url.replace(/^\//, '').replace(/\?.*$/, '')) };
diff --git a/packages/rocketchat-emoji-custom/server/startup/settings.js b/packages/rocketchat-emoji-custom/server/startup/settings.js
index 41c2bd36b887..2b3e516e8e84 100644
--- a/packages/rocketchat-emoji-custom/server/startup/settings.js
+++ b/packages/rocketchat-emoji-custom/server/startup/settings.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.settings.addGroup('EmojiCustomFilesystem', function() {
this.add('EmojiUpload_Storage_Type', 'GridFS', {
type: 'select',
diff --git a/packages/rocketchat-emoji-emojione/client/index.js b/packages/rocketchat-emoji-emojione/client/index.js
new file mode 100644
index 000000000000..8e716d1f414f
--- /dev/null
+++ b/packages/rocketchat-emoji-emojione/client/index.js
@@ -0,0 +1 @@
+import '../lib/rocketchat';
diff --git a/packages/rocketchat-emoji-emojione/emojiPicker.js b/packages/rocketchat-emoji-emojione/lib/emojiPicker.js
similarity index 99%
rename from packages/rocketchat-emoji-emojione/emojiPicker.js
rename to packages/rocketchat-emoji-emojione/lib/emojiPicker.js
index 08e552c4f47f..72125682f1a7 100644
--- a/packages/rocketchat-emoji-emojione/emojiPicker.js
+++ b/packages/rocketchat-emoji-emojione/lib/emojiPicker.js
@@ -1,9 +1,7 @@
-/* globals emojisByCategory:true, emojiCategories:true, toneList:true */
-
/*
* Mapping category hashes into human readable and translated names
*/
-emojiCategories = {
+export const emojiCategories = {
people: 'Smileys_and_People',
nature: 'Animals_and_Nature',
food: 'Food_and_Drink',
@@ -14,7 +12,7 @@ emojiCategories = {
flags: 'Flags',
};
-toneList = {
+export const toneList = {
raised_hands: 1,
clap: 1,
wave: 1,
@@ -101,7 +99,7 @@ toneList = {
juggling: 1,
};
-emojisByCategory = {
+export const emojisByCategory = {
people: [
'grinning',
'grimacing',
@@ -1525,5 +1523,3 @@ emojisByCategory = {
'flag_mf',
],
};
-
-/* exported emojisByCategory, emojiCategories, toneList */
diff --git a/packages/rocketchat-emoji-emojione/generateEmojiIndex.js b/packages/rocketchat-emoji-emojione/lib/generateEmojiIndex.js
similarity index 97%
rename from packages/rocketchat-emoji-emojione/generateEmojiIndex.js
rename to packages/rocketchat-emoji-emojione/lib/generateEmojiIndex.js
index f9b4a6c5ac08..8296f60fa401 100644
--- a/packages/rocketchat-emoji-emojione/generateEmojiIndex.js
+++ b/packages/rocketchat-emoji-emojione/lib/generateEmojiIndex.js
@@ -1,3 +1,4 @@
+/* eslint-disable */
// emoji.json from emojione@2.2.6
import fs from 'fs';
diff --git a/packages/rocketchat-emoji-emojione/rocketchat.js b/packages/rocketchat-emoji-emojione/lib/rocketchat.js
similarity index 84%
rename from packages/rocketchat-emoji-emojione/rocketchat.js
rename to packages/rocketchat-emoji-emojione/lib/rocketchat.js
index caaf654b2495..552cac6ee8a4 100644
--- a/packages/rocketchat-emoji-emojione/rocketchat.js
+++ b/packages/rocketchat-emoji-emojione/lib/rocketchat.js
@@ -1,4 +1,9 @@
-/* globals emojione, emojisByCategory, emojiCategories, toneList */
+import { Meteor } from 'meteor/meteor';
+import { Tracker } from 'meteor/tracker';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { emojione } from 'meteor/emojione:emojione';
+import { emojisByCategory, emojiCategories, toneList } from './emojiPicker';
+
RocketChat.emoji.packages.emojione = emojione;
RocketChat.emoji.packages.emojione.imageType = 'png';
RocketChat.emoji.packages.emojione.sprites = true;
diff --git a/packages/rocketchat-emoji-emojione/package.js b/packages/rocketchat-emoji-emojione/package.js
index 83d58382488e..2314d203164d 100644
--- a/packages/rocketchat-emoji-emojione/package.js
+++ b/packages/rocketchat-emoji-emojione/package.js
@@ -12,11 +12,7 @@ Package.onUse(function(api) {
'rocketchat:emoji',
'rocketchat:lib',
]);
-
- api.addFiles('emojiPicker.js');
-
- api.addFiles('rocketchat.js');
-
api.addFiles('client/sprites.css', 'client');
- api.addFiles('server/callbacks.js', 'server');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-emoji-emojione/server/callbacks.js b/packages/rocketchat-emoji-emojione/server/callbacks.js
index f1da979ce068..2c0edcadee73 100644
--- a/packages/rocketchat-emoji-emojione/server/callbacks.js
+++ b/packages/rocketchat-emoji-emojione/server/callbacks.js
@@ -1,4 +1,7 @@
-/* globals emojione */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { emojione } from 'meteor/emojione:emojione';
+
Meteor.startup(function() {
RocketChat.callbacks.add('beforeSendMessageNotifications', (message) => emojione.shortnameToUnicode(message));
});
diff --git a/packages/rocketchat-emoji-emojione/server/index.js b/packages/rocketchat-emoji-emojione/server/index.js
new file mode 100644
index 000000000000..c8e0898cfc01
--- /dev/null
+++ b/packages/rocketchat-emoji-emojione/server/index.js
@@ -0,0 +1,2 @@
+import '../lib/rocketchat';
+import './callbacks';
diff --git a/packages/rocketchat-emoji/client/emojiButton.js b/packages/rocketchat-emoji/client/emojiButton.js
deleted file mode 100644
index 7114155ea456..000000000000
--- a/packages/rocketchat-emoji/client/emojiButton.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/* globals Template chatMessages*/
-Template.messageBox.events({
- 'click .emoji-picker-icon'(event) {
- event.stopPropagation();
- event.preventDefault();
-
- if (!RocketChat.getUserPreference(Meteor.userId(), 'useEmojis')) {
- return false;
- }
-
- if (RocketChat.EmojiPicker.isOpened()) {
- RocketChat.EmojiPicker.close();
- } else {
- RocketChat.EmojiPicker.open(event.currentTarget, (emoji) => {
- const { input } = chatMessages[RocketChat.openedRoom];
-
- const emojiValue = `:${ emoji }:`;
-
- const caretPos = input.selectionStart;
- const textAreaTxt = input.value;
- input.focus();
- if (!document.execCommand || !document.execCommand('insertText', false, emojiValue)) {
- input.value = textAreaTxt.substring(0, caretPos) + emojiValue + textAreaTxt.substring(caretPos);
- }
-
- input.focus();
-
- input.selectionStart = caretPos + emojiValue.length;
- input.selectionEnd = caretPos + emojiValue.length;
- });
- }
- },
-});
-
-Template.messageBox.onCreated(function() {
- RocketChat.EmojiPicker.init();
-});
diff --git a/packages/rocketchat-emoji/client/emojiParser.js b/packages/rocketchat-emoji/client/emojiParser.js
index f3271ab14825..f17aa776e994 100644
--- a/packages/rocketchat-emoji/client/emojiParser.js
+++ b/packages/rocketchat-emoji/client/emojiParser.js
@@ -1,4 +1,6 @@
-/* globals isSetNotNull */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { isSetNotNull } from './function-isSet';
import s from 'underscore.string';
/*
diff --git a/packages/rocketchat-emoji/client/emojiPicker.js b/packages/rocketchat-emoji/client/emojiPicker.js
index 31094181ae52..342a2f08391e 100644
--- a/packages/rocketchat-emoji/client/emojiPicker.js
+++ b/packages/rocketchat-emoji/client/emojiPicker.js
@@ -1,4 +1,9 @@
-/* globals Template, isSetNotNull */
+import { ReactiveVar } from 'meteor/reactive-var';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { Template } from 'meteor/templating';
+import { TAPi18n } from 'meteor/tap:i18n';
+import { isSetNotNull } from './function-isSet';
+
const emojiCategories = {};
/**
* Turns category hash to a nice readable translated name
diff --git a/packages/rocketchat-emoji/client/function-isSet.js b/packages/rocketchat-emoji/client/function-isSet.js
index 4181bb827f2f..1dd2e6e7e8a0 100644
--- a/packages/rocketchat-emoji/client/function-isSet.js
+++ b/packages/rocketchat-emoji/client/function-isSet.js
@@ -1,6 +1,5 @@
-/* globals isSet:true, isSetNotNull:true */
// http://stackoverflow.com/a/26990347 function isSet() from Gajus
-isSet = function(fn) {
+export const isSet = function(fn) {
let value;
try {
value = fn();
@@ -11,7 +10,7 @@ isSet = function(fn) {
}
};
-isSetNotNull = function(fn) {
+export const isSetNotNull = function(fn) {
let value;
try {
value = fn();
@@ -21,5 +20,3 @@ isSetNotNull = function(fn) {
return value !== null && value !== undefined;
}
};
-
-/* exported isSet, isSetNotNull */
diff --git a/packages/rocketchat-emoji/client/index.js b/packages/rocketchat-emoji/client/index.js
new file mode 100644
index 000000000000..e4b043a604ef
--- /dev/null
+++ b/packages/rocketchat-emoji/client/index.js
@@ -0,0 +1,11 @@
+import '../lib/rocketchat';
+import './emojiParser';
+import './emojiPicker.html';
+import './emojiPicker';
+import './lib/EmojiPicker';
+import { renderEmoji } from './lib/emojiRenderer';
+import './keyboardFix';
+
+export {
+ renderEmoji,
+};
diff --git a/packages/rocketchat-emoji/client/keyboardFix.js b/packages/rocketchat-emoji/client/keyboardFix.js
index 297887458074..7f65426c2d33 100644
--- a/packages/rocketchat-emoji/client/keyboardFix.js
+++ b/packages/rocketchat-emoji/client/keyboardFix.js
@@ -1,4 +1,5 @@
-/* global device */
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
if (Meteor.isCordova) {
window.addEventListener('native.keyboardshow', function() {
diff --git a/packages/rocketchat-emoji/client/lib/EmojiPicker.js b/packages/rocketchat-emoji/client/lib/EmojiPicker.js
index e305ce3f208a..6644789d3888 100644
--- a/packages/rocketchat-emoji/client/lib/EmojiPicker.js
+++ b/packages/rocketchat-emoji/client/lib/EmojiPicker.js
@@ -1,4 +1,7 @@
-/* globals Blaze, Template */
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { Blaze } from 'meteor/blaze';
+import { Template } from 'meteor/templating';
+
import _ from 'underscore';
RocketChat.EmojiPicker = {
@@ -55,21 +58,23 @@ RocketChat.EmojiPicker = {
},
setPosition() {
const windowHeight = window.innerHeight;
+ const windowWidth = window.innerWidth;
const windowBorder = 10;
const sourcePos = $(this.source).offset();
const { left, top } = sourcePos;
const cssProperties = { top, left };
+ const isLargerThanWindow = this.width + windowBorder > windowWidth;
if (top + this.height >= windowHeight) {
cssProperties.top = windowHeight - this.height - windowBorder;
}
if (left < windowBorder) {
- cssProperties.left = windowBorder;
+ cssProperties.left = isLargerThanWindow ? 0 : windowBorder;
}
- if (left + this.width >= window.innerWidth) {
- cssProperties.left = left - this.width - windowBorder;
+ if (left + this.width >= windowWidth) {
+ cssProperties.left = isLargerThanWindow ? 0 : windowWidth - this.width - windowBorder;
}
return $('.emoji-picker').css(cssProperties);
diff --git a/packages/rocketchat-emoji/client/lib/emojiRenderer.js b/packages/rocketchat-emoji/client/lib/emojiRenderer.js
index 6e70f4d28c74..15731c2fb704 100644
--- a/packages/rocketchat-emoji/client/lib/emojiRenderer.js
+++ b/packages/rocketchat-emoji/client/lib/emojiRenderer.js
@@ -1,5 +1,10 @@
-/* globals HTML, isSetNotNull, renderEmoji:true */
-renderEmoji = function(emoji) {
+import { Blaze } from 'meteor/blaze';
+import { Template } from 'meteor/templating';
+import { RocketChat } from 'meteor/rocketchat:lib';
+import { isSetNotNull } from '../function-isSet';
+import { HTML } from 'meteor/htmljs';
+
+export const renderEmoji = function(emoji) {
if (isSetNotNull(() => RocketChat.emoji.list[emoji].emojiPackage)) {
const { emojiPackage } = RocketChat.emoji.list[emoji];
return RocketChat.emoji.packages[emojiPackage].render(emoji);
@@ -19,5 +24,3 @@ Template.registerHelper('renderEmoji', new Template('renderEmoji', function() {
return '';
}));
-
-/* exported renderEmoji */
diff --git a/packages/rocketchat-emoji/client/rocketchat.js b/packages/rocketchat-emoji/lib/rocketchat.js
similarity index 80%
rename from packages/rocketchat-emoji/client/rocketchat.js
rename to packages/rocketchat-emoji/lib/rocketchat.js
index 870580c1de01..c0bcf7a3f002 100644
--- a/packages/rocketchat-emoji/client/rocketchat.js
+++ b/packages/rocketchat-emoji/lib/rocketchat.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.emoji = {
packages: {
base: {
diff --git a/packages/rocketchat-emoji/package.js b/packages/rocketchat-emoji/package.js
index 62c06d91d998..6fb43988aecb 100644
--- a/packages/rocketchat-emoji/package.js
+++ b/packages/rocketchat-emoji/package.js
@@ -11,21 +11,9 @@ Package.onUse(function(api) {
'templating',
'rocketchat:lib',
'rocketchat:theme',
- 'rocketchat:ui-message',
+ 'htmljs',
]);
- api.addFiles('client/function-isSet.js', 'client');
- api.addFiles('client/rocketchat.js');
-
- api.addFiles('client/emojiParser.js', 'client');
-
- api.addFiles('client/emojiPicker.html', 'client');
- api.addFiles('client/emojiPicker.js', 'client');
-
- api.addFiles('client/lib/emojiRenderer.js', 'client');
- api.addFiles('client/lib/EmojiPicker.js', 'client');
- api.addFiles('client/emojiButton.js', 'client');
- api.addFiles('client/keyboardFix.js', 'client');
-
- api.export('renderEmoji');
+ api.mainModule('client/index.js', 'client');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-emoji/server/index.js b/packages/rocketchat-emoji/server/index.js
new file mode 100644
index 000000000000..8e716d1f414f
--- /dev/null
+++ b/packages/rocketchat-emoji/server/index.js
@@ -0,0 +1 @@
+import '../lib/rocketchat';
diff --git a/packages/rocketchat-error-handler/package.js b/packages/rocketchat-error-handler/package.js
index 424f081152df..77dada968925 100644
--- a/packages/rocketchat-error-handler/package.js
+++ b/packages/rocketchat-error-handler/package.js
@@ -12,6 +12,5 @@ Package.onUse(function(api) {
'templating',
]);
- api.addFiles('server/lib/RocketChat.ErrorHandler.js', 'server');
- api.addFiles('server/startup/settings.js', 'server');
+ api.mainModule('server/index.js', 'server');
});
diff --git a/packages/rocketchat-error-handler/server/index.js b/packages/rocketchat-error-handler/server/index.js
new file mode 100644
index 000000000000..183513dd2b60
--- /dev/null
+++ b/packages/rocketchat-error-handler/server/index.js
@@ -0,0 +1,2 @@
+import './lib/RocketChat.ErrorHandler';
+import './startup/settings';
diff --git a/packages/rocketchat-error-handler/server/lib/RocketChat.ErrorHandler.js b/packages/rocketchat-error-handler/server/lib/RocketChat.ErrorHandler.js
index 4a8b611259e2..10443e051adb 100644
--- a/packages/rocketchat-error-handler/server/lib/RocketChat.ErrorHandler.js
+++ b/packages/rocketchat-error-handler/server/lib/RocketChat.ErrorHandler.js
@@ -1,3 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { RocketChat } from 'meteor/rocketchat:lib';
+
class ErrorHandler {
constructor() {
this.reporting = false;
diff --git a/packages/rocketchat-error-handler/server/startup/settings.js b/packages/rocketchat-error-handler/server/startup/settings.js
index d815d6a20eb5..558340c60a8b 100644
--- a/packages/rocketchat-error-handler/server/startup/settings.js
+++ b/packages/rocketchat-error-handler/server/startup/settings.js
@@ -1,3 +1,5 @@
+import { RocketChat } from 'meteor/rocketchat:lib';
+
RocketChat.settings.addGroup('Logs', function() {
this.add('Log_Exceptions_to_Channel', '', { type: 'string' });
});
diff --git a/packages/rocketchat-favico/client/favico.js b/packages/rocketchat-favico/client/favico.js
index 00f6f5e60fa3..b85f9b4a4ee1 100644
--- a/packages/rocketchat-favico/client/favico.js
+++ b/packages/rocketchat-favico/client/favico.js
@@ -23,9 +23,8 @@
* });
*/
/* eslint-disable */
-(function() {
- var Favico = (function(opt) {
+ export const Favico = (function(opt) {
'use strict';
opt = (opt) ? opt : {};
var _def = {
@@ -843,20 +842,3 @@
}
};
});
-
- // AMD / RequireJS
- if (typeof define !== 'undefined' && define.amd) {
- define([], function() {
- return Favico;
- });
- }
- // CommonJS
- else if (typeof module !== 'undefined' && module.exports) {
- module.exports = Favico;
- }
- // included directly via