Skip to content

Commit 5e1b862

Browse files
committed
Changed uploadDir to initialize from formData and customized further for PairIDE.
1 parent 815f050 commit 5e1b862

File tree

2 files changed

+53
-41
lines changed

2 files changed

+53
-41
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
jquery-file-upload-middleware
22
=============================
33

4+
> This module has been mofified and customized to work with [PairIDE](https://github.com/pairide/pairide). Original readme is appended below as is.
5+
46
jQuery-File-Upload Express.js middleware. Based on the server code of [jQuery-File-Upload](https://github.com/blueimp/jQuery-File-Upload)
57

68
Installation:

lib/uploadhandler.js

+51-41
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,41 @@ var EventEmitter = require('events').EventEmitter,
66
mkdirp = require('mkdirp'),
77
_ = require('lodash');
88

9-
module.exports = function (options) {
9+
var upload_directory = null;
10+
var FileInfo = null;
11+
var username = null;
12+
13+
function get_upload_directory(){
14+
return upload_directory;
15+
}
16+
17+
function validatePath(relativePath, fileName){
18+
19+
relativePath = unescape(relativePath);
20+
fileName = unescape(fileName);
1021

11-
var FileInfo = require('./fileinfo')(
12-
_.extend({
13-
baseDir: options.uploadDir
14-
}, _.pick(options, 'minFileSize', 'maxFileSize', 'acceptFileTypes'))
15-
);
22+
var fullPath = relativePath + fileName;
23+
//Check for .. in relative path
24+
var pathReg1 = /.*\.\..*/;
25+
//Check that the fileName doesn't contain / or \
26+
var pathReg2 = /(.*(\/|\\).*)/;
27+
//Further validation on the name mostly ensures characters are alphanumeric
28+
var pathReg3 = /^([a-zA-Z0-9_ .]|-)*$/;
29+
30+
return !(pathReg1.exec(relativePath)
31+
|| pathReg2.exec(fileName)
32+
|| !pathReg3.exec(fileName)
33+
|| pathReg1.exec(fullPath));
34+
}
35+
36+
module.exports = function (options) {
1637

1738
var UploadHandler = function (req, res, callback) {
1839
EventEmitter.call(this);
1940
this.req = req;
2041
this.res = res;
2142
this.callback = callback;
43+
username = req.session.user_id;
2244
};
2345
require('util').inherits(UploadHandler, EventEmitter);
2446

@@ -31,23 +53,6 @@ module.exports = function (options) {
3153
};
3254

3355
UploadHandler.prototype.get = function () {
34-
this.noCache();
35-
var files = [];
36-
fs.readdir(options.uploadDir(), _.bind(function (err, list) {
37-
_.each(list, function (name) {
38-
var stats = fs.statSync(options.uploadDir() + '/' + name),
39-
fileInfo;
40-
if (stats.isFile()) {
41-
fileInfo = new FileInfo({
42-
name: name,
43-
size: stats.size
44-
});
45-
this.initUrls(fileInfo);
46-
files.push(fileInfo);
47-
}
48-
}, this);
49-
this.callback(files);
50-
}, this));
5156
};
5257

5358
UploadHandler.prototype.post = function () {
@@ -74,6 +79,7 @@ module.exports = function (options) {
7479
form.uploadDir = options.tmpDir;
7580
form
7681
.on('fileBegin', function (name, file) {
82+
console.log("Begin file... ");
7783
tmpFiles.push(file.path);
7884
var fileInfo = new FileInfo(file);
7985
fileInfo.safeName();
@@ -82,6 +88,20 @@ module.exports = function (options) {
8288
self.emit('begin', fileInfo);
8389
})
8490
.on('field', function (name, value) {
91+
92+
if(!validatePath(value, "")){
93+
return;
94+
}
95+
md5h = require('MD5'),
96+
app_dir = require('../../../config').app_dir;
97+
upload_directory = app_dir + '/users/' + md5h(username) + value;
98+
99+
FileInfo = require('./fileinfo')(
100+
_.extend({
101+
baseDir: function() { return get_upload_directory(); }
102+
}, _.pick(options, 'minFileSize', 'maxFileSize', 'acceptFileTypes'))
103+
);
104+
85105
if (name === 'redirect') {
86106
redirect = value;
87107
}
@@ -99,33 +119,33 @@ module.exports = function (options) {
99119
if (options.imageTypes.test(fileInfo.name)) {
100120
_.each(options.imageVersions, function (value, version) {
101121
// creating directory recursive
102-
if (!fs.existsSync(options.uploadDir() + '/' + version + '/'))
103-
mkdirp.sync(options.uploadDir() + '/' + version + '/');
122+
if (!fs.existsSync(get_upload_directory() + '/' + version + '/'))
123+
mkdirp.sync(get_upload_directory() + '/' + version + '/');
104124

105125
counter++;
106126
var opts = options.imageVersions[version];
107127
imageMagick.resize({
108128
width: opts.width,
109129
height: opts.height,
110-
srcPath: options.uploadDir() + '/' + fileInfo.name,
111-
dstPath: options.uploadDir() + '/' + version + '/' + fileInfo.name,
130+
srcPath: get_upload_directory() + '/' + fileInfo.name,
131+
dstPath: get_upload_directory() + '/' + version + '/' + fileInfo.name,
112132
customArgs: opts.imageArgs || ['-auto-orient']
113133
}, finish);
114134
});
115135
}
116136
}
117137

118-
if (!fs.existsSync(options.uploadDir() + '/'))
119-
mkdirp.sync(options.uploadDir() + '/');
138+
if (!fs.existsSync(get_upload_directory() + '/'))
139+
mkdirp.sync(get_upload_directory() + '/');
120140

121141
counter++;
122-
fs.rename(file.path, options.uploadDir() + '/' + fileInfo.name, function (err) {
142+
fs.rename(file.path, get_upload_directory() + '/' + fileInfo.name, function (err) {
123143
if (!err) {
124144
generatePreviews();
125145
finish();
126146
} else {
127147
var is = fs.createReadStream(file.path);
128-
var os = fs.createWriteStream(options.uploadDir() + '/' + fileInfo.name);
148+
var os = fs.createWriteStream(get_upload_directory() + '/' + fileInfo.name);
129149
is.on('end', function (err) {
130150
if (!err) {
131151
fs.unlinkSync(file.path);
@@ -157,16 +177,6 @@ module.exports = function (options) {
157177
};
158178

159179
UploadHandler.prototype.destroy = function () {
160-
var self = this,
161-
fileName = path.basename(decodeURIComponent(this.req.url));
162-
163-
fs.unlink(options.uploadDir() + '/' + fileName, function (ex) {
164-
_.each(options.imageVersions, function (value, version) {
165-
fs.unlink(options.uploadDir() + '/' + version + '/' + fileName);
166-
});
167-
self.emit('delete', fileName);
168-
self.callback(!ex);
169-
});
170180
};
171181

172182
UploadHandler.prototype.initUrls = function (fileInfo) {

0 commit comments

Comments
 (0)