oidc-lib
Version:
A library for creating OIDC Service Providers
195 lines (163 loc) • 6.08 kB
JavaScript
var fs = require('fs');
var path = require('path');
var base64url = require('base64url');
var node_input = require('./nodeInput');
var util = require('./util')
const lib_data = 'oidc_lib_data';
var debug = false;
startup();
async function startup(){
try{
var possibleError;
var ni = new node_input();
if (debug){
// process exits when done
processAddition('covid_cred.json', null, false, undefined, true, ni);
}
var inputFile = await ni.question(
'What config package (e.g. example) or file (e.g. ./example.json) contains the credential issuer you want to add?');
inputFile = inputFile.trim(' ');
if (inputFile.startsWith('.')){
inputFile = path.join(process.cwd(), inputFile);
}
else if (!inputFile.startsWith('/') && !inputFile.startsWith('\\')){
inputFile = path.join(__dirname, '../issuer_examples', inputFile + '.json');
}
var possibleError = 'File not found: ' + inputFile;
var inputString = fs.readFileSync(inputFile, {encoding: 'utf8'});
var possibleError = 'File contents are not valid JSON: ' + inputFile;
var input = JSON.parse(inputString);
console.log('The credential issuer is currently called "' + input.issuer + '". You can change it but will have mnanually revise ' + input.issuer + '.js');
var retainIssuerName = await ni.question(
'Press "Y" to retain the issuer name, or "N" to change it.', 'trueFalse');
if (!retainIssuerName){
var newIssuerName = await ni.question(
'What is the new name of the credential issuer?');
newIssuerName = newIssuerName.trim(' ');
}
var includeJsCss;
if (input.js || input.css){
console.log('Do you want to add the js and css files present in the package?');
includeJsCss = await ni.question(
'Press "Y" to include the js and css files, or "N" skip them.', 'trueFalse');
}
var proceed = await ni.question(
'Press "Y" to proceed, "N" to exit.', 'trueFalse');
if (!proceed){
process.exit(1);
}
processAddition(inputFile, input, retainIssuerName, newIssuerName, includeJsCss, ni)
}
catch(err){
console.log(possibleError);
process.exit(-1);
}
}
async function processAddition(inputFile, input, retainIssuerName, newIssuerName, includeJsCss, ni){
try{
var possibleError;
if (!input){
var possibleError = 'File not found: ' + inputFile;
var inputString = fs.readFileSync(inputFile, {encoding: 'utf8'});
var possibleError = 'File contents are not valid JSON: ' + inputFile;
var input = JSON.parse(inputString);
}
// check lib version
var packageDef = fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8');
possibleError = 'package.json is corrupted';
var packageObj = JSON.parse(packageDef);
possibleError = 'error comparing oidc-lib versions';
var current_lib_version = packageObj.dependencies['oidc-lib'].replace('^', '');
var import_lib_version = input.oidc_lib_version.replace('^', '');
if (current_lib_version !== import_lib_version){
console.log();
console.log('The current oidc-lib version (' + current_lib_version + ')');
console.log(' differs from the import\'s oidc-lib version (' + import_lib_version + ')');
var proceed = await ni.question(
'Press "Y" to proceed, "N" to exit.', 'trueFalse');
if (!proceed){
console.log('Exiting due to the oidc-libversion difference.');
process.exit(1);
}
}
var issuer;
var configb64 = input.code['oidc_config.json'];
var config = JSON.parse(base64url.decode(configb64));
var config_files = config.config_files;
for (var inputKey in input){
switch (inputKey){
case 'issuer':
issuer = input.issuer;
if (!retainIssuerName){
issuer = newIssuerName;
}
break;
case 'code':
var codePath = path.join(process.cwd(), issuer);
possibleError = 'Error applying directory: ' + codePath;
applyDirectory(config_files, codePath, input.code);
break;
case 'description':
case 'oidc_lib_version':
break;
default:
var skip = false;
var overwrite = true;
switch (inputKey){
case 'web/js':
case 'web/css':
overwrite = true;
if (!includeJsCss){
skip = true;
}
break;
case 'web/code':
inputKey = 'web/' + issuer;
break;
case 'views':
overwrite = true;
break;
}
var location;
location = path.join(process.cwd(), inputKey);
possibleError = 'Error applying directory: ' + location;
applyDirectory(config_files, location, input[inputKey]);
break;
}
}
console.log("Done");
process.exit(0);
}
catch(err){
console.log(possibleError);
console.log(err.code);
process.exit(-1);
}
}
function applyDirectory(config_files, directoryName, directoryContent){
var _workingDirectory = process.cwd();
var _workingDirectoryLength = _workingDirectory.length;
recurseDirectory(config_files, directoryName, directoryContent);
function recurseDirectory(config_files, directoryName, directoryContent){
for (var key in directoryContent){
var content = directoryContent[key];
if (typeof content === 'string'){
var buffer = base64url.toBuffer(content);
util.mkDirectoriesInPath(directoryName);
var filename = path.join(directoryName, key);
var relativePath = filename.substr(_workingDirectoryLength).replace(/\\/g, '/');
var safe_filename = filename;
if (fs.existsSync(filename) && config_files && config_files.includes(relativePath)){
console.log('** not overwriting config_file ' + filename + ' - will write with .new extension');
safe_filename = filename + '.new';
}
fs.writeFileSync(safe_filename, buffer);
}
else if (typeof content === 'object'){
var subDirectoryName = path.join(directoryName, key);
util.mkDirectoriesInPath(subDirectoryName);
recurseDirectory(config_files, subDirectoryName, content);
}
}
}
}