OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 <string> | |
6 | |
7 #include "base/pickle.h" | |
8 #include "base/values.h" | |
9 #include "extensions/common/permissions/permissions_info.h" | |
10 #include "extensions/common/permissions/socket_permission.h" | |
11 #include "extensions/common/permissions/socket_permission_data.h" | |
12 #include "ipc/ipc_message.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 namespace extensions { | |
16 | |
17 namespace { | |
18 | |
19 using content::SocketPermissionRequest; | |
20 | |
21 void ParseTest(const std::string& permission, | |
22 const std::string& expected_result) { | |
23 SocketPermissionData data; | |
24 ASSERT_TRUE(data.ParseForTest(permission)) << "Parse permission \"" | |
25 << permission << "\" failed."; | |
26 EXPECT_EQ(expected_result, data.GetAsStringForTest()); | |
27 } | |
28 | |
29 TEST(SocketPermissionTest, General) { | |
30 SocketPermissionData data1, data2; | |
31 | |
32 CHECK(data1.ParseForTest("tcp-connect")); | |
33 CHECK(data2.ParseForTest("tcp-connect")); | |
34 | |
35 EXPECT_TRUE(data1 == data2); | |
36 EXPECT_FALSE(data1 < data2); | |
37 | |
38 CHECK(data1.ParseForTest("tcp-connect")); | |
39 CHECK(data2.ParseForTest("tcp-connect:www.example.com")); | |
40 | |
41 EXPECT_FALSE(data1 == data2); | |
42 EXPECT_TRUE(data1 < data2); | |
43 } | |
44 | |
45 TEST(SocketPermissionTest, Parse) { | |
46 SocketPermissionData data; | |
47 | |
48 EXPECT_FALSE(data.ParseForTest(std::string())); | |
49 EXPECT_FALSE(data.ParseForTest("*")); | |
50 EXPECT_FALSE(data.ParseForTest("\00\00*")); | |
51 EXPECT_FALSE(data.ParseForTest("\01*")); | |
52 EXPECT_FALSE(data.ParseForTest("tcp-connect:www.example.com:-1")); | |
53 EXPECT_FALSE(data.ParseForTest("tcp-connect:www.example.com:65536")); | |
54 EXPECT_FALSE(data.ParseForTest("tcp-connect:::")); | |
55 EXPECT_FALSE(data.ParseForTest("tcp-connect::0")); | |
56 EXPECT_FALSE(data.ParseForTest("tcp-connect: www.exmaple.com: 99 ")); | |
57 EXPECT_FALSE(data.ParseForTest("tcp-connect:*.exmaple.com :99")); | |
58 EXPECT_FALSE(data.ParseForTest("tcp-connect:*.exmaple.com: 99")); | |
59 EXPECT_FALSE(data.ParseForTest("tcp-connect:*.exmaple.com:99 ")); | |
60 EXPECT_FALSE(data.ParseForTest("tcp-connect:\t*.exmaple.com:99")); | |
61 EXPECT_FALSE(data.ParseForTest("tcp-connect:\n*.exmaple.com:99")); | |
62 EXPECT_FALSE(data.ParseForTest("resolve-host:exmaple.com:99")); | |
63 EXPECT_FALSE(data.ParseForTest("resolve-host:127.0.0.1")); | |
64 EXPECT_FALSE(data.ParseForTest("resolve-host:")); | |
65 EXPECT_FALSE(data.ParseForTest("resolve-proxy:exmaple.com:99")); | |
66 EXPECT_FALSE(data.ParseForTest("resolve-proxy:exmaple.com")); | |
67 | |
68 ParseTest("tcp-connect", "tcp-connect:*:*"); | |
69 ParseTest("tcp-listen", "tcp-listen:*:*"); | |
70 ParseTest("udp-bind", "udp-bind:*:*"); | |
71 ParseTest("udp-send-to", "udp-send-to:*:*"); | |
72 ParseTest("resolve-host", "resolve-host"); | |
73 ParseTest("resolve-proxy", "resolve-proxy"); | |
74 | |
75 ParseTest("tcp-connect:", "tcp-connect:*:*"); | |
76 ParseTest("tcp-listen:", "tcp-listen:*:*"); | |
77 ParseTest("udp-bind:", "udp-bind:*:*"); | |
78 ParseTest("udp-send-to:", "udp-send-to:*:*"); | |
79 | |
80 ParseTest("tcp-connect::", "tcp-connect:*:*"); | |
81 ParseTest("tcp-listen::", "tcp-listen:*:*"); | |
82 ParseTest("udp-bind::", "udp-bind:*:*"); | |
83 ParseTest("udp-send-to::", "udp-send-to:*:*"); | |
84 | |
85 ParseTest("tcp-connect:*", "tcp-connect:*:*"); | |
86 ParseTest("tcp-listen:*", "tcp-listen:*:*"); | |
87 ParseTest("udp-bind:*", "udp-bind:*:*"); | |
88 ParseTest("udp-send-to:*", "udp-send-to:*:*"); | |
89 | |
90 ParseTest("tcp-connect:*:", "tcp-connect:*:*"); | |
91 ParseTest("tcp-listen:*:", "tcp-listen:*:*"); | |
92 ParseTest("udp-bind:*:", "udp-bind:*:*"); | |
93 ParseTest("udp-send-to:*:", "udp-send-to:*:*"); | |
94 | |
95 ParseTest("tcp-connect::*", "tcp-connect:*:*"); | |
96 ParseTest("tcp-listen::*", "tcp-listen:*:*"); | |
97 ParseTest("udp-bind::*", "udp-bind:*:*"); | |
98 ParseTest("udp-send-to::*", "udp-send-to:*:*"); | |
99 | |
100 ParseTest("tcp-connect:www.example.com", "tcp-connect:www.example.com:*"); | |
101 ParseTest("tcp-listen:www.example.com", "tcp-listen:www.example.com:*"); | |
102 ParseTest("udp-bind:www.example.com", "udp-bind:www.example.com:*"); | |
103 ParseTest("udp-send-to:www.example.com", "udp-send-to:www.example.com:*"); | |
104 ParseTest("udp-send-to:wWW.ExAmPlE.cOm", "udp-send-to:www.example.com:*"); | |
105 | |
106 ParseTest("tcp-connect:.example.com", "tcp-connect:*.example.com:*"); | |
107 ParseTest("tcp-listen:.example.com", "tcp-listen:*.example.com:*"); | |
108 ParseTest("udp-bind:.example.com", "udp-bind:*.example.com:*"); | |
109 ParseTest("udp-send-to:.example.com", "udp-send-to:*.example.com:*"); | |
110 | |
111 ParseTest("tcp-connect:*.example.com", "tcp-connect:*.example.com:*"); | |
112 ParseTest("tcp-listen:*.example.com", "tcp-listen:*.example.com:*"); | |
113 ParseTest("udp-bind:*.example.com", "udp-bind:*.example.com:*"); | |
114 ParseTest("udp-send-to:*.example.com", "udp-send-to:*.example.com:*"); | |
115 | |
116 ParseTest("tcp-connect::99", "tcp-connect:*:99"); | |
117 ParseTest("tcp-listen::99", "tcp-listen:*:99"); | |
118 ParseTest("udp-bind::99", "udp-bind:*:99"); | |
119 ParseTest("udp-send-to::99", "udp-send-to:*:99"); | |
120 | |
121 ParseTest("tcp-connect:www.example.com", "tcp-connect:www.example.com:*"); | |
122 | |
123 ParseTest("tcp-connect:*.example.com:99", "tcp-connect:*.example.com:99"); | |
124 } | |
125 | |
126 TEST(SocketPermissionTest, Match) { | |
127 SocketPermissionData data; | |
128 scoped_ptr<SocketPermission::CheckParam> param; | |
129 | |
130 CHECK(data.ParseForTest("tcp-connect")); | |
131 param.reset(new SocketPermission::CheckParam( | |
132 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | |
133 EXPECT_TRUE(data.Check(param.get())); | |
134 param.reset(new SocketPermission::CheckParam( | |
135 SocketPermissionRequest::UDP_SEND_TO, "www.example.com", 80)); | |
136 EXPECT_FALSE(data.Check(param.get())); | |
137 | |
138 CHECK(data.ParseForTest("udp-send-to::8800")); | |
139 param.reset(new SocketPermission::CheckParam( | |
140 SocketPermissionRequest::UDP_SEND_TO, "www.example.com", 8800)); | |
141 EXPECT_TRUE(data.Check(param.get())); | |
142 param.reset(new SocketPermission::CheckParam( | |
143 SocketPermissionRequest::UDP_SEND_TO, "smtp.example.com", 8800)); | |
144 EXPECT_TRUE(data.Check(param.get())); | |
145 param.reset(new SocketPermission::CheckParam( | |
146 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | |
147 EXPECT_FALSE(data.Check(param.get())); | |
148 | |
149 CHECK(data.ParseForTest("udp-send-to:*.example.com:8800")); | |
150 param.reset(new SocketPermission::CheckParam( | |
151 SocketPermissionRequest::UDP_SEND_TO, "www.example.com", 8800)); | |
152 EXPECT_TRUE(data.Check(param.get())); | |
153 param.reset(new SocketPermission::CheckParam( | |
154 SocketPermissionRequest::UDP_SEND_TO, "smtp.example.com", 8800)); | |
155 EXPECT_TRUE(data.Check(param.get())); | |
156 param.reset(new SocketPermission::CheckParam( | |
157 SocketPermissionRequest::UDP_SEND_TO, "SMTP.example.com", 8800)); | |
158 EXPECT_TRUE(data.Check(param.get())); | |
159 param.reset(new SocketPermission::CheckParam( | |
160 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | |
161 EXPECT_FALSE(data.Check(param.get())); | |
162 param.reset(new SocketPermission::CheckParam( | |
163 SocketPermissionRequest::UDP_SEND_TO, "www.google.com", 8800)); | |
164 EXPECT_FALSE(data.Check(param.get())); | |
165 param.reset(new SocketPermission::CheckParam( | |
166 SocketPermissionRequest::UDP_SEND_TO, "wwwexample.com", 8800)); | |
167 EXPECT_FALSE(data.Check(param.get())); | |
168 | |
169 CHECK(data.ParseForTest("udp-send-to:*.ExAmPlE.cOm:8800")); | |
170 param.reset(new SocketPermission::CheckParam( | |
171 SocketPermissionRequest::UDP_SEND_TO, "www.example.com", 8800)); | |
172 EXPECT_TRUE(data.Check(param.get())); | |
173 param.reset(new SocketPermission::CheckParam( | |
174 SocketPermissionRequest::UDP_SEND_TO, "smtp.example.com", 8800)); | |
175 EXPECT_TRUE(data.Check(param.get())); | |
176 param.reset(new SocketPermission::CheckParam( | |
177 SocketPermissionRequest::UDP_SEND_TO, "SMTP.example.com", 8800)); | |
178 EXPECT_TRUE(data.Check(param.get())); | |
179 param.reset(new SocketPermission::CheckParam( | |
180 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | |
181 EXPECT_FALSE(data.Check(param.get())); | |
182 param.reset(new SocketPermission::CheckParam( | |
183 SocketPermissionRequest::UDP_SEND_TO, "www.google.com", 8800)); | |
184 EXPECT_FALSE(data.Check(param.get())); | |
185 | |
186 ASSERT_TRUE(data.ParseForTest("udp-bind::8800")); | |
187 param.reset(new SocketPermission::CheckParam( | |
188 SocketPermissionRequest::UDP_BIND, "127.0.0.1", 8800)); | |
189 EXPECT_TRUE(data.Check(param.get())); | |
190 param.reset(new SocketPermission::CheckParam( | |
191 SocketPermissionRequest::UDP_BIND, "127.0.0.1", 8888)); | |
192 EXPECT_FALSE(data.Check(param.get())); | |
193 param.reset(new SocketPermission::CheckParam( | |
194 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | |
195 EXPECT_FALSE(data.Check(param.get())); | |
196 param.reset(new SocketPermission::CheckParam( | |
197 SocketPermissionRequest::UDP_SEND_TO, "www.google.com", 8800)); | |
198 EXPECT_FALSE(data.Check(param.get())); | |
199 | |
200 // Do not wildcard part of ip address. | |
201 ASSERT_TRUE(data.ParseForTest("tcp-connect:*.168.0.1:8800")); | |
202 param.reset(new SocketPermission::CheckParam( | |
203 SocketPermissionRequest::TCP_CONNECT, "192.168.0.1", 8800)); | |
204 EXPECT_FALSE(data.Check(param.get())); | |
205 | |
206 ASSERT_FALSE(data.ParseForTest("udp-multicast-membership:*")); | |
207 ASSERT_FALSE(data.ParseForTest("udp-multicast-membership:*:*")); | |
208 ASSERT_TRUE(data.ParseForTest("udp-multicast-membership")); | |
209 param.reset(new SocketPermission::CheckParam( | |
210 SocketPermissionRequest::UDP_BIND, "127.0.0.1", 8800)); | |
211 EXPECT_FALSE(data.Check(param.get())); | |
212 param.reset(new SocketPermission::CheckParam( | |
213 SocketPermissionRequest::UDP_BIND, "127.0.0.1", 8888)); | |
214 EXPECT_FALSE(data.Check(param.get())); | |
215 param.reset(new SocketPermission::CheckParam( | |
216 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | |
217 EXPECT_FALSE(data.Check(param.get())); | |
218 param.reset(new SocketPermission::CheckParam( | |
219 SocketPermissionRequest::UDP_SEND_TO, "www.google.com", 8800)); | |
220 EXPECT_FALSE(data.Check(param.get())); | |
221 param.reset(new SocketPermission::CheckParam( | |
222 SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, "127.0.0.1", 35)); | |
223 EXPECT_TRUE(data.Check(param.get())); | |
224 | |
225 ASSERT_TRUE(data.ParseForTest("resolve-host")); | |
226 param.reset(new SocketPermission::CheckParam( | |
227 SocketPermissionRequest::RESOLVE_HOST, "www.example.com", 80)); | |
228 EXPECT_TRUE(data.Check(param.get())); | |
229 param.reset(new SocketPermission::CheckParam( | |
230 SocketPermissionRequest::RESOLVE_HOST, "www.example.com", 8080)); | |
231 EXPECT_TRUE(data.Check(param.get())); | |
232 param.reset(new SocketPermission::CheckParam( | |
233 SocketPermissionRequest::UDP_BIND, "127.0.0.1", 8800)); | |
234 EXPECT_FALSE(data.Check(param.get())); | |
235 param.reset(new SocketPermission::CheckParam( | |
236 SocketPermissionRequest::TCP_CONNECT, "127.0.0.1", 8800)); | |
237 EXPECT_FALSE(data.Check(param.get())); | |
238 | |
239 ASSERT_TRUE(data.ParseForTest("resolve-proxy")); | |
240 param.reset(new SocketPermission::CheckParam( | |
241 SocketPermissionRequest::RESOLVE_PROXY, "www.example.com", 80)); | |
242 EXPECT_TRUE(data.Check(param.get())); | |
243 param.reset(new SocketPermission::CheckParam( | |
244 SocketPermissionRequest::RESOLVE_PROXY, "www.example.com", 8080)); | |
245 EXPECT_TRUE(data.Check(param.get())); | |
246 param.reset(new SocketPermission::CheckParam( | |
247 SocketPermissionRequest::UDP_BIND, "127.0.0.1", 8800)); | |
248 EXPECT_FALSE(data.Check(param.get())); | |
249 param.reset(new SocketPermission::CheckParam( | |
250 SocketPermissionRequest::TCP_CONNECT, "127.0.0.1", 8800)); | |
251 EXPECT_FALSE(data.Check(param.get())); | |
252 | |
253 ASSERT_TRUE(data.ParseForTest("network-state")); | |
254 param.reset(new SocketPermission::CheckParam( | |
255 SocketPermissionRequest::NETWORK_STATE, std::string(), 0)); | |
256 EXPECT_TRUE(data.Check(param.get())); | |
257 param.reset(new SocketPermission::CheckParam( | |
258 SocketPermissionRequest::UDP_BIND, "127.0.0.1", 8800)); | |
259 EXPECT_FALSE(data.Check(param.get())); | |
260 param.reset(new SocketPermission::CheckParam( | |
261 SocketPermissionRequest::TCP_CONNECT, "127.0.0.1", 8800)); | |
262 EXPECT_FALSE(data.Check(param.get())); | |
263 } | |
264 | |
265 TEST(SocketPermissionTest, IPC) { | |
266 const APIPermissionInfo* permission_info = | |
267 PermissionsInfo::GetInstance()->GetByID(APIPermission::kSocket); | |
268 | |
269 { | |
270 IPC::Message m; | |
271 | |
272 scoped_ptr<APIPermission> permission1( | |
273 permission_info->CreateAPIPermission()); | |
274 scoped_ptr<APIPermission> permission2( | |
275 permission_info->CreateAPIPermission()); | |
276 | |
277 permission1->Write(&m); | |
278 PickleIterator iter(m); | |
279 permission2->Read(&m, &iter); | |
280 | |
281 EXPECT_TRUE(permission1->Equal(permission2.get())); | |
282 } | |
283 | |
284 { | |
285 IPC::Message m; | |
286 | |
287 scoped_ptr<APIPermission> permission1( | |
288 permission_info->CreateAPIPermission()); | |
289 scoped_ptr<APIPermission> permission2( | |
290 permission_info->CreateAPIPermission()); | |
291 | |
292 scoped_ptr<base::ListValue> value(new base::ListValue()); | |
293 value->AppendString("tcp-connect:*.example.com:80"); | |
294 value->AppendString("udp-bind::8080"); | |
295 value->AppendString("udp-send-to::8888"); | |
296 ASSERT_TRUE(permission1->FromValue(value.get(), NULL, NULL)); | |
297 | |
298 EXPECT_FALSE(permission1->Equal(permission2.get())); | |
299 | |
300 permission1->Write(&m); | |
301 PickleIterator iter(m); | |
302 permission2->Read(&m, &iter); | |
303 EXPECT_TRUE(permission1->Equal(permission2.get())); | |
304 } | |
305 } | |
306 | |
307 TEST(SocketPermissionTest, Value) { | |
308 const APIPermissionInfo* permission_info = | |
309 PermissionsInfo::GetInstance()->GetByID(APIPermission::kSocket); | |
310 | |
311 scoped_ptr<APIPermission> permission1( | |
312 permission_info->CreateAPIPermission()); | |
313 scoped_ptr<APIPermission> permission2( | |
314 permission_info->CreateAPIPermission()); | |
315 | |
316 scoped_ptr<base::ListValue> value(new base::ListValue()); | |
317 value->AppendString("tcp-connect:*.example.com:80"); | |
318 value->AppendString("udp-bind::8080"); | |
319 value->AppendString("udp-send-to::8888"); | |
320 ASSERT_TRUE(permission1->FromValue(value.get(), NULL, NULL)); | |
321 | |
322 EXPECT_FALSE(permission1->Equal(permission2.get())); | |
323 | |
324 scoped_ptr<base::Value> vtmp(permission1->ToValue()); | |
325 ASSERT_TRUE(vtmp); | |
326 ASSERT_TRUE(permission2->FromValue(vtmp.get(), NULL, NULL)); | |
327 EXPECT_TRUE(permission1->Equal(permission2.get())); | |
328 } | |
329 | |
330 } // namespace | |
331 | |
332 } // namespace extensions | |
333 | |
OLD | NEW |