From f7c4ae19f4e1a5806ef76f2cc26765e551f3f461 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Thu, 23 Jul 2020 01:20:06 +1200 Subject: [PATCH] Option to track quota for analysis --- src/lib/constants.js | 6 ++++-- src/lib/quota/index.js | 17 +++++++++++++---- src/lib/utils/upgradedb.js | 17 +++++++++++++++-- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/lib/constants.js b/src/lib/constants.js index 2a1522d..768623d 100644 --- a/src/lib/constants.js +++ b/src/lib/constants.js @@ -117,7 +117,8 @@ let constants = { timeframe: 20*60*60*1000, count: 50, ip_mode: "header", // one of: "header", "address" - ip_header: "x-forwarded-for" + ip_header: "x-forwarded-for", + track: false }, user_settings: [ @@ -288,7 +289,8 @@ let constants = { additional_routes: [], - database_version: 9 + database_version: 10, + actually_backup_on_database_upgrade: true } // Override values from config and export the result diff --git a/src/lib/quota/index.js b/src/lib/quota/index.js index a424cb2..890d216 100644 --- a/src/lib/quota/index.js +++ b/src/lib/quota/index.js @@ -1,7 +1,8 @@ const constants = require("../constants") const LimitByFrame = require("./LimitByFrame") const {getIdentifier} = require("./get_identifier") -require("../testimports")(LimitByFrame, getIdentifier) +const db = require("../db") +require("../testimports")(LimitByFrame, getIdentifier, db) const limiter = new LimitByFrame() @@ -13,19 +14,27 @@ function getIPFromReq(req) { } } +const preparedTrack = db.prepare("INSERT INTO QuotaHistory VALUES (?, ?, ?)") + function remaining(req) { if (!constants.quota.enabled) return Infinity // sure. const ip = getIPFromReq(req) - const identifier = getIdentifier(ip) - return limiter.remaining(identifier) + const identifier = String(getIdentifier(ip)) + const remaining = limiter.remaining(identifier) + + if (constants.quota.track) { + preparedTrack.run(identifier, Date.now(), remaining) + } + + return remaining } function add(req, count) { if (!constants.quota.enabled) return Infinity // why not. const ip = getIPFromReq(req) - const identifier = getIdentifier(ip) + const identifier = String(getIdentifier(ip)) return limiter.add(identifier, count) } diff --git a/src/lib/utils/upgradedb.js b/src/lib/utils/upgradedb.js index 4120e50..4025d9e 100644 --- a/src/lib/utils/upgradedb.js +++ b/src/lib/utils/upgradedb.js @@ -112,6 +112,15 @@ const deltas = new Map([ db.prepare("CREATE TABLE SavedRequests (url TEXT NOT NULL, path TEXT NOT NULL, PRIMARY KEY (url))") .run() })() + }], + // version 9 to version 10 + [10, function() { + db.transaction(() => { + db.prepare("DROP TABLE IF EXISTS QuotaHistory") + .run() + db.prepare("CREATE Table QuotaHistory (identifier TEXT NOT NULL, timestamp INTEGER NOT NULL, remaining INTEGER NOT NULL)") + .run() + })() }] ]) @@ -134,8 +143,12 @@ function writeProgress(i) { async function createBackup(entry) { const filename = `backups/bibliogram.db.bak-v${entry-1}` process.stdout.write(`Backing up current to ${filename}... `) - await db.backup(pj(__dirname, "../../../db", filename)) - process.stdout.write("done.\n") + if (constants.actually_backup_on_database_upgrade) { + await db.backup(pj(__dirname, "../../../db", filename)) + process.stdout.write("done.\n") + } else { + process.stdout.write("jk. You turned off backups.\n") + } } /**