blob: 853338ddfe399d472f699b41d8c324bb081abfc5 [file] [log] [blame]
battre4cdaa7c2016-01-07 11:30:271// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/feedback/anonymizer_tool.h"
6
7#include <gtest/gtest.h>
8
battre03910b42016-01-11 13:42:349#include "base/strings/string_util.h"
10
battre4cdaa7c2016-01-07 11:30:2711namespace feedback {
12
Jeffrey Kardatzke98761d92019-07-17 17:14:3313const char kFakeFirstPartyID[] = "nkoccljplnhpfnfiajclkommnmllphnl";
14const char* const kFakeFirstPartyExtensionIDs[] = {kFakeFirstPartyID, nullptr};
15
battre4cdaa7c2016-01-07 11:30:2716class AnonymizerToolTest : public testing::Test {
17 protected:
18 std::string AnonymizeMACAddresses(const std::string& input) {
19 return anonymizer_.AnonymizeMACAddresses(input);
20 }
21
Jeffrey Kardatzkec359d0b2019-08-05 20:16:2122 std::string AnonymizeHashes(const std::string& input) {
23 return anonymizer_.AnonymizeHashes(input);
24 }
25
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2726 std::string AnonymizeAndroidAppStoragePaths(const std::string& input) {
27 return anonymizer_.AnonymizeAndroidAppStoragePaths(input);
28 }
29
battre4cdaa7c2016-01-07 11:30:2730 std::string AnonymizeCustomPatterns(const std::string& input) {
31 return anonymizer_.AnonymizeCustomPatterns(input);
32 }
33
battre03910b42016-01-11 13:42:3434 std::string AnonymizeCustomPatternWithContext(
battre4cdaa7c2016-01-07 11:30:2735 const std::string& input,
Jeffrey Kardatzke8525b6e2019-08-08 19:06:1036 const CustomPatternWithAlias& pattern) {
37 return anonymizer_.AnonymizeCustomPatternWithContext(input, pattern);
battre03910b42016-01-11 13:42:3438 }
39
40 std::string AnonymizeCustomPatternWithoutContext(
41 const std::string& input,
Jeffrey Kardatzke8525b6e2019-08-08 19:06:1042 const CustomPatternWithAlias& pattern) {
43 return anonymizer_.AnonymizeCustomPatternWithoutContext(input, pattern);
battre4cdaa7c2016-01-07 11:30:2744 }
45
Jeffrey Kardatzke98761d92019-07-17 17:14:3346 AnonymizerTool anonymizer_{kFakeFirstPartyExtensionIDs};
battre4cdaa7c2016-01-07 11:30:2747};
48
49TEST_F(AnonymizerToolTest, Anonymize) {
50 EXPECT_EQ("", anonymizer_.Anonymize(""));
51 EXPECT_EQ("foo\nbar\n", anonymizer_.Anonymize("foo\nbar\n"));
52
53 // Make sure MAC address anonymization is invoked.
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2754 EXPECT_EQ("[MAC OUI=02:46:8a IFACE=1]",
55 anonymizer_.Anonymize("02:46:8a:ce:13:57"));
battre4cdaa7c2016-01-07 11:30:2756
Jeffrey Kardatzkec359d0b2019-08-05 20:16:2157 // Make sure hash anonymization is invoked.
58 EXPECT_EQ("<HASH:1122 1>",
59 anonymizer_.Anonymize("11223344556677889900AABBCCDDEEFF"));
60
battre4cdaa7c2016-01-07 11:30:2761 // Make sure custom pattern anonymization is invoked.
Jeffrey Kardatzke8525b6e2019-08-08 19:06:1062 EXPECT_EQ("Cell ID: '<CellID: 1>'",
63 AnonymizeCustomPatterns("Cell ID: 'A1B2'"));
afakhry5a59f952017-05-24 21:04:2664
65 // Make sure UUIDs are anonymized.
66 EXPECT_EQ(
67 "REQUEST localhost - - \"POST /printers/<UUID: 1> HTTP/1.1\" 200 291 "
68 "Create-Job successful-ok",
69 anonymizer_.Anonymize(
70 "REQUEST localhost - - \"POST /printers/"
71 "cb738a9f-6433-4d95-a81e-94e4ae0ed30b HTTP/1.1\" 200 291 Create-Job "
72 "successful-ok"));
73 EXPECT_EQ(
74 "REQUEST localhost - - \"POST /printers/<UUID: 2> HTTP/1.1\" 200 286 "
75 "Create-Job successful-ok",
76 anonymizer_.Anonymize(
77 "REQUEST localhost - - \"POST /printers/"
78 "d17188da-9cd3-44f4-b148-3e1d748a3b0f HTTP/1.1\" 200 286 Create-Job "
79 "successful-ok"));
battre4cdaa7c2016-01-07 11:30:2780}
81
82TEST_F(AnonymizerToolTest, AnonymizeMACAddresses) {
83 EXPECT_EQ("", AnonymizeMACAddresses(""));
84 EXPECT_EQ("foo\nbar\n", AnonymizeMACAddresses("foo\nbar\n"));
85 EXPECT_EQ("11:22:33:44:55", AnonymizeMACAddresses("11:22:33:44:55"));
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2786 EXPECT_EQ("[MAC OUI=aa:bb:cc IFACE=1]",
87 AnonymizeMACAddresses("aa:bb:cc:dd:ee:ff"));
Jeffrey Kardatzkec359d0b2019-08-05 20:16:2188 EXPECT_EQ("[MAC OUI=aa:bb:cc IFACE=1]",
89 AnonymizeMACAddresses("aa_bb_cc_dd_ee_ff"));
90 EXPECT_EQ("[MAC OUI=aa:bb:cc IFACE=1]",
91 AnonymizeMACAddresses("aa-bb-cc-dd-ee-ff"));
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2792 EXPECT_EQ("00:00:00:00:00:00", AnonymizeMACAddresses("00:00:00:00:00:00"));
93 EXPECT_EQ("ff:ff:ff:ff:ff:ff", AnonymizeMACAddresses("ff:ff:ff:ff:ff:ff"));
battre4cdaa7c2016-01-07 11:30:2794 EXPECT_EQ(
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:2795 "BSSID: [MAC OUI=aa:bb:cc IFACE=1] in the middle\n"
96 "[MAC OUI=bb:cc:dd IFACE=2] start of line\n"
97 "end of line [MAC OUI=aa:bb:cc IFACE=1]\n"
battre4cdaa7c2016-01-07 11:30:2798 "no match across lines aa:bb:cc:\n"
99 "dd:ee:ff two on the same line:\n"
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:27100 "x [MAC OUI=bb:cc:dd IFACE=2] [MAC OUI=cc:dd:ee IFACE=3] x\n",
battre4cdaa7c2016-01-07 11:30:27101 AnonymizeMACAddresses("BSSID: aa:bb:cc:dd:ee:ff in the middle\n"
102 "bb:cc:dd:ee:ff:00 start of line\n"
103 "end of line aa:bb:cc:dd:ee:ff\n"
104 "no match across lines aa:bb:cc:\n"
105 "dd:ee:ff two on the same line:\n"
106 "x bb:cc:dd:ee:ff:00 cc:dd:ee:ff:00:11 x\n"));
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:27107 EXPECT_EQ("Remember [MAC OUI=bb:cc:dd IFACE=2]?",
battre4cdaa7c2016-01-07 11:30:27108 AnonymizeMACAddresses("Remember bB:Cc:DD:ee:ff:00?"));
109}
110
Jeffrey Kardatzkec359d0b2019-08-05 20:16:21111TEST_F(AnonymizerToolTest, AnonymizeHashes) {
112 EXPECT_EQ("", AnonymizeHashes(""));
113 EXPECT_EQ("foo\nbar\n", AnonymizeHashes("foo\nbar\n"));
114 // Too short.
115 EXPECT_EQ("11223344556677889900aabbccddee",
116 AnonymizeHashes("11223344556677889900aabbccddee"));
117 // Not the right length.
118 EXPECT_EQ("11223344556677889900aabbccddeeff1122",
119 AnonymizeHashes("11223344556677889900aabbccddeeff1122"));
120 // Too long.
121 EXPECT_EQ(
122 "11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff11",
123 AnonymizeHashes("11223344556677889900aabbccddeeff11223344556677889900aabb"
124 "ccddeeff11"));
125 // Test all 3 valid lengths.
126 EXPECT_EQ("<HASH:aabb 1>",
127 AnonymizeHashes("aabbccddeeff00112233445566778899"));
128 EXPECT_EQ("<HASH:aabb 2>",
129 AnonymizeHashes("aabbccddeeff00112233445566778899aabbccdd"));
130 EXPECT_EQ(
131 "<HASH:9988 3>",
132 AnonymizeHashes(
133 "99887766554433221100ffeeddccbbaaaabbccddeeff00112233445566778899"));
134 // Skip 32 byte hashes that have a at least 3 whitespace chars before it.
135 EXPECT_EQ(" <HASH:aabb 1>",
136 AnonymizeHashes(" aabbccddeeff00112233445566778899"));
137 EXPECT_EQ(" aabbccddeeff00112233445566778899",
138 AnonymizeHashes(" aabbccddeeff00112233445566778899"));
139 // Multiline test.
140 EXPECT_EQ(
141 "Hash value=<HASH:aabb 1>, should be replaced as\n"
142 "well as /<HASH:aabb 1>/ and mixed case of\n"
143 "<HASH:aabb 1> but we don't go across lines\n"
144 "aabbccddeeff\n00112233445566778899 but allow multiple on a line "
145 "<HASH:aabb 4>-"
146 "<HASH:0011 5>\n",
147 AnonymizeHashes(
148 "Hash value=aabbccddeeff00112233445566778899, should be replaced as\n"
149 "well as /aabbccddeeff00112233445566778899/ and mixed case of\n"
150 "AaBbCCddEeFf00112233445566778899 but we don't go across lines\n"
151 "aabbccddeeff\n00112233445566778899 but allow multiple on a line "
152 "aabbccddeeffaabbccddeeffaabbccddeeffaabb-"
153 "00112233445566778899aabbccddeeff\n"));
154}
155
battre4cdaa7c2016-01-07 11:30:27156TEST_F(AnonymizerToolTest, AnonymizeCustomPatterns) {
157 EXPECT_EQ("", AnonymizeCustomPatterns(""));
158
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10159 EXPECT_EQ("Cell ID: '<CellID: 1>'",
160 AnonymizeCustomPatterns("Cell ID: 'A1B2'"));
161 EXPECT_EQ("Cell ID: '<CellID: 2>'",
162 AnonymizeCustomPatterns("Cell ID: 'C1D2'"));
163 EXPECT_EQ("foo Cell ID: '<CellID: 1>' bar",
battre4cdaa7c2016-01-07 11:30:27164 AnonymizeCustomPatterns("foo Cell ID: 'A1B2' bar"));
165
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10166 EXPECT_EQ("foo Location area code: '<LocAC: 1>' bar",
battre4cdaa7c2016-01-07 11:30:27167 AnonymizeCustomPatterns("foo Location area code: 'A1B2' bar"));
168
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10169 EXPECT_EQ("foo\na SSID='<SSID: 1>' b\n'",
battre4cdaa7c2016-01-07 11:30:27170 AnonymizeCustomPatterns("foo\na SSID='Joe's' b\n'"));
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10171 EXPECT_EQ("ssid '<SSID: 2>'", AnonymizeCustomPatterns("ssid 'My AP'"));
battre4cdaa7c2016-01-07 11:30:27172 EXPECT_EQ("bssid 'aa:bb'", AnonymizeCustomPatterns("bssid 'aa:bb'"));
173
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10174 EXPECT_EQ("Scan SSID - hexdump(len=6): <SSIDHex: 1>\nfoo",
battre4cdaa7c2016-01-07 11:30:27175 AnonymizeCustomPatterns(
176 "Scan SSID - hexdump(len=6): 47 6f 6f 67 6c 65\nfoo"));
177
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10178 EXPECT_EQ("a\nb [SSID=<SSID: 3>] [SSID=<SSID: 1>] [SSID=foo\nbar] b",
179 AnonymizeCustomPatterns(
180 "a\nb [SSID=foo] [SSID=Joe's] [SSID=foo\nbar] b"));
battre03910b42016-01-11 13:42:34181
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10182 EXPECT_EQ("SerialNumber: <Serial: 1>",
afakhry85eea802017-05-01 17:04:10183 AnonymizeCustomPatterns("SerialNumber: 1217D7EF"));
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10184 EXPECT_EQ("serial number: <Serial: 2>",
afakhry85eea802017-05-01 17:04:10185 AnonymizeCustomPatterns("serial number: 50C971FEE7F3x010900"));
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10186 EXPECT_EQ("SerialNumber: <Serial: 3>",
afakhry85eea802017-05-01 17:04:10187 AnonymizeCustomPatterns("SerialNumber: EVT23-17BA01-004"));
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10188 EXPECT_EQ("serial=\"<Serial: 4>\"",
189 AnonymizeCustomPatterns("serial=\"1234AA5678\""));
190 EXPECT_EQ("\"serial_number\"=\"<Serial: 1>\"",
191 AnonymizeCustomPatterns("\"serial_number\"=\"1217D7EF\""));
192 EXPECT_EQ("SerialNumber: <Serial: 5>",
193 AnonymizeCustomPatterns("SerialNumber: 5:00:14.0"));
194 EXPECT_EQ("Serial: <Serial: 6>",
195 AnonymizeCustomPatterns("Serial: ABCEFG\x01kjmn-as:342/234\\432"));
Jeffrey Kardatzke31f358a2019-08-28 23:53:08196 // Don't overly anonymize serial numbers, we only do this for a specific
197 // formatting case for edid-decode.
198 EXPECT_EQ("Foo serial number 123",
199 AnonymizeCustomPatterns("Foo serial number 123"));
200 EXPECT_EQ("Foo Serial Number <Serial: 7>",
201 AnonymizeCustomPatterns("Foo Serial Number 123"));
afakhry85eea802017-05-01 17:04:10202
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10203 EXPECT_EQ("\"gaia_id\":\"<GAIA: 1>\"",
Jeffrey Kardatzke4a9a1bd32019-06-17 21:30:22204 AnonymizeCustomPatterns("\"gaia_id\":\"1234567890\""));
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10205 EXPECT_EQ("gaia_id='<GAIA: 2>'",
206 AnonymizeCustomPatterns("gaia_id='987654321'"));
207 EXPECT_EQ("{id: <GAIA: 1>, email:",
208 AnonymizeCustomPatterns("{id: 1234567890, email:"));
Jeffrey Kardatzke4a9a1bd32019-06-17 21:30:22209
battre03910b42016-01-11 13:42:34210 EXPECT_EQ("<email: 1>",
211 AnonymizeCustomPatterns("[email protected]"));
212 EXPECT_EQ("Email: <email: 1>.",
213 AnonymizeCustomPatterns("Email: [email protected]."));
214 EXPECT_EQ("Email:\n<email: 2>\n",
215 AnonymizeCustomPatterns("Email:\[email protected]\n"));
216
217 EXPECT_EQ("[<IPv6: 1>]", AnonymizeCustomPatterns(
218 "[2001:0db8:0000:0000:0000:ff00:0042:8329]"));
219 EXPECT_EQ("[<IPv6: 2>]",
220 AnonymizeCustomPatterns("[2001:db8:0:0:0:ff00:42:8329]"));
221 EXPECT_EQ("[<IPv6: 3>]", AnonymizeCustomPatterns("[2001:db8::ff00:42:8329]"));
Garrick Evans5a5c24e2019-01-28 12:55:44222 EXPECT_EQ("[<IPv6: 4>]", AnonymizeCustomPatterns("[aa::bb]"));
Garrick Evans5fbf45d2019-01-18 12:37:26223 EXPECT_EQ("<IPv4: 1>", AnonymizeCustomPatterns("192.160.0.1"));
battre03910b42016-01-11 13:42:34224
225 EXPECT_EQ("<URL: 1>",
226 AnonymizeCustomPatterns("http://example.com/foo?test=1"));
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10227 EXPECT_EQ(
228 "Foo <URL: 2> Bar",
229 AnonymizeCustomPatterns("Foo http://192.168.0.1/foo?test=1#123 Bar"));
battre03910b42016-01-11 13:42:34230 const char* kURLs[] = {
231 "http://example.com/foo?test=1",
232 "http://userid:[email protected]:8080",
233 "http://userid:[email protected]:8080/",
234 "http://@example.com",
235 "http://192.168.0.1",
236 "http://192.168.0.1/",
237 "http://اختبار.com",
238 "http://test.com/foo(bar)baz.html",
239 "http://test.com/foo%20bar",
240 "ftp://test:[email protected]",
241 "chrome://extensions/",
242 "chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/options.html",
243 "http://example.com/[email protected]",
pbond4104d692016-02-10 09:41:07244 "rtsp://[email protected]/",
245 "https://aaaaaaaaaaaaaaaa.com",
battre03910b42016-01-11 13:42:34246 };
Avi Drissman8171db7d2018-12-25 23:08:31247 for (size_t i = 0; i < base::size(kURLs); ++i) {
battre03910b42016-01-11 13:42:34248 SCOPED_TRACE(kURLs[i]);
249 std::string got = AnonymizeCustomPatterns(kURLs[i]);
250 EXPECT_TRUE(
251 base::StartsWith(got, "<URL: ", base::CompareCase::INSENSITIVE_ASCII));
252 EXPECT_TRUE(base::EndsWith(got, ">", base::CompareCase::INSENSITIVE_ASCII));
253 }
254 // Test that "Android:" is not considered a schema with empty hier part.
255 EXPECT_EQ("The following applies to Android:",
256 AnonymizeCustomPatterns("The following applies to Android:"));
battre4cdaa7c2016-01-07 11:30:27257}
258
battre03910b42016-01-11 13:42:34259TEST_F(AnonymizerToolTest, AnonymizeCustomPatternWithContext) {
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10260 const CustomPatternWithAlias kPattern1 = {"ID", "(\\b(?i)id:? ')(\\d+)(')"};
261 const CustomPatternWithAlias kPattern2 = {"ID", "(\\b(?i)id=')(\\d+)(')"};
262 const CustomPatternWithAlias kPattern3 = {"IDG", "(\\b(?i)idg=')(\\d+)(')"};
263 EXPECT_EQ("", AnonymizeCustomPatternWithContext("", kPattern1));
battre4cdaa7c2016-01-07 11:30:27264 EXPECT_EQ("foo\nbar\n",
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10265 AnonymizeCustomPatternWithContext("foo\nbar\n", kPattern1));
266 EXPECT_EQ("id '<ID: 1>'",
267 AnonymizeCustomPatternWithContext("id '2345'", kPattern1));
268 EXPECT_EQ("id '<ID: 2>'",
269 AnonymizeCustomPatternWithContext("id '1234'", kPattern1));
270 EXPECT_EQ("id: '<ID: 2>'",
271 AnonymizeCustomPatternWithContext("id: '1234'", kPattern1));
272 EXPECT_EQ("ID: '<ID: 1>'",
273 AnonymizeCustomPatternWithContext("ID: '2345'", kPattern1));
274 EXPECT_EQ("x1 id '<ID: 1>' 1x id '<ID: 2>'\nid '<ID: 1>'\n",
battre03910b42016-01-11 13:42:34275 AnonymizeCustomPatternWithContext(
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10276 "x1 id '2345' 1x id '1234'\nid '2345'\n", kPattern1));
277 // Different pattern with same alias should reuse the replacements.
278 EXPECT_EQ("id='<ID: 2>'",
279 AnonymizeCustomPatternWithContext("id='1234'", kPattern2));
280 // Different alias should not reuse replacement from another pattern.
281 EXPECT_EQ("idg='<IDG: 1>'",
282 AnonymizeCustomPatternWithContext("idg='1234'", kPattern3));
283 EXPECT_EQ("x<FOO: 1>z",
284 AnonymizeCustomPatternWithContext("xyz", {"FOO", "()(y+)()"}));
battre03910b42016-01-11 13:42:34285}
286
287TEST_F(AnonymizerToolTest, AnonymizeCustomPatternWithoutContext) {
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10288 CustomPatternWithAlias kPattern = {"pattern", "(o+)"};
289 EXPECT_EQ("", AnonymizeCustomPatternWithoutContext("", kPattern));
battre03910b42016-01-11 13:42:34290 EXPECT_EQ("f<pattern: 1>\nf<pattern: 2>z\nf<pattern: 1>l\n",
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10291 AnonymizeCustomPatternWithoutContext("fo\nfooz\nfol\n", kPattern));
battre4cdaa7c2016-01-07 11:30:27292}
293
Dominic Battref091addfc2017-12-07 15:45:34294TEST_F(AnonymizerToolTest, AnonymizeChunk) {
Jeffrey Kardatzke8719d852019-07-02 19:31:31295 // For better readability, put all the pre/post redaction strings in an array
296 // of pairs, and then convert that to two strings which become the input and
297 // output of the anonymizer.
298 std::pair<std::string, std::string> data[] = {
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:27299 {"aaaaaaaa [SSID=123aaaaaa]aaaaa", // SSID.
Jeffrey Kardatzke8525b6e2019-08-08 19:06:10300 "aaaaaaaa [SSID=<SSID: 1>]aaaaa"},
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:27301 {"aaaaaaaahttp://tets.comaaaaaaa", // URL.
302 "aaaaaaaa<URL: 1>"},
303 {"[email protected]", // Email address.
304 "<email: 1>"},
305 {"example@@1234", // No PII, it is not invalid email address.
306 "example@@1234"},
307 {"255.255.155.2", // IP address.
308 "<IPv4: 1>"},
309 {"255.255.155.255", // IP address.
310 "<IPv4: 2>"},
311 {"127.0.0.1", // IPv4 loopback.
312 "<127.0.0.0/8: 3>"},
313 {"127.255.0.1", // IPv4 loopback.
314 "<127.0.0.0/8: 4>"},
315 {"0.0.0.0", // Any IPv4.
316 "<0.0.0.0/8: 5>"},
317 {"0.255.255.255", // Any IPv4.
318 "<0.0.0.0/8: 6>"},
319 {"10.10.10.100", // IPv4 private class A.
320 "<10.0.0.0/8: 7>"},
321 {"10.10.10.100", // Intentional duplicate.
322 "<10.0.0.0/8: 7>"},
323 {"10.10.10.101", // IPv4 private class A.
324 "<10.0.0.0/8: 8>"},
325 {"10.255.255.255", // IPv4 private class A.
326 "<10.0.0.0/8: 9>"},
327 {"172.16.0.0", // IPv4 private class B.
328 "<172.16.0.0/12: 10>"},
329 {"172.31.255.255", // IPv4 private class B.
330 "<172.16.0.0/12: 11>"},
331 {"172.11.5.5", // IP address.
332 "<IPv4: 12>"},
333 {"172.111.5.5", // IP address.
334 "<IPv4: 13>"},
335 {"192.168.0.0", // IPv4 private class C.
336 "<192.168.0.0/16: 14>"},
337 {"192.168.255.255", // IPv4 private class C.
338 "<192.168.0.0/16: 15>"},
339 {"192.169.2.120", // IP address.
340 "<IPv4: 16>"},
341 {"169.254.0.1", // Link local.
342 "<169.254.0.0/16: 17>"},
343 {"169.200.0.1", // IP address.
344 "<IPv4: 18>"},
345 {"fe80::", // Link local.
346 "<fe80::/10: 1>"},
347 {"fe80::ffff", // Link local.
348 "<fe80::/10: 2>"},
349 {"febf:ffff::ffff", // Link local.
350 "<fe80::/10: 3>"},
351 {"fecc::1111", // IP address.
352 "<IPv6: 4>"},
353 {"224.0.0.24", // Multicast.
354 "<224.0.0.0/4: 19>"},
355 {"240.0.0.0", // IP address.
356 "<IPv4: 20>"},
357 {"255.255.255.255", // Broadcast.
358 "255.255.255.255"},
359 {"100.115.92.92", // ChromeOS.
360 "100.115.92.92"},
361 {"100.115.91.92", // IP address.
362 "<IPv4: 23>"},
363 {"1.1.1.1", // DNS
364 "1.1.1.1"},
365 {"8.8.8.8", // DNS
366 "8.8.8.8"},
367 {"8.8.4.4", // DNS
368 "8.8.4.4"},
369 {"8.8.8.4", // IP address.
370 "<IPv4: 27>"},
371 {"255.255.259.255", // Not an IP address.
372 "255.255.259.255"},
373 {"255.300.255.255", // Not an IP address.
374 "255.300.255.255"},
375 {"aaaa123.123.45.4aaa", // IP address.
376 "aaaa<IPv4: 28>aaa"},
377 {"11:11;11::11", // IP address.
378 "11:11;<IPv6: 5>"},
379 {"11::11", // IP address.
380 "<IPv6: 5>"},
381 {"11:11:abcdef:0:0:0:0:0", // No PII.
382 "11:11:abcdef:0:0:0:0:0"},
383 {"::", // Unspecified.
384 "::"},
385 {"::1", // Local host.
386 "::1"},
387 {"Instance::Set", // Ignore match, no PII.
388 "Instance::Set"},
389 {"Instant::ff", // Ignore match, no PII.
390 "Instant::ff"},
391 {"net::ERR_CONN_TIMEOUT", // Ignore match, no PII.
392 "net::ERR_CONN_TIMEOUT"},
393 {"ff01::1", // All nodes address (interface local).
394 "ff01::1"},
395 {"ff01::2", // All routers (interface local).
396 "ff01::2"},
397 {"ff01::3", // Multicast (interface local).
398 "<ff01::/16: 13>"},
399 {"ff02::1", // All nodes address (link local).
400 "ff02::1"},
401 {"ff02::2", // All routers (link local).
402 "ff02::2"},
403 {"ff02::3", // Multicast (link local).
404 "<ff02::/16: 16>"},
405 {"ff02::fb", // mDNSv6 (link local).
406 "<ff02::/16: 17>"},
407 {"ff08::fb", // mDNSv6.
408 "<IPv6: 18>"},
409 {"ff0f::101", // All NTP servers.
410 "<IPv6: 19>"},
411 {"::ffff:cb0c:10ea", // IPv4-mapped IPV6 (IP address).
412 "<IPv6: 20>"},
413 {"::ffff:a0a:a0a", // IPv4-mapped IPV6 (private class A).
414 "<M 10.0.0.0/8: 21>"},
415 {"::ffff:a0a:a0a", // Intentional duplicate.
416 "<M 10.0.0.0/8: 21>"},
417 {"::ffff:ac1e:1e1e", // IPv4-mapped IPV6 (private class B).
418 "<M 172.16.0.0/12: 22>"},
419 {"::ffff:c0a8:640a", // IPv4-mapped IPV6 (private class C).
420 "<M 192.168.0.0/16: 23>"},
421 {"::ffff:6473:5c01", // IPv4-mapped IPV6 (Chrome).
422 "<M 100.115.92.1: 24>"},
423 {"64:ff9b::a0a:a0a", // IPv4-translated 6to4 IPV6 (private class A).
424 "<T 10.0.0.0/8: 25>"},
425 {"64:ff9b::6473:5c01", // IPv4-translated 6to4 IPV6 (Chrome).
426 "<T 100.115.92.1: 26>"},
427 {"::0101:ffff:c0a8:640a", // IP address.
428 "<IPv6: 27>"},
429 {"aa:aa:aa:aa:aa:aa", // MAC address (BSSID).
430 "[MAC OUI=aa:aa:aa IFACE=1]"},
431 {"chrome://resources/foo", // Secure chrome resource, whitelisted.
432 "chrome://resources/foo"},
433 {"chrome://settings/crisper.js", // Whitelisted settings URLs.
434 "chrome://settings/crisper.js"},
435 // Whitelisted first party extension.
436 {"chrome-extension://nkoccljplnhpfnfiajclkommnmllphnl/foobar.js",
437 "chrome-extension://nkoccljplnhpfnfiajclkommnmllphnl/foobar.js"},
438 {"chrome://resources/f?user=bar", // Potentially PII in parameter.
439 "<URL: 2>"},
440 {"chrome-extension://nkoccljplnhpfnfiajclkommnmllphnl/foobar.js?bar=x",
Jeffrey Kardatzkec359d0b2019-08-05 20:16:21441 "<URL: 3>"}, // Potentially PII in parameter.
442 {"/root/27540283740a0897ab7c8de0f809add2bacde78f/foo",
443 "/root/<HASH:2754 1>/foo"}, // Hash string.
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:27444#if defined(OS_CHROMEOS) // We only anonymize Android paths on Chrome OS.
445 // Allowed android storage path.
446 {"112K\t/home/root/deadbeef1234/android-data/data/system_de",
447 "112K\t/home/root/deadbeef1234/android-data/data/system_de"},
448 // Anonymized app-specific storage path.
449 {"8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/de",
450 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/d_"},
451#endif // defined(OS_CHROMEOS)
Jeffrey Kardatzke98761d92019-07-17 17:14:33452 };
Jeffrey Kardatzke8719d852019-07-02 19:31:31453 std::string anon_input;
454 std::string anon_output;
455 for (const auto& s : data) {
456 anon_input.append(s.first).append("\n");
457 anon_output.append(s.second).append("\n");
458 }
459 EXPECT_EQ(anon_output, anonymizer_.Anonymize(anon_input));
Dominic Battref091addfc2017-12-07 15:45:34460}
461
Jeffrey Kardatzke8d2ee9a2019-08-01 20:01:27462#if defined(OS_CHROMEOS) // We only anonymize Android paths on Chrome OS.
463TEST_F(AnonymizerToolTest, AnonymizeAndroidAppStoragePaths) {
464 EXPECT_EQ("", AnonymizeAndroidAppStoragePaths(""));
465 EXPECT_EQ("foo\nbar\n", AnonymizeAndroidAppStoragePaths("foo\nbar\n"));
466
467 constexpr char kDuOutput[] =
468 "112K\t/home/root/deadbeef1234/android-data/data/system_de\n"
469 // /data/data will be modified by the anonymizer.
470 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pack.age1/a\n"
471 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pack.age1/bc\n"
472 "24K\t/home/root/deadbeef1234/android-data/data/data/pack.age1\n"
473 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/de\n"
474 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/de/"
475 "\xe3\x81\x82\n"
476 "8.1K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/de/"
477 "\xe3\x81\x82\xe3\x81\x83\n"
478 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/ef\n"
479 "24K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2\n"
480 // /data/app won't.
481 "8.0K\t/home/root/deadbeef1234/android-data/data/app/pack.age1/a\n"
482 "8.0K\t/home/root/deadbeef1234/android-data/data/app/pack.age1/bc\n"
483 "24K\t/home/root/deadbeef1234/android-data/data/app/pack.age1\n"
484 // /data/user_de will.
485 "8.0K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1/a\n"
486 "8.0K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1/bc\n"
487 "24K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1\n"
488 "78M\t/home/root/deadbeef1234/android-data/data/data\n";
489 constexpr char kDuOutputRedacted[] =
490 "112K\t/home/root/deadbeef1234/android-data/data/system_de\n"
491 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pack.age1/a\n"
492 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pack.age1/b_\n"
493 "24K\t/home/root/deadbeef1234/android-data/data/data/pack.age1\n"
494 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/d_\n"
495 // The non-ASCII directory names will become '*_'.
496 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/d_/*_\n"
497 "8.1K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/d_/*_\n"
498 "8.0K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2/e_\n"
499 "24K\t/home/root/deadbeef1234/android-data/data/data/pa.ckage2\n"
500 "8.0K\t/home/root/deadbeef1234/android-data/data/app/pack.age1/a\n"
501 "8.0K\t/home/root/deadbeef1234/android-data/data/app/pack.age1/bc\n"
502 "24K\t/home/root/deadbeef1234/android-data/data/app/pack.age1\n"
503 "8.0K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1/a\n"
504 "8.0K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1/b_\n"
505 "24K\t/home/root/deadbeef1234/android-data/data/user_de/0/pack.age1\n"
506 "78M\t/home/root/deadbeef1234/android-data/data/data\n";
507 EXPECT_EQ(kDuOutputRedacted, AnonymizeAndroidAppStoragePaths(kDuOutput));
508}
509#endif // defined(OS_CHROMEOS)
510
battre4cdaa7c2016-01-07 11:30:27511} // namespace feedback