From 22b7a70e38c4a879fe025d87bd43f1fdea4a3283 Mon Sep 17 00:00:00 2001 From: Jannik Schönartz Date: Mon, 30 Jul 2018 00:29:03 +0000 Subject: [server/external-backends] Implemented checkConnection of iDoIT. Simple auth call is made with error handling. --- server/.eslintrc.js | 3 ++ server/.gitignore | 3 +- server/api/backends.js | 12 ++--- .../external-backends/backends/another-backend.js | 2 +- .../external-backends/backends/dummy-backend.js | 2 +- .../external-backends/backends/idoit-backend.js | 59 ++++++++++++++++++++-- .../external-backends/backends/template-backend.js | 2 +- server/lib/external-backends/external-backends.js | 2 +- server/package-lock.json | 22 ++++++++ server/package.json | 1 + 10 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 server/.eslintrc.js (limited to 'server') diff --git a/server/.eslintrc.js b/server/.eslintrc.js new file mode 100644 index 0000000..b6351b0 --- /dev/null +++ b/server/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + "extends": "standard" +}; diff --git a/server/.gitignore b/server/.gitignore index 251d1ad..3e9d832 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -19,5 +19,4 @@ yarn-error.log* *.suo *.ntvs* *.njsproj -*.sln -*.eslintrc.js +*.sln \ No newline at end of file diff --git a/server/api/backends.js b/server/api/backends.js index a5d1233..3b9551e 100644 --- a/server/api/backends.js +++ b/server/api/backends.js @@ -51,14 +51,14 @@ module.exports = { const backendId = req.query.id db.backend.findOne({ where: { id: backendId } }).then(backend => { const bCredentials = { - backendId: backendId, - backendName: backend.name, - backendType: backend.type, - backendCredentials: backend.credentials + id: backendId, + name: backend.name, + type: backend.type, + credentials: backend.credentials } const b = new ExternalBackends() - const instance = b.getInstance(bCredentials.backendType) - instance.checkConnection().then(connection => { + const instance = b.getInstance(bCredentials.type) + instance.checkConnection(bCredentials).then(connection => { res.status(200).send({ success: connection.success, msg: connection.msg }) }) }) diff --git a/server/lib/external-backends/backends/another-backend.js b/server/lib/external-backends/backends/another-backend.js index 90b8f8b..8044f84 100644 --- a/server/lib/external-backends/backends/another-backend.js +++ b/server/lib/external-backends/backends/another-backend.js @@ -5,7 +5,7 @@ class AnotherBackend extends ExternalBackends { return [{ type: 'text', id: 1, name: 'text 1' }, { type: 'text', id: 2, name: 'text 2' }, { type: 'password', id: 3, name: 'password 1', show: false }, { type: 'password', id: 4, name: 'password 2', show: true }, { type: 'password', id: 5, name: 'password 3', show: false }] } - async checkConnection () { + async checkConnection (backend) { return { success: true } } } diff --git a/server/lib/external-backends/backends/dummy-backend.js b/server/lib/external-backends/backends/dummy-backend.js index 99d27c1..a1704e3 100644 --- a/server/lib/external-backends/backends/dummy-backend.js +++ b/server/lib/external-backends/backends/dummy-backend.js @@ -5,7 +5,7 @@ class DummyBackend extends ExternalBackends { return [{ type: 'switch', id: 1, name: 'switch 1', value: false }, { type: 'switch', id: 2, name: 'switch 2', value: false }, { type: 'switch', id: 3, name: 'switch 3', value: true }, { type: 'select', id: 4, name: 'selection 1', items: ['wasd', 'asdf', 'qwertz'] }, { type: 'select', id: 5, name: 'selection 2', items: ['1', '2', '3'] }] } - async checkConnection () { + async checkConnection (backend) { return { success: false, msg: 'This is a test where success was intentionally set to false!' } } } diff --git a/server/lib/external-backends/backends/idoit-backend.js b/server/lib/external-backends/backends/idoit-backend.js index 2520b07..d95618d 100644 --- a/server/lib/external-backends/backends/idoit-backend.js +++ b/server/lib/external-backends/backends/idoit-backend.js @@ -1,4 +1,5 @@ var ExternalBackends = require('../external-backends.js') +var axios = require('axios') class IdoitBackend extends ExternalBackends { getCredentials () { @@ -6,7 +7,8 @@ class IdoitBackend extends ExternalBackends { return [ { type: 'text', id: 1, name: 'API url', icon: 'link' }, { type: 'password', id: 2, name: 'API token', icon: 'vpn_key', show: false }, - { type: 'switch', + { + type: 'switch', id: 3, name: 'Login', icon: 'lock_open', @@ -18,9 +20,58 @@ class IdoitBackend extends ExternalBackends { ] } - async checkConnection () { - // Make a simple login and check if the connection works. - return { success: false, msg: 'TODO: IMPLEMENT' } + async checkConnection (backend) { + const credentials = JSON.parse(backend.credentials) + const url = credentials.find(x => x.id === 1).value + const apiKey = credentials.find(x => x.id === 2).value + + const body = { + 'version': '2.0', + 'method': 'idoit.login', + 'params': { + 'apikey': apiKey, + 'language': 'en' + }, + 'id': 1 + } + + var config = { + timeout: 30000, + headers: { + 'Content-Type': 'application/json' + } + } + + // Optional credentials + const login = credentials.find(x => x.id === 3) + if (login.value) { + config.headers['X-RPC-Auth-Username'] = login.elements.find(x => x.id === 4).value + config.headers['X-RPC-Auth-Password'] = login.elements.find(x => x.id === 5).value + } + + // Make a login request and see if we are authenticated. + var response = await axios.post(url, body, config) + .then(response => { + return response + }) + .catch(error => { + console.log(error) + return error.response ? error.response : { status: 900, statusText: 'Request failed timeout' } + }) + + // Axios error handling + if (response.status !== 200) { + return { success: false, error: response.status, msg: response.statusText } + } + + // iDoIT error handling. + if (response.data.result) { + return { success: true } + } else if (response.data.error) { + return { success: false, error: response.data.error.message, msg: response.data.error.data.error } + } else { + return { success: false, msg: 'UNNOWN ERROR' } + } } } diff --git a/server/lib/external-backends/backends/template-backend.js b/server/lib/external-backends/backends/template-backend.js index ceab46a..3bf665a 100644 --- a/server/lib/external-backends/backends/template-backend.js +++ b/server/lib/external-backends/backends/template-backend.js @@ -5,7 +5,7 @@ class TemplateBackend extends ExternalBackends { return [{ type: 'text', id: 1, name: 'text test', icon: 'bug_report' }, { type: 'password', id: 2, name: 'password test', show: true }, { type: 'password', id: 3, name: 'password test nr2', show: false }, { type: 'switch', id: 4, name: 'bool test', value: false }, { type: 'select', id: 5, name: 'selection test', items: ['wasd', 'asdf', 'qwertz'] }] } - async checkConnection () { + async checkConnection (backend) { var result = await x() console.log(result) return result diff --git a/server/lib/external-backends/external-backends.js b/server/lib/external-backends/external-backends.js index a1264a0..7d306b3 100644 --- a/server/lib/external-backends/external-backends.js +++ b/server/lib/external-backends/external-backends.js @@ -27,7 +27,7 @@ class ExternalBackends { return backend } - async checkConnection () { + async checkConnection (backend) { console.log('If this method gets called the backend class has NOT IMPLEMENTED the checkConnection method!') return null } diff --git a/server/package-lock.json b/server/package-lock.json index 96ee9be..3af2294 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -129,6 +129,15 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "requires": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1125,6 +1134,14 @@ "write": "^0.2.1" } }, + "follow-redirects": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.1.tgz", + "integrity": "sha512-v9GI1hpaqq1ZZR6pBD1+kI7O24PhDvNGNodjS3MdcEqyrahCp8zbtpv+2B/krUnSmUH80lbAS7MrdeK5IylgKg==", + "requires": { + "debug": "^3.1.0" + } + }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -1363,6 +1380,11 @@ "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", diff --git a/server/package.json b/server/package.json index 247a12e..0ad1ccc 100644 --- a/server/package.json +++ b/server/package.json @@ -7,6 +7,7 @@ "start": "node ./bin/www" }, "dependencies": { + "axios": "^0.18.0", "compression": "^1.7.2", "cookie-parser": "^1.4.3", "debug": "^3.1.0", -- cgit v1.2.3-55-g7522