support for delete uploaded files

pull/2435/head
Diego Sampaio 10 years ago
parent 0ea80c7f15
commit 5fd741294b
  1. 2
      .meteor/versions
  2. 2
      packages/rocketchat-file-upload/client/lib/FileUploadGridFS.js
  3. 17
      packages/rocketchat-file-upload/package.js
  4. 47
      packages/rocketchat-file-upload/server/config/configFileUploadAmazonS3.js
  5. 19
      packages/rocketchat-file-upload/server/config/configFileUploadGridFS.js
  6. 27
      packages/rocketchat-file-upload/server/lib/FileUpload.js
  7. 17
      packages/rocketchat-file-upload/server/lib/fileUploadResponse.js
  8. 7
      packages/rocketchat-file-upload/server/lib/requests.js
  9. 33
      packages/rocketchat-file-upload/server/lib/responseAmazonS3.js
  10. 3
      server/methods/deleteMessage.coffee

@ -112,6 +112,8 @@ ordered-dict@1.0.4
ostrio:cookies@2.0.1
pauli:accounts-linkedin@1.2.0
pauli:linkedin@1.2.0
peerlibrary:aws-sdk@2.0.17_2
peerlibrary:blocking@0.4.3
perak:codemirror@1.2.9
percolate:synced-cron@1.3.0
pntbr:js-yaml-client@0.0.1

