Merge remote-tracking branch 'origin/develop' into release-candidate

pull/15459/head
Diego Sampaio 6 years ago
commit 044bbd1b9c
No known key found for this signature in database
GPG Key ID: E060152B30502562
  1. 5
      app/apps/server/communication/rest.js
  2. 6
      app/livechat/server/sendMessageBySMS.js
  3. 46
      app/sms/server/services/twilio.js
  4. 19
      app/sms/server/settings.js
  5. 14
      app/theme/client/imports/components/header.css
  6. 1
      app/theme/client/imports/components/tooltip.css
  7. 1
      app/ui/client/components/header/header.js
  8. 2
      app/ui/client/components/header/headerRoom.html
  9. 4
      app/ui/client/components/header/headerRoom.js
  10. 2
      app/ui/client/index.js
  11. 2
      client/components/admin/info/CommitSection.js
  12. 25
      client/routes.js
  13. 2
      package.json
  14. 2
      packages/rocketchat-i18n/i18n/en.i18n.json
  15. 2
      packages/rocketchat-version/plugin/compile-version.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) {

@ -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');

@ -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 },
});
}

@ -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() {

@ -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 {

@ -21,7 +21,6 @@
bottom: 100%;
min-height: 100%;
margin: 11px 0;
padding: 0.5em 1em;

@ -1,6 +1,7 @@
import { Template } from 'meteor/templating';
import { TabBar, fireGlobalEvent } from '../../../../ui-utils';
import './header.html';
Template.header.helpers({
back() {

@ -14,7 +14,7 @@
{{#if isToggleFavoriteButtonVisible}}
<div class="rc-header__block rc-header__favorite rc-header__block--action">
<button aria-label="{{toggleFavoriteButtonIconLabel}}" type="button" class="rc-header__toggle-favorite rc-header__first-icon js-favorite">
<button aria-label="{{toggleFavoriteButtonIconLabel}}" type="button" class="rc-header__toggle-favorite {{#if isToggleFavoriteButtonChecked}}rc-header__toggle-favorite--checked{{/if}} rc-header__first-icon rc-tooltip rc-tooltip--down rc-tooltip--start js-favorite">
{{> icon block="rc-header__icon" icon=toggleFavoriteButtonIcon}}
</button>
</div>

@ -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',

@ -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';

@ -6,7 +6,7 @@ import { InformationEntry } from './InformationEntry';
export function CommitSection({ info }) {
const t = useTranslation();
const { commit } = info;
const { commit = {} } = info;
return <>
<h3>{t('Commit')}</h3>

@ -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'),
});
}
}
},
});

@ -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",

@ -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 <a target=\"_blank\" href=\"https://go.rocket.chat/i/invalid-site-url\">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",

@ -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({

Loading…
Cancel
Save