pointsight/middleware/apitoken.middleware.js
2022-03-06 18:36:36 +01:00

87 lines
3.1 KiB
JavaScript

module.exports = function (app, con, apiTaxonomyCache) {
const _ = require("underscore");
function isFutureDate(value) {
const d_now = new Date();
const d_inp = new Date(value);
return d_now.getTime() <= d_inp.getTime();
}
app.use(function (req, res, next) {
// API key handling middleware
if (req.path.includes("/api/")) {
if (req.query.key != undefined) {
const sql = "SELECT * FROM apikeys WHERE apikey LIKE ? LIMIT 1";
con.query(sql, [req.query.key], function (err, result) {
if (err) {
throw err;
}
if (result.length == 0) {
// There is atleast one result
res.status(401);
res.setHeader("Content-Type", "application/json");
res.send(
JSON.stringify({ state: "Failed", message: "Invalid API key" })
);
} else {
// console.log(req.headers);
if (
JSON.parse(result[0].hosts).includes(req.hostname) ||
JSON.parse(result[0].hosts).includes("*")
) {
// Is the key even allowed for this host?
if (isFutureDate(result[0].expire)) { // Has the key expired?
next(); // Allow it to pass
if(!_.isFinite(apiTaxonomyCache[req.query.key])){
apiTaxonomyCache[req.query.key] = 0;
}
apiTaxonomyCache[req.query.key] = apiTaxonomyCache[req.query.key]+1;
// console.log(apiTaxonomyCache)
/*const updateSql = "UPDATE apitaxonomy SET calls = calls+1 WHERE apikey LIKE ? AND DATE(date) = CURDATE()";
const insertSql = "INSERT INTO apitaxonomy (apikey, calls) VALUES(?, ?);"
con.query(updateSql, [req.query.key], function (err, result) {
if (err) {
console.error(err);
}
if(result.affectedRows == 0) {
con.query(insertSql, [req.query.key, 1], function (err, result) {
if (err) {
console.error(err);
}
});
}
});*/
} else {
// Yes? Then no passing!
res.status(401);
res.setHeader("Content-Type", "application/json");
res.send(
JSON.stringify({
state: "Failed",
message: "Expired API key",
})
);
}
} else {
res.status(401);
res.setHeader("Content-Type", "application/json");
res.send(
JSON.stringify({
state: "Failed",
message: "Invalid Hostname for API key",
})
);
}
}
});
} else {
res.status(401);
res.setHeader("Content-Type", "application/json");
res.send(
JSON.stringify({ state: "Failed", message: "Missing API key" })
);
}
} else {
next();
}
});
};