Transparency: label blocked/allowed in traffic log; whitelist Cloudflare CDN (WI-6: #554, #561, #358) - #607
Merged
Conversation
…are CDN (#554, #561, #358) WI-6 (visibility half). Users cannot tell what is blocked, and legitimate Cloudflare-fronted content is over-blocked as a shared-IP tracker. - AdapterLog / log.xml (#561): the raw traffic log encoded blocked-vs-allowed only via a small tinted connection icon. Add an explicit coloured "BLOCKED"/ "ALLOWED" text label per row, mirroring the TimelineAdapter idiom (R.color.timeline_blocked / timeline_allowed, R.string.blocked / allowed). Hidden when the allowed state is unknown (allowed < 0). - TrackerList.ignoreDomains (#554 partial): the shared-CDN false-positive whitelist covered cloudfront.net and fastly.net but not Cloudflare. Add cloudflare.com (the shared CDN fronting e.g. cdnjs.cloudflare.com), matching the existing exact-domain pattern. Cloudflare's analytics beacon (cloudflareinsights.com) is deliberately left blockable. Deliberately out of scope: surfacing blocked-but-unattributed connections as toggleable per-app rows (#554/#358 "no way to unblock"). updateAccess only runs for recognised trackers, and getAppTrackers() skips rows where findTracker(host) == null; making these visible/toggleable would require changing the access-table population policy (flooding a per-app table with every host each app contacts), a new per-app/per-host block mechanism, and would still be dishonest because the block decision is IP-based off the UID-global dns table (the deferred attribution limitation in TODO.md / triage C-3). Left for a dedicated attribution redesign. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
kasnder
marked this pull request as ready for review
July 11, 2026 00:44
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
WI-6 — Transparency: blocked connections invisible / unlabelled
Fixes the visibility half of WI-6. References #554, #561, #358.
Problem
AdapterLog), blocked-vs-allowed was encoded only via a small tinted connection icon (AdapterLog.java~173/181-182) — no text. The newer tracker Timeline (TimelineAdapter~176-188) already labels this clearly.TrackerList.ignoreDomains(~61-63) coveredcloudfront.net/fastly.netbut not Cloudflare.What changed
1. Traffic log now labels blocked/allowed (#561) —
AdapterLog.java+res/layout/log.xmlBLOCKEDred /ALLOWEDgreen), mirroring theTimelineAdapteridiom. Reuses existing resourcesR.string.blocked/R.string.allowedandR.color.timeline_blocked/R.color.timeline_allowed. Label is hidden when the allowed state is unknown (allowed < 0).2. Whitelist Cloudflare's shared CDN (#554 partial) —
TrackerList.javacloudflare.comtoignoreDomains. Verified the mechanism first:isIgnoredDomain()does an exact registrable-domain match against the domains listed in the blocklists. In the Disconnect list Cloudflare appears ascloudflare.com(the shared CDN fronting e.g.cdnjs.cloudflare.com),cloudflareinsights.com(its Web Analytics beacon), andcloudflarestream.com.cloudflare.comis the correct analogue ofcloudfront.net/fastly.net; the analytics beaconcloudflareinsights.comis deliberately left blockable (exact match won't touch it).Root cause (attribution half — see Out of scope)
updateAccess, which feeds the per-app tracker list, runs only whenisTrackeris true (ServiceSinkhole.java~978), while the raw log is written whenever logging is on (~974). In addition,TrackerList.getAppTrackers()(~337-339) skips any access row wherefindTracker(host) == null. So a blocked-but-unrecognised connection has no toggleable per-app row.Deliberately out of scope
getAppTrackers()to emit an "unknown" category, and (c) a new per-app/per-host block mechanism that does not exist. Crucially it would still be dishonest: the block decision is IP-based off the UID-globaldnstable (nouidcolumn) — the deliberately-deferred attribution limitation documented inTODO.mdand triage §C-3. Left for a dedicated attribution redesign rather than papered over here.ServiceSinkhole.getDnsregion (~1330-1450) and theTrackerList.loadTrackers/JSON-parse region (~178/524) that concurrent PRs touch.Testing
./gradlew :app:compileGithubDebugJavaWithJavaccompiled cleanly (Java + resources) on first run. Only Java/resources were touched; no packet-path change.BLOCKED/ALLOWEDlabels in the traffic log render correctly in light and dark themes.🤖 Generated with Claude Code