/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/spartan-shield@1.2.0/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
#! /usr/bin/env node
"use strict";var commander=require("commander");const text=require("cfonts");var hash,{spawn:spawn,spawnSync:spawnSync}=require("child_process"),chalk=require("chalk"),p=require("./policy"),a=p.read(__dirname+"/answers.json"),pkg=p.read(__dirname+"/package.json"),short=require(__dirname+"/question").nq,long=require(__dirname+"/question").lnq,confirmDelete=require(__dirname+"/question").confirmDelete,confirmSettings=require(__dirname+"/question").confirmSettings,confirmDeleteForce=require(__dirname+"/question").confirmDeleteForce,restoreDefault=require(__dirname+"/question").restoreDefault,inquirer=require("inquirer"),bp=require(__dirname+"/boilerplate"),all=["snyk","bcrypt","passport","rbac","cors","winston","mime-types","js-cookie","cookie-parser","helmet","mongodb","csurf","validator","joi","redis","forms"];async function ask(e){return await inquirer.prompt(e)}function integrity(e){try{const t=spawn("shasum",["-b","-a","384",e]),o=spawn("xxd",["-r","-p"]),i=spawn("base64");t.stdout.pipe(o.stdin),o.stdout.pipe(i.stdin),i.stdout.on("data",(t=>(console.log(`SHA-384 hash of ${chalk.yellow(e)}: ${chalk.magenta(t)}`),hash=t))),i.stderr.on("data",(e=>{console.error(`Error hashing security.json: ${e}`)}))}catch(e){throw new Error(`Could not calculate hash of security.json, ${e}`)}}function nextSteps(e){var t=chalk.bold.yellow(`npm install ${e}`),o=chalk.green("https://docs.spartan-security.io/"),i=chalk.bold.cyan("javascriptEnabled: false");return`Next steps: \n\t1. Install necessary packages (copy/paste at command prompt inside project directory): \n\t\t\`${t}\n\t\t${chalk.cyan.dim("Psst! If you haven't already, install eslint-plugin-security to prevent vulnerabilties from being written into your code")}\`\n\t2.Disable Javascript execution in Mongo. \n\t\tAdd the following line inside the ${chalk.red("security section")} to \`${chalk.red.underline("mongod.conf")}\`: ${i}\n\t\t${chalk.red.dim("Psst! Be sure to save the file and restart mongod!")}\n\t3.Wire in \`security.js\` components to your app. \n\t\tCheck ${o} for additional information\n`}async function begin(e,t=[]){if("init"===e&&"y"===t||"init"===e&&"Y"===t||"default"===e)try{var o=await p.create("default");console.log(o[1]),integrity(o[2]);var i=await bp.writeBoilerplate(o[0]);console.log(i.message+"\n"),integrity(i.pathToFile),await console.log(nextSteps(i.modules))}catch(e){console.log("problem writing files "+e)}else if("update"===e)if("L"===t){var n=await ask(long);console.log(n),(await ask(confirmSettings)).settingsConfirm?p.create(e,n):begin(e,"L")}else{var r=await ask(short);if(console.log(r),(await ask(confirmSettings)).settingsConfirm){var s=await p.create(e,r);console.log(s[1]),integrity(s[2]),integrity((await bp.writeBoilerplate(s[0])).pathToFile)}else begin(e)}else if("force"===e)try{var l=p.read("./security.json"),c=await bp.writeBoilerplate(l);console.log("The following modules should be installed as a result of the force command:"),console.log(chalk.yellow(bp.matches(all,c.modules))),console.log("The following modules should be removed as a result of the force command: "),console.log(chalk.red(bp.diff(all,c.modules))),integrity("security.js")}catch(e){console.log("No policy file found. Please run `_spartan init` to build your policy first.")}else if("delete"===e){if("F"===t)(await ask(confirmDeleteForce)).deleteForceConfirm?(p.deletePolicy(),bp.removeModules()):console.log("Policy Not deleted\n");else(await ask(confirmDelete)).deleteConfirm?p.deletePolicy():console.log("Policy Not deleted\n")}else if("no-overwrite"===e)try{var d=await ask(short);console.log(d),(await ask(confirmSettings)).settingsConfirm?p.create(e,a):begin(e)}catch(e){throw new Error("Could not create a separate policy file")}else if("set-as-default"===e)try{var u=p.strip(p.read("./security.json"));p.wp(u,`${__dirname}/security-default.json`);var f="Successfully replaced default policy";return integrity(`${__dirname}/security-default.json`),console.log(f),f}catch(e){console.error("No policy file found. Please run `_spartan init` to build your policy first.")}else if("integrity"===e)integrity("./security.json"),integrity("./security.js");else if("resetDefault"===e){if((await ask(restoreDefault)).restore){const e="https://raw.githubusercontent.com/darkmsph1t/_spartan-factory-default/master/security-default.json",t="https://github.com/darkmsph1t/_spartan-factory-default";console.log(`Restoring security-default.json from ${chalk.yellow(e)}...`);try{var m=spawnSync("wget",[e,"-O",`${__dirname}/security-default.json`],{stdio:"pipe"});console.log(m.output[2].toString()),integrity(__dirname+"/security-default.json"),console.log(`Default file has been restored. Check ${chalk.yellow(t)} to validate integrity of the file before proceeding`)}catch(t){console.log(`There was a problem restoring the default policy to factory settings, ${t}. Download the policy directly from ${e}`)}}}else if("deploy"===e)console.log("So you're ready to deploy your app! Awesome! This feature is under development, but check back soon!");else{var g=await ask(short);if(console.log(g),(await ask(confirmSettings)).settingsConfirm){var y=p.create("init",g);console.log(y[1]),integrity(y[2]);var h=await bp.writeBoilerplate(y[0]);console.log(h.message+"\n"),integrity(h.pathToFile),console.log(nextSteps(h.modules))}else begin("init")}}if(text.say("_spartan",{font:"simple",align:"left",colors:["red"],space:!1}),text.say("by @darkmsph1t",{font:"console",align:"center",colors:["cyan"],space:!1}),commander.version(pkg.version,"-v, --version").option("init, [y][Y][L]","Initialize a new policy. Use y | Y for defaults. Use L for long-form questions\n").option("-D, --default","Builds a preconfigured, default security policy and security.js installed modules\n").option("-u, --update [L]","Update the existing policy. Use the L flag to update using long-form questions\n").option("-f, --force ","Force a complete regeneration of the boilerplate code defined in security.js. \n\t\t\t Typically used after making a manual adjustment to the security.json file.\n").option("--no-overwrite [L]","Creates a new policy without overwriting the existing policy. \n\t\t\t Use L for long-form questions\n").option("--del, --delete [F]","Remove the policy and boilerplate code. Use F option to remove any installed modules\n").option("--set-as-default","Sets the current policy as the default policy\n").option("-R, --reset-default","Restores the default policy to factory settings. Requires wget\n").option("-i, --integrity","SHA-384 hash of existing policy").option("--deploy","Deploys the app using the specification from security.json").parse(process.argv),commander.version&&void 0===pkg&&(pkg.version="0.0.1",console.log("Couldn't find package.json file. Have you already run `npm init`?")),commander.init)"y"===commander.init||"Y"===commander.init||"L"===commander.init?begin("init",commander.init):begin("init");else if(commander.default)begin("default");else if(commander.update){if(!p.read("./security.json"))throw new Error("No policy file found");begin("update")}else commander.force?begin("force"):commander.overwrite?commander.delete?(begin("delete"),"F"===commander.delete[0]&&begin("delete","F")):commander.setAsDefault?begin("set-as-default"):commander.integrity?begin("integrity"):commander.resetDefault?begin("resetDefault"):commander.deploy?begin("deploy"):0===commander.args.length?commander.help():console.log("That is not an avaiable option"):begin("no-overwrite");module.exports.ask=ask,module.exports.begin=begin,module.exports.integrity=integrity;
//# sourceMappingURL=/sm/f04de18c4c01b2be30ca2855731e2bc48d11ece60eb755ee6f02ef24c5865376.map