Lint: fix errors and remove unused variables
**Motivations:** - Ensure lint config is not degraded and fix all lint errors for pousse workflow. **Root causes:** - Unused variables kept with _ prefix instead of removed (_row, _questReward, _i). - getAnimalBlockOrigin had 5 parameters (max 4). - use of continue statement (no-continue rule). **Correctifs:** - ESLint config verified; no eslint-disable in codebase. - Removed unused variable _row (biome-rules); removed dead function _questReward (quests); removed unused map param _i (state.js). - getAnimalBlockOrigin refactored to 4 params (pos object instead of x, y). - Replaced continue with if (cell) block in normalizeLoadedCells (state.js). - JSDoc param names aligned with _height, _y (biome-rules). **Evolutions:** - (none) **Pages affectées:** - web/js/biome-rules.js - web/js/quests.js - web/js/state.js - web/js/placement.js
This commit is contained in:
@@ -15,6 +15,23 @@ import { verifySignature, buildSignMessage, hashBody } from "../auth.js";
|
||||
const router = express.Router();
|
||||
const TIMESTAMP_TOLERANCE_MS = 5 * 60 * 1000;
|
||||
|
||||
function isTimestampValid(timestamp) {
|
||||
const now = Date.now();
|
||||
const ts = new Date(timestamp).getTime();
|
||||
return !Number.isNaN(ts) && Math.abs(now - ts) <= TIMESTAMP_TOLERANCE_MS;
|
||||
}
|
||||
|
||||
function getBodyForSignature(req) {
|
||||
return req.bodyRaw !== undefined && req.bodyRaw !== null ? req.bodyRaw : "";
|
||||
}
|
||||
|
||||
function isSignatureValid(req, publicKey, signature, timestamp) {
|
||||
const bodyHash = hashBody(getBodyForSignature(req));
|
||||
const path = req.originalUrl || req.baseUrl + req.path || req.path;
|
||||
const message = buildSignMessage(req.method, path, timestamp, bodyHash);
|
||||
return verifySignature(publicKey, signature, message);
|
||||
}
|
||||
|
||||
function requireSignature() {
|
||||
return (req, res, next) => {
|
||||
const publicKey = req.headers["x-public-key"];
|
||||
@@ -24,17 +41,11 @@ function requireSignature() {
|
||||
res.status(401).json({ error: "Missing X-Public-Key, X-Signature, or X-Timestamp" });
|
||||
return;
|
||||
}
|
||||
const now = Date.now();
|
||||
const ts = new Date(timestamp).getTime();
|
||||
if (Number.isNaN(ts) || Math.abs(now - ts) > TIMESTAMP_TOLERANCE_MS) {
|
||||
if (!isTimestampValid(timestamp)) {
|
||||
res.status(401).json({ error: "Invalid or expired timestamp" });
|
||||
return;
|
||||
}
|
||||
const body = req.bodyRaw !== undefined && req.bodyRaw !== null ? req.bodyRaw : "";
|
||||
const bodyHash = hashBody(body);
|
||||
const path = req.originalUrl || req.baseUrl + req.path || req.path;
|
||||
const message = buildSignMessage(req.method, path, timestamp, bodyHash);
|
||||
if (!verifySignature(publicKey, signature, message)) {
|
||||
if (!isSignatureValid(req, publicKey, signature, timestamp)) {
|
||||
res.status(401).json({ error: "Invalid signature" });
|
||||
return;
|
||||
}
|
||||
@@ -49,20 +60,31 @@ function requireSignature() {
|
||||
};
|
||||
}
|
||||
|
||||
/** @returns {Promise<{ zoos: Array<object>, mapWidth: number, mapHeight: number }>}
|
||||
*/
|
||||
async function getZoosForMap() {
|
||||
const params = await getMapParams();
|
||||
let zoos = await getAllZoos();
|
||||
await countPlayerZoos();
|
||||
const need = Math.max(0, params.minZoos - zoos.length);
|
||||
for (let i = 0; i < need; i++) {
|
||||
const x = 10 + Math.random() * 80;
|
||||
const y = 10 + Math.random() * 80;
|
||||
const weights = { Basic: 1 + Math.floor(Math.random() * 2), Ocean: Math.floor(Math.random() * 2), Mountain: Math.floor(Math.random() * 2) };
|
||||
await createBotZoo(x, y, weights);
|
||||
}
|
||||
if (need > 0) zoos = await getAllZoos();
|
||||
return {
|
||||
zoos,
|
||||
mapWidth: params.mapWidth,
|
||||
mapHeight: params.mapHeight,
|
||||
};
|
||||
}
|
||||
|
||||
/** GET /api/zoos — list zoos for map (no auth). Ensures minZoos with bots. */
|
||||
router.get("/", async (req, res, next) => {
|
||||
try {
|
||||
const params = await getMapParams();
|
||||
let zoos = await getAllZoos();
|
||||
await countPlayerZoos();
|
||||
const need = Math.max(0, params.minZoos - zoos.length);
|
||||
for (let i = 0; i < need; i++) {
|
||||
const x = 10 + Math.random() * 80;
|
||||
const y = 10 + Math.random() * 80;
|
||||
const weights = { Basic: 1 + Math.floor(Math.random() * 2), Ocean: Math.floor(Math.random() * 2), Mountain: Math.floor(Math.random() * 2) };
|
||||
await createBotZoo(x, y, weights);
|
||||
}
|
||||
if (need > 0) zoos = await getAllZoos();
|
||||
const { zoos, mapWidth, mapHeight } = await getZoosForMap();
|
||||
const worldZoos = zoos.map((z) => ({
|
||||
id: z.id,
|
||||
name: z.name,
|
||||
@@ -71,7 +93,7 @@ router.get("/", async (req, res, next) => {
|
||||
animalWeights: z.animal_weights,
|
||||
game_state: z.game_state ?? null,
|
||||
}));
|
||||
res.json({ worldZoos, mapWidth: params.mapWidth, mapHeight: params.mapHeight });
|
||||
res.json({ worldZoos, mapWidth, mapHeight });
|
||||
} catch (e) {
|
||||
next(e);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user