diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000000..2327e0f4b6ef1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,94 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to meteor debug", + "type": "node", + "request": "attach", + "port": 9229, + "address": "localhost", + "restart": false, + "sourceMaps": true, + "sourceMapPathOverrides": { + "meteor://💻app/packages/rocketchat:*": "${workspaceFolder}/packages/rocketchat-*" + }, + "protocol": "inspector" + }, + { + "type": "chrome", + "request": "launch", + "name": "Frontend (Chrome)", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}", + "sourceMapPathOverrides": { + "meteor://💻app/packages/rocketchat:*": "${workspaceFolder}/packages/rocketchat-*" + } + }, + { + "type": "node", + "request": "launch", + "name": "Server (debug)", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "debug" + ], + "port": 9229, + "timeout": 300000, //Rocket.Chat really takes some time to startup, so play it safe + "sourceMapPathOverrides": { + "meteor://💻app/packages/rocketchat:*": "${workspaceFolder}/packages/rocketchat-*" + }, + "protocol": "inspector", + "env": { + "USE_UNRELEASED_ROCKETAPPS_FRAMEWORK": "true" + } + }, + { + "type": "node", + "request": "launch", + "name": "Server (debug-brk)", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "debug-brk" + ], + "port": 9229, + "timeout": 300000, //Rocket.Chat really takes some time to startup, so play it safe + "sourceMapPathOverrides": { + "meteor://💻app/packages/rocketchat:*": "${workspaceFolder}/packages/rocketchat-*" + }, + "protocol": "inspector", + "env": { + "USE_UNRELEASED_ROCKETAPPS_FRAMEWORK": "true" + } + }, + { + "type": "node", + "request": "launch", + "name": "Server (Testmode)", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "debug" + ], + "port": 9229, + "timeout": 300000, //Rocket.Chat really takes some time to startup, so play it safe + "sourceMapPathOverrides": { + "meteor://💻app/packages/rocketchat:*": "${workspaceFolder}/packages/rocketchat-*" + }, + "env": { + "TEST_MODE": "true" + }, + "protocol": "inspector" + } + ], + "compounds": [ + { + "name": "Server + Frontend", + "configurations": [ + "Server (debug-brk)", + "Frontend (Chrome)" + ] + } + ] +} diff --git a/package.json b/package.json index 4e3f8067b8947..4c7d0e7bdbb41 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "scripts": { "start": "meteor npm i && meteor", "debug": "meteor run --inspect", + "debug-brk": "meteor run --inspect-brk", "lint": "eslint .", "lint-fix": "eslint . --fix", "stylelint": "stylelint packages/**/*.css", diff --git a/packages/chatpal-search/client/template/admin.html b/packages/chatpal-search/client/template/admin.html index 5235c4c4993a5..d59a982a6b231 100644 --- a/packages/chatpal-search/client/template/admin.html +++ b/packages/chatpal-search/client/template/admin.html @@ -11,6 +11,7 @@ {{#unless isAdmin}}

{{_ "You_are_not_authorized_to_view_this_page"}}

{{else}} +

{{{_ "Chatpal_Get_more_information_about_chatpal_on_our_website"}}}

