aktueller stand
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
const axios = require('axios');
|
||||
const requestLogStore = require('./requestLogStore');
|
||||
const sessionStore = require('./sessionStore');
|
||||
|
||||
const BASE_URL = 'https://foodsharing.de';
|
||||
|
||||
@@ -38,6 +39,7 @@ client.interceptors.response.use(
|
||||
} catch (error) {
|
||||
console.warn('[REQUEST-LOG] Outgoing-Log fehlgeschlagen:', error.message);
|
||||
}
|
||||
updateSessionCookiesFromResponse(response);
|
||||
return response;
|
||||
},
|
||||
(error) => {
|
||||
@@ -60,6 +62,9 @@ client.interceptors.response.use(
|
||||
} catch (logError) {
|
||||
console.warn('[REQUEST-LOG] Outgoing-Error-Log fehlgeschlagen:', logError.message);
|
||||
}
|
||||
if (error?.response) {
|
||||
updateSessionCookiesFromResponse(error.response);
|
||||
}
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
@@ -158,12 +163,75 @@ function buildRequestConfig({ cookieHeader, csrfToken, context, params } = {}) {
|
||||
return config;
|
||||
}
|
||||
|
||||
async function getCurrentUserDetails(cookieHeader, context) {
|
||||
function mergeCookieHeaders(existingHeader = '', setCookies = []) {
|
||||
const cookieMap = new Map();
|
||||
if (existingHeader) {
|
||||
existingHeader.split(';').forEach((part) => {
|
||||
const trimmed = part.trim();
|
||||
if (!trimmed) {
|
||||
return;
|
||||
}
|
||||
const [name, ...valueParts] = trimmed.split('=');
|
||||
if (!name) {
|
||||
return;
|
||||
}
|
||||
cookieMap.set(name, valueParts.join('='));
|
||||
});
|
||||
}
|
||||
|
||||
if (Array.isArray(setCookies)) {
|
||||
setCookies.forEach((cookie) => {
|
||||
if (!cookie || typeof cookie !== 'string') {
|
||||
return;
|
||||
}
|
||||
const [nameValue] = cookie.split(';');
|
||||
if (!nameValue) {
|
||||
return;
|
||||
}
|
||||
const [name, ...valueParts] = nameValue.split('=');
|
||||
if (!name) {
|
||||
return;
|
||||
}
|
||||
cookieMap.set(name, valueParts.join('='));
|
||||
});
|
||||
}
|
||||
|
||||
return Array.from(cookieMap.entries())
|
||||
.map(([name, value]) => `${name}=${value}`)
|
||||
.join('; ');
|
||||
}
|
||||
|
||||
function updateSessionCookiesFromResponse(response) {
|
||||
const setCookies = response?.headers?.['set-cookie'];
|
||||
if (!Array.isArray(setCookies) || setCookies.length === 0) {
|
||||
return;
|
||||
}
|
||||
const metadata = response?.config?.metadata || {};
|
||||
const sessionId = metadata.sessionId;
|
||||
if (!sessionId) {
|
||||
return;
|
||||
}
|
||||
const session = sessionStore.get(sessionId);
|
||||
if (!session) {
|
||||
return;
|
||||
}
|
||||
const mergedCookieHeader = mergeCookieHeaders(session.cookieHeader, setCookies);
|
||||
if (!mergedCookieHeader) {
|
||||
return;
|
||||
}
|
||||
const csrfToken = extractCsrfTokenFromCookieHeader(mergedCookieHeader) || session.csrfToken || null;
|
||||
sessionStore.update(sessionId, {
|
||||
cookieHeader: mergedCookieHeader,
|
||||
csrfToken
|
||||
});
|
||||
}
|
||||
|
||||
async function getCurrentUserDetails(cookieHeader, context, options = {}) {
|
||||
const response = await client.get(
|
||||
'/api/user/current/details',
|
||||
buildRequestConfig({ cookieHeader, context })
|
||||
);
|
||||
return response.data;
|
||||
return options.raw ? response : response.data;
|
||||
}
|
||||
|
||||
async function login(email, password) {
|
||||
@@ -185,8 +253,14 @@ async function login(email, password) {
|
||||
const response = await client.post('/api/user/login', payload, { headers });
|
||||
const cookies = response.headers['set-cookie'] || [];
|
||||
const csrfToken = extractCsrfToken(cookies);
|
||||
const cookieHeader = serializeCookies(cookies);
|
||||
const details = await getCurrentUserDetails(cookieHeader);
|
||||
let cookieHeader = serializeCookies(cookies);
|
||||
const detailsResponse = await getCurrentUserDetails(cookieHeader, null, { raw: true });
|
||||
const detailsCookies = detailsResponse?.headers?.['set-cookie'] || [];
|
||||
if (detailsCookies.length > 0) {
|
||||
cookieHeader = mergeCookieHeaders(cookieHeader, detailsCookies);
|
||||
}
|
||||
const updatedCsrf = extractCsrfTokenFromCookieHeader(cookieHeader) || csrfToken;
|
||||
const details = detailsResponse?.data;
|
||||
if (!details?.id) {
|
||||
throw new Error('Profil-ID konnte nicht ermittelt werden.');
|
||||
}
|
||||
@@ -200,7 +274,7 @@ async function login(email, password) {
|
||||
}
|
||||
|
||||
return {
|
||||
csrfToken,
|
||||
csrfToken: updatedCsrf,
|
||||
cookieHeader,
|
||||
profile: {
|
||||
id: String(details.id),
|
||||
|
||||
Reference in New Issue
Block a user