@ -36,7 +36,7 @@ FileUpload.GridFS = class FileUploadGridFS extends FileUploadBase {
}, 2000);
});
}
});;
});
}
start() {
return this.handler.start();

@ -1,3 +1,4 @@
/* globals Package */
Package.describe({
name: 'rocketchat:file-upload',
version: '0.0.1',
@ -10,6 +11,7 @@ Package.onUse(function(api) {
api.versionsFrom('1.2.1');
api.use('ecmascript');
api.use('edgee:slingshot');
api.use('peerlibrary:aws-sdk');
api.use('rocketchat:lib');
api.use('random');
api.use('underscore');
@ -18,21 +20,20 @@ Package.onUse(function(api) {
api.addFiles('globalFileRestrictions.js');
api.addFiles('client/lib/FileUploadBase.js', 'client');
api.addFiles('client/lib/fileUploadHandler.js', 'client');
api.addFiles('client/lib/FileUploadAmazonS3.js', 'client');
api.addFiles('client/lib/FileUploadGridFS.js', 'client');
api.addFiles('client/lib/fileUploadHandler.js', 'client');
api.addFiles('server/lib/fileUploadResponse.js', 'server');
api.addFiles('server/lib/FileUpload.js', 'server');
api.addFiles('server/lib/requests.js', 'server');
api.addFiles('server/lib/responseGridFS.js', 'server');
api.addFiles('server/lib/responseAmazonS3.js', 'server');
api.addFiles('server/configAmazonS3.js', 'server');
api.addFiles('server/startup/settings.js', 'server');
api.addFiles('server/config/configFileUploadAmazonS3.js', 'server');
api.addFiles('server/config/configFileUploadGridFS.js', 'server');
api.addFiles('server/methods/sendFileMessage.js', 'server');
api.addFiles('server/startup/settings.js', 'server');
api.export('fileUploadHandler');
api.export('FileUpload');
});

@ -1,4 +1,38 @@
/* globals createS3Directive:true, Slingshot */
/* globals createS3Directive:true, Slingshot, FileUpload, AWS */
var crypto = Npm.require('crypto');
var S3accessKey, S3secretKey;
var generateURL = function(file) {
if (!file || !file.s3) {
return;
}
let resourceURL = '/' + file.s3.bucket + '/' + file.s3.path + file._id;
let expires = parseInt(new Date().getTime() / 1000) + 60;
let StringToSign = 'GET\n\n\n' + expires +'\n'+resourceURL;
let signature = crypto.createHmac('sha1', S3secretKey).update(new Buffer(StringToSign, 'utf-8')).digest('base64');
return file.url + '?AWSAccessKeyId='+encodeURIComponent(S3accessKey)+'&Expires='+expires+'&Signature='+encodeURIComponent(signature);
};
FileUpload.addHandler('s3', {
get(file, req, res) {
let fileUrl = generateURL(file);
if (fileUrl) {
res.setHeader('Location', fileUrl);
res.writeHead(302);
}
res.end();
},
delete(file) {
let s3 = new AWS.S3();
let request = s3.deleteObject({
Bucket: file.s3.bucket,
Key: file.s3.path + file._id
});
request.send();
}
});
createS3Directive = _.debounce(() => {
var directiveName = 'rocketchat-uploads';
@ -12,6 +46,11 @@ createS3Directive = _.debounce(() => {
var region = RocketChat.settings.get('FileUpload_S3_Region');
var bucketUrl = RocketChat.settings.get('FileUpload_S3_BucketURL');
AWS.config.update({
accessKeyId: RocketChat.settings.get('FileUpload_S3_AWSAccessKeyId'),
secretAccessKey: RocketChat.settings.get('FileUpload_S3_AWSSecretAccessKey')
});
if (type === 'AmazonS3' && !_.isEmpty(bucket) && !_.isEmpty(accessKey) && !_.isEmpty(secretKey)) {
if (Slingshot._directives[directiveName]) {
delete Slingshot._directives[directiveName];
@ -72,11 +111,13 @@ RocketChat.settings.get('FileUpload_S3_Acl', function() {
createS3Directive();
});
RocketChat.settings.get('FileUpload_S3_AWSAccessKeyId', function() {
RocketChat.settings.get('FileUpload_S3_AWSAccessKeyId', function(key, value) {
S3accessKey = value;
createS3Directive();
});
RocketChat.settings.get('FileUpload_S3_AWSSecretAccessKey', function() {
RocketChat.settings.get('FileUpload_S3_AWSSecretAccessKey', function(key, value) {
S3secretKey = value;
createS3Directive();
});

@ -1,3 +1,4 @@
/* globals FileUpload, UploadFS */
var stream = Npm.require('stream');
var zlib = Npm.require('zlib');
@ -50,10 +51,16 @@ var readFromGridFS = function(storeName, fileId, file, req, res) {
}
};
fileUploadResponse.register('rocketchat_uploads', function(file, req, res, next) {
res.setHeader('Content-Disposition', "attachment; filename=\"" + encodeURIComponent(file.name) + "\"");
res.setHeader('Last-Modified', file.uploadedAt.toUTCString());
res.setHeader('Content-Type', file.type);
res.setHeader('Content-Length', file.size);
return readFromGridFS(file.store, file._id, file, req, res);
FileUpload.addHandler('rocketchat_uploads', {
get(file, req, res) {
res.setHeader('Content-Disposition', 'attachment; filename="' + encodeURIComponent(file.name) + '"');
res.setHeader('Last-Modified', file.uploadedAt.toUTCString());
res.setHeader('Content-Type', file.type);
res.setHeader('Content-Length', file.size);
return readFromGridFS(file.store, file._id, file, req, res);
},
delete(file) {
console.log('will delete file from GridFS',file);
return Meteor.fileStore.delete(file._id);
}
});

@ -0,0 +1,27 @@
/* globals FileUpload:true */
FileUpload = {
handlers: {},
addHandler(store, handler) {
this.handlers[store] = handler;
},
delete(fileId) {
let file = RocketChat.models.Uploads.findOneById(fileId);
if (!file) {
return;
}
this.handlers[file.store].delete(file);
return RocketChat.models.Uploads.remove(file._id);
},
get(file, req, res, next) {
if (file.store && this.handlers && this.handlers[file.store] && this.handlers[file.store].get) {
this.handlers[file.store].get.call(this, file, req, res, next);
} else {
res.writeHead(404);
res.end();
return;
}
}
};

@ -1,17 +0,0 @@
fileUploadResponse = new class {
constructor() {
this.workers = {};
}
register(store, callback) {
this.workers[store] = callback;
}
process(file, req, res, next) {
if (file.store && this.workers && this.workers[file.store]) {
this.workers[file.store].call(this, file, req, res, next);
} else {
res.writeHead(404);
res.end();
return;
}
}
};

@ -1,3 +1,4 @@
/* globals FileUpload, WebApp, Cookies */
var protectedFiles;
RocketChat.settings.get('FileUpload_ProtectFiles', function(key, value) {
@ -7,8 +8,6 @@ RocketChat.settings.get('FileUpload_ProtectFiles', function(key, value) {
WebApp.connectHandlers.use('/file-upload/', function(req, res, next) {
var file;
var dd = new Date();
var match = /^\/([^\/]+)\/(.*)/.exec(req.url);
if (match[1]) {
@ -19,7 +18,7 @@ WebApp.connectHandlers.use('/file-upload/', function(req, res, next) {
var cookie, rawCookies, ref, token, uid;
cookie = new Cookies();
if ((typeof req !== "undefined" && req !== null ? (ref = req.headers) != null ? ref.cookie : void 0 : void 0) != null) {
if ((typeof req !== 'undefined' && req !== null ? (ref = req.headers) != null ? ref.cookie : void 0 : void 0) != null) {
rawCookies = req.headers.cookie;
}
@ -43,7 +42,7 @@ WebApp.connectHandlers.use('/file-upload/', function(req, res, next) {
}
}
return fileUploadResponse.process(file, req, res, next);
return FileUpload.get(file, req, res, next);
}
}

@ -1,33 +0,0 @@
/* globals fileUploadResponse*/
var crypto = Npm.require('crypto');
var S3accessKey, S3secretKey;
RocketChat.settings.get('FileUpload_S3_AWSAccessKeyId', function(key, value) {
S3accessKey = value;
});
RocketChat.settings.get('FileUpload_S3_AWSSecretAccessKey', function(key, value) {
S3secretKey = value;
});
var generateURL = function(file) {
if (!file || !file.s3) {
return;
}
let resourceURL = '/' + file.s3.bucket + '/' + file.s3.path + file._id;
let expires = parseInt(new Date().getTime() / 1000) + 60;
let StringToSign = 'GET\n\n\n' + expires +'\n'+resourceURL;
let signature = crypto.createHmac('sha1', S3secretKey).update(new Buffer(StringToSign, 'utf-8')).digest('base64');
return file.url + '?AWSAccessKeyId='+encodeURIComponent(S3accessKey)+'&Expires='+expires+'&Signature='+encodeURIComponent(signature);
};
fileUploadResponse.register('s3', function(file, req, res) {
let fileUrl = generateURL(file);
if (fileUrl) {
res.setHeader('Location', fileUrl);
res.writeHead(302);
}
res.end();
});

@ -32,8 +32,7 @@ Meteor.methods
RocketChat.models.Messages.removeById originalMessage._id
if originalMessage.file?._id?
RocketChat.models.Uploads.remove originalMessage.file._id
Meteor.fileStore.delete originalMessage.file._id
FileUpload.delete(originalMessage.file._id)
if showDeletedStatus
RocketChat.models.Messages.setAsDeletedById originalMessage._id

Loading…
Cancel
Save