From 561b42d0f92d40cae7735f87eb9ebc4b2e1751e6 Mon Sep 17 00:00:00 2001
From: Julian Lam <julian@designcreateplay.com>
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');
 					}