mirror of
https://github.com/kjanat/livedash-node.git
synced 2026-01-16 11:12:11 +01:00
refactor: fix biome linting issues and update project documentation
- Fix 36+ biome linting issues reducing errors/warnings from 227 to 191 - Replace explicit 'any' types with proper TypeScript interfaces - Fix React hooks dependencies and useCallback patterns - Resolve unused variables and parameter assignment issues - Improve accessibility with proper label associations - Add comprehensive API documentation for admin and security features - Update README.md with accurate PostgreSQL setup and current tech stack - Create complete documentation for audit logging, CSP monitoring, and batch processing - Fix outdated project information and missing developer workflows
This commit is contained in:
@ -1,6 +1,14 @@
|
||||
import type { NextRequest } from "next/server";
|
||||
import { NextResponse } from "next/server";
|
||||
import { extractClientIP, InMemoryRateLimiter } from "../lib/rateLimiter";
|
||||
import {
|
||||
securityAuditLogger,
|
||||
AuditOutcome,
|
||||
createAuditMetadata,
|
||||
SecurityEventType,
|
||||
AuditSeverity,
|
||||
} from "../lib/securityAuditLogger";
|
||||
import { enhancedSecurityLog } from "../lib/securityMonitoring";
|
||||
|
||||
// Rate limiting for login attempts
|
||||
const loginRateLimiter = new InMemoryRateLimiter({
|
||||
@ -13,7 +21,7 @@ const loginRateLimiter = new InMemoryRateLimiter({
|
||||
/**
|
||||
* Apply rate limiting to authentication endpoints
|
||||
*/
|
||||
export function authRateLimitMiddleware(request: NextRequest) {
|
||||
export async function authRateLimitMiddleware(request: NextRequest) {
|
||||
const { pathname } = request.nextUrl;
|
||||
|
||||
// Only apply to NextAuth signin endpoint
|
||||
@ -22,9 +30,35 @@ export function authRateLimitMiddleware(request: NextRequest) {
|
||||
pathname.startsWith("/api/auth/callback/credentials")
|
||||
) {
|
||||
const ip = extractClientIP(request);
|
||||
const userAgent = request.headers.get("user-agent") || undefined;
|
||||
const rateLimitResult = loginRateLimiter.checkRateLimit(ip);
|
||||
|
||||
if (!rateLimitResult.allowed) {
|
||||
// Log rate limiting event with enhanced monitoring
|
||||
await enhancedSecurityLog(
|
||||
SecurityEventType.RATE_LIMITING,
|
||||
"auth_rate_limit_exceeded",
|
||||
AuditOutcome.RATE_LIMITED,
|
||||
{
|
||||
ipAddress: ip,
|
||||
userAgent,
|
||||
metadata: createAuditMetadata({
|
||||
endpoint: pathname,
|
||||
resetTime: rateLimitResult.resetTime,
|
||||
maxAttempts: 5,
|
||||
windowMs: 15 * 60 * 1000,
|
||||
}),
|
||||
},
|
||||
AuditSeverity.HIGH,
|
||||
"Authentication rate limit exceeded",
|
||||
{
|
||||
endpoint: pathname,
|
||||
rateLimitType: "authentication",
|
||||
threshold: 5,
|
||||
windowMinutes: 15,
|
||||
}
|
||||
);
|
||||
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
@ -40,6 +74,27 @@ export function authRateLimitMiddleware(request: NextRequest) {
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
// Log successful rate limit check for monitoring
|
||||
await enhancedSecurityLog(
|
||||
SecurityEventType.RATE_LIMITING,
|
||||
"auth_rate_limit_check",
|
||||
AuditOutcome.SUCCESS,
|
||||
{
|
||||
ipAddress: ip,
|
||||
userAgent,
|
||||
metadata: createAuditMetadata({
|
||||
endpoint: pathname,
|
||||
attemptsRemaining: 5 - (rateLimitResult as any).currentCount || 0,
|
||||
}),
|
||||
},
|
||||
AuditSeverity.INFO,
|
||||
undefined,
|
||||
{
|
||||
endpoint: pathname,
|
||||
rateLimitType: "authentication_check",
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
return NextResponse.next();
|
||||
|
||||
@ -68,7 +68,10 @@ export async function csrfProtectionMiddleware(
|
||||
const validation = await CSRFProtection.validateRequest(request);
|
||||
|
||||
if (!validation.valid) {
|
||||
console.warn(`CSRF validation failed for ${method} ${pathname}:`, validation.error);
|
||||
console.warn(
|
||||
`CSRF validation failed for ${method} ${pathname}:`,
|
||||
validation.error
|
||||
);
|
||||
|
||||
return NextResponse.json(
|
||||
{
|
||||
@ -100,11 +103,7 @@ export function generateCSRFTokenResponse(): NextResponse {
|
||||
});
|
||||
|
||||
// Set the CSRF token cookie
|
||||
response.cookies.set(
|
||||
cookie.name,
|
||||
cookie.value,
|
||||
cookie.options
|
||||
);
|
||||
response.cookies.set(cookie.name, cookie.value, cookie.options);
|
||||
|
||||
return response;
|
||||
}
|
||||
@ -121,4 +120,4 @@ export function csrfTokenMiddleware(request: NextRequest): NextResponse | null {
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user