var fs = require('fs'),
path = require('path'),
- ejs = require('ejs'),
- rimraf = require('rimraf'),
+ rm = require('del'),
+ debug = require('debug')('files'),
+ mkdirp = require('mkdirp'),
HttpError = require('connect-lastmile').HttpError,
HttpSuccess = require('connect-lastmile').HttpSuccess;
-exports = module.exports = {
- get: get,
- put: put,
- del: del
-};
+var gBasePath;
+
+exports = module.exports = function (basePath) {
+ gBasePath = basePath;
-var FILE_BASE = path.resolve(__dirname, '../files');
+ return {
+ get: get,
+ put: put,
+ del: del
+ };
+};
// http://stackoverflow.com/questions/11293857/fastest-way-to-copy-file-in-node-js
function copyFile(source, target, cb) {
var cbCalled = false;
- var rd = fs.createReadStream(source);
- rd.on("error", function(err) {
- done(err);
- });
+ // ensure directory
+ mkdirp(path.dirname(target), function (error) {
+ if (error) return cb(error);
- var wr = fs.createWriteStream(target);
- wr.on("error", function(err) {
- done(err);
- });
+ var rd = fs.createReadStream(source);
+ rd.on("error", function(err) {
+ done(err);
+ });
- wr.on("close", function(ex) {
- done();
- });
+ var wr = fs.createWriteStream(target);
+ wr.on("error", function(err) {
+ done(err);
+ });
- rd.pipe(wr);
+ wr.on("close", function(ex) {
+ done();
+ });
- function done(err) {
- if (!cbCalled) {
- cb(err);
- cbCalled = true;
- }
- }
-}
+ rd.pipe(wr);
-function render(view, options) {
- return ejs.render(fs.readFileSync(view, 'utf8'), options);
+ function done(err) {
+ if (!cbCalled) {
+ cb(err);
+ cbCalled = true;
+ }
+ }
+ });
}
function getAbsolutePath(filePath) {
- var absoluteFilePath = path.resolve(FILE_BASE, filePath);
+ var absoluteFilePath = path.resolve(path.join(gBasePath, filePath));
- if (absoluteFilePath.indexOf(FILE_BASE) !== 0) return null;
+ if (absoluteFilePath.indexOf(gBasePath) !== 0) return null;
return absoluteFilePath;
}
fs.stat(absoluteFilePath, function (error, result) {
if (error) return next(new HttpError(404, error));
- console.log('get', absoluteFilePath, result);
+ debug('get', absoluteFilePath);
- if (result.isFile()) return res.sendfile(absoluteFilePath);
- if (result.isDirectory()) return res.status(200).send({ entries: fs.readdirSync(absoluteFilePath) });
+ if (result.isFile()) return res.sendFile(absoluteFilePath);
+ if (result.isDirectory()) return res.status(222).send({ entries: fs.readdirSync(absoluteFilePath) });
return next(new HttpError(500, 'unsupported type'));
});
fs.stat(absoluteFilePath, function (error, result) {
if (error && error.code !== 'ENOENT') return next(new HttpError(500, error));
- console.log('put', absoluteFilePath, result, req.files.file);
+ debug('put', absoluteFilePath, req.files.file);
if (result && result.isDirectory()) return next(new HttpError(409, 'cannot put on directories'));
if (!result || result.isFile()) {
function del(req, res, next) {
var filePath = req.params[0];
var absoluteFilePath = getAbsolutePath(filePath);
- if (!absoluteFilePath) return next(new HttpError(403, 'Path not allowed'));
+ if (!absoluteFilePath) return next(new HttpError(404, 'Not found'));
+ if (absoluteFilePath.slice(gBasePath.length) === '') return next(new HttpError(403, 'Forbidden'));
fs.stat(absoluteFilePath, function (error, result) {
if (error) return next(new HttpError(404, error));
- rimraf(absoluteFilePath, function (error) {
+ rm(absoluteFilePath, function (error, result) {
if (error) return next(new HttpError(500, 'Unable to remove'));
- next(new HttpError(200, {}));
+ next(new HttpSuccess(200, { entries: result }));
});
});
}