diff --git a/packages/chatpal-search/package.js b/packages/chatpal-search/package.js index 4c340c4416584..6ab0bb2c35dc6 100644 --- a/packages/chatpal-search/package.js +++ b/packages/chatpal-search/package.js @@ -17,7 +17,6 @@ Package.onUse(function(api) { ]); api.addFiles('server/asset/chatpal-enter.svg', 'server', {isAsset:true}); - api.addFiles('server/asset/chatpal-logo-icon-lightblue.svg', 'server', {isAsset:true}); api.addFiles('server/asset/chatpal-logo-icon-darkblue.svg', 'server', {isAsset:true}); api.addFiles([ diff --git a/packages/chatpal-search/server/asset/chatpal-logo-icon-darkblue.svg b/packages/chatpal-search/server/asset/chatpal-logo-icon-darkblue.svg index bdd8d83274540..6d30666f538bc 100644 --- a/packages/chatpal-search/server/asset/chatpal-logo-icon-darkblue.svg +++ b/packages/chatpal-search/server/asset/chatpal-logo-icon-darkblue.svg @@ -1,5 +1,5 @@ - + diff --git a/packages/chatpal-search/server/asset/chatpal-logo-icon-lightblue.svg b/packages/chatpal-search/server/asset/chatpal-logo-icon-lightblue.svg deleted file mode 100644 index 7a13ff8dc8ba7..0000000000000 --- a/packages/chatpal-search/server/asset/chatpal-logo-icon-lightblue.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/packages/chatpal-search/server/asset/config.js b/packages/chatpal-search/server/asset/config.js index db2c834140fe8..add37dbca2712 100644 --- a/packages/chatpal-search/server/asset/config.js +++ b/packages/chatpal-search/server/asset/config.js @@ -1,5 +1,4 @@ /* globals Inject */ Inject.rawBody('chatpal-enter', Assets.getText('server/asset/chatpal-enter.svg')); -Inject.rawBody('chatpal-logo-icon-lightblue', Assets.getText('server/asset/chatpal-logo-icon-lightblue.svg')); Inject.rawBody('chatpal-logo-icon-darkblue', Assets.getText('server/asset/chatpal-logo-icon-darkblue.svg')); diff --git a/packages/rocketchat-api/server/v1/settings.js b/packages/rocketchat-api/server/v1/settings.js index bfe93c3b604e4..cbac450b8ee26 100644 --- a/packages/rocketchat-api/server/v1/settings.js +++ b/packages/rocketchat-api/server/v1/settings.js @@ -35,9 +35,10 @@ RocketChat.API.v1.addRoute('settings.oauth', { authRequired: false }, { const oAuthServicesEnabled = ServiceConfiguration.configurations.find({}, { fields: { secret: 0 } }).fetch(); return oAuthServicesEnabled.map((service) => { - if (service.custom) { + if (service.custom || ['saml', 'cas'].includes(service.service)) { return { ...service }; } + return { _id: service._id, name: service.service, diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js index 97399cdf6a5c9..d1f8b03fc37bf 100644 --- a/packages/rocketchat-apps/package.js +++ b/packages/rocketchat-apps/package.js @@ -88,5 +88,5 @@ Package.onUse(function(api) { Npm.depends({ 'busboy': '0.2.13', '@rocket.chat/apps-engine': '0.5.11', - '@rocket.chat/apps-ts-definition': '0.9.6' + '@rocket.chat/apps-ts-definition': '0.9.8' }); diff --git a/packages/rocketchat-apps/server/converters/messages.js b/packages/rocketchat-apps/server/converters/messages.js index fd9191c8702d8..b762a16f9f19c 100644 --- a/packages/rocketchat-apps/server/converters/messages.js +++ b/packages/rocketchat-apps/server/converters/messages.js @@ -19,6 +19,10 @@ export class AppMessagesConverter { let sender; if (msgObj.u && msgObj.u._id) { sender = this.orch.getConverters().get('users').convertById(msgObj.u._id); + + if (!sender) { + sender = this.orch.getConverters().get('users').convertToApp(msgObj.u); + } } let editor; @@ -59,10 +63,20 @@ export class AppMessagesConverter { let u; if (message.sender && message.sender.id) { const user = RocketChat.models.Users.findOneById(message.sender.id); - u = { - _id: user._id, - username: user.username - }; + + if (user) { + u = { + _id: user._id, + username: user.username, + name: user.name + }; + } else { + u = { + _id: message.sender.id, + username: message.sender.username, + name: message.sender.name + }; + } } let editedBy; diff --git a/packages/rocketchat-apps/server/converters/users.js b/packages/rocketchat-apps/server/converters/users.js index 6a3caeec3d1f8..39e129b771237 100644 --- a/packages/rocketchat-apps/server/converters/users.js +++ b/packages/rocketchat-apps/server/converters/users.js @@ -8,22 +8,21 @@ export class AppUsersConverter { convertById(userId) { const user = RocketChat.models.Users.findOneById(userId); - return this._convertToApp(user); + return this.convertToApp(user); } convertByUsername(username) { const user = RocketChat.models.Users.findOneByUsername(username); - return this._convertToApp(user); + return this.convertToApp(user); } - _convertToApp(user) { + convertToApp(user) { if (!user) { return undefined; } const type = this._convertUserTypeToEnum(user.type); - const status = this._convertStatusConnectionToEnum(user.username, user._id, user.status); const statusConnection = this._convertStatusConnectionToEnum(user.username, user._id, user.statusConnection); return { @@ -34,7 +33,7 @@ export class AppUsersConverter { isEnabled: user.active, name: user.name, roles: user.roles, - status, + status: user.status, statusConnection, utcOffset: user.utcOffset, createdAt: user.createdAt, @@ -49,6 +48,9 @@ export class AppUsersConverter { return UserType.USER; case 'bot': return UserType.BOT; + case '': + case undefined: + return UserType.UNKNOWN; default: console.warn(`A new user type has been added that the Apps don't know about? "${ type }"`); return type.toUpperCase(); @@ -65,6 +67,9 @@ export class AppUsersConverter { return UserStatusConnection.AWAY; case 'busy': return UserStatusConnection.BUSY; + case undefined: + // This is needed for Livechat guests and Rocket.Cat user. + return UserStatusConnection.UNDEFINED; default: console.warn(`The user ${ username } (${ userId }) does not have a valid status (offline, online, away, or busy). It is currently: "${ status }"`); return !status ? UserStatusConnection.OFFLINE : status.toUpperCase(); diff --git a/packages/rocketchat-i18n/i18n/de.i18n.json b/packages/rocketchat-i18n/i18n/de.i18n.json index e1887e1df11d7..cd75b051b4423 100644 --- a/packages/rocketchat-i18n/i18n/de.i18n.json +++ b/packages/rocketchat-i18n/i18n/de.i18n.json @@ -429,6 +429,7 @@ "Chatpal_ERROR_username_already_exists": "Benutzername existiert bereits", "Chatpal_created_key_successfully": "API-Key erfolgreich erstellt", "Chatpal_run_search": "Suche", + "Chatpal_Get_more_information_about_chatpal_on_our_website": "Finden Sie mehr über Chatpal heraus, unter http://chatpal.io!", "CDN_PREFIX": "CDN-Präfix", "Certificates_and_Keys": "Zertifikate und Schlüssel", "Change_Room_Type": "Ändere den Typ des Raums", @@ -2343,4 +2344,4 @@ "your_message_optional": "Ihre optionale Nachricht", "Your_password_is_wrong": "Falsches Passwort", "Your_push_was_sent_to_s_devices": "Eine Push-Nachricht wurde an %s Geräte gesendet." -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index bc2d5f18ebf9f..ac0942786afc6 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -432,6 +432,7 @@ "Chatpal_ERROR_username_already_exists": "Username already exists", "Chatpal_created_key_successfully": "API-Key created successfully", "Chatpal_run_search": "Search", + "Chatpal_Get_more_information_about_chatpal_on_our_website": "Get more information about Chatpal on http://chatpal.io!", "CDN_PREFIX": "CDN Prefix", "Certificates_and_Keys": "Certificates and Keys", "Change_Room_Type": "Changing the Room Type", diff --git a/packages/rocketchat-integrations/server/lib/triggerHandler.js b/packages/rocketchat-integrations/server/lib/triggerHandler.js index f3457c3b1edcd..887fada828bbf 100644 --- a/packages/rocketchat-integrations/server/lib/triggerHandler.js +++ b/packages/rocketchat-integrations/server/lib/triggerHandler.js @@ -84,7 +84,7 @@ RocketChat.integrations.triggerHandler = new class RocketChatIntegrationHandler } if (data) { - history.data = data; + history.data = { ...data }; if (data.user) { history.data.user = _.omit(data.user, ['meta', '$loki', 'services']); diff --git a/packages/rocketchat-lib/server/functions/deleteMessage.js b/packages/rocketchat-lib/server/functions/deleteMessage.js index 9111557397d1c..eb7d85cac91de 100644 --- a/packages/rocketchat-lib/server/functions/deleteMessage.js +++ b/packages/rocketchat-lib/server/functions/deleteMessage.js @@ -23,12 +23,12 @@ RocketChat.deleteMessage = function(message, user) { if (message.file && message.file._id) { FileUpload.getStore('Uploads').deleteById(message.file._id); } - - Meteor.defer(function() { - RocketChat.callbacks.run('afterDeleteMessage', deletedMsg); - }); } + Meteor.defer(function() { + RocketChat.callbacks.run('afterDeleteMessage', deletedMsg || { _id: message._id }); + }); + // update last message if (RocketChat.settings.get('Store_Last_Message')) { const room = RocketChat.models.Rooms.findOneById(message.rid, { fields: { lastMessage: 1 } }); diff --git a/packages/rocketchat-search/client/search/search.js b/packages/rocketchat-search/client/search/search.js index b13d453294237..165e5cc828e3a 100644 --- a/packages/rocketchat-search/client/search/search.js +++ b/packages/rocketchat-search/client/search/search.js @@ -67,7 +67,9 @@ Template.RocketSearch.onCreated(function() { //TODO what should happen } else { this.suggestionActive.set(undefined); - this.suggestions.set(result); + if (value !== this.scope.text.get()) { + this.suggestions.set(result); + } } }); }; diff --git a/packages/rocketchat-ui-flextab/client/tabs/membersList.js b/packages/rocketchat-ui-flextab/client/tabs/membersList.js index 1a9f8ec571d71..deaa46ac49db4 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/membersList.js +++ b/packages/rocketchat-ui-flextab/client/tabs/membersList.js @@ -87,7 +87,7 @@ Template.membersList.helpers({ const usersLimit = Template.instance().usersLimit.get(); if (usersLimit) { hasMore = users.length > usersLimit; - users = _.first(users, usersLimit); + users = _.first(users, usersLimit) || []; } const totalShowing = users.length; diff --git a/packages/rocketchat-ui-sidenav/client/sidebarHeader.js b/packages/rocketchat-ui-sidenav/client/sidebarHeader.js index a4b59ade5f245..15358152479ce 100644 --- a/packages/rocketchat-ui-sidenav/client/sidebarHeader.js +++ b/packages/rocketchat-ui-sidenav/client/sidebarHeader.js @@ -140,10 +140,10 @@ const toolbarButtons = (user) => { { name: t('Options'), icon: 'menu', - condition: () => AccountBox.getItems().length || RocketChat.authz.hasAtLeastOnePermission(['view-statistics', 'view-room-administration', 'view-user-administration', 'view-privileged-setting', 'manage-emoji' ]), + condition: () => AccountBox.getItems().length || RocketChat.authz.hasAtLeastOnePermission([ 'manage-emoji', 'manage-integrations', 'manage-oauth-apps', 'manage-own-integrations', 'manage-sounds', 'view-logs', 'view-privileged-setting', 'view-room-administration', 'view-statistics', 'view-user-administration' ]), action: (e) => { let adminOption; - if (RocketChat.authz.hasAtLeastOnePermission(['view-statistics', 'view-room-administration', 'view-user-administration', 'view-privileged-setting', 'manage-emoji' ])) { + if (RocketChat.authz.hasAtLeastOnePermission([ 'manage-emoji', 'manage-integrations', 'manage-oauth-apps', 'manage-own-integrations', 'manage-sounds', 'view-logs', 'view-privileged-setting', 'view-room-administration', 'view-statistics', 'view-user-administration' ])) { adminOption = { icon: 'customize', name: t('Administration'),