added discord functionality to extension and polished some of downloader process.

This commit is contained in:
Bryan Van Deusen
2026-01-24 23:15:03 -05:00
parent b9b8048a2d
commit 058901cd05
6 changed files with 186 additions and 28 deletions
+114 -11
View File
@@ -2,16 +2,75 @@
* Background script - handles cookie operations and API calls
*/
// Store for captured Discord token
let discordToken = null;
let discordTokenCapturedAt = null;
// Initialize API on startup
browser.runtime.onInstalled.addListener(async () => {
console.log('GallerySubscriber extension installed');
await api.init();
await loadDiscordToken();
});
browser.runtime.onStartup.addListener(async () => {
await api.init();
await loadDiscordToken();
});
/**
* Load Discord token from storage
*/
async function loadDiscordToken() {
const stored = await browser.storage.local.get(['discordToken', 'discordTokenCapturedAt']);
if (stored.discordToken) {
discordToken = stored.discordToken;
discordTokenCapturedAt = stored.discordTokenCapturedAt;
console.log('Loaded Discord token from storage (captured:', discordTokenCapturedAt, ')');
}
}
/**
* Save Discord token to storage
*/
async function saveDiscordToken(token) {
discordToken = token;
discordTokenCapturedAt = new Date().toISOString();
await browser.storage.local.set({
discordToken: token,
discordTokenCapturedAt: discordTokenCapturedAt
});
console.log('Discord token captured and saved');
}
/**
* Listen for Discord API requests to capture Authorization header
*/
browser.webRequest.onSendHeaders.addListener(
(details) => {
// Look for Authorization header
const authHeader = details.requestHeaders.find(
h => h.name.toLowerCase() === 'authorization'
);
if (authHeader && authHeader.value) {
// Discord user tokens don't have "Bearer " prefix
// Bot tokens have "Bot " prefix - we want user tokens
const token = authHeader.value;
// Only capture if it looks like a user token (not a bot token)
if (!token.startsWith('Bot ') && token.length > 50) {
// Only save if it's different from what we have
if (token !== discordToken) {
saveDiscordToken(token);
}
}
}
},
{ urls: ['*://discord.com/api/*', '*://*.discord.com/api/*'] },
['requestHeaders']
);
// Handle messages from popup and options pages
browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
handleMessage(message)
@@ -70,8 +129,27 @@ async function exportCookies(platformKey) {
let credentialType;
if (platform.authType === 'token') {
// Discord and other token-based platforms require manual entry
throw new Error(`${platform.name} requires manual token entry in the web UI. Token extraction is not supported for security reasons.`);
// Discord - use captured token from webRequest listener
if (platformKey === 'discord') {
if (!discordToken) {
throw new Error(`No Discord token captured. Please open Discord in this browser and interact with it (e.g., switch channels) to capture the token.`);
}
credentialData = discordToken;
credentialType = 'token';
// Send to backend
const result = await api.uploadCredentials(platformKey, credentialType, credentialData);
return {
success: true,
platform: platformKey,
tokenCapturedAt: discordTokenCapturedAt,
message: result.message || 'Token exported successfully'
};
}
// Other token-based platforms require manual entry
throw new Error(`${platform.name} requires manual token entry in the web UI.`);
}
// Cookie-based auth
@@ -108,8 +186,8 @@ async function exportAllCookies() {
for (const platformKey of platforms) {
const platform = PLATFORMS[platformKey];
// Skip token-based platforms
if (platform.authType === 'token') {
// Skip token-based platforms (except Discord if we have a token)
if (platform.authType === 'token' && platformKey !== 'discord') {
results[platformKey] = {
success: false,
platform: platformKey,
@@ -119,6 +197,17 @@ async function exportAllCookies() {
continue;
}
// Skip Discord if no token captured
if (platformKey === 'discord' && !discordToken) {
results[platformKey] = {
success: false,
platform: platformKey,
skipped: true,
message: 'No token captured - open Discord in browser first'
};
continue;
}
try {
results[platformKey] = await exportCookies(platformKey);
} catch (error) {
@@ -144,13 +233,27 @@ async function getPlatformStatus() {
try {
if (platform.authType === 'token') {
// Token-based platforms
status[key] = {
name: platform.name,
authType: 'token',
hasCookies: false,
cookieCount: 0,
note: platform.note || 'Requires manual token entry'
};
if (key === 'discord') {
status[key] = {
name: platform.name,
authType: 'token',
hasToken: !!discordToken,
tokenCapturedAt: discordTokenCapturedAt,
hasCookies: false,
cookieCount: 0,
note: discordToken
? `Token captured ${new Date(discordTokenCapturedAt).toLocaleString()}`
: 'Open Discord in browser to capture token'
};
} else {
status[key] = {
name: platform.name,
authType: 'token',
hasCookies: false,
cookieCount: 0,
note: platform.note || 'Requires manual token entry'
};
}
} else {
// Cookie-based platforms
const cookies = await extractCookiesForPlatform(key);