in src/plugman/install.js [196:244]
function getEngines (pluginInfo, platform, project_dir, plugin_dir) {
const engines = pluginInfo.getEngines();
const defaultEngines = require('./util/default-engines')(project_dir);
const uncheckedEngines = [];
let cordovaEngineIndex, cordovaPlatformEngineIndex, theName, platformIndex, defaultPlatformIndex;
// load in known defaults and update when necessary
engines.forEach(function (engine) {
theName = engine.name;
// check to see if the engine is listed as a default engine
if (defaultEngines[theName]) {
// make sure engine is for platform we are installing on
defaultPlatformIndex = defaultEngines[theName].platform.indexOf(platform);
if (defaultPlatformIndex > -1 || defaultEngines[theName].platform === '*') {
defaultEngines[theName].minVersion = defaultEngines[theName].minVersion ? defaultEngines[theName].minVersion : engine.version;
defaultEngines[theName].currentVersion = defaultEngines[theName].currentVersion ? defaultEngines[theName].currentVersion : null;
defaultEngines[theName].scriptSrc = defaultEngines[theName].scriptSrc ? defaultEngines[theName].scriptSrc : null;
defaultEngines[theName].name = theName;
// set the indices so we can pop the cordova engine when needed
if (theName === 'cordova') cordovaEngineIndex = uncheckedEngines.length;
if (theName === 'cordova-' + platform) cordovaPlatformEngineIndex = uncheckedEngines.length;
uncheckedEngines.push(defaultEngines[theName]);
}
// check for other engines
} else {
if (typeof engine.platform === 'undefined' || typeof engine.scriptSrc === 'undefined') {
throw new CordovaError('engine.platform or engine.scriptSrc is not defined in custom engine "' +
theName + '" from plugin "' + pluginInfo.id + '" for ' + platform);
}
platformIndex = engine.platform.indexOf(platform);
// CB-7183: security check for scriptSrc path escaping outside the plugin
const scriptSrcPath = path.resolve(plugin_dir, engine.scriptSrc);
if (scriptSrcPath.indexOf(plugin_dir) !== 0) {
throw new Error('Security violation: scriptSrc ' + scriptSrcPath + ' is out of plugin dir ' + plugin_dir);
}
if (platformIndex > -1 || engine.platform === '*') {
uncheckedEngines.push({ name: theName, platform: engine.platform, scriptSrc: scriptSrcPath, minVersion: engine.version });
}
}
});
// make sure we check for platform req's and not just cordova reqs
if (cordovaEngineIndex && cordovaPlatformEngineIndex) uncheckedEngines.pop(cordovaEngineIndex);
return uncheckedEngines;
}