battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 1 | // 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 | |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 9 | #include "base/strings/string_util.h" |
| 10 | |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 11 | namespace feedback { |
| 12 | |
Jeffrey Kardatzke | 98761d9 | 2019-07-17 17:14:33 | [diff] [blame] | 13 | const char kFakeFirstPartyID[] = "nkoccljplnhpfnfiajclkommnmllphnl"; |
| 14 | const char* const kFakeFirstPartyExtensionIDs[] = {kFakeFirstPartyID, nullptr}; |
| 15 | |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 16 | class AnonymizerToolTest : public testing::Test { |
| 17 | protected: |
| 18 | std::string AnonymizeMACAddresses(const std::string& input) { |
| 19 | return anonymizer_.AnonymizeMACAddresses(input); |
| 20 | } |
| 21 | |
Jeffrey Kardatzke | c359d0b | 2019-08-05 20:16:21 | [diff] [blame] | 22 | std::string AnonymizeHashes(const std::string& input) { |
| 23 | return anonymizer_.AnonymizeHashes(input); |
| 24 | } |
| 25 | |
Jeffrey Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 26 | std::string AnonymizeAndroidAppStoragePaths(const std::string& input) { |
| 27 | return anonymizer_.AnonymizeAndroidAppStoragePaths(input); |
| 28 | } |
| 29 | |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 30 | std::string AnonymizeCustomPatterns(const std::string& input) { |
| 31 | return anonymizer_.AnonymizeCustomPatterns(input); |
| 32 | } |
| 33 | |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 34 | std::string AnonymizeCustomPatternWithContext( |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 35 | const std::string& input, |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 36 | const CustomPatternWithAlias& pattern) { |
| 37 | return anonymizer_.AnonymizeCustomPatternWithContext(input, pattern); |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 38 | } |
| 39 | |
| 40 | std::string AnonymizeCustomPatternWithoutContext( |
| 41 | const std::string& input, |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 42 | const CustomPatternWithAlias& pattern) { |
| 43 | return anonymizer_.AnonymizeCustomPatternWithoutContext(input, pattern); |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 44 | } |
| 45 | |
Jeffrey Kardatzke | 98761d9 | 2019-07-17 17:14:33 | [diff] [blame] | 46 | AnonymizerTool anonymizer_{kFakeFirstPartyExtensionIDs}; |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 47 | }; |
| 48 | |
| 49 | TEST_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 Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 54 | EXPECT_EQ("[MAC OUI=02:46:8a IFACE=1]", |
| 55 | anonymizer_.Anonymize("02:46:8a:ce:13:57")); |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 56 | |
Jeffrey Kardatzke | c359d0b | 2019-08-05 20:16:21 | [diff] [blame] | 57 | // Make sure hash anonymization is invoked. |
| 58 | EXPECT_EQ("<HASH:1122 1>", |
| 59 | anonymizer_.Anonymize("11223344556677889900AABBCCDDEEFF")); |
| 60 | |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 61 | // Make sure custom pattern anonymization is invoked. |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 62 | EXPECT_EQ("Cell ID: '<CellID: 1>'", |
| 63 | AnonymizeCustomPatterns("Cell ID: 'A1B2'")); |
afakhry | 5a59f95 | 2017-05-24 21:04:26 | [diff] [blame] | 64 | |
| 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")); |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 80 | } |
| 81 | |
| 82 | TEST_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 Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 86 | EXPECT_EQ("[MAC OUI=aa:bb:cc IFACE=1]", |
| 87 | AnonymizeMACAddresses("aa:bb:cc:dd:ee:ff")); |
Jeffrey Kardatzke | c359d0b | 2019-08-05 20:16:21 | [diff] [blame] | 88 | 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 Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 92 | 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")); |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 94 | EXPECT_EQ( |
Jeffrey Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 95 | "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" |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 98 | "no match across lines aa:bb:cc:\n" |
| 99 | "dd:ee:ff two on the same line:\n" |
Jeffrey Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 100 | "x [MAC OUI=bb:cc:dd IFACE=2] [MAC OUI=cc:dd:ee IFACE=3] x\n", |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 101 | 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 Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 107 | EXPECT_EQ("Remember [MAC OUI=bb:cc:dd IFACE=2]?", |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 108 | AnonymizeMACAddresses("Remember bB:Cc:DD:ee:ff:00?")); |
| 109 | } |
| 110 | |
Jeffrey Kardatzke | c359d0b | 2019-08-05 20:16:21 | [diff] [blame] | 111 | TEST_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 | |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 156 | TEST_F(AnonymizerToolTest, AnonymizeCustomPatterns) { |
| 157 | EXPECT_EQ("", AnonymizeCustomPatterns("")); |
| 158 | |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 159 | 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", |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 164 | AnonymizeCustomPatterns("foo Cell ID: 'A1B2' bar")); |
| 165 | |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 166 | EXPECT_EQ("foo Location area code: '<LocAC: 1>' bar", |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 167 | AnonymizeCustomPatterns("foo Location area code: 'A1B2' bar")); |
| 168 | |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 169 | EXPECT_EQ("foo\na SSID='<SSID: 1>' b\n'", |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 170 | AnonymizeCustomPatterns("foo\na SSID='Joe's' b\n'")); |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 171 | EXPECT_EQ("ssid '<SSID: 2>'", AnonymizeCustomPatterns("ssid 'My AP'")); |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 172 | EXPECT_EQ("bssid 'aa:bb'", AnonymizeCustomPatterns("bssid 'aa:bb'")); |
| 173 | |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 174 | EXPECT_EQ("Scan SSID - hexdump(len=6): <SSIDHex: 1>\nfoo", |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 175 | AnonymizeCustomPatterns( |
| 176 | "Scan SSID - hexdump(len=6): 47 6f 6f 67 6c 65\nfoo")); |
| 177 | |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 178 | 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")); |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 181 | |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 182 | EXPECT_EQ("SerialNumber: <Serial: 1>", |
afakhry | 85eea80 | 2017-05-01 17:04:10 | [diff] [blame] | 183 | AnonymizeCustomPatterns("SerialNumber: 1217D7EF")); |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 184 | EXPECT_EQ("serial number: <Serial: 2>", |
afakhry | 85eea80 | 2017-05-01 17:04:10 | [diff] [blame] | 185 | AnonymizeCustomPatterns("serial number: 50C971FEE7F3x010900")); |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 186 | EXPECT_EQ("SerialNumber: <Serial: 3>", |
afakhry | 85eea80 | 2017-05-01 17:04:10 | [diff] [blame] | 187 | AnonymizeCustomPatterns("SerialNumber: EVT23-17BA01-004")); |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 188 | 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 Kardatzke | 31f358a | 2019-08-28 23:53:08 | [diff] [blame] | 196 | // 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")); |
afakhry | 85eea80 | 2017-05-01 17:04:10 | [diff] [blame] | 202 | |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 203 | EXPECT_EQ("\"gaia_id\":\"<GAIA: 1>\"", |
Jeffrey Kardatzke | 4a9a1bd3 | 2019-06-17 21:30:22 | [diff] [blame] | 204 | AnonymizeCustomPatterns("\"gaia_id\":\"1234567890\"")); |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 205 | EXPECT_EQ("gaia_id='<GAIA: 2>'", |
| 206 | AnonymizeCustomPatterns("gaia_id='987654321'")); |
| 207 | EXPECT_EQ("{id: <GAIA: 1>, email:", |
| 208 | AnonymizeCustomPatterns("{id: 1234567890, email:")); |
Jeffrey Kardatzke | 4a9a1bd3 | 2019-06-17 21:30:22 | [diff] [blame] | 209 | |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 210 | 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 Evans | 5a5c24e | 2019-01-28 12:55:44 | [diff] [blame] | 222 | EXPECT_EQ("[<IPv6: 4>]", AnonymizeCustomPatterns("[aa::bb]")); |
Garrick Evans | 5fbf45d | 2019-01-18 12:37:26 | [diff] [blame] | 223 | EXPECT_EQ("<IPv4: 1>", AnonymizeCustomPatterns("192.160.0.1")); |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 224 | |
| 225 | EXPECT_EQ("<URL: 1>", |
| 226 | AnonymizeCustomPatterns("http://example.com/foo?test=1")); |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 227 | EXPECT_EQ( |
| 228 | "Foo <URL: 2> Bar", |
| 229 | AnonymizeCustomPatterns("Foo http://192.168.0.1/foo?test=1#123 Bar")); |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 230 | 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]", |
pbond | 4104d69 | 2016-02-10 09:41:07 | [diff] [blame] | 244 | "rtsp://[email protected]/", |
| 245 | "https://aaaaaaaaaaaaaaaa.com", |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 246 | }; |
Avi Drissman | 8171db7d | 2018-12-25 23:08:31 | [diff] [blame] | 247 | for (size_t i = 0; i < base::size(kURLs); ++i) { |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 248 | 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:")); |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 257 | } |
| 258 | |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 259 | TEST_F(AnonymizerToolTest, AnonymizeCustomPatternWithContext) { |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 260 | 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)); |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 264 | EXPECT_EQ("foo\nbar\n", |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 265 | 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", |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 275 | AnonymizeCustomPatternWithContext( |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 276 | "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+)()"})); |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 285 | } |
| 286 | |
| 287 | TEST_F(AnonymizerToolTest, AnonymizeCustomPatternWithoutContext) { |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 288 | CustomPatternWithAlias kPattern = {"pattern", "(o+)"}; |
| 289 | EXPECT_EQ("", AnonymizeCustomPatternWithoutContext("", kPattern)); |
battre | 03910b4 | 2016-01-11 13:42:34 | [diff] [blame] | 290 | EXPECT_EQ("f<pattern: 1>\nf<pattern: 2>z\nf<pattern: 1>l\n", |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 291 | AnonymizeCustomPatternWithoutContext("fo\nfooz\nfol\n", kPattern)); |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 292 | } |
| 293 | |
Dominic Battre | f091addfc | 2017-12-07 15:45:34 | [diff] [blame] | 294 | TEST_F(AnonymizerToolTest, AnonymizeChunk) { |
Jeffrey Kardatzke | 8719d85 | 2019-07-02 19:31:31 | [diff] [blame] | 295 | // 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 Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 299 | {"aaaaaaaa [SSID=123aaaaaa]aaaaa", // SSID. |
Jeffrey Kardatzke | 8525b6e | 2019-08-08 19:06:10 | [diff] [blame] | 300 | "aaaaaaaa [SSID=<SSID: 1>]aaaaa"}, |
Jeffrey Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 301 | {"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 Kardatzke | c359d0b | 2019-08-05 20:16:21 | [diff] [blame] | 441 | "<URL: 3>"}, // Potentially PII in parameter. |
| 442 | {"/root/27540283740a0897ab7c8de0f809add2bacde78f/foo", |
| 443 | "/root/<HASH:2754 1>/foo"}, // Hash string. |
Jeffrey Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 444 | #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 Kardatzke | 98761d9 | 2019-07-17 17:14:33 | [diff] [blame] | 452 | }; |
Jeffrey Kardatzke | 8719d85 | 2019-07-02 19:31:31 | [diff] [blame] | 453 | 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 Battre | f091addfc | 2017-12-07 15:45:34 | [diff] [blame] | 460 | } |
| 461 | |
Jeffrey Kardatzke | 8d2ee9a | 2019-08-01 20:01:27 | [diff] [blame] | 462 | #if defined(OS_CHROMEOS) // We only anonymize Android paths on Chrome OS. |
| 463 | TEST_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 | |
battre | 4cdaa7c | 2016-01-07 11:30:27 | [diff] [blame] | 511 | } // namespace feedback |