Skip to content

Commit

Permalink
Chore: Remove wrong usages of Meteor.wrapAsync (RocketChat#23079)
Browse files Browse the repository at this point in the history
  • Loading branch information
sampaiodiego authored Sep 1, 2021
1 parent 3c8f82f commit 63206b5
Show file tree
Hide file tree
Showing 20 changed files with 187 additions and 247 deletions.
63 changes: 28 additions & 35 deletions app/api/server/v1/assets.js
Original file line number Diff line number Diff line change
@@ -1,42 +1,33 @@
import { Meteor } from 'meteor/meteor';
import Busboy from 'busboy';

import { RocketChatAssets } from '../../../assets/server';
import { API } from '../api';
import { getUploadFormData } from '../lib/getUploadFormData';

API.v1.addRoute('assets.setAsset', { authRequired: true }, {
post() {
const busboy = new Busboy({ headers: this.request.headers });
const fields = {};
let asset = {};

Meteor.wrapAsync((callback) => {
busboy.on('field', (fieldname, value) => { fields[fieldname] = value; });
busboy.on('file', Meteor.bindEnvironment((fieldname, file, filename, encoding, mimetype) => {
const isValidAsset = Object.keys(RocketChatAssets.assets).includes(fieldname);
if (!isValidAsset) {
callback(new Meteor.Error('error-invalid-asset', 'Invalid asset'));
}
const assetData = [];
file.on('data', Meteor.bindEnvironment((data) => {
assetData.push(data);
}));

file.on('end', Meteor.bindEnvironment(() => {
asset = {
buffer: Buffer.concat(assetData),
name: fieldname,
mimetype,
};
}));
}));
busboy.on('finish', () => callback());
this.request.pipe(busboy);
})();
Meteor.runAsUser(this.userId, () => Meteor.call('setAsset', asset.buffer, asset.mimetype, asset.name));
if (fields.refreshAllClients) {
Meteor.runAsUser(this.userId, () => Meteor.call('refreshClients'));
const { refreshAllClients, ...files } = Promise.await(getUploadFormData({
request: this.request,
}));

const assetsKeys = Object.keys(RocketChatAssets.assets);

const [assetName] = Object.keys(files);

const isValidAsset = assetsKeys.includes(assetName);
if (!isValidAsset) {
throw new Meteor.Error('error-invalid-asset', 'Invalid asset');
}

Meteor.runAsUser(this.userId, () => {
const { [assetName]: asset } = files;

Meteor.call('setAsset', asset.fileBuffer, asset.mimetype, assetName);
if (refreshAllClients) {
Meteor.call('refreshClients');
}
});

return API.v1.success();
},
});
Expand All @@ -48,10 +39,12 @@ API.v1.addRoute('assets.unsetAsset', { authRequired: true }, {
if (!isValidAsset) {
throw new Meteor.Error('error-invalid-asset', 'Invalid asset');
}
Meteor.runAsUser(this.userId, () => Meteor.call('unsetAsset', assetName));
if (refreshAllClients) {
Meteor.runAsUser(this.userId, () => Meteor.call('refreshClients'));
}
Meteor.runAsUser(this.userId, () => {
Meteor.call('unsetAsset', assetName);
if (refreshAllClients) {
Meteor.call('refreshClients');
}
});
return API.v1.success();
},
});
151 changes: 57 additions & 94 deletions app/api/server/v1/emoji-custom.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Meteor } from 'meteor/meteor';
import Busboy from 'busboy';

import { EmojiCustom } from '../../../models';
import { EmojiCustom } from '../../../models/server';
import { API } from '../api';
import { getUploadFormData } from '../lib/getUploadFormData';
import { findEmojisCustom } from '../lib/emoji-custom';
import { Media } from '../../../../server/sdk';

