refactor(themes): remove session tokens and authenticate exclusively via username and password

This commit is contained in:
HorizonCode committed 2026-11-02 16:25:38 +01:00
1 parent a051c021d7
commit a423850dc9
1 file changed
+4 -51
+4 -51
View File
@@ -187,7 +187,6 @@ export const LEGACY_COMMUNITY_THEMES: CommunityTheme[] = [
]; ];
const DEFAULT_THEMES_SERVICE_URL = 'http://127.0.0.1:3000'; const DEFAULT_THEMES_SERVICE_URL = 'http://127.0.0.1:3000';
let cachedSessionToken: string | null = null;
export async function getThemesServiceUrl(): Promise<string> { export async function getThemesServiceUrl(): Promise<string> {
const customUrl = await config.value<string>('themes_service_url').get(''); const customUrl = await config.value<string>('themes_service_url').get('');
@@ -195,8 +194,7 @@ export async function getThemesServiceUrl(): Promise<string> {
} }
/** /**
* Returns authentication headers using stored username and password, * Returns authentication headers using stored username and password.
* plus session token if available.
*/ */
export async function getAuthHeaders(): Promise<Record<string, string>> { export async function getAuthHeaders(): Promise<Record<string, string>> {
const headers: Record<string, string> = {}; const headers: Record<string, string> = {};
@@ -208,54 +206,9 @@ export async function getAuthHeaders(): Promise<Record<string, string>> {
headers['X-Password'] = password; headers['X-Password'] = password;
} }
const token = await getThemesAuthToken();
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
return headers; return headers;
} }
export async function getThemesAuthToken(forceRefresh = false): Promise<string | null> {
if (!forceRefresh && cachedSessionToken) {
return cachedSessionToken;
}
const storedToken = await config.value<string>('themes_auth_token').get('');
if (!forceRefresh && storedToken.trim().length > 0) {
cachedSessionToken = storedToken.trim();
return cachedSessionToken;
}
// Attempt automatic login using saved username & password
const username = await config.value<string>('username').get('');
const password = await config.value<string>('password').get('');
if (username.length > 0 && password.length > 0) {
try {
const baseUrl = await getThemesServiceUrl();
const res = await fetch(`${baseUrl}/v1/auth/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password }),
});
if (res.ok) {
const data = (await res.json()) as { token: string };
if (data.token) {
cachedSessionToken = data.token;
await config.value<string>('themes_auth_token').set(data.token);
return cachedSessionToken;
}
}
} catch (err) {
console.warn('[CommunityThemes] Auto-login failed:', err);
}
}
return null;
}
export async function fetchCommunityThemes(options?: { export async function fetchCommunityThemes(options?: {
q?: string; q?: string;
tag?: string; tag?: string;
@@ -364,7 +317,7 @@ export async function toggleCommunityThemeLike(themeId: string): Promise<{ liked
const baseUrl = await getThemesServiceUrl(); const baseUrl = await getThemesServiceUrl();
const headers = await getAuthHeaders(); const headers = await getAuthHeaders();
if (!headers['X-Username'] && !headers['Authorization']) { if (!headers['X-Username'] || !headers['X-Password']) {
throw new Error('Please log in to like community themes.'); throw new Error('Please log in to like community themes.');
} }
@@ -385,7 +338,7 @@ export async function deleteCommunityTheme(themeId: string): Promise<void> {
const baseUrl = await getThemesServiceUrl(); const baseUrl = await getThemesServiceUrl();
const headers = await getAuthHeaders(); const headers = await getAuthHeaders();
if (!headers['X-Username'] && !headers['Authorization']) { if (!headers['X-Username'] || !headers['X-Password']) {
throw new Error('Please log in to manage your community themes.'); throw new Error('Please log in to manage your community themes.');
} }
@@ -418,7 +371,7 @@ export async function publishThemeToWorkshop(options: {
const baseUrl = await getThemesServiceUrl(); const baseUrl = await getThemesServiceUrl();
const authHeaders = await getAuthHeaders(); const authHeaders = await getAuthHeaders();
if (!authHeaders['X-Username'] && !authHeaders['Authorization']) { if (!authHeaders['X-Username'] || !authHeaders['X-Password']) {
throw new Error('You must be logged in to EZPPFarm to publish themes.'); throw new Error('You must be logged in to EZPPFarm to publish themes.');
} }