From d138ff03f453b0bb3fce4093dd3d14e4a5b2d00d Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Fri, 1 May 2026 00:17:38 -0700 Subject: [PATCH] fix(wiretap): cover current Discord cache layout --- internal/discorddesktop/import.go | 4 ++- internal/discorddesktop/import_test.go | 50 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/internal/discorddesktop/import.go b/internal/discorddesktop/import.go index cccc2c9..c85c069 100644 --- a/internal/discorddesktop/import.go +++ b/internal/discorddesktop/import.go @@ -646,7 +646,9 @@ func extractJSONObjects(data []byte) [][]byte { func shouldSkipDir(name string) bool { switch strings.ToLower(name) { - case "crashpad", "gpu-cache", "shadercache", "spellcheck", "dawncache": + case "blob_storage", "component_crx_cache", "crashpad", "dawngraphitecache", + "dawnwebgpucache", "download_cache", "gpucache", "gpu-cache", + "shadercache", "spellcheck", "videodecodestats", "widevinecdm": return true default: return false diff --git a/internal/discorddesktop/import_test.go b/internal/discorddesktop/import_test.go index 83ddb6b..4290e76 100644 --- a/internal/discorddesktop/import_test.go +++ b/internal/discorddesktop/import_test.go @@ -308,6 +308,56 @@ func TestImportClassifiesMessagesFromCachedChannelRoutes(t *testing.T) { require.Equal(t, [][]string{{"Discord Desktop Guild 999999999999999998"}}, guildRows) } +func TestImportClassifiesGzipCacheMessagesFromRendererRoutes(t *testing.T) { + ctx := context.Background() + dir := t.TempDir() + cachePath := filepath.Join(dir, "Cache", "Cache_Data") + logPath := filepath.Join(dir, "logs") + require.NoError(t, os.MkdirAll(cachePath, 0o755)) + require.NoError(t, os.MkdirAll(logPath, 0o755)) + + require.NoError(t, os.WriteFile(filepath.Join(logPath, "renderer_js.log"), []byte(`[Routing/Utils] transitionTo - Transitioning to /channels/@me/111111111111111122 +[Routing/Utils] transitionTo - Transitioning to /channels/999999999999999995/111111111111111123 +`), 0o600)) + + var compressed bytes.Buffer + zw := gzip.NewWriter(&compressed) + _, err := zw.Write([]byte(`[ +{"id":"333333333333333348","channel_id":"111111111111111122","content":"current cache dm","timestamp":"2026-04-23T18:20:43Z","author":{"id":"222222222222222234","username":"alice","global_name":"Alice"}}, +{"id":"333333333333333349","channel_id":"111111111111111123","content":"current cache guild","timestamp":"2026-04-23T18:20:44Z","author":{"id":"222222222222222235","username":"bob","global_name":"Bob"}} +]`)) + require.NoError(t, err) + require.NoError(t, zw.Close()) + + cacheBlob := append([]byte("1/0/https://discord.com/api/v9/channels/111111111111111122/messages?limit=13\x00content-encoding\x00gzip\x00"), compressed.Bytes()...) + require.NoError(t, os.WriteFile(filepath.Join(cachePath, "entry_0"), cacheBlob, 0o600)) + + dbPath := filepath.Join(dir, "discrawl.db") + st, err := store.Open(ctx, dbPath) + require.NoError(t, err) + defer func() { _ = st.Close() }() + + stats, err := Import(ctx, st, Options{Path: dir}) + require.NoError(t, err) + require.Equal(t, 2, stats.FilesScanned) + require.Equal(t, 2, stats.Messages) + require.Equal(t, 1, stats.DMMessages) + require.Equal(t, 1, stats.GuildMessages) + require.Equal(t, 0, stats.SkippedMessages) + + dmResults, err := st.SearchMessages(ctx, store.SearchOptions{Query: "current cache dm", Limit: 10}) + require.NoError(t, err) + require.Len(t, dmResults, 1) + require.Equal(t, DirectMessageGuildID, dmResults[0].GuildID) + require.Equal(t, "Alice", dmResults[0].ChannelName) + + guildResults, err := st.SearchMessages(ctx, store.SearchOptions{Query: "current cache guild", Limit: 10}) + require.NoError(t, err) + require.Len(t, guildResults, 1) + require.Equal(t, "999999999999999995", guildResults[0].GuildID) + require.Equal(t, "channel-111123", guildResults[0].ChannelName) +} + func TestImportInfersDirectMessageNamesFromCachedUsers(t *testing.T) { ctx := context.Background() dir := t.TempDir()