Compare commits

...

7 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
5e4eec3f10 Merge branch 'master' into copilot/update-float-fields-precision 2026-01-11 12:41:08 +00:00
copilot-swe-agent[bot]
0ac5286c76 Increase ping validation limit to 100 billion ms (~3.17 years)
Co-authored-by: CommanderStorm <26258709+CommanderStorm@users.noreply.github.com>
2026-01-11 07:09:51 +00:00
copilot-swe-agent[bot]
10363388c0 Add input validation for ping values in /api/push endpoint
Co-authored-by: CommanderStorm <26258709+CommanderStorm@users.noreply.github.com>
2026-01-11 06:57:25 +00:00
copilot-swe-agent[bot]
0192995a05 Also convert heartbeat.ping from INT to BIGINT
Co-authored-by: CommanderStorm <26258709+CommanderStorm@users.noreply.github.com>
2026-01-11 06:02:54 +00:00
copilot-swe-agent[bot]
d9efb23c78 Remove unnecessary .comment() calls from migration
Co-authored-by: louislam <1336778+louislam@users.noreply.github.com>
2026-01-10 10:28:38 +00:00
copilot-swe-agent[bot]
c44f3aa9a3 Add database migration to convert FLOAT(8,2) to FLOAT(20,2)
Co-authored-by: louislam <1336778+louislam@users.noreply.github.com>
2026-01-10 10:20:07 +00:00
copilot-swe-agent[bot]
559403285b Initial plan 2026-01-10 10:15:03 +00:00
2 changed files with 50 additions and 0 deletions

View File

@ -0,0 +1,43 @@
exports.up = function (knex) {
return knex.schema
.alterTable("heartbeat", function (table) {
table.bigInteger("ping").alter();
})
.alterTable("stat_minutely", function (table) {
table.float("ping", 20, 2).notNullable().alter();
table.float("ping_min", 20, 2).notNullable().defaultTo(0).alter();
table.float("ping_max", 20, 2).notNullable().defaultTo(0).alter();
})
.alterTable("stat_daily", function (table) {
table.float("ping", 20, 2).notNullable().alter();
table.float("ping_min", 20, 2).notNullable().defaultTo(0).alter();
table.float("ping_max", 20, 2).notNullable().defaultTo(0).alter();
})
.alterTable("stat_hourly", function (table) {
table.float("ping", 20, 2).notNullable().alter();
table.float("ping_min", 20, 2).notNullable().defaultTo(0).alter();
table.float("ping_max", 20, 2).notNullable().defaultTo(0).alter();
});
};
exports.down = function (knex) {
return knex.schema
.alterTable("heartbeat", function (table) {
table.integer("ping").alter();
})
.alterTable("stat_minutely", function (table) {
table.float("ping").notNullable().alter();
table.float("ping_min").notNullable().defaultTo(0).alter();
table.float("ping_max").notNullable().defaultTo(0).alter();
})
.alterTable("stat_daily", function (table) {
table.float("ping").notNullable().alter();
table.float("ping_min").notNullable().defaultTo(0).alter();
table.float("ping_max").notNullable().defaultTo(0).alter();
})
.alterTable("stat_hourly", function (table) {
table.float("ping").notNullable().alter();
table.float("ping_min").notNullable().defaultTo(0).alter();
table.float("ping_max").notNullable().defaultTo(0).alter();
});
};

View File

@ -52,6 +52,13 @@ router.all("/api/push/:pushToken", async (request, response) => {
let statusString = request.query.status || "up"; let statusString = request.query.status || "up";
const statusFromParam = statusString === "up" ? UP : DOWN; const statusFromParam = statusString === "up" ? UP : DOWN;
// Validate ping value - max 100 billion ms (~3.17 years)
// Fits safely in both BIGINT and FLOAT(20,2)
const MAX_PING_MS = 100000000000;
if (ping !== null && (ping < 0 || ping > MAX_PING_MS)) {
throw new Error(`Invalid ping value. Must be between 0 and ${MAX_PING_MS} ms.`);
}
let monitor = await R.findOne("monitor", " push_token = ? AND active = 1 ", [pushToken]); let monitor = await R.findOne("monitor", " push_token = ? AND active = 1 ", [pushToken]);
if (!monitor) { if (!monitor) {