71 lines
2.5 KiB
TypeScript
71 lines
2.5 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { cookies } from 'next/headers';
|
|
import { logger } from '@/lib/logger';
|
|
import { encryptSession, decryptSession } from '@/lib/auth/crypto';
|
|
import { SESSION_COOKIE, SESSION_COOKIE_MAX_AGE } from '@/lib/auth/session-cookie';
|
|
|
|
const COOKIE_OPTIONS = {
|
|
httpOnly: true,
|
|
secure: process.env.NODE_ENV === 'production',
|
|
sameSite: 'lax' as const,
|
|
path: '/',
|
|
maxAge: SESSION_COOKIE_MAX_AGE,
|
|
};
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
if (process.env.OAUTH_ENABLED === 'true' && process.env.OAUTH_ONLY === 'true') {
|
|
return NextResponse.json({ error: 'Basic authentication is disabled' }, { status: 403 });
|
|
}
|
|
|
|
const { serverUrl, username, password } = await request.json();
|
|
if (!serverUrl || !username || !password) {
|
|
return NextResponse.json({ error: 'Missing required fields' }, { status: 400 });
|
|
}
|
|
|
|
const token = encryptSession(serverUrl, username, password);
|
|
const cookieStore = await cookies();
|
|
cookieStore.set(SESSION_COOKIE, token, COOKIE_OPTIONS);
|
|
|
|
return NextResponse.json({ ok: true });
|
|
} catch (error) {
|
|
logger.error('Session store error', { error: error instanceof Error ? error.message : 'Unknown error' });
|
|
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
|
|
}
|
|
}
|
|
|
|
export async function GET() {
|
|
try {
|
|
const cookieStore = await cookies();
|
|
const token = cookieStore.get(SESSION_COOKIE)?.value;
|
|
|
|
if (!token) {
|
|
return NextResponse.json({ error: 'No session' }, { status: 401 });
|
|
}
|
|
|
|
const credentials = decryptSession(token);
|
|
if (!credentials) {
|
|
cookieStore.delete(SESSION_COOKIE);
|
|
return NextResponse.json({ error: 'Invalid session' }, { status: 401 });
|
|
}
|
|
|
|
return NextResponse.json(credentials, {
|
|
headers: { 'Cache-Control': 'no-store, no-cache, must-revalidate' },
|
|
});
|
|
} catch (error) {
|
|
logger.error('Session read error', { error: error instanceof Error ? error.message : 'Unknown error' });
|
|
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
|
|
}
|
|
}
|
|
|
|
export async function DELETE() {
|
|
try {
|
|
const cookieStore = await cookies();
|
|
cookieStore.delete(SESSION_COOKIE);
|
|
return NextResponse.json({ ok: true });
|
|
} catch (error) {
|
|
logger.error('Session clear error', { error: error instanceof Error ? error.message : 'Unknown error' });
|
|
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
|
|
}
|
|
}
|