diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 00000000..e3762f60 --- /dev/null +++ b/ui/README.md @@ -0,0 +1,18 @@ + +# Simple Stack + +## Requirements + +You need to define 2 environments variables: + +``` +export AUTH_SECRET=changeme +export AUTH_COOKIE=changeme +``` + +## Start the UI + +``` +npm install +node index.js +``` \ No newline at end of file diff --git a/ui/definitions/auth.js b/ui/definitions/auth.js index d8b2cd07..dec1f731 100644 --- a/ui/definitions/auth.js +++ b/ui/definitions/auth.js @@ -1,6 +1,6 @@ var opt = {}; -opt.secret = CONF.auth_secret; -opt.cookie = CONF.auth_cookie; +opt.secret = process.env.AUTH_SECRET; +opt.cookie = process.env.AUTH_COOKIE; opt.expire = '3 minutes'; opt.cleaner = '5 minutes'; opt.strict = false; @@ -12,7 +12,7 @@ opt.onauthorize = function($) { let bufferObj = Buffer.from(authorization, "base64"); let decodedString = bufferObj.toString("utf8").split(':'); - DATA.read('nosql/users').where('email', decodedString[0]).where('password', decodedString[1].sha256(CONF.auth_secret)).where('isinactive', false).where('isremoved', false).callback(function(err, user){ + DATA.read('nosql/users').where('email', decodedString[0]).where('password', decodedString[1].sha256(process.env.AUTH_SECRET)).where('isinactive', false).where('isremoved', false).callback(function(err, user){ if(err){ $.invalid(401); } diff --git a/ui/index.js.map b/ui/index.js.map index e08d8af2..4ec58e03 100644 --- a/ui/index.js.map +++ b/ui/index.js.map @@ -288,6 +288,14 @@ "input": "*type:String, *key:String, status:Boolean, value:String", "name": "Update a variable set" }, + { + "method": "API", + "url": "/api/", + "auth": 1, + "params": "id:string", + "id": "variables_remove", + "name": "Remove a variable set" + }, { "method": "API", "url": "/api/", diff --git a/ui/schemas/catalogs.js b/ui/schemas/catalogs.js index cc6c8c58..d4d92ebb 100644 --- a/ui/schemas/catalogs.js +++ b/ui/schemas/catalogs.js @@ -156,7 +156,7 @@ NEWSCHEMA('Catalogs', function(schema) { .error('@(Settings are undefined)') .promise($); - const decrypted = JSON.parse(DECRYPT(settings.value, CONF.auth_secret)); + const decrypted = JSON.parse(DECRYPT(settings.value, process.env.AUTH_SECRET)); const payload = { meta: { hosts: decrypted.instance }, diff --git a/ui/schemas/infrastructures.js b/ui/schemas/infrastructures.js index 3327c72c..02dd9383 100644 --- a/ui/schemas/infrastructures.js +++ b/ui/schemas/infrastructures.js @@ -85,7 +85,7 @@ NEWSCHEMA('Infrastructures', function (schema) { // Populate system fields model.id = UID(); model.uid = $.user.id; - model.admin_pass = model.admin_pass.sha256(CONF.auth_secret); + model.admin_pass = model.admin_pass.sha256(process.env.AUTH_SECRET); model.dtcreated = new Date(); model.isarchived = false; model.tfstate = { version: 4 }; @@ -138,7 +138,7 @@ NEWSCHEMA('Infrastructures', function (schema) { $.invalid(`${REGEX_PROJECTS.admin_pass.comment}`); return; } - model.admin_pass = model.admin_pass.sha256(CONF.auth_secret); + model.admin_pass = model.admin_pass.sha256(process.env.AUTH_SECRET); } else { // Preserve existing hash const existing = await DATA diff --git a/ui/schemas/softwares.js b/ui/schemas/softwares.js index 47763368..0cec528b 100644 --- a/ui/schemas/softwares.js +++ b/ui/schemas/softwares.js @@ -211,7 +211,7 @@ NEWSCHEMA('Softwares', function (schema) { .error('@(Settings are undefined)') .promise($); - const decryptedSettings = JSON.parse(DECRYPT(settingsRec.value, CONF.auth_secret)); + const decryptedSettings = JSON.parse(DECRYPT(settingsRec.value, process.env.AUTH_SECRET)); const catalogName = (await DATA.read('nosql/catalogs') .where('id', item.software) diff --git a/ui/schemas/users.js b/ui/schemas/users.js index df2ab6aa..0173a348 100644 --- a/ui/schemas/users.js +++ b/ui/schemas/users.js @@ -1,6 +1,6 @@ NEWSCHEMA('Users', function (schema) { - const hash = value => value.sha256(CONF.auth_secret); + const hash = value => value.sha256(process.env.AUTH_SECRET); const expire = (value = CONF.auth_cookie_expire) => NOW.add(value || '1 month'); function validateModel(model, rules) { diff --git a/ui/schemas/variables.js b/ui/schemas/variables.js index 471a051a..2d3b80bf 100644 --- a/ui/schemas/variables.js +++ b/ui/schemas/variables.js @@ -33,7 +33,7 @@ NEWSCHEMA('Variables', function (schema) { return; } - const decrypted = DECRYPT(result.value, CONF.auth_secret); + const decrypted = DECRYPT(result.value, process.env.AUTH_SECRET); let value; try { value = JSON.parse(decrypted); @@ -70,10 +70,10 @@ NEWSCHEMA('Variables', function (schema) { const merged = variables.reduce((acc, variable) => { try { - const parsed = JSON.parse(DECRYPT(variable.value, CONF.auth_secret)); + const parsed = JSON.parse(DECRYPT(variable.value, process.env.AUTH_SECRET)); return { ...acc, ...parsed }; } catch (_) { - const raw = DECRYPT(variable.value, CONF.auth_secret); + const raw = DECRYPT(variable.value, process.env.AUTH_SECRET); return { ...acc, ...raw }; } }, {}); @@ -92,7 +92,7 @@ NEWSCHEMA('Variables', function (schema) { key: model.key, key2, dtupdated: NOW, - value: ENCRYPT(JSON.stringify(yamlToJson(model.value)), CONF.auth_secret) + value: ENCRYPT(JSON.stringify(yamlToJson(model.value)), process.env.AUTH_SECRET) }; await DATA.insert('nosql/variables', payload) @@ -112,7 +112,7 @@ NEWSCHEMA('Variables', function (schema) { const updatePayload = { status: model.status, - value: ENCRYPT(JSON.stringify(yamlToJson(model.value)), CONF.auth_secret), + value: ENCRYPT(JSON.stringify(yamlToJson(model.value)), process.env.AUTH_SECRET), dtupdated: NOW, key2 }; @@ -166,7 +166,7 @@ NEWSCHEMA('Variables', function (schema) { key: model.key, key2: model.key.replace(/\./g, '_'), dtupdated: NOW, - value: ENCRYPT({ [model.subkey]: generatePassword(model.userpass, model.nosymbols, model.length) }, CONF.auth_secret) + value: ENCRYPT({ [model.subkey]: generatePassword(model.userpass, model.nosymbols, model.length) }, process.env.AUTH_SECRET) }; await DATA.insert('nosql/variables', newRecord) .error('@(Error)') @@ -187,9 +187,9 @@ NEWSCHEMA('Variables', function (schema) { let stored; try { - stored = JSON.parse(DECRYPT(result.value, CONF.auth_secret)); + stored = JSON.parse(DECRYPT(result.value, process.env.AUTH_SECRET)); } catch (_) { - stored = DECRYPT(result.value, CONF.auth_secret); + stored = DECRYPT(result.value, process.env.AUTH_SECRET); } if (model.subkey) { @@ -202,7 +202,7 @@ NEWSCHEMA('Variables', function (schema) { if (!subExists && model.missing === 'create') { stored[model.subkey] = generatePassword(model.userpass, model.nosymbols, model.length); - await DATA.update('nosql/variables', { value: ENCRYPT(stored, CONF.auth_secret), dtupdated: NOW }) + await DATA.update('nosql/variables', { value: ENCRYPT(stored, process.env.AUTH_SECRET), dtupdated: NOW }) .where('id', result.id) // .error('@(Error)') .promise($); @@ -212,7 +212,7 @@ NEWSCHEMA('Variables', function (schema) { if (model.overwrite) { stored[model.subkey] = generatePassword(model.userpass, model.nosymbols, model.length); - await DATA.update('nosql/variables', { value: ENCRYPT(stored, CONF.auth_secret), dtupdated: NOW }) + await DATA.update('nosql/variables', { value: ENCRYPT(stored, process.env.AUTH_SECRET), dtupdated: NOW }) .where('id', result.id) // .error('@(Error)') .promise($); @@ -222,7 +222,7 @@ NEWSCHEMA('Variables', function (schema) { if (model.delete) { delete stored[model.subkey]; - await DATA.update('nosql/variables', { value: ENCRYPT(stored, CONF.auth_secret), dtupdated: NOW }) + await DATA.update('nosql/variables', { value: ENCRYPT(stored, process.env.AUTH_SECRET), dtupdated: NOW }) .where('id', result.id) // .error('@(Error)') .promise($);