Skip to content

Commit f62e5b8

Browse files
committed
fix more bugs
1 parent ac9d4e1 commit f62e5b8

4 files changed

Lines changed: 72 additions & 7 deletions

File tree

app/src/main/java/net/kollnig/missioncontrol/data/TrackerBlocklist.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public class TrackerBlocklist {
4141
*/
4242
private final Map<Integer, Set<String>> blockmap = new ConcurrentHashMap<>();
4343

44+
interface PackageUidResolver {
45+
Integer resolve(String packageName);
46+
}
47+
4448
private TrackerBlocklist(Context c) {
4549
// Initialize Concurrent Set using values from shared preferences if possible.
4650
if (c != null)
@@ -84,6 +88,16 @@ public static String getBlockingKey(Tracker t) {
8488
public void loadSettings(Context c) {
8589
SharedPreferences prefs = c.getSharedPreferences(PREF_BLOCKLIST, Context.MODE_PRIVATE);
8690
Set<String> set = prefs.getStringSet(SHARED_PREFS_BLOCKLIST_APPS_KEY, null);
91+
PackageUidResolver resolver = new PackageUidResolver() {
92+
@Override
93+
public Integer resolve(String packageName) {
94+
try {
95+
return c.getPackageManager().getApplicationInfo(packageName, 0).uid;
96+
} catch (PackageManager.NameNotFoundException ignored) {
97+
return null;
98+
}
99+
}
100+
};
87101

88102
blockmap.clear();
89103
if (set != null) {
@@ -123,16 +137,25 @@ public void loadSettings(Context c) {
123137
}
124138

125139
// Retrieve uid
126-
int uid = -1;
127-
if (StringUtils.isNumeric(appUid))
128-
uid = Integer.parseInt(appUid);
140+
int uid = resolveStoredUid(appUid, resolver);
129141

130142
if (uid >= 0)
131143
blockmap.put(uid, subset);
132144
}
133145
}
134146
}
135147

148+
static int resolveStoredUid(String storedUid, PackageUidResolver resolver) {
149+
if (StringUtils.isNumeric(storedUid))
150+
return Integer.parseInt(storedUid);
151+
152+
if (resolver == null)
153+
return -1;
154+
155+
Integer uid = resolver.resolve(storedUid);
156+
return uid == null ? -1 : uid;
157+
}
158+
136159
public synchronized boolean hasSubset(int uid) {
137160
return blockmap.containsKey(uid);
138161
}

app/src/main/java/net/kollnig/missioncontrol/data/TrackerList.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.io.InputStream;
3939
import java.nio.charset.StandardCharsets;
4040
import java.util.ArrayList;
41+
import java.util.Arrays;
4142
import java.util.Collections;
4243
import java.util.Date;
4344
import java.util.HashMap;
@@ -56,7 +57,9 @@
5657
*/
5758
public class TrackerList {
5859
private static final String TAG = TrackerList.class.getSimpleName();
59-
private static final List<String> ignoreDomains = Collections.singletonList("cloudfront.net, fastly.net");
60+
private static final Set<String> ignoreDomains = new HashSet<>(Arrays.asList(
61+
"cloudfront.net",
62+
"fastly.net"));
6063
private static final Map<String, Tracker> hostnameToTracker = new ConcurrentHashMap<>();
6164
public static String TRACKER_HOSTLIST = "TRACKER_HOSTLIST";
6265
private static final Tracker hostlistTracker = new Tracker(TRACKER_HOSTLIST, UNCATEGORISED);
@@ -91,6 +94,10 @@ public static TrackerList getInstance(Context c) {
9194
return instance;
9295
}
9396

97+
static boolean isIgnoredDomain(String domain) {
98+
return ignoreDomains.contains(domain);
99+
}
100+
94101
/**
95102
* Identifies tracker hosts
96103
*
@@ -385,7 +392,7 @@ private void loadXrayTrackers(Context c) {
385392
for (int j = 0; j < domains.length(); j++) {
386393
String dom = domains.getString(j);
387394

388-
if (ignoreDomains.contains(dom))
395+
if (isIgnoredDomain(dom))
389396
continue;
390397

391398
addTrackerDomain(tracker, dom);
@@ -421,7 +428,7 @@ private void loadDuckDuckGoTrackers(Context c) {
421428
JSONObject trackerInfo = trackers.getJSONObject(domain);
422429

423430
// Skip CDN domains that would cause false positives
424-
if (ignoreDomains.contains(domain))
431+
if (isIgnoredDomain(domain))
425432
continue;
426433

427434
// Check if tracker already exists (e.g., from Disconnect list)
@@ -522,7 +529,7 @@ private void loadDisconnectTrackers(Context c) {
522529
for (int j = 0; j < urls.length(); j++) {
523530
String dom = urls.getString(j);
524531

525-
if (ignoreDomains.contains(dom))
532+
if (isIgnoredDomain(dom))
526533
continue;
527534

528535
addTrackerDomain(tracker, dom);

app/src/test/java/net/kollnig/missioncontrol/data/TrackerBlocklistTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,32 @@ public void minimalModeOnlyAllowsContentCategory() {
9393
assertTrue(TrackerBlocklist.blockedTrackerMinimal(
9494
new Tracker("Branch", "Advertising")));
9595
}
96+
97+
@Test
98+
public void resolveStoredUidParsesNumericIdsWithoutResolver() {
99+
assertEquals(UID, TrackerBlocklist.resolveStoredUid(Integer.toString(UID), null));
100+
}
101+
102+
@Test
103+
public void resolveStoredUidMigratesLegacyPackageNames() {
104+
assertEquals(UID, TrackerBlocklist.resolveStoredUid("com.example.app",
105+
new TrackerBlocklist.PackageUidResolver() {
106+
@Override
107+
public Integer resolve(String packageName) {
108+
assertEquals("com.example.app", packageName);
109+
return UID;
110+
}
111+
}));
112+
}
113+
114+
@Test
115+
public void resolveStoredUidDropsUnknownLegacyPackageNames() {
116+
assertEquals(-1, TrackerBlocklist.resolveStoredUid("com.example.missing",
117+
new TrackerBlocklist.PackageUidResolver() {
118+
@Override
119+
public Integer resolve(String packageName) {
120+
return null;
121+
}
122+
}));
123+
}
96124
}

app/src/test/java/net/kollnig/missioncontrol/data/TrackerListModeTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ public void minimalModeDoesNotSeeRepresentativeXrayOrDisconnectDomains() throws
6565
assertFalse(duckDuckGo.contains("\"branch.io\""));
6666
}
6767

68+
@Test
69+
public void ignoredCdnParentDomainsAreMatchedSeparately() {
70+
assertTrue(TrackerList.isIgnoredDomain("cloudfront.net"));
71+
assertTrue(TrackerList.isIgnoredDomain("fastly.net"));
72+
assertFalse(TrackerList.isIgnoredDomain("cloudfront.net, fastly.net"));
73+
}
74+
6875
private static String readAsset(String assetName) throws IOException {
6976
return new String(Files.readAllBytes(assetPath(assetName)), StandardCharsets.UTF_8);
7077
}

0 commit comments

Comments
 (0)