UNPKG

oidc-lib

Version:

A library for creating OIDC Service Providers

364 lines (311 loc) 9.39 kB
var startupInvoked = false; var mainReadyToStart = false; // paintLoadScreen(); const clientlib = window.claimerClientLib; var frameworkModules = { key_management: pk.key_management, sts: pk.sts, token: pk.token, pmanager: pk.pmanager, serialize64: pk.serialize64 } var dbScaffold = pk.util.createDbScaffold(); var jsonForm = require('../wallet/jsonForm'); var featureModules = { 'wallet': { code: require('../wallet/wallet') } }; var templatePaths = { './wallet/data/scope_claim_map': require('../wallet/data/scope_claim_map_auto') } var content_scope_claim_maps = { 'wallet': require('../wallet/data/scope_claim_map_auto') }; var contentModuleResponseTypes = {}; for (var contentModuleName in pk.util.config.content_modules){ pk.app.registerCookie(pk.sts.cookie_identifier + contentModuleName); var responseTypes = ["code", "id_token", "id_token token", "code id_token", "code token", "code id_token token"]; if (pk.util.config.content_modules[contentModuleName]['responseTypes'] !== undefined){ responseTypes = pk.util.config.content_modules[contentModuleName].responseTypes; } contentModuleResponseTypes[contentModuleName] = responseTypes; } pk.feature_modules = featureModules; pk.dbs = {}; pk.util.content_module_response_types = contentModuleResponseTypes; pk.util.content_module_signing_key = pk.key_management.contentModuleSigningKey; pk.util.jsonForm = jsonForm; mainReadyToStart = true; if (navigator.serviceWorker.controller === null){ pk.util.log_debug('[Main] Controller not yet present.'); } else{ pk.util.log_debug('[Main] Controller exists.'); beginStartup(); } async function beginStartup(){ if (startupInvoked){ return; } else{ startupInvoked = true; } var potentialErrorMessage = ''; try { if (!('indexedDB' in window)) { throw ('This browser doesn\'t support IndexedDB'); } potentialErrorMessage = "Error initializing databases"; dbResult = await initializeAllDataBases(dbScaffold); for (var dbInfo in pk.dbs){ if (dbInfo.contentModuleName === 'sts'){ continue; } else{ dbInfo.flockMembership = pk.dbs['sts'].flockMembership; } } var content_scope_claim_maps = {}; for (var module_name in pk.feature_modules){ try { pk.feature_modules[module_name].code.registerEndpoints(pk); content_scope_claim_maps[module_name] = initializeSingleContentModuleConfig(module_name, 'scope_claim_map'); } catch(err){ if (claimer_config.logging > 1){ console.error(chalk.red('Unable to register Endpoints for content module ' + module_name)); console.error(err); } else{ console.error(chalk.red('Unable to register Endpoints for content module ' + module_name)); console.error(chalk.red(err.message)); } } } pk.util.content_scope_claim_maps = content_scope_claim_maps; for (var fmod in frameworkModules){ frameworkModules[fmod].registerEndpoints(pk); } // potentialErrorMessage = "Error checking incognito"; // var incognito = await checkIncognito(); potentialErrorMessage = "Error initializing Personas"; var allPersonas = await pk.ptools.initializePersonas(false); potentialErrorMessage = "Error loading or creating keys"; await pk.key_management.loadOrCreateKeys(); // on completion call the function transformed from the pathname // by replacing slashes and periods with underscores // -- for example /wallet/test.html results in a call to // the global function _wallet_test_html var pathfunc = window.location.pathname.replace(/\/|\.|\-/g, '_'); potentialErrorMessage = "Error attempting to invoke startup function '" + pathfunc + "' in your script. "; this[pathfunc](); return true; } catch (err){ console.log('[Main] *******************************'); console.log(potentialErrorMessage + err); console.log('[Main] *******************************'); } } function initializeAllDataBases(dbScaffold){ var flockMembership; var initPromises = []; return new Promise((resolve, reject) => { for (var cmName in dbScaffold){ var provider = dbScaffold[cmName]; if (provider !== undefined){ var promise = provider.initialize(pk, cmName, provider); initPromises.push(promise); } } Promise.all(initPromises) .then(data => { for (var i=0; i < data.length; i++){ var dbInfo = data[i]; pk.dbs[dbInfo.contentModuleName] = dbInfo; } resolve(true); }, err => { reject("error with initializeDatabase promises: " + err); }) }); } function calculateContentModuleScopes(content_scope_claim_maps){ var contentModuleScopes = {}; for (var module_name in content_scope_claim_maps){ if (content_scope_claim_maps[module_name] !== null){ var moduleScopes = []; var scope_claim_map = content_scope_claim_maps[module_name]; for (var key in scope_claim_map){ if (key.startsWith('fieldset_')){ var scope = scope_claim_map[key].scope; if (scope !== undefined){ moduleScopes.push(scope); } } } contentModuleScopes[module_name] = moduleScopes; } } return contentModuleScopes; } function initializeSingleContentModuleConfig(module_name, kind){ var moduleExport = feature_modules[module_name].code; if (moduleExport['invokeConsentUserAgent'] === undefined){ return null; } var claims = []; var content; var templatePath = './claimer_content/' + module_name + '/data/' + kind; try{ if (typeof window === 'undefined'){ content = require(templatePath); } else{ content = templatePaths[templatePath]; } if (moduleExport['registerModuleScope'] !== undefined){ var scope = moduleExport.registerModuleScope(); for (var scopeKey in scope){ content[scopeKey] = scope[scopeKey]; } } } catch (err){ if (err.code === 'MODULE_CONFIG_NOT_FOUND'){ pk.util.log_debug("*** Warning: content module " + module_name + ' contains an error defining ' + kind + ' at ' + templatePath + '.js... '); } else { pk.util.log_debug("*** Warning: content module " + module_name + ' contains an error defining ' + kind + ' at ' + templatePath + '.js... '); } } return content; } function paintLoadScreen(){ var html = '\ <div class="center-block" style="padding: 20%">\ <img style="height: 100%; width: 100%; object-fit: contain" src=\'/wallet/images/icons/{{splash}}\'/>\ </div>'; var splash; if (window.location.search.startsWith('?req_cred=')){ splash = 'blue-setup.png'; } else if (!window.location.search){ splash = 'blue-512x512.png'; } if (splash){ html = html.replace("{{splash}}", splash); var renderEl = document.getElementById('render'); renderEl.innerHTML = html; } } /* function dataStore(){ var _ds_info = new pk.util.db_module('indexed_db')(); var _dbInfo = null; Object.defineProperty(this, "set", { value: function(name, value) { return new Promise((resolve, reject) => { var initPromise; if (_dbInfo === null){ initPromise = _ds_info.initialize_local_storage(pk, 'sts', _ds_info); } else{ initPromise = Promise.resolve(_dbInfo); } initPromise .then(dbInfo => { if (dbInfo){ if (!_dbInfo){ _dbInfo = dbInfo; } var payload = { id: name, value: value } return _ds_info.createOrUpdateDocument(dbInfo, 'local_storage', payload); } }, err => { reject(err); }) .then(result => { if (result){ resolve(result); } }, err => { reject(err); }) }) } }) Object.defineProperty(this, "get", { value: function(name, encoding) { return new Promise((resolve, reject) => { var initPromise; if (_dbInfo === null){ initPromise = _ds_info.initialize_local_storage(pk, 'sts', _ds_info); } else{ initPromise = Promise.resolve(_dbInfo); } initPromise .then(dbInfo => { if (dbInfo){ if (!_dbInfo){ _dbInfo = dbInfo; } return _ds_info.getDocument(dbInfo, 'local_storage', name); } }, err => { reject(err); }) .then(payload => { if (payload){ resolve(payload.value); } }, err => { if (err && err.code === 404){ resolve(undefined); } else{ reject(err); } }) }) } }) Object.defineProperty(this, "remove", { value: function(name, encoding) { return new Promise((resolve, reject) => { var initPromise; if (_dbInfo === null){ initPromise = _ds_info.initialize_local_storage(pk, 'sts', _ds_info); } else{ initPromise = Promise.resolve(_dbInfo); } initPromise .then(dbInfo => { if (dbInfo){ if (!_dbInfo){ _dbInfo = dbInfo; } return _ds_info.deleteDocument(dbInfo, 'local_storage', name); } }, err => { reject(err); }) .then(payload => { if (payload){ resolve(payload); } }, err => { reject(err); }) }) } }) } */