Expand Down Expand Up @@ -71,106 +71,69 @@ API.v1.addRoute('emoji-custom.all', { authRequired: true }, {

API.v1.addRoute('emoji-custom.create', { authRequired: true }, {
post() {
const { emoji, ...fields } = Promise.await(getUploadFormData({
request: this.request,
}));

if (!emoji) {
throw new Meteor.Error('invalid-field');
}

const isUploadable = Promise.await(Media.isImage(emoji.fileBuffer));
if (!isUploadable) {
throw new Meteor.Error('emoji-is-not-image', 'Emoji file provided cannot be uploaded since it\'s not an image');
}

const [, extension] = emoji.mimetype.split('/');
fields.extension = extension;

fields.newFile = true;
fields.aliases = fields.aliases || '';

Meteor.runAsUser(this.userId, () => {
const fields = {};
const busboy = new Busboy({ headers: this.request.headers });
const emojiData = [];
let emojiMimetype = '';

Meteor.wrapAsync((callback) => {
busboy.on('file', Meteor.bindEnvironment((fieldname, file, filename, encoding, mimetype) => {
if (fieldname !== 'emoji') {
return callback(new Meteor.Error('invalid-field'));
}

file.on('data', Meteor.bindEnvironment((data) => emojiData.push(data)));

file.on('end', Meteor.bindEnvironment(() => {
const extension = mimetype.split('/')[1];
emojiMimetype = mimetype;
fields.extension = extension;
}));
}));
busboy.on('field', (fieldname, val) => {
fields[fieldname] = val;
});
busboy.on('finish', Meteor.bindEnvironment(() => {
fields.newFile = true;
fields.aliases = fields.aliases || '';
try {
const emojiBuffer = Buffer.concat(emojiData);
const isUploadable = Promise.await(Media.isImage(emojiBuffer));
if (!isUploadable) {
throw new Meteor.Error('emoji-is-not-image', 'Emoji file provided cannot be uploaded since it\'s not an image');
}

Meteor.call('insertOrUpdateEmoji', fields);
Meteor.call('uploadEmojiCustom', emojiBuffer, emojiMimetype, fields);
callback();
} catch (error) {
return callback(error);
}
}));
this.request.pipe(busboy);
})();
Meteor.call('insertOrUpdateEmoji', fields);
Meteor.call('uploadEmojiCustom', emoji.fileBuffer, emoji.mimetype, fields);
});
},
});

API.v1.addRoute('emoji-custom.update', { authRequired: true }, {
post() {
const { emoji, ...fields } = Promise.await(getUploadFormData({
request: this.request,
}));

if (!fields._id) {
throw new Meteor.Error('The required "_id" query param is missing.');
}

const emojiToUpdate = EmojiCustom.findOneById(fields._id);
if (!emojiToUpdate) {
throw new Meteor.Error('Emoji not found.');
}

fields.previousName = emojiToUpdate.name;
fields.previousExtension = emojiToUpdate.extension;
fields.aliases = fields.aliases || '';
fields.newFile = Boolean(emoji?.fileBuffer.length);

if (fields.newFile) {
const isUploadable = Promise.await(Media.isImage(emoji.fileBuffer));
if (!isUploadable) {
throw new Meteor.Error('emoji-is-not-image', 'Emoji file provided cannot be uploaded since it\'s not an image');
}

const [, extension] = emoji.mimetype.split('/');
fields.extension = extension;
} else {
fields.extension = emojiToUpdate.extension;
}

Meteor.runAsUser(this.userId, () => {
const fields = {};
const busboy = new Busboy({ headers: this.request.headers });
const emojiData = [];
let emojiMimetype = '';

Meteor.wrapAsync((callback) => {
busboy.on('file', Meteor.bindEnvironment((fieldname, file, filename, encoding, mimetype) => {
if (fieldname !== 'emoji') {
return callback(new Meteor.Error('invalid-field'));
}
file.on('data', Meteor.bindEnvironment((data) => emojiData.push(data)));

file.on('end', Meteor.bindEnvironment(() => {
const extension = mimetype.split('/')[1];
emojiMimetype = mimetype;
fields.extension = extension;
}));
}));
busboy.on('field', (fieldname, val) => {
fields[fieldname] = val;
});
busboy.on('finish', Meteor.bindEnvironment(() => {
try {
if (!fields._id) {
return callback(new Meteor.Error('The required "_id" query param is missing.'));
}
const emojiToUpdate = EmojiCustom.findOneById(fields._id);
if (!emojiToUpdate) {
return callback(new Meteor.Error('Emoji not found.'));
}
fields.previousName = emojiToUpdate.name;
fields.previousExtension = emojiToUpdate.extension;
fields.aliases = fields.aliases || '';
fields.newFile = Boolean(emojiData.length);
const emojiBuffer = Buffer.concat(emojiData);
const isUploadable = Promise.await(Media.isImage(emojiBuffer));
if (!isUploadable) {
throw new Meteor.Error('emoji-is-not-image', 'Emoji file provided cannot be uploaded since it\'s not an image');
}

Meteor.call('insertOrUpdateEmoji', fields);
if (emojiData.length) {
Meteor.call('uploadEmojiCustom', emojiBuffer, emojiMimetype, fields);
}
callback();
} catch (error) {
return callback(error);
}
}));
this.request.pipe(busboy);
})();
Meteor.call('insertOrUpdateEmoji', fields);
if (fields.newFile) {
Meteor.call('uploadEmojiCustom', emoji.fileBuffer, emoji.mimetype, fields);
}
});
},
});
Expand Down
88 changes: 34 additions & 54 deletions app/api/server/v1/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { Meteor } from 'meteor/meteor';
import { Match, check } from 'meteor/check';
import { TAPi18n } from 'meteor/rocketchat:tap-i18n';
import _ from 'underscore';
import Busboy from 'busboy';

import { Users, Subscriptions } from '../../../models/server';
import { Users as UsersRaw } from '../../../models/server/raw';
Expand All @@ -16,10 +15,11 @@ import {
checkUsernameAvailability,
setUserAvatar,
saveCustomFields,
} from '../../../lib';
setStatusText,
} from '../../../lib/server';
import { getFullUserDataByIdOrUsername } from '../../../lib/server/functions/getFullUserData';
import { API } from '../api';
import { setStatusText } from '../../../lib/server';
import { getUploadFormData } from '../lib/getUploadFormData';
import { findUsersToAutocomplete, getInclusiveFields, getNonEmptyFields, getNonEmptyQuery } from '../lib/users';
import { getUserForCheck, emailCheck } from '../../../2fa/server/code';
import { resetUserE2EEncriptionKey } from '../../../../server/lib/resetUserE2EKey';
Expand Down Expand Up @@ -349,58 +349,38 @@ API.v1.addRoute('users.setAvatar', { authRequired: true }, {
return API.v1.unauthorized();
}

Meteor.runAsUser(user._id, () => {
if (this.bodyParams.avatarUrl) {
setUserAvatar(user, this.bodyParams.avatarUrl, '', 'url');
} else {
const busboy = new Busboy({ headers: this.request.headers });
const fields = {};
const getUserFromFormData = (fields) => {
if (fields.userId) {
return Users.findOneById(fields.userId, { _id: 1 });
}
if (fields.username) {
return Users.findOneByUsernameIgnoringCase(fields.username, { _id: 1 });
}
};

Meteor.wrapAsync((callback) => {
busboy.on('file', Meteor.bindEnvironment((fieldname, file, filename, encoding, mimetype) => {
if (fieldname !== 'image') {
return callback(new Meteor.Error('invalid-field'));
}
const imageData = [];
file.on('data', Meteor.bindEnvironment((data) => {
imageData.push(data);
}));

file.on('end', Meteor.bindEnvironment(() => {
const sentTheUserByFormData = fields.userId || fields.username;
if (sentTheUserByFormData) {
user = getUserFromFormData(fields);
if (!user) {
return callback(new Meteor.Error('error-invalid-user', 'The optional "userId" or "username" param provided does not match any users'));
}
const isAnotherUser = this.userId !== user._id;
if (isAnotherUser && !hasPermission(this.userId, 'edit-other-user-info')) {
return callback(new Meteor.Error('error-not-allowed', 'Not allowed'));
}
}
try {
setUserAvatar(user, Buffer.concat(imageData), mimetype, 'rest');
callback();
} catch (e) {
callback(e);
}
}));
}));
busboy.on('field', (fieldname, val) => {
fields[fieldname] = val;
});
this.request.pipe(busboy);
})();
if (this.bodyParams.avatarUrl) {
setUserAvatar(user, this.bodyParams.avatarUrl, '', 'url');
return API.v1.success();
}

const { image, ...fields } = Promise.await(getUploadFormData({
request: this.request,
}));

if (!image) {
return API.v1.failure('The \'image\' param is required');
}

const sentTheUserByFormData = fields.userId || fields.username;
if (sentTheUserByFormData) {
if (fields.userId) {
user = Users.findOneById(fields.userId, { fields: { username: 1 } });
} else if (fields.username) {
user = Users.findOneByUsernameIgnoringCase(fields.username, { fields: { username: 1 } });
}
});

if (!user) {
throw new Meteor.Error('error-invalid-user', 'The optional "userId" or "username" param provided does not match any users');
}

const isAnotherUser = this.userId !== user._id;
if (isAnotherUser && !hasPermission(this.userId, 'edit-other-user-info')) {
throw new Meteor.Error('error-not-allowed', 'Not allowed');
}
}

setUserAvatar(user, image.fileBuffer, image.mimetype, 'rest');

return API.v1.success();
},
Expand Down
3 changes: 1 addition & 2 deletions app/federation/server/endpoints/dispatch.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { Meteor } from 'meteor/meteor';
import { EJSON } from 'meteor/ejson';

import { API } from '../../../api/server';
Expand Down Expand Up @@ -240,7 +239,7 @@ const eventHandlers = {
origin,
};

Meteor.runAsUser(upload.userId, () => Meteor.wrapAsync(fileStore.insert.bind(fileStore))(upload, buffer));
fileStore.insertSync(upload, buffer);

// Update the message's file
denormalizedMessage.file._id = upload._id;
Expand Down
6 changes: 1 addition & 5 deletions app/federation/server/endpoints/uploads.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { Meteor } from 'meteor/meteor';

import { API } from '../../../api/server';
import { Uploads } from '../../../models/server';
import { FileUpload } from '../../../file-upload/server';
Expand All @@ -19,9 +17,7 @@ API.v1.addRoute('federation.uploads', { authRequired: false }, {
return API.v1.failure('There is no such file in this server');
}

const getFileBuffer = Meteor.wrapAsync(FileUpload.getBuffer, FileUpload);

const buffer = getFileBuffer(upload);
const buffer = FileUpload.getBufferSync(upload);

return API.v1.success({ upload, buffer });
},
Expand Down
Loading

0 comments on commit 63206b5

Please sign in to comment.