import { Database } from '../database/database.js'; import { MongoStorage } from "@canmertinyo/rate-limiter-mongo"; import { rateLimiter } from "@canmertinyo/rate-limiter-core"; import * as config from '../config.js'; const authenticateApiKey = async (req, res, next) => { const apiKey = req.headers['x-api-key']; const dbClient = new Database("AkenoXJs"); const db = dbClient.collection("api_keys"); if (!apiKey) { return res.status(401).json({ error: 'API Key required' }); } try { const keyDoc = await db.findOne({key: apiKey}); if (!keyDoc) { return res.status(403).json({ error: 'Invalid API Key' }); } next(); } catch (err) { res.status(500).json({ error: 'Server error' }); } }; const apiLimiter = rateLimiter({ /* store: new MongoStore({ uri: dbUrls, collectionName: "rateLimits", }), */ ms: 2 * 60 * 1000, maxRequest: 100, keyGenerator: (req) => req.headers["x-api-key"], // standardHeaders: true, // legacyHeaders: false, message: (req, res) => { const retryAfterMs = res.getHeaders()["retry-after"] * 1000 || 2 * 60 * 1000; const remainingSeconds = Math.ceil(retryAfterMs / 1000); const remainingMinutes = Math.floor(remainingSeconds / 60); return { error: `Too many requests from this API Key. Try again later: ${remainingMinutes}m ${remainingSeconds % 60}s.` }; } }); class CheckMilWare { constructor() { this.dbClient = new Database("AkenoXJs"); } async handle(req, res, next) { try { delete req.headers["link"]; const xForwardedFor = req.headers['x-forwarded-for']; const xRealIP = req.headers['x-real-ip']; const cfConnectingIP = req.headers['cf-connecting-ip']; let realIP = req.ip; if (xForwardedFor) { realIP = xForwardedFor.split(',')[0].trim(); } else if (xRealIP) { realIP = xRealIP; } else if (cfConnectingIP) { realIP = cfConnectingIP; } req.realIP = realIP; const isBlocked = await this.dbClient.CheckIsBlocked(realIP); if (isBlocked && isBlocked.blocked) { return res.status(403).send("Access denied: IP is blocked"); } if (req.path === '/.env') { console.log("Check path /env"); await this.dbClient.AddIpisBlocked(realIP); return res.status(403).send("Access denied: IP is blocked.."); } console.log(`Real IP address is: ${realIP} path method: ${req.path} method: ${req.method} header used: ${xForwardedFor ? "x-forwarded-for" : xRealIP ? "x-real-ip" : cfConnectingIP ? "cf-connecting-ip" : "req.ip"} `); next(); } catch (error) { console.error("Error in middleware: " + error); res.status(500).send("Something bad happened"); } } } export { CheckMilWare, authenticateApiKey, apiLimiter };