UNPKG

ltijs

Version:

Turn your application into a fully integratable LTI 1.3 tool or platform.

385 lines (319 loc) 13.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _classPrivateFieldGet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet")); var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet")); // Utis const Auth = require('./Auth'); const provPlatformDebug = require('debug')('provider:platform'); /** * @description Class representing a registered platform. */ class Platform { /** * @param {string} name - Platform name. * @param {string} platformUrl - Platform url. * @param {string} clientId - Client Id generated by the platform. * @param {string} authenticationEndpoint - Authentication endpoint that the tool will use to authenticate within the platform. * @param {string} accesstokenEndpoint - Access token endpoint for the platform. * @param {string} kid - Key id for local keypair used to sign messages to this platform. * @param {string} _ENCRYPTIONKEY - Encryption key used * @param {Object} _authConfig - Authentication configurations for the platform. */ constructor(name, platformUrl, clientId, authenticationEndpoint, accesstokenEndpoint, kid, _ENCRYPTIONKEY, _authConfig, logger, Database) { _platformName.set(this, { writable: true, value: void 0 }); _platformUrl.set(this, { writable: true, value: void 0 }); _clientId.set(this, { writable: true, value: void 0 }); _authEndpoint.set(this, { writable: true, value: void 0 }); _authConfig2.set(this, { writable: true, value: void 0 }); _ENCRYPTIONKEY2.set(this, { writable: true, value: void 0 }); _accesstokenEndpoint.set(this, { writable: true, value: void 0 }); _kid.set(this, { writable: true, value: void 0 }); _logger.set(this, { writable: true, value: void 0 }); _Database.set(this, { writable: true, value: void 0 }); (0, _classPrivateFieldSet2.default)(this, _authConfig2, _authConfig); (0, _classPrivateFieldSet2.default)(this, _ENCRYPTIONKEY2, _ENCRYPTIONKEY); (0, _classPrivateFieldSet2.default)(this, _platformName, name); (0, _classPrivateFieldSet2.default)(this, _platformUrl, platformUrl); (0, _classPrivateFieldSet2.default)(this, _clientId, clientId); (0, _classPrivateFieldSet2.default)(this, _authEndpoint, authenticationEndpoint); (0, _classPrivateFieldSet2.default)(this, _accesstokenEndpoint, accesstokenEndpoint); (0, _classPrivateFieldSet2.default)(this, _kid, kid); (0, _classPrivateFieldSet2.default)(this, _logger, logger); (0, _classPrivateFieldSet2.default)(this, _Database, Database); } /** * @description Sets/Gets the platform name. * @param {string} [name] - Platform name. */ async platformName(name) { if (!name) return (0, _classPrivateFieldGet2.default)(this, _platformName); try { await (0, _classPrivateFieldGet2.default)(this, _Database).Modify(false, 'platform', { platformUrl: (0, _classPrivateFieldGet2.default)(this, _platformUrl) }, { platformName: name }); } catch (err) { provPlatformDebug(err.message); if ((0, _classPrivateFieldGet2.default)(this, _logger)) (0, _classPrivateFieldGet2.default)(this, _logger).log({ level: 'error', message: 'Message: ' + err.message + '\nStack: ' + err.stack }); return false; } (0, _classPrivateFieldSet2.default)(this, _platformName, name); return this; } /** * @description Sets/Gets the platform url. * @param {string} [url] - Platform url. */ async platformUrl(url) { if (!url) return (0, _classPrivateFieldGet2.default)(this, _platformUrl); try { await (0, _classPrivateFieldGet2.default)(this, _Database).Modify(false, 'platform', { platformUrl: (0, _classPrivateFieldGet2.default)(this, _platformUrl) }, { platformUrl: url }); } catch (err) { provPlatformDebug(err.message); if ((0, _classPrivateFieldGet2.default)(this, _logger)) (0, _classPrivateFieldGet2.default)(this, _logger).log({ level: 'error', message: 'Message: ' + err.message + '\nStack: ' + err.stack }); return false; } (0, _classPrivateFieldSet2.default)(this, _platformUrl, url); return this; } /** * @description Sets/Gets the platform client id. * @param {string} [clientId] - Platform client id. */ async platformClientId(clientId) { if (!clientId) return (0, _classPrivateFieldGet2.default)(this, _clientId); try { await (0, _classPrivateFieldGet2.default)(this, _Database).Modify(false, 'platform', { platformUrl: (0, _classPrivateFieldGet2.default)(this, _platformUrl) }, { clientId: clientId }); } catch (err) { provPlatformDebug(err.message); if ((0, _classPrivateFieldGet2.default)(this, _logger)) (0, _classPrivateFieldGet2.default)(this, _logger).log({ level: 'error', message: 'Message: ' + err.message + '\nStack: ' + err.stack }); return false; } (0, _classPrivateFieldSet2.default)(this, _clientId, clientId); return this; } /** * @description Gets the platform key_id. */ platformKid() { return (0, _classPrivateFieldGet2.default)(this, _kid); } /** * @description Gets the RSA public key assigned to the platform. * */ async platformPublicKey() { try { const key = await (0, _classPrivateFieldGet2.default)(this, _Database).Get((0, _classPrivateFieldGet2.default)(this, _ENCRYPTIONKEY2), 'publickey', { kid: (0, _classPrivateFieldGet2.default)(this, _kid) }); return key[0].key; } catch (err) { provPlatformDebug(err.message); if ((0, _classPrivateFieldGet2.default)(this, _logger)) (0, _classPrivateFieldGet2.default)(this, _logger).log({ level: 'error', message: 'Message: ' + err.message + '\nStack: ' + err.stack }); return false; } } /** * @description Gets the RSA private key assigned to the platform. * */ async platformPrivateKey() { try { const key = await (0, _classPrivateFieldGet2.default)(this, _Database).Get((0, _classPrivateFieldGet2.default)(this, _ENCRYPTIONKEY2), 'privatekey', { kid: (0, _classPrivateFieldGet2.default)(this, _kid) }); return key[0].key; } catch (err) { provPlatformDebug(err.message); if ((0, _classPrivateFieldGet2.default)(this, _logger)) (0, _classPrivateFieldGet2.default)(this, _logger).log({ level: 'error', message: 'Message: ' + err.message + '\nStack: ' + err.stack }); return false; } } /** * @description Sets/Gets the platform authorization configurations used to validate it's messages. * @param {string} method - Method of authorization "RSA_KEY" or "JWK_KEY" or "JWK_SET". * @param {string} key - Either the RSA public key provided by the platform, or the JWK key, or the JWK keyset address. */ async platformAuthConfig(method, key) { if (!method && !key) return (0, _classPrivateFieldGet2.default)(this, _authConfig2); if (method !== 'RSA_KEY' && method !== 'JWK_KEY' && method !== 'JWK_SET') throw new Error('Invalid message validation method. Valid methods are "RSA_KEY", "JWK_KEY", "JWK_SET"'); if (!key) throw new Error('Missing secong argument key or keyset_url.'); const authConfig = { method: method, key: key }; try { await (0, _classPrivateFieldGet2.default)(this, _Database).Modify(false, 'platform', { platformUrl: (0, _classPrivateFieldGet2.default)(this, _platformUrl) }, { authConfig: authConfig }); } catch (err) { provPlatformDebug(err.message); if ((0, _classPrivateFieldGet2.default)(this, _logger)) (0, _classPrivateFieldGet2.default)(this, _logger).log({ level: 'error', message: 'Message: ' + err.message + '\nStack: ' + err.stack }); return false; } (0, _classPrivateFieldSet2.default)(this, _authConfig2, authConfig); return this; } /** * @description Sets/Gets the platform authorization endpoint used to perform the OIDC login. * @param {string} [authEndpoint] - Platform authorization endpoint. */ async platformAuthEndpoint(authEndpoint) { if (!authEndpoint) return (0, _classPrivateFieldGet2.default)(this, _authEndpoint); try { await (0, _classPrivateFieldGet2.default)(this, _Database).Modify(false, 'platform', { platformUrl: (0, _classPrivateFieldGet2.default)(this, _platformUrl) }, { authEndpoint: authEndpoint }); } catch (err) { provPlatformDebug(err.message); if ((0, _classPrivateFieldGet2.default)(this, _logger)) (0, _classPrivateFieldGet2.default)(this, _logger).log({ level: 'error', message: 'Message: ' + err.message + '\nStack: ' + err.stack }); return false; } (0, _classPrivateFieldSet2.default)(this, _authEndpoint, authEndpoint); return this; } /** * @description Sets/Gets the platform access token endpoint used to authenticate messages to the platform. * @param {string} [accesstokenEndpoint] - Platform access token endpoint. */ async platformAccessTokenEndpoint(accesstokenEndpoint) { if (!accesstokenEndpoint) return (0, _classPrivateFieldGet2.default)(this, _accesstokenEndpoint); try { await (0, _classPrivateFieldGet2.default)(this, _Database).Modify(false, 'platform', { platformUrl: (0, _classPrivateFieldGet2.default)(this, _platformUrl) }, { accesstokenEndpoint: accesstokenEndpoint }); } catch (err) { provPlatformDebug(err.message); if ((0, _classPrivateFieldGet2.default)(this, _logger)) (0, _classPrivateFieldGet2.default)(this, _logger).log({ level: 'error', message: 'Message: ' + err.message + '\nStack: ' + err.stack }); return false; } (0, _classPrivateFieldSet2.default)(this, _accesstokenEndpoint, accesstokenEndpoint); return this; } /** * @description Gets the platform access token or attempts to generate a new one. */ async platformAccessToken() { const token = await (0, _classPrivateFieldGet2.default)(this, _Database).Get((0, _classPrivateFieldGet2.default)(this, _ENCRYPTIONKEY2), 'accesstoken', { platformUrl: (0, _classPrivateFieldGet2.default)(this, _platformUrl) }); if (!token) { provPlatformDebug('Access_token for ' + (0, _classPrivateFieldGet2.default)(this, _platformUrl) + ' not found'); provPlatformDebug('Attempting to generate new access_token for ' + (0, _classPrivateFieldGet2.default)(this, _platformUrl)); const res = await Auth.getAccessToken(this, (0, _classPrivateFieldGet2.default)(this, _ENCRYPTIONKEY2), (0, _classPrivateFieldGet2.default)(this, _Database)); return res; } else { provPlatformDebug('Access_token found'); if ((Date.now() - token[0].createdAt) / 1000 > token[0].expires_in) { provPlatformDebug('Token expired'); provPlatformDebug('Access_token for ' + (0, _classPrivateFieldGet2.default)(this, _platformUrl) + ' not found'); provPlatformDebug('Attempting to generate new access_token for ' + (0, _classPrivateFieldGet2.default)(this, _platformUrl)); const res = await Auth.getAccessToken(this, (0, _classPrivateFieldGet2.default)(this, _ENCRYPTIONKEY2), (0, _classPrivateFieldGet2.default)(this, _Database)); return res; } return token[0].token; } } /** * @description Deletes a registered platform. */ async remove() { try { return Promise.all([(0, _classPrivateFieldGet2.default)(this, _Database).Delete('platform', { platformUrl: (0, _classPrivateFieldGet2.default)(this, _platformUrl) }), (0, _classPrivateFieldGet2.default)(this, _Database).Delete('publickey', { kid: (0, _classPrivateFieldGet2.default)(this, _kid) }), (0, _classPrivateFieldGet2.default)(this, _Database).Delete('privatekey', { kid: (0, _classPrivateFieldGet2.default)(this, _kid) })]); } catch (err) { provPlatformDebug(err.message); if ((0, _classPrivateFieldGet2.default)(this, _logger)) (0, _classPrivateFieldGet2.default)(this, _logger).log({ level: 'error', message: 'Message: ' + err.message + '\nStack: ' + err.stack }); return false; } } } var _platformName = new WeakMap(); var _platformUrl = new WeakMap(); var _clientId = new WeakMap(); var _authEndpoint = new WeakMap(); var _authConfig2 = new WeakMap(); var _ENCRYPTIONKEY2 = new WeakMap(); var _accesstokenEndpoint = new WeakMap(); var _kid = new WeakMap(); var _logger = new WeakMap(); var _Database = new WeakMap(); module.exports = Platform;