From 561b42d0f92d40cae7735f87eb9ebc4b2e1751e6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 28 Feb 2014 16:21:02 -0500 Subject: [PATCH] new staticDirs format, @mrwaffle --- package.json | 3 ++- src/plugins.js | 2 +- src/routes/plugins.js | 36 ++++++++++++++++++++++++++++-------- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 9024cc068b..b3e7350f72 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,8 @@ "nodebb-theme-cerulean": "~0.0.13", "nodebb-theme-lavender": "~0.0.22", "less": "^1.6.3", - "daemon": "~1.1.0" + "daemon": "~1.1.0", + "underscore": "^1.6.0" }, "optionalDependencies": { "redis": "0.8.3", diff --git a/src/plugins.js b/src/plugins.js index 30731712e8..4d01840498 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -174,7 +174,7 @@ var fs = require('fs'), (function(staticDir) { fs.exists(staticDir, function(exists) { if (exists) { - Plugins.staticDirs[mappedPath] = staticDir; + Plugins.staticDirs[path.join(pluginData.id, mappedPath)] = staticDir; } else { winston.warn('[plugins/' + pluginData.id + '] Mapped path \'' + mappedPath + ' => ' + staticDir + '\' not found.'); } diff --git a/src/routes/plugins.js b/src/routes/plugins.js index 96638a86dd..774fee7217 100644 --- a/src/routes/plugins.js +++ b/src/routes/plugins.js @@ -4,6 +4,8 @@ var nconf = require('nconf'), path = require('path'), fs = require('fs'), validator = require('validator'), + _ = require('underscore'), + async = require('async'), plugins = require('../plugins'), PluginRoutes = function(app) { @@ -31,16 +33,34 @@ var nconf = require('nconf'), // Static Assets app.get('/plugins/:id/*', function(req, res) { - var relPath = req._parsedUrl.pathname.replace(nconf.get('relative_path') + '/plugins/' + req.params.id, ''); + var relPath = req._parsedUrl.pathname.replace(nconf.get('relative_path') + '/plugins/', ''), + matches = _.map(plugins.staticDirs, function(realPath, mappedPath) { + if (relPath.match(mappedPath)) { + return mappedPath; + } else { + return null; + } + }).filter(function(a) { return a; }); + + if (matches) { + async.map(matches, function(mappedPath, next) { + var filePath = path.join(plugins.staticDirs[mappedPath], relPath.slice(mappedPath.length)); - if (plugins.staticDirs[req.params.id]) { - var fullPath = path.join(plugins.staticDirs[req.params.id], decodeURIComponent(relPath)); + fs.exists(filePath, function(exists) { + if (exists) { + next(null, filePath); + } else { + next(); + } + }); + }, function(err, matches) { + // Filter out the nulls + matches = matches.filter(function(a) { + return a; + }); - fs.exists(fullPath, function(exists) { - if (exists) { - res.sendfile(fullPath, { - maxAge: app.enabled('cache') ? 5184000000 : 0 - }); + if (matches.length) { + res.sendfile(matches[0]); } else { res.redirect('/404'); }