pointsight/tools/apiKeyManager/main.js
2022-03-06 18:36:36 +01:00

291 lines
9.3 KiB
JavaScript

const prompt = require("prompts");
const validate = require("uuid").validate;
const uuid = require("uuid");
const ora = require("ora");
const mysql = require("mysql");
const fs = require("fs");
function isFutureDate(value) {
const d_now = new Date();
const d_inp = new Date(value);
return d_now.getTime() <= d_inp.getTime();
}
let jsonConfigGlobal = {
fontAwesome: undefined,
mapboxAccessToken: undefined,
cookieSecret: undefined,
database: {
host: undefined,
user: undefined,
password: undefined,
database: undefined,
},
env: undefined,
maint: undefined,
};
// Load config
try {
const data = fs.readFileSync("../../config/default.json", "utf8");
jsonConfigGlobal = JSON.parse(data);
} catch (error) {
console.error(
"While reading the config an error occured. The error was: " + error
);
}
const connectionPool = mysql.createPool(jsonConfigGlobal.database);
console.log(
" --[Pointsight API key management]-- "
);
console.log(
" Welcome to the Pointsight api key manager. THIS SOFTWARE MY ONLY BE USED BY AUTHORIZED PERSONELL. \n \
This tool enables you to create and manage api keys. Use responsible."
);
// prompt.inject([ 'yes', "" ]);
const questions = [
{
type: "confirm",
name: "value",
message: "Are you authorized to use this software",
initial: false,
},
{
type: (prev, values, prompt) => (values.value == true ? "select" : null),
name: "cmd",
message: "What do you want to do?",
choices: [
{ title: "whois", value: "whois" },
{ title: "create", value: "create" },
{ title: "edit", value: "edit" },
{ title: "delete", value: "delete" },
{ title: "quit" },
],
},
{
type: (prev, values, prompt) => (prev == "whois" ? "text" : null),
name: "key",
message: "Please enter the api key you want to lookup",
validate: (value) =>
validate(value) ? true : `Please enter a valid api key`,
},
{
type: (prev, values, prompt) => (values.cmd == "edit" ? "text" : null),
name: "key",
message: "Please enter the api key you want to edit",
validate: (value) =>
validate(value) ? true : `Please enter a valid api key`,
},
{
type: (prev, values, prompt) => (values.cmd == "delete" ? "text" : null),
name: "key",
message: "Please enter the api key you want to delete",
validate: (value) =>
validate(value) ? true : `Please enter a valid api key`,
},
{
type: (prev, values, prompt) => (values.cmd == "delete" ? "confirm" : null),
name: "sure",
message: (prev, values, prompt) =>
"Are you sure you want to delete " + prev + "?",
},
{
type: (prev, values, prompt) => (values.cmd == "create" ? "text" : null),
name: "owner",
message: "Enter the owner of the apikey",
},
{
type: (prev, values, prompt) => (values.cmd == "create" ? "list" : null),
name: "hosts",
message: "Enter all hosts, sperated by a ','",
},
{
type: (prev, values, prompt) => (values.cmd == "create" ? "date" : null),
name: "expire",
message: "Enter an expiration date",
validate: (date) =>
date < Date.now() ? "Date is not in the future" : true,
},
];
(async () => {
const response = await prompt(questions);
console.log(response);
if (response.cmd == "whois") {
const spinner = ora("Initating MySQL Database connection").start();
connectionPool.getConnection((err, conn) => {
if (err) {
throw err;
}
spinner.text = "Sending SQL query to server";
//i do query stuff
const query = "SELECT * FROM apikeys WHERE apikey=?";
conn.query(query, [response.key], function (err, result) {
if (err) throw err;
if (result.length != 1) {
spinner.warn("No or too many results have been found");
} else {
spinner.succeed("Database requests done.");
}
console.log("Found a result: ");
console.log(" Key: " + result[0].apikey);
console.log(" Owner: " + result[0].owner);
console.log(" Hosts: " + result[0].hosts);
console.log(" Creation date: " + result[0].created);
console.log(" Expire date: " + result[0].expire);
console.log(" Has expired: " + !isFutureDate(result[0].expire));
});
//i close the connection
conn.release();
});
} else if (response.cmd == "create") {
const sqlQuery =
"INSERT INTO `apikeys` (`id`, `apikey`, `owner`, `hosts`, `created`, `expire`) VALUES (NULL, ?, ?, ?, current_timestamp(), ?);";
const spinner = ora("Initating MySQL Database connection").start();
connectionPool.getConnection((err, conn) => {
if (err) {
throw err;
}
spinner.text = "Sending SQL query to server";
const allHosts = response.hosts;
let hostString = "[";
for (eI in allHosts) {
host = allHosts[eI];
hostString += '"' + host + '"';
if (eI < allHosts.length - 1) {
hostString += ",";
}
}
hostString += "]";
const myUUID = uuid.v4();
conn.query(
sqlQuery,
[myUUID, response.owner, hostString, response.expire],
function (err, result) {
if (err) throw err;
spinner.succeed("Database request done.");
console.log(" Created api key `" + myUUID + "`.");
}
);
conn.release();
});
} else if (response.cmd == "delete" && response.sure == true) {
const sqlQuery = "DELETE FROM `apikeys` WHERE `apikey` = ?";
const spinner = ora("Initating MySQL Database connection").start();
connectionPool.getConnection((err, conn) => {
if (err) {
throw err;
}
spinner.text = "Sending SQL query to server";
conn.query(sqlQuery, [response.key], function (err, result) {
if (err) throw err;
spinner.succeed("Database request done.");
});
conn.release();
});
} else if (response.cmd == "edit") {
const sqlQuery = "DELETE FROM `apikeys` WHERE `apikey` = ?";
const spinner = ora("Initating MySQL Database connection").start();
connectionPool.getConnection((err, conn) => {
if (err) {
throw err;
}
spinner.text = "Sending SQL query to server";
const query = "SELECT * FROM apikeys WHERE apikey=?";
conn.query(query, [response.key], function (err, result) {
if (err) throw err;
if (result.length != 1) {
spinner.warn("No or too many results have been found");
} else {
spinner.succeed("Database requests done.");
console.log(result[0]);
const histy = JSON.parse(result[0].hosts);
const editQuestions = [
{
type: "text",
name: "owner",
initial: result[0].owner,
message: "Enter the owner of the apikey",
},
{
type: "list",
name: "hosts",
initial: histy,
message: "Enter all hosts, sperated by a ','",
},
{
type: "date",
name: "expire",
initial: result[0].expire,
message: "Enter an expiration date",
validate: (date) =>
date < Date.now() ? "Date is not in the future" : true,
},
];
(async () => {
const response2 = await prompt(editQuestions);
console.log(" Key: " + response.key);
console.log(" Owner: " + response2.owner);
console.log(" Hosts: " + response2.hosts);
console.log(" Expire date: " + response2.expire);
console.log(" Has expired: " + !isFutureDate(response2.expire));
(async () => {
const response3 = await prompt({
type: "confirm",
name: "conf",
message: "Is this correct?",
});
if (response3.conf == true) {
const sqlQuery =
"UPDATE `apikeys` SET `owner` = ?, `hosts` = ?, `expire` = ? WHERE `apikey` = ?";
const spinner = ora(
"Initating MySQL Database connection"
).start();
connectionPool.getConnection((err, conn) => {
if (err) {
throw err;
}
spinner.text = "Sending SQL query to server";
const allHosts = response2.hosts;
let hostString = "[";
for (eI in allHosts) {
host = allHosts[eI];
hostString += '"' + host + '"';
if (eI < allHosts.length - 1) {
hostString += ",";
}
}
hostString += "]";
conn.query(
sqlQuery,
[response2.owner, hostString, response2.expire, response.key],
function (err, result) {
if (err) throw err;
spinner.succeed("Database request done.");
}
);
conn.release();
});
}
})();
})();
}
});
conn.release();
});
}
})();