aktueller stand

This commit is contained in:
2025-12-29 19:51:45 +01:00
parent f4323e20de
commit 41ef5107aa
9 changed files with 438 additions and 98 deletions

View File

@@ -55,15 +55,43 @@ client.interceptors.response.use(
}
);
const CSRF_COOKIE_NAMES = ['CSRF_TOKEN', 'CSRF-TOKEN', 'XSRF-TOKEN', 'XSRF_TOKEN'];
function extractCookieValue(cookies = [], name) {
if (!Array.isArray(cookies) || !name) {
return null;
}
const prefix = `${name}=`;
const match = cookies.find((cookie) => cookie.startsWith(prefix));
if (!match) {
return null;
}
return match.split(';')[0].slice(prefix.length);
}
function extractCsrfToken(cookies = []) {
if (!Array.isArray(cookies)) {
for (const name of CSRF_COOKIE_NAMES) {
const value = extractCookieValue(cookies, name);
if (value) {
return value;
}
}
return null;
}
function extractCsrfTokenFromCookieHeader(cookieHeader = '') {
if (!cookieHeader) {
return null;
}
const tokenCookie = cookies.find((cookie) => cookie.startsWith('CSRF_TOKEN='));
if (!tokenCookie) {
return null;
const pairs = cookieHeader.split(';').map((part) => part.trim());
for (const name of CSRF_COOKIE_NAMES) {
const prefix = `${name}=`;
const match = pairs.find((pair) => pair.startsWith(prefix));
if (match) {
return match.slice(prefix.length);
}
}
return tokenCookie.split(';')[0].split('=')[1];
return null;
}
function serializeCookies(cookies = []) {
@@ -78,8 +106,10 @@ function buildHeaders(cookieHeader, csrfToken) {
if (cookieHeader) {
headers.cookie = cookieHeader;
}
if (csrfToken) {
headers['x-csrf-token'] = csrfToken;
const token = csrfToken || extractCsrfTokenFromCookieHeader(cookieHeader);
if (token) {
headers['x-csrf-token'] = token;
headers['x-xsrf-token'] = token;
}
return headers;
}
@@ -135,25 +165,13 @@ async function login(email, password) {
};
}
async function checkSession(cookieHeader, profileId) {
if (!cookieHeader) {
return false;
}
try {
await client.get(`/api/wall/foodsaver/${profileId}?limit=1`, {
headers: buildHeaders(cookieHeader)
});
return true;
} catch {
return false;
}
}
async function fetchProfile(cookieHeader) {
async function fetchProfile(cookieHeader, { throwOnError = false } = {}) {
try {
return await getCurrentUserDetails(cookieHeader);
} catch (error) {
if (throwOnError) {
throw error;
}
console.warn('Profil konnte nicht geladen werden:', error.message);
return null;
}
@@ -296,7 +314,6 @@ async function bookSlot(storeId, utcDate, profileId, session) {
module.exports = {
login,
checkSession,
fetchProfile,
fetchStores,
fetchPickups,