oidc-lib
Version:
A library for creating OIDC Service Providers
364 lines (311 loc) • 9.39 kB
JavaScript
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);
})
})
}
})
}
*/