UNPKG

oidc-lib

Version:

A library for creating OIDC Service Providers

195 lines (163 loc) 6.08 kB
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); } } } }