diff --git a/app/file-upload/server/lib/FileUpload.js b/app/file-upload/server/lib/FileUpload.js index ecb3f99a3f86f..9dcc41fb5630e 100644 --- a/app/file-upload/server/lib/FileUpload.js +++ b/app/file-upload/server/lib/FileUpload.js @@ -27,6 +27,7 @@ import { fileUploadIsValidContentType } from '../../../utils/lib/fileUploadRestr import { isValidJWT, generateJWT } from '../../../utils/server/lib/JWTHelper'; import { Messages } from '../../../models/server'; import { AppEvents, Apps } from '../../../apps/server'; +import { streamToBuffer } from './streamToBuffer'; const cookie = new Cookies(); let maxFileSize = 0; @@ -57,7 +58,7 @@ export const FileUpload = { }, options, FileUpload[`default${ type }`]())); }, - validateFileUpload({ file, stream }) { + validateFileUpload({ file, content }) { if (!Match.test(file.rid, String)) { return false; } @@ -97,7 +98,7 @@ export const FileUpload = { // App IPreFileUpload event hook try { - Promise.await(Apps.triggerEvent(AppEvents.IPreFileUpload, { file, stream })); + Promise.await(Apps.triggerEvent(AppEvents.IPreFileUpload, { file, content })); } catch (error) { if (error instanceof AppsEngineException) { throw new Meteor.Error('error-app-prevented', error.message); @@ -596,12 +597,14 @@ export class FileUploadClass { } insert(fileData, streamOrBuffer, cb) { - fileData.size = parseInt(fileData.size) || 0; + if (streamOrBuffer instanceof stream) { + streamOrBuffer = Promise.await(streamToBuffer(streamOrBuffer)); + } // Check if the fileData matches store filter const filter = this.store.getFilter(); if (filter && filter.check) { - filter.check({ file: fileData, stream: streamOrBuffer }); + filter.check({ file: fileData, content: streamOrBuffer }); } return this._doInsert(fileData, streamOrBuffer, cb); diff --git a/app/file-upload/server/lib/streamToBuffer.ts b/app/file-upload/server/lib/streamToBuffer.ts new file mode 100644 index 0000000000000..34dc1c434a32a --- /dev/null +++ b/app/file-upload/server/lib/streamToBuffer.ts @@ -0,0 +1,11 @@ +import { Readable } from 'stream'; + +export const streamToBuffer = (stream: Readable): Promise => new Promise((resolve) => { + const chunks: Array = []; + + stream + .on('data', (data) => chunks.push(data)) + .on('end', () => resolve(Buffer.concat(chunks))) + // force stream to resume data flow in case it was explicitly paused before + .resume(); +}); diff --git a/client/views/admin/apps/AppPermissionsReviewModal.js b/client/views/admin/apps/AppPermissionsReviewModal.js index 520fc13dc111d..687f173f9d6cb 100644 --- a/client/views/admin/apps/AppPermissionsReviewModal.js +++ b/client/views/admin/apps/AppPermissionsReviewModal.js @@ -37,7 +37,7 @@ const AppPermissionsReviewModal = ({ ? appPermissions.map((permission) =>
  • { t(`Apps_Permissions_${ permission.name.replace('.', '_') }`) } - { permission.required && ({ t('Required') }) } + { permission.required && ({ t('required') }) }
  • ) : t('Apps_Permissions_No_Permissions_Required') } diff --git a/package-lock.json b/package-lock.json index 18a39d4f872e5..b1be8eb5b73aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5907,9 +5907,9 @@ } }, "@rocket.chat/apps-engine": { - "version": "1.22.0-alpha.4545", - "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.22.0-alpha.4545.tgz", - "integrity": "sha512-RlibX/xJxnO5LzENCePpLiNEZjiD4r4AP0AEQQTYeWLqy58FR75wQnnNL7otyWDKnB55wfdnufbqw7OpqVbpEg==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.22.1.tgz", + "integrity": "sha512-i1F0fvPegTmYrDdDY/XgW6SC6ez69QjkbN13rGVpzOmTXeAJAXovdMDMCTD4UaV3WNo+9ghMfsIlRbMIHeM6/g==", "requires": { "adm-zip": "^0.4.9", "cryptiles": "^4.1.3", diff --git a/package.json b/package.json index b337865fd625c..c60f04f661dbc 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "@nivo/heatmap": "^0.61.0", "@nivo/line": "^0.61.1", "@nivo/pie": "^0.61.1", - "@rocket.chat/apps-engine": "1.22.0-alpha.4545", + "@rocket.chat/apps-engine": "1.22.1", "@rocket.chat/css-in-js": "^0.21.0", "@rocket.chat/emitter": "^0.21.0", "@rocket.chat/fuselage": "^0.21.0", diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 1154ea5a4675a..e4fa5e6907c02 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -489,8 +489,6 @@ "Apps_Permissions_persistence": "Store internal data in the database", "Apps_Permissions_scheduler": "Register and maintain scheduled jobs", "Apps_Permissions_ui_interact": "Interact with the UI", - "Required": "required", - "Apps_Settings": "App's Settings", "Apps_User_Already_Exists": "The username \"__username__\" is already being used. Rename or remove the user using it to install this App", "Apps_WhatIsIt": "Apps: What Are They?", @@ -3209,6 +3207,8 @@ "Requested_At": "Requested At", "Requested_By": "Requested By", "Require": "Require", + "Required": "Required", + "required": "required", "Require_all_tokens": "Require all tokens", "Require_any_token": "Require any token", "Require_password_change": "Require password change",