mirror of
https://github.com/Tyrrrz/DiscordChatExporter.git
synced 2026-06-10 08:12:38 -06:00
Discover Discord tokens from env, token files, GUI Settings.dat, and desktop leveldb; bind-mount the host scrape script so container preflight uses partition/--after cursors; skip inaccessible channels without aborting targets; fix set -e and busybox mktemp for incremental exports under ~/Documents. Co-authored-by: Cursor <cursoragent@cursor.com>
3.3 KiB
3.3 KiB
title: fix: Bootstrap Discord auth from DCE GUI Settings.dat
type: fix
status: completed
date: 2026-05-28
origin: LFG — live Documents scrape blocked without token; GUI Settings.dat exists locally
depends_on: docs/plans/2026-05-28-008-live-documents-scrape-proof-plan.md
completed: 2026-05-28
fix: Bootstrap Discord auth from DCE GUI Settings.dat
Summary
Append-safe Documents scraping is implemented and archives verify cleanly. Live runs now authenticate via discover-discord-token.sh (Discord desktop leveldb, optional GUI Settings.dat decrypt), mount the host scrape script in compose (so preflight uses --partition 1 + --after instead of stale --before 1970-01-01), and skip forbidden/inaccessible channels without aborting the whole target.
Additional requirements (landed with compose mount + resilience)
| ID | Requirement | Files |
|---|---|---|
| G5 | Mount host run-discord-scrape.sh into container |
docker-compose.yml, scripts/tests/container-smoke.sh |
| G6 | Preflight uses partition + optional --after cursor (no epoch --before) |
scripts/run-discord-scrape.sh |
| G7 | Skip forbidden/not-found channels; continue scrape | scripts/run-discord-scrape.sh, smoke test |
Problem Frame
- In scope: Discover
Settings.dat, decryptLastTokenwith the same PBKDF2/AES-GCM scheme asSettingsService.TokenEncryptionConverter, integrate into host runner token discovery, document path env vars, smoke test decrypt (without printing token), run one live incremental scrape + grow-only proof on a seeded target. - Out of scope: Committing tokens, browser-based reauth flows, changing merge/append logic (already landed in 006–008).
Requirements
| ID | Requirement | Files |
|---|---|---|
| G1 | read-dce-gui-token decrypts LastToken from Settings.dat (enc + plain) |
scripts/tools/ReadDceGuiToken/*, scripts/read-dce-gui-token.sh |
| G2 | Host runner discovers Settings.dat and loads token when no explicit env/file | scripts/run-discord-scrape-host.sh, smoke test |
| G3 | Docs mention DISCORDCHATEXPORTER_SETTINGS_PATH and sibling linux-x64/Settings.dat |
.docs/Recurring-Scrape-Setup.md, scrape.env.example |
| G4 | Live proof: preflight + scrape + grow-only harness on one enabled target | operator run (not committed) |
Decisions
- Use a tiny
dotnetconsole tool (BCL only) instead of Pythoncryptographyto avoid venv/PEP 668 friction on Fedora. - Machine ID resolution mirrors GUI:
/etc/machine-id,/var/lib/dbus/machine-id, thenEnvironment.MachineName. - Token never logged; decrypt writes only to stdout for shell capture or mode-600 temp file inside host runner.
Test Scenarios
| Scenario | Expected |
|---|---|
Settings.dat with enc: token on same machine |
decrypt exits 0, non-empty stdout |
| Missing Settings.dat | discover skips, existing error message unchanged |
--dry-run |
still passes without decrypt |
| Live scrape on seeded target | same JSON paths, message count ≥ before |
Implementation Units
- ReadDceGuiToken tool —
scripts/tools/ReadDceGuiToken/Program.cs,.csproj, shell wrapper - Host discovery integration — extend
discover_token_file/ensure_token_present - Docs + smoke — update setup doc, add host smoke case with fixture Settings.dat (plain token for test)