mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 11:05:54 +01:00 
			
		
		
		
	closes #2578
This commit is contained in:
		| @@ -34,8 +34,8 @@ var fs = require('fs'), | |||||||
|  |  | ||||||
| 	Plugins.initialized = false; | 	Plugins.initialized = false; | ||||||
|  |  | ||||||
| 	Plugins.requireLibrary = function(pluginData, libraryPath) { | 	Plugins.requireLibrary = function(pluginID, libraryPath) { | ||||||
| 		Plugins.libraries[pluginData.id] = require(libraryPath); | 		Plugins.libraries[pluginID] = require(libraryPath); | ||||||
| 		Plugins.libraryPaths.push(libraryPath); | 		Plugins.libraryPaths.push(libraryPath); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| @@ -287,23 +287,12 @@ var fs = require('fs'), | |||||||
|  |  | ||||||
| 					async.waterfall([ | 					async.waterfall([ | ||||||
| 						function(next) { | 						function(next) { | ||||||
| 							async.parallel({ | 							Plugins.loadPluginInfo(file, next); | ||||||
| 								packageJSON: function(next) { |  | ||||||
| 									fs.readFile(path.join(file, 'package.json'), next); |  | ||||||
| 						}, | 						}, | ||||||
| 								pluginJSON: function(next) { | 						function(pluginData, next) { | ||||||
| 									fs.readFile(path.join(file, 'plugin.json'), next); | 							var packageName = path.basename(file); | ||||||
| 								} |  | ||||||
| 							}, next); |  | ||||||
| 						}, |  | ||||||
| 						function(results, next) { |  | ||||||
| 							var packageName = path.basename(file), |  | ||||||
| 								packageInfo, pluginInfo; |  | ||||||
|  |  | ||||||
| 							try { | 							if (!pluginData) { | ||||||
| 								packageInfo = JSON.parse(results.packageJSON); |  | ||||||
| 								pluginInfo = JSON.parse(results.pluginJSON); |  | ||||||
| 							} catch (err) { |  | ||||||
| 								winston.warn("Plugin `" + packageName + "` is corrupted or invalid. Please check either package.json or plugin.json for errors."); | 								winston.warn("Plugin `" + packageName + "` is corrupted or invalid. Please check either package.json or plugin.json for errors."); | ||||||
| 							 	return next(null, { | 							 	return next(null, { | ||||||
| 							 		id: packageName, | 							 		id: packageName, | ||||||
| @@ -313,19 +302,17 @@ var fs = require('fs'), | |||||||
| 							 	}); | 							 	}); | ||||||
| 							} | 							} | ||||||
|  |  | ||||||
| 							Plugins.isActive(packageInfo.name, function(err, active) { | 							Plugins.isActive(pluginData.name, function(err, active) { | ||||||
| 								if (err) { | 								if (err) { | ||||||
| 									return next(new Error('no-active-state')); | 									return next(new Error('no-active-state')); | ||||||
| 								} | 								} | ||||||
|  |  | ||||||
| 								delete pluginInfo.hooks; | 								delete pluginData.hooks; | ||||||
| 								delete pluginInfo.library; | 								delete pluginData.library; | ||||||
| 								pluginInfo.active = active; | 								pluginData.active = active; | ||||||
| 								pluginInfo.installed = true; | 								pluginData.installed = true; | ||||||
| 								pluginInfo.error = false; | 								pluginData.error = false; | ||||||
| 								pluginInfo.version = packageInfo.version; | 								next(null, pluginData); | ||||||
|  |  | ||||||
| 								next(null, pluginInfo); |  | ||||||
| 							}); | 							}); | ||||||
| 						} | 						} | ||||||
| 					], function(err, config) { | 					], function(err, config) { | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ module.exports = function(Plugins) { | |||||||
|  |  | ||||||
| 			if (typeof data.method === 'string' && data.method.length > 0) { | 			if (typeof data.method === 'string' && data.method.length > 0) { | ||||||
| 				method = data.method.split('.').reduce(function(memo, prop) { | 				method = data.method.split('.').reduce(function(memo, prop) { | ||||||
| 					if (memo !== null && memo[prop]) { | 					if (memo && memo[prop]) { | ||||||
| 						return memo[prop]; | 						return memo[prop]; | ||||||
| 					} else { | 					} else { | ||||||
| 						// Couldn't find method by path, aborting | 						// Couldn't find method by path, aborting | ||||||
|   | |||||||
| @@ -12,20 +12,13 @@ var fs = require('fs'), | |||||||
| module.exports = function(Plugins) { | module.exports = function(Plugins) { | ||||||
|  |  | ||||||
| 	Plugins.loadPlugin = function(pluginPath, callback) { | 	Plugins.loadPlugin = function(pluginPath, callback) { | ||||||
| 		fs.readFile(path.join(pluginPath, 'plugin.json'), function(err, data) { | 		Plugins.loadPluginInfo(pluginPath, function(err, pluginData) { | ||||||
| 			if (err) { | 			if (err) { | ||||||
| 				return callback(pluginPath.match('nodebb-theme') ? null : err); | 				return callback(pluginPath.match('nodebb-theme') ? null : err); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			var pluginData, staticDir; | 			var staticDir; | ||||||
|  | 			if (!pluginData) { | ||||||
| 			try { |  | ||||||
| 				pluginData = JSON.parse(data); |  | ||||||
| 			} catch (err) { |  | ||||||
| 				var pluginDir = pluginPath.split(path.sep); |  | ||||||
| 				pluginDir = pluginDir[pluginDir.length -1]; |  | ||||||
|  |  | ||||||
| 				winston.error('[plugins/' + pluginDir + '] Plugin not loaded - please check its plugin.json for errors'); |  | ||||||
| 				return callback(); | 				return callback(); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| @@ -88,7 +81,7 @@ module.exports = function(Plugins) { | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if (!Plugins.libraries[pluginData.id]) { | 			if (!Plugins.libraries[pluginData.id]) { | ||||||
| 				Plugins.requireLibrary(pluginData, libraryPath); | 				Plugins.requireLibrary(pluginData.id, libraryPath); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if (Array.isArray(pluginData.hooks) && pluginData.hooks.length > 0) { | 			if (Array.isArray(pluginData.hooks) && pluginData.hooks.length > 0) { | ||||||
| @@ -198,7 +191,35 @@ module.exports = function(Plugins) { | |||||||
| 				callback(); | 				callback(); | ||||||
| 			}); | 			}); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	Plugins.loadPluginInfo = function(pluginPath, callback) { | ||||||
|  | 		async.parallel({ | ||||||
|  | 			package: function(next) { | ||||||
|  | 				fs.readFile(path.join(pluginPath, 'package.json'), next); | ||||||
|  | 			}, | ||||||
|  | 			plugin: function(next) { | ||||||
|  | 				fs.readFile(path.join(pluginPath, 'plugin.json'), next); | ||||||
|  | 			} | ||||||
|  | 		}, function(err, results) { | ||||||
|  | 			if (err) { | ||||||
|  | 				return callback(err); | ||||||
|  | 			} | ||||||
|  | 			try { | ||||||
|  | 				var pluginData = JSON.parse(results.plugin); | ||||||
|  | 				var packageData = JSON.parse(results.package); | ||||||
|  |  | ||||||
|  | 				var obj = utils.merge(pluginData, packageData); | ||||||
|  | 				obj.id = packageData.name; | ||||||
|  | 				callback(null, obj); | ||||||
|  | 			} catch(err) { | ||||||
|  | 				var pluginDir = pluginPath.split(path.sep); | ||||||
|  | 				pluginDir = pluginDir[pluginDir.length -1]; | ||||||
|  |  | ||||||
|  | 				winston.error('[plugins/' + pluginDir + '] Error in plugin.json/package.json! ' + err.message); | ||||||
|  |  | ||||||
|  | 				callback(); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	}; | ||||||
| }; | }; | ||||||
		Reference in New Issue
	
	Block a user