WIP: create new runtime-api

This commit is contained in:
Nick O'Leary
2018-04-15 11:18:10 +01:00
parent e8a637498d
commit e8e8f70c27
22 changed files with 1422 additions and 611 deletions

View File

@@ -14,39 +14,23 @@
* limitations under the License.
**/
var log;
var api;
var runtimeAPI;
var apiUtils = require("../util");
module.exports = {
init: function(runtime) {
log = runtime.log;
api = runtime.nodes;
init: function(_runtimeAPI) {
runtimeAPI = _runtimeAPI
},
get: function (req, res) {
// TODO: It should verify the given node id is of the type specified -
// but that would add a dependency from this module to the
// registry module that knows about node types.
var nodeType = req.params.type;
var nodeID = req.params.id;
log.audit({event: "credentials.get",type:nodeType,id:nodeID},req);
var credentials = api.getCredentials(nodeID);
if (!credentials) {
res.json({});
return;
var opts = {
user: req.user,
type: req.params.type,
id: req.params.id
}
var definition = api.getCredentialDefinition(nodeType);
var sendCredentials = {};
for (var cred in definition) {
if (definition.hasOwnProperty(cred)) {
if (definition[cred].type == "password") {
var key = 'has_' + cred;
sendCredentials[key] = credentials[cred] != null && credentials[cred] !== '';
continue;
}
sendCredentials[cred] = credentials[cred] || '';
}
}
res.json(sendCredentials);
runtimeAPI.flows.getNodeCredentials(opts).then(function(result) {
res.json(result);
}).catch(function(err) {
apiUtils.rejectHandler(req,res,err);
})
}
}

View File

@@ -25,6 +25,7 @@ var auth = require("../auth");
var nodes = require("../admin/nodes"); // TODO: move /icons into here
var needsPermission;
var runtime;
var runtimeAPI;
var log;
var apiUtil = require("../util");
@@ -38,16 +39,17 @@ var ensureRuntimeStarted = function(req,res,next) {
}
module.exports = {
init: function(server, _runtime) {
init: function(server, settings, _runtime, _runtimeAPI) {
runtime = _runtime;
runtimeAPI = _runtimeAPI;
log = runtime.log;
needsPermission = auth.needsPermission;
var settings = runtime.settings;
if (!settings.disableEditor) {
info.init(runtime);
info.init(runtimeAPI);
comms.init(server,runtime);
var ui = require("./ui");
// ui is passed runtime so it get access runtime.nodes.getNodeIconPath
ui.init(runtime);
var editorApp = express();
if (settings.requireHttps === true) {
@@ -67,7 +69,7 @@ module.exports = {
editorApp.get("/icons/:scope/:module/:icon",ui.icon);
var theme = require("./theme");
theme.init(runtime);
theme.init(settings, runtime.version());
editorApp.use("/theme",theme.app());
editorApp.use("/",ui.editorResources);
@@ -91,7 +93,7 @@ module.exports = {
// Credentials
var credentials = require("./credentials");
credentials.init(runtime);
credentials.init(runtimeAPI);
editorApp.get('/credentials/:type/:id', needsPermission("credentials.read"),credentials.get,apiUtil.errorHandler);
// Settings
@@ -100,11 +102,8 @@ module.exports = {
editorApp.get("/settings/user",needsPermission("settings.read"),info.userSettings,apiUtil.errorHandler);
// User Settings
editorApp.post("/settings/user",needsPermission("settings.write"),info.updateUserSettings,apiUtil.errorHandler);
// SSH keys
var sshkeys = require("./sshkeys");
sshkeys.init(runtime);
editorApp.use("/settings/user/keys",sshkeys.app());
editorApp.use("/settings/user/keys",info.sshkeys());
return editorApp;
}

View File

@@ -13,117 +13,48 @@
* See the License for the specific language governing permissions and
* limitations under the License.
**/
var theme = require("../editor/theme");
var util = require('util');
var runtime;
var settings;
var log;
var apiUtils = require("../util");
var runtimeAPI;
var sshkeys = require("./sshkeys");
var theme = require("./theme");
module.exports = {
init: function(_runtime) {
runtime = _runtime;
settings = runtime.settings;
log = runtime.log;
init: function(_runtimeAPI) {
runtimeAPI = _runtimeAPI;
sshkeys.init(runtimeAPI);
},
runtimeSettings: function(req,res) {
var safeSettings = {
httpNodeRoot: settings.httpNodeRoot||"/",
version: settings.version,
var opts = {
user: req.user
}
var themeSettings = theme.settings();
if (themeSettings) {
safeSettings.editorTheme = themeSettings;
}
if (util.isArray(settings.paletteCategories)) {
safeSettings.paletteCategories = settings.paletteCategories;
}
if (settings.flowFilePretty) {
safeSettings.flowFilePretty = settings.flowFilePretty;
}
if (!runtime.nodes.paletteEditorEnabled()) {
safeSettings.editorTheme = safeSettings.editorTheme || {};
safeSettings.editorTheme.palette = safeSettings.editorTheme.palette || {};
safeSettings.editorTheme.palette.editable = false;
}
if (runtime.storage.projects) {
var activeProject = runtime.storage.projects.getActiveProject();
if (activeProject) {
safeSettings.project = activeProject;
} else if (runtime.storage.projects.flowFileExists()) {
safeSettings.files = {
flow: runtime.storage.projects.getFlowFilename(),
credentials: runtime.storage.projects.getCredentialsFilename()
}
runtimeAPI.settings.getRuntimeSettings(opts).then(function(result) {
var themeSettings = theme.settings();
if (themeSettings) {
result.editorTheme = themeSettings;
}
safeSettings.git = {
globalUser: runtime.storage.projects.getGlobalGitUser()
}
}
safeSettings.flowEncryptionType = runtime.nodes.getCredentialKeyType();
settings.exportNodeSettings(safeSettings);
res.json(safeSettings);
res.json(result);
});
},
userSettings: function(req, res) {
var username;
if (!req.user || req.user.anonymous) {
username = '_';
} else {
username = req.user.username;
var opts = {
user: req.user
}
res.json(settings.getUserSettings(username)||{});
runtimeAPI.settings.getUserSettings(opts).then(function(result) {
res.json(result);
});
},
updateUserSettings: function(req,res) {
var username;
if (!req.user || req.user.anonymous) {
username = '_';
} else {
username = req.user.username;
}
var currentSettings = settings.getUserSettings(username)||{};
currentSettings = extend(currentSettings, req.body);
try {
settings.setUserSettings(username, currentSettings).then(function() {
log.audit({event: "settings.update",username:username},req);
res.status(204).end();
}).catch(function(err) {
log.audit({event: "settings.update",username:username,error:err.code||"unexpected_error",message:err.toString()},req);
res.status(400).json({error:err.code||"unexpected_error", message:err.toString()});
});
} catch(err) {
log.warn(log._("settings.user-not-available",{message:log._("settings.not-available")}));
log.audit({event: "settings.update",username:username,error:err.code||"unexpected_error",message:err.toString()},req);
res.status(400).json({error:err.code||"unexpected_error", message:err.toString()});
var opts = {
user: req.user,
settings: req.body
}
runtimeAPI.settings.updateUserSettings(opts).then(function(result) {
res.status(204).end();
}).catch(function(err) {
apiUtils.rejectHandler(req,res,err);
});
},
sshkeys: function() {
return sshkeys.app()
}
}
function extend(target, source) {
var keys = Object.keys(source);
var i = keys.length;
while(i--) {
var value = source[keys[i]]
var type = typeof value;
if (type === 'string' || type === 'number' || type === 'boolean' || Array.isArray(value)) {
target[keys[i]] = value;
} else if (value === null) {
if (target.hasOwnProperty(keys[i])) {
delete target[keys[i]];
}
} else {
// Object
if (target.hasOwnProperty(keys[i])) {
target[keys[i]] = extend(target[keys[i]],value);
} else {
target[keys[i]] = value;
}
}
}
return target;
}

View File

@@ -15,8 +15,7 @@
**/
var express = require("express");
var os = require("os");
var runtime;
var runtimeAPI;
var needsPermission = require("../auth").needsPermission;
function getUsername(userObj) {
@@ -28,94 +27,66 @@ function getUsername(userObj) {
}
module.exports = {
init: function(_runtime) {
runtime = _runtime;
init: function(_runtimeAPI) {
runtimeAPI = _runtimeAPI;
},
app: function() {
var app = express();
// SSH keys
// List all SSH keys
app.get("/", needsPermission("settings.read"), function(req,res) {
var username = getUsername(req.user);
runtime.storage.projects.ssh.listSSHKeys(username)
.then(function(list) {
var opts = {
user: req.user
}
runtimeAPI.settings.getUserKeys(opts).then(function(list) {
res.json({
keys: list
});
})
.catch(function(err) {
// console.log(err.stack);
if (err.code) {
res.status(400).json({error:err.code, message: err.message});
} else {
res.status(400).json({error:"unexpected_error", message:err.toString()});
}
}).catch(function(err) {
apiUtils.rejectHandler(req,res,err);
});
});
// Get SSH key detail
app.get("/:id", needsPermission("settings.read"), function(req,res) {
var username = getUsername(req.user);
// console.log('username:', username);
runtime.storage.projects.ssh.getSSHKey(username, req.params.id)
.then(function(data) {
if (data) {
res.json({
publickey: data
});
} else {
res.status(404).end();
}
})
.catch(function(err) {
if (err.code) {
res.status(400).json({error:err.code, message: err.message});
} else {
res.status(400).json({error:"unexpected_error", message:err.toString()});
}
var opts = {
user: req.user,
id: req.params.id
}
runtimeAPI.settings.getUserKey(opts).then(function(data) {
res.json({
publickey: data
});
}).catch(function(err) {
apiUtils.rejectHandler(req,res,err);
});
});
// Generate a SSH key
app.post("/", needsPermission("settings.write"), function(req,res) {
var username = getUsername(req.user);
// console.log('req.body:', req.body);
if ( req.body && req.body.name && /^[a-zA-Z0-9\-_]+$/.test(req.body.name)) {
runtime.storage.projects.ssh.generateSSHKey(username, req.body)
.then(function(name) {
// console.log('generate key --- success name:', name);
res.json({
name: name
});
})
.catch(function(err) {
if (err.code) {
res.status(400).json({error:err.code, message: err.message});
} else {
res.status(400).json({error:"unexpected_error", message:err.toString()});
}
var opts = {
user: req.user,
id: req.params.id
}
runtimeAPI.settings.generateUserKey(opts).then(function(name) {
res.json({
name: name
});
}
else {
res.status(400).json({error:"unexpected_error", message:"You need to have body or body.name"});
}
}).catch(function(err) {
apiUtils.rejectHandler(req,res,err);
});
});
// Delete a SSH key
app.delete("/:id", needsPermission("settings.write"), function(req,res) {
var username = getUsername(req.user);
runtime.storage.projects.ssh.deleteSSHKey(username, req.params.id)
.then(function() {
var opts = {
user: req.user,
id: req.params.id
}
runtimeAPI.settings.generateUserKey(opts).then(function(name) {
res.status(204).end();
})
.catch(function(err) {
if (err.code) {
res.status(400).json({error:err.code, message: err.message});
} else {
res.status(400).json({error:"unexpected_error", message:err.toString()});
}
}).catch(function(err) {
apiUtils.rejectHandler(req,res,err);
});
});

View File

@@ -40,7 +40,6 @@ var defaultContext = {
var theme = null;
var themeContext = clone(defaultContext);
var themeSettings = null;
var runtime = null;
var themeApp;
@@ -78,11 +77,10 @@ function serveFilesFromTheme(themeValue, themeApp, directory) {
}
module.exports = {
init: function(runtime) {
var settings = runtime.settings;
init: function(settings,version) {
themeContext = clone(defaultContext);
if (runtime.version) {
themeContext.version = runtime.version();
if (version) {
themeContext.version = version;
}
themeSettings = null;
theme = settings.editorTheme || {};