From 925190220b112c2d0878e2833983c91fb40a0d24 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Mon, 23 Sep 2019 18:55:11 -0300 Subject: [PATCH 1/5] Regression: Favorite room button (#15426) --- app/theme/client/imports/components/header.css | 14 +++++--------- app/theme/client/imports/components/tooltip.css | 1 - app/ui/client/components/header/header.js | 1 + app/ui/client/components/header/headerRoom.html | 2 +- app/ui/client/components/header/headerRoom.js | 4 ++++ app/ui/client/index.js | 2 -- 6 files changed, 11 insertions(+), 13 deletions(-) diff --git a/app/theme/client/imports/components/header.css b/app/theme/client/imports/components/header.css index 063647aca0b..3ef3fdc1dc8 100644 --- a/app/theme/client/imports/components/header.css +++ b/app/theme/client/imports/components/header.css @@ -248,15 +248,7 @@ padding: 0 0.25rem; - color: var(--header-toggle-favorite-star-color); - - &.empty { - color: var(--header-toggle-favorite-color); - - & > .rc-header__icon { - fill: none; - } - } + color: var(--header-toggle-favorite-color); & > .rc-header__icon { font-size: 2rem; @@ -265,6 +257,10 @@ &:hover { color: var(--header-toggle-favorite-star-color); } + + &--checked { + color: var(--header-toggle-favorite-star-color); + } } &__toggle-encryption { diff --git a/app/theme/client/imports/components/tooltip.css b/app/theme/client/imports/components/tooltip.css index 4d60d4ca826..5c08d8be251 100644 --- a/app/theme/client/imports/components/tooltip.css +++ b/app/theme/client/imports/components/tooltip.css @@ -21,7 +21,6 @@ bottom: 100%; - min-height: 100%; margin: 11px 0; padding: 0.5em 1em; diff --git a/app/ui/client/components/header/header.js b/app/ui/client/components/header/header.js index 8fef0596d4e..380a80bdacd 100644 --- a/app/ui/client/components/header/header.js +++ b/app/ui/client/components/header/header.js @@ -1,6 +1,7 @@ import { Template } from 'meteor/templating'; import { TabBar, fireGlobalEvent } from '../../../../ui-utils'; +import './header.html'; Template.header.helpers({ back() { diff --git a/app/ui/client/components/header/headerRoom.html b/app/ui/client/components/header/headerRoom.html index b3d6a7c2fff..7cd0b5a2e1b 100644 --- a/app/ui/client/components/header/headerRoom.html +++ b/app/ui/client/components/header/headerRoom.html @@ -14,7 +14,7 @@ {{#if isToggleFavoriteButtonVisible}}
-
diff --git a/app/ui/client/components/header/headerRoom.js b/app/ui/client/components/header/headerRoom.js index 3f72b2d8d5c..2d8418fe4ae 100644 --- a/app/ui/client/components/header/headerRoom.js +++ b/app/ui/client/components/header/headerRoom.js @@ -14,6 +14,8 @@ import { emoji } from '../../../../emoji'; import { Markdown } from '../../../../markdown/client'; import { hasAllPermission } from '../../../../authorization'; +import './headerRoom.html'; + const getUserStatus = (id) => { const roomData = Session.get(`roomData${ id }`); return roomTypes.getUserStatus(roomData.t, id); @@ -27,6 +29,7 @@ const getUserStatusText = (id) => { Template.headerRoom.helpers({ isDiscussion: () => Template.instance().state.get('discussion'), isToggleFavoriteButtonVisible: () => Template.instance().state.get('favorite') !== null, + isToggleFavoriteButtonChecked: () => Template.instance().state.get('favorite'), toggleFavoriteButtonIconLabel: () => (Template.instance().state.get('favorite') ? t('Unfavorite') : t('Favorite')), toggleFavoriteButtonIcon: () => (Template.instance().state.get('favorite') ? 'star-filled' : 'star'), @@ -145,6 +148,7 @@ Template.headerRoom.events({ 'click .js-favorite'(event, instance) { event.stopPropagation(); event.preventDefault(); + event.currentTarget.blur(); return Meteor.call( 'toggleFavorite', diff --git a/app/ui/client/index.js b/app/ui/client/index.js index e812fc0e40d..39f35a953ee 100644 --- a/app/ui/client/index.js +++ b/app/ui/client/index.js @@ -49,9 +49,7 @@ import './components/popupList.html'; import './components/popupList'; import './components/selectDropdown.html'; -import './components/header/header.html'; import './components/header/header'; -import './components/header/headerRoom.html'; import './components/header/headerRoom'; import './components/contextualBar.html'; import './components/contextualBar'; From 8ea1a911fbb9e85a9279689b29e3d05457eaf25d Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 24 Sep 2019 15:29:12 -0300 Subject: [PATCH 2/5] Regression: setup wizard dynamic import using relative url (#15432) * fix dynamic import on setup wizard * Update packages/rocketchat-i18n/i18n/en.i18n.json Co-Authored-By: Aaron Ogle * Update en.i18n.json --- client/routes.js | 25 ++++++++++++++++++---- packages/rocketchat-i18n/i18n/en.i18n.json | 2 ++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/client/routes.js b/client/routes.js index bd378af54f7..cb83de47af0 100644 --- a/client/routes.js +++ b/client/routes.js @@ -12,8 +12,9 @@ import { Session } from 'meteor/session'; import { KonchatNotification } from '../app/ui'; import { ChatSubscription } from '../app/models'; -import { roomTypes } from '../app/utils'; -import { call } from '../app/ui-utils'; +import { roomTypes, t } from '../app/utils'; +import { baseURI } from '../app/utils/client/lib/baseuri'; +import { call, modal } from '../app/ui-utils'; const getRoomById = mem((rid) => call('getRoomById', rid)); @@ -212,8 +213,24 @@ FlowRouter.route('/register/:hash', { FlowRouter.route('/setup-wizard/:step?', { name: 'setup-wizard', action: async () => { - const { SetupWizard } = await import('./components/setupWizard/SetupWizard'); - BlazeLayout.render(await createTemplateForComponent(SetupWizard)); + const render = async () => { + const { SetupWizard } = await import('./components/setupWizard/SetupWizard'); + BlazeLayout.render(await createTemplateForComponent(SetupWizard)); + }; + try { + await render(); + } catch (_) { + Meteor.absoluteUrl.defaultOptions = { ...Meteor.absoluteUrl.defaultOptions, rootUrl: baseURI }; + try { + await render(); + } catch (_) { + modal.open({ + title: t('Error_Site_URL'), + text: t('Error_Site_URL_description'), + confirmButtonText: t('Ok'), + }); + } + } }, }); diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 336dc2bb8df..daa5cfb032d 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1310,6 +1310,8 @@ "error-role-in-use": "Cannot delete role because it's in use", "error-role-name-required": "Role name is required", "error-room-is-not-closed": "Room is not closed", + "Error_Site_URL": "Invalid Site_Url", + "Error_Site_URL_description": "Please, update your \"Site_Url\" setting find more information here", "error-the-field-is-required": "The field __field__ is required.", "error-this-is-not-a-livechat-room": "This is not a Livechat room", "error-personal-access-tokens-are-current-disabled": "Personal Access Tokens are currently disabled", From abf742625c9d57f207f0dab8963ce63d86fad8be Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Wed, 25 Sep 2019 14:02:58 -0300 Subject: [PATCH 3/5] Regression: Fix Commit Section when there is no commit info (#15436) --- client/components/admin/info/CommitSection.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/admin/info/CommitSection.js b/client/components/admin/info/CommitSection.js index ead090a4cf1..e7d3570e520 100644 --- a/client/components/admin/info/CommitSection.js +++ b/client/components/admin/info/CommitSection.js @@ -6,7 +6,7 @@ import { InformationEntry } from './InformationEntry'; export function CommitSection({ info }) { const t = useTranslation(); - const { commit } = info; + const { commit = {} } = info; return <>

{t('Commit')}

From a9b8fba19746b15bd6029e258c468431abc95c80 Mon Sep 17 00:00:00 2001 From: Douglas Gubert Date: Wed, 25 Sep 2019 14:16:08 -0300 Subject: [PATCH 4/5] Regression: Fix invalid version string error on marketplace screen (#15437) --- app/apps/server/communication/rest.js | 5 +++-- packages/rocketchat-version/plugin/compile-version.js | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/apps/server/communication/rest.js b/app/apps/server/communication/rest.js index 98e9925d4d8..2787a965135 100644 --- a/app/apps/server/communication/rest.js +++ b/app/apps/server/communication/rest.js @@ -9,8 +9,9 @@ import { Info } from '../../../utils'; import { Settings, Users } from '../../../models/server'; import { Apps } from '../orchestrator'; +const appsEngineVersionForMarketplace = Info.marketplaceApiVersion.replace(/-.*/g, ''); const getDefaultHeaders = () => ({ - 'X-Apps-Engine-Version': Info.marketplaceApiVersion, + 'X-Apps-Engine-Version': appsEngineVersionForMarketplace, }); const purchaseTypes = new Set(['buy', 'subscription']); @@ -341,7 +342,7 @@ export class AppsRestApi { let result; try { - result = HTTP.get(`${ baseUrl }/v1/apps/${ this.urlParams.id }/latest?frameworkVersion=${ Info.marketplaceApiVersion }`, { + result = HTTP.get(`${ baseUrl }/v1/apps/${ this.urlParams.id }/latest?frameworkVersion=${ appsEngineVersionForMarketplace }`, { headers, }); } catch (e) { diff --git a/packages/rocketchat-version/plugin/compile-version.js b/packages/rocketchat-version/plugin/compile-version.js index 19da988d165..450b611f607 100644 --- a/packages/rocketchat-version/plugin/compile-version.js +++ b/packages/rocketchat-version/plugin/compile-version.js @@ -55,7 +55,7 @@ class VersionCompiler { } const pkg = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf8')); - output.marketplaceApiVersion = pkg.dependencies['@rocket.chat/apps-engine'].replace(/[^0-9.]/g, ''); + output.marketplaceApiVersion = pkg.dependencies['@rocket.chat/apps-engine'].replace(/^[^0-9]/g, ''); output = `exports.Info = ${ JSON.stringify(output, null, 4) };`; file.addJavaScript({ From 8bfd1db62223f8dc3887d3e13ac25a23a5185f7a Mon Sep 17 00:00:00 2001 From: Renato Becker Date: Wed, 25 Sep 2019 20:13:40 -0300 Subject: [PATCH 5/5] [NEW] Allow file sharing through Twilio (WhatsApp) integration (#15415) --- app/livechat/server/sendMessageBySMS.js | 6 ++-- app/sms/server/services/twilio.js | 46 ++++++++++++++++++++++++- app/sms/server/settings.js | 19 ++++++++++ package.json | 2 +- 4 files changed, 69 insertions(+), 4 deletions(-) diff --git a/app/livechat/server/sendMessageBySMS.js b/app/livechat/server/sendMessageBySMS.js index 722ccd92e2e..cbceda93baf 100644 --- a/app/livechat/server/sendMessageBySMS.js +++ b/app/livechat/server/sendMessageBySMS.js @@ -29,9 +29,11 @@ callbacks.add('afterSaveMessage', function(message, room) { return message; } - + let extraData; if (message.file) { message = normalizeMessageFileUpload(message); + const { fileUpload, rid, u: { _id: userId } = {} } = message; + extraData = Object.assign({}, { rid, userId, fileUpload }); } const SMSService = SMS.getService(settings.get('SMS_Service')); @@ -46,7 +48,7 @@ callbacks.add('afterSaveMessage', function(message, room) { return message; } - SMSService.send(room.sms.from, visitor.phone[0].phoneNumber, message.msg); + SMSService.send(room.sms.from, visitor.phone[0].phoneNumber, message.msg, extraData); return message; }, callbacks.priority.LOW, 'sendMessageBySms'); diff --git a/app/sms/server/services/twilio.js b/app/sms/server/services/twilio.js index b4221c2b2f4..67920e13145 100644 --- a/app/sms/server/services/twilio.js +++ b/app/sms/server/services/twilio.js @@ -1,12 +1,29 @@ +import { Meteor } from 'meteor/meteor'; import twilio from 'twilio'; +import { Random } from 'meteor/random'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import filesize from 'filesize'; import { settings } from '../../../settings'; import { SMS } from '../SMS'; +import { Notifications } from '../../../notifications'; +import { fileUploadIsValidContentType } from '../../../utils/lib/fileUploadRestrictions'; + +const MAX_FILE_SIZE = 5242880; + +const notifyAgent = (userId, rid, msg) => Notifications.notifyUser(userId, 'message', { + _id: Random.id(), + rid, + ts: new Date(), + msg, +}); class Twilio { constructor() { this.accountSid = settings.get('SMS_Twilio_Account_SID'); this.authToken = settings.get('SMS_Twilio_authToken'); + this.fileUploadEnabled = settings.get('SMS_Twilio_FileUpload_Enabled'); + this.mediaTypeWhiteList = settings.get('SMS_Twilio_FileUpload_MediaTypeWhiteList'); } parse(data) { @@ -58,13 +75,40 @@ class Twilio { return returnData; } - send(fromNumber, toNumber, message) { + send(fromNumber, toNumber, message, extraData) { const client = twilio(this.accountSid, this.authToken); + let mediaUrl; + if (extraData && extraData.fileUpload) { + const { rid, userId, fileUpload: { size, type, publicFilePath } } = extraData; + const user = userId ? Meteor.users.findOne(userId) : null; + const lng = (user && user.language) || settings.get('Language') || 'en'; + + let reason; + if (!this.fileUploadEnabled) { + reason = TAPi18n.__('FileUpload_Disabled', { lng }); + } else if (size > MAX_FILE_SIZE) { + reason = TAPi18n.__('File_exceeds_allowed_size_of_bytes', { + size: filesize(MAX_FILE_SIZE), + lng, + }); + } else if (!fileUploadIsValidContentType(type, this.fileUploadMediaTypeWhiteList)) { + reason = TAPi18n.__('File_type_is_not_accepted', { lng }); + } + + if (reason) { + rid && userId && notifyAgent(userId, rid, reason); + return console.error(`(Twilio) -> ${ reason }`); + } + + mediaUrl = [publicFilePath]; + } + // return client.messages.create({ to: toNumber, from: fromNumber, body: message, + ...mediaUrl && { mediaUrl }, }); } diff --git a/app/sms/server/settings.js b/app/sms/server/settings.js index 80b06946ef9..466df5d8c65 100644 --- a/app/sms/server/settings.js +++ b/app/sms/server/settings.js @@ -47,6 +47,25 @@ Meteor.startup(function() { i18nLabel: 'Auth_Token', secret: true, }); + this.add('SMS_Twilio_FileUpload_Enabled', true, { + type: 'boolean', + enableQuery: { + _id: 'SMS_Service', + value: 'twilio', + }, + i18nLabel: 'FileUpload_Enabled', + secret: true, + }); + this.add('SMS_Twilio_FileUpload_MediaTypeWhiteList', 'image/*,audio/*,video/*,text/*,application/pdf', { + type: 'string', + enableQuery: { + _id: 'SMS_Service', + value: 'twilio', + }, + i18nLabel: 'FileUpload_MediaTypeWhiteList', + i18nDescription: 'FileUpload_MediaTypeWhiteListDescription', + secret: true, + }); }); this.section('Voxtelesys', function() { diff --git a/package.json b/package.json index 385f636ec2d..01088ac51b1 100644 --- a/package.json +++ b/package.json @@ -220,7 +220,7 @@ "tar-stream": "^1.6.2", "toastr": "^2.1.4", "turndown": "^5.0.1", - "twilio": "^3.25.0", + "twilio": "^3.35.0", "twit": "^2.2.11", "ua-parser-js": "^0.7.19", "underscore": "^1.9.1",