OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <stddef.h> |
| 6 #include <stdint.h> |
| 7 |
5 #include "sandbox/win/src/policy_engine_params.h" | 8 #include "sandbox/win/src/policy_engine_params.h" |
6 #include "sandbox/win/src/policy_engine_processor.h" | 9 #include "sandbox/win/src/policy_engine_processor.h" |
7 #include "sandbox/win/src/policy_low_level.h" | 10 #include "sandbox/win/src/policy_low_level.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
9 | 12 |
10 #define POLPARAMS_BEGIN(x) sandbox::ParameterSet x[] = { | 13 #define POLPARAMS_BEGIN(x) sandbox::ParameterSet x[] = { |
11 #define POLPARAM(p) sandbox::ParamPickerMake(p), | 14 #define POLPARAM(p) sandbox::ParamPickerMake(p), |
12 #define POLPARAMS_END } | 15 #define POLPARAMS_END } |
13 | 16 |
14 namespace sandbox { | 17 namespace sandbox { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 | 52 |
50 // The simplest test using LowLevelPolicy it should test a single opcode which | 53 // The simplest test using LowLevelPolicy it should test a single opcode which |
51 // does a exact string comparison. | 54 // does a exact string comparison. |
52 TEST(PolicyEngineTest, SimpleStrMatch) { | 55 TEST(PolicyEngineTest, SimpleStrMatch) { |
53 SetupNtdllImports(); | 56 SetupNtdllImports(); |
54 PolicyRule pr(ASK_BROKER); | 57 PolicyRule pr(ASK_BROKER); |
55 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"z:\\Directory\\domo.txt", | 58 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"z:\\Directory\\domo.txt", |
56 CASE_INSENSITIVE)); | 59 CASE_INSENSITIVE)); |
57 | 60 |
58 PolicyGlobal* policy = MakePolicyMemory(); | 61 PolicyGlobal* policy = MakePolicyMemory(); |
59 const uint32 kFakeService = 2; | 62 const uint32_t kFakeService = 2; |
60 | 63 |
61 LowLevelPolicy policyGen(policy); | 64 LowLevelPolicy policyGen(policy); |
62 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 65 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
63 EXPECT_TRUE(policyGen.Done()); | 66 EXPECT_TRUE(policyGen.Done()); |
64 | 67 |
65 const wchar_t* filename = L"Z:\\Directory\\domo.txt"; | 68 const wchar_t* filename = L"Z:\\Directory\\domo.txt"; |
66 | 69 |
67 POLPARAMS_BEGIN(eval_params) | 70 POLPARAMS_BEGIN(eval_params) |
68 POLPARAM(filename) // Argument 0 | 71 POLPARAM(filename) // Argument 0 |
69 POLPARAMS_END; | 72 POLPARAMS_END; |
(...skipping 12 matching lines...) Expand all Loading... |
82 delete [] reinterpret_cast<char*>(policy); | 85 delete [] reinterpret_cast<char*>(policy); |
83 } | 86 } |
84 | 87 |
85 TEST(PolicyEngineTest, SimpleIfNotStrMatch) { | 88 TEST(PolicyEngineTest, SimpleIfNotStrMatch) { |
86 SetupNtdllImports(); | 89 SetupNtdllImports(); |
87 PolicyRule pr(ASK_BROKER); | 90 PolicyRule pr(ASK_BROKER); |
88 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\", | 91 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\", |
89 CASE_SENSITIVE)); | 92 CASE_SENSITIVE)); |
90 | 93 |
91 PolicyGlobal* policy = MakePolicyMemory(); | 94 PolicyGlobal* policy = MakePolicyMemory(); |
92 const uint32 kFakeService = 2; | 95 const uint32_t kFakeService = 2; |
93 LowLevelPolicy policyGen(policy); | 96 LowLevelPolicy policyGen(policy); |
94 | 97 |
95 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 98 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
96 EXPECT_TRUE(policyGen.Done()); | 99 EXPECT_TRUE(policyGen.Done()); |
97 | 100 |
98 const wchar_t* filename = NULL; | 101 const wchar_t* filename = NULL; |
99 POLPARAMS_BEGIN(eval_params) | 102 POLPARAMS_BEGIN(eval_params) |
100 POLPARAM(filename) // Argument 0 | 103 POLPARAM(filename) // Argument 0 |
101 POLPARAMS_END; | 104 POLPARAMS_END; |
102 | 105 |
(...skipping 17 matching lines...) Expand all Loading... |
120 delete [] reinterpret_cast<char*>(policy); | 123 delete [] reinterpret_cast<char*>(policy); |
121 } | 124 } |
122 | 125 |
123 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild1) { | 126 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild1) { |
124 SetupNtdllImports(); | 127 SetupNtdllImports(); |
125 PolicyRule pr(ASK_BROKER); | 128 PolicyRule pr(ASK_BROKER); |
126 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*", | 129 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*", |
127 CASE_SENSITIVE)); | 130 CASE_SENSITIVE)); |
128 | 131 |
129 PolicyGlobal* policy = MakePolicyMemory(); | 132 PolicyGlobal* policy = MakePolicyMemory(); |
130 const uint32 kFakeService = 3; | 133 const uint32_t kFakeService = 3; |
131 LowLevelPolicy policyGen(policy); | 134 LowLevelPolicy policyGen(policy); |
132 | 135 |
133 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 136 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
134 EXPECT_TRUE(policyGen.Done()); | 137 EXPECT_TRUE(policyGen.Done()); |
135 | 138 |
136 const wchar_t* filename = NULL; | 139 const wchar_t* filename = NULL; |
137 POLPARAMS_BEGIN(eval_params) | 140 POLPARAMS_BEGIN(eval_params) |
138 POLPARAM(filename) // Argument 0 | 141 POLPARAM(filename) // Argument 0 |
139 POLPARAMS_END; | 142 POLPARAMS_END; |
140 | 143 |
(...skipping 12 matching lines...) Expand all Loading... |
153 delete [] reinterpret_cast<char*>(policy); | 156 delete [] reinterpret_cast<char*>(policy); |
154 } | 157 } |
155 | 158 |
156 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild2) { | 159 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild2) { |
157 SetupNtdllImports(); | 160 SetupNtdllImports(); |
158 PolicyRule pr(ASK_BROKER); | 161 PolicyRule pr(ASK_BROKER); |
159 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*.txt", | 162 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*.txt", |
160 CASE_SENSITIVE)); | 163 CASE_SENSITIVE)); |
161 | 164 |
162 PolicyGlobal* policy = MakePolicyMemory(); | 165 PolicyGlobal* policy = MakePolicyMemory(); |
163 const uint32 kFakeService = 3; | 166 const uint32_t kFakeService = 3; |
164 LowLevelPolicy policyGen(policy); | 167 LowLevelPolicy policyGen(policy); |
165 | 168 |
166 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 169 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
167 EXPECT_TRUE(policyGen.Done()); | 170 EXPECT_TRUE(policyGen.Done()); |
168 | 171 |
169 const wchar_t* filename = NULL; | 172 const wchar_t* filename = NULL; |
170 POLPARAMS_BEGIN(eval_params) | 173 POLPARAMS_BEGIN(eval_params) |
171 POLPARAM(filename) // Argument 0 | 174 POLPARAM(filename) // Argument 0 |
172 POLPARAMS_END; | 175 POLPARAMS_END; |
173 | 176 |
(...skipping 18 matching lines...) Expand all Loading... |
192 } | 195 } |
193 | 196 |
194 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild1) { | 197 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild1) { |
195 SetupNtdllImports(); | 198 SetupNtdllImports(); |
196 PolicyRule pr(ASK_BROKER); | 199 PolicyRule pr(ASK_BROKER); |
197 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*", | 200 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*", |
198 CASE_SENSITIVE)); | 201 CASE_SENSITIVE)); |
199 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL)); | 202 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL)); |
200 | 203 |
201 PolicyGlobal* policy = MakePolicyMemory(); | 204 PolicyGlobal* policy = MakePolicyMemory(); |
202 const uint32 kFakeService = 3; | 205 const uint32_t kFakeService = 3; |
203 LowLevelPolicy policyGen(policy); | 206 LowLevelPolicy policyGen(policy); |
204 | 207 |
205 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 208 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
206 EXPECT_TRUE(policyGen.Done()); | 209 EXPECT_TRUE(policyGen.Done()); |
207 | 210 |
208 const wchar_t* filename = NULL; | 211 const wchar_t* filename = NULL; |
209 uint32 access = 0; | 212 uint32_t access = 0; |
210 POLPARAMS_BEGIN(eval_params) | 213 POLPARAMS_BEGIN(eval_params) |
211 POLPARAM(filename) // Argument 0 | 214 POLPARAM(filename) // Argument 0 |
212 POLPARAM(access) // Argument 1 | 215 POLPARAM(access) // Argument 1 |
213 POLPARAMS_END; | 216 POLPARAMS_END; |
214 | 217 |
215 PolicyResult result; | 218 PolicyResult result; |
216 PolicyProcessor pol_ev(policy->entry[kFakeService]); | 219 PolicyProcessor pol_ev(policy->entry[kFakeService]); |
217 | 220 |
218 filename = L"c:\\Microsoft\\domo.txt"; | 221 filename = L"c:\\Microsoft\\domo.txt"; |
219 access = 24; | 222 access = 24; |
(...skipping 21 matching lines...) Expand all Loading... |
241 | 244 |
242 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild2) { | 245 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild2) { |
243 SetupNtdllImports(); | 246 SetupNtdllImports(); |
244 PolicyRule pr(ASK_BROKER); | 247 PolicyRule pr(ASK_BROKER); |
245 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL)); | 248 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL)); |
246 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\GoogleV?\\*.txt", | 249 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\GoogleV?\\*.txt", |
247 CASE_SENSITIVE)); | 250 CASE_SENSITIVE)); |
248 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, 66, EQUAL)); | 251 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, 66, EQUAL)); |
249 | 252 |
250 PolicyGlobal* policy = MakePolicyMemory(); | 253 PolicyGlobal* policy = MakePolicyMemory(); |
251 const uint32 kFakeService = 3; | 254 const uint32_t kFakeService = 3; |
252 LowLevelPolicy policyGen(policy); | 255 LowLevelPolicy policyGen(policy); |
253 | 256 |
254 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 257 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
255 EXPECT_TRUE(policyGen.Done()); | 258 EXPECT_TRUE(policyGen.Done()); |
256 | 259 |
257 const wchar_t* filename = NULL; | 260 const wchar_t* filename = NULL; |
258 uint32 access = 0; | 261 uint32_t access = 0; |
259 uint32 sharing = 66; | 262 uint32_t sharing = 66; |
260 | 263 |
261 POLPARAMS_BEGIN(eval_params) | 264 POLPARAMS_BEGIN(eval_params) |
262 POLPARAM(filename) // Argument 0 | 265 POLPARAM(filename) // Argument 0 |
263 POLPARAM(access) // Argument 1 | 266 POLPARAM(access) // Argument 1 |
264 POLPARAM(sharing) // Argument 2 | 267 POLPARAM(sharing) // Argument 2 |
265 POLPARAMS_END; | 268 POLPARAMS_END; |
266 | 269 |
267 PolicyResult result; | 270 PolicyResult result; |
268 PolicyProcessor pol_ev(policy->entry[kFakeService]); | 271 PolicyProcessor pol_ev(policy->entry[kFakeService]); |
269 | 272 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 TEST(PolicyEngineTest, OneRuleTest) { | 318 TEST(PolicyEngineTest, OneRuleTest) { |
316 SetupNtdllImports(); | 319 SetupNtdllImports(); |
317 PolicyRule pr(ASK_BROKER); | 320 PolicyRule pr(ASK_BROKER); |
318 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*Microsoft*\\*.txt", | 321 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*Microsoft*\\*.txt", |
319 CASE_SENSITIVE)); | 322 CASE_SENSITIVE)); |
320 EXPECT_TRUE(pr.AddNumberMatch(IF_NOT, 1, CREATE_ALWAYS, EQUAL)); | 323 EXPECT_TRUE(pr.AddNumberMatch(IF_NOT, 1, CREATE_ALWAYS, EQUAL)); |
321 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL)); | 324 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL)); |
322 | 325 |
323 PolicyGlobal* policy = MakePolicyMemory(); | 326 PolicyGlobal* policy = MakePolicyMemory(); |
324 | 327 |
325 const uint32 kNtFakeCreateFile = 7; | 328 const uint32_t kNtFakeCreateFile = 7; |
326 | 329 |
327 LowLevelPolicy policyGen(policy); | 330 LowLevelPolicy policyGen(policy); |
328 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr)); | 331 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr)); |
329 EXPECT_TRUE(policyGen.Done()); | 332 EXPECT_TRUE(policyGen.Done()); |
330 | 333 |
331 const wchar_t* filename = L"c:\\Documents and Settings\\Microsoft\\BLAH.txt"; | 334 const wchar_t* filename = L"c:\\Documents and Settings\\Microsoft\\BLAH.txt"; |
332 uint32 creation_mode = OPEN_EXISTING; | 335 uint32_t creation_mode = OPEN_EXISTING; |
333 uint32 flags = FILE_ATTRIBUTE_NORMAL; | 336 uint32_t flags = FILE_ATTRIBUTE_NORMAL; |
334 void* security_descriptor = NULL; | 337 void* security_descriptor = NULL; |
335 | 338 |
336 POLPARAMS_BEGIN(eval_params) | 339 POLPARAMS_BEGIN(eval_params) |
337 POLPARAM(filename) // Argument 0 | 340 POLPARAM(filename) // Argument 0 |
338 POLPARAM(creation_mode) // Argument 1 | 341 POLPARAM(creation_mode) // Argument 1 |
339 POLPARAM(flags) // Argument 2 | 342 POLPARAM(flags) // Argument 2 |
340 POLPARAM(security_descriptor) | 343 POLPARAM(security_descriptor) |
341 POLPARAMS_END; | 344 POLPARAMS_END; |
342 | 345 |
343 PolicyResult result; | 346 PolicyResult result; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 | 424 |
422 PolicyRule pr_none(GIVE_FIRST); | 425 PolicyRule pr_none(GIVE_FIRST); |
423 EXPECT_TRUE(pr_none.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_READONLY, AND)); | 426 EXPECT_TRUE(pr_none.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_READONLY, AND)); |
424 EXPECT_TRUE(pr_none.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_SYSTEM, AND)); | 427 EXPECT_TRUE(pr_none.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_SYSTEM, AND)); |
425 | 428 |
426 size_t opc5 = pr_none.GetOpcodeCount(); | 429 size_t opc5 = pr_none.GetOpcodeCount(); |
427 EXPECT_EQ(2u, opc5); | 430 EXPECT_EQ(2u, opc5); |
428 | 431 |
429 PolicyGlobal* policy = MakePolicyMemory(); | 432 PolicyGlobal* policy = MakePolicyMemory(); |
430 | 433 |
431 const uint32 kNtFakeNone = 4; | 434 const uint32_t kNtFakeNone = 4; |
432 const uint32 kNtFakeCreateFile = 5; | 435 const uint32_t kNtFakeCreateFile = 5; |
433 const uint32 kNtFakeOpenFile = 6; | 436 const uint32_t kNtFakeOpenFile = 6; |
434 | 437 |
435 LowLevelPolicy policyGen(policy); | 438 LowLevelPolicy policyGen(policy); |
436 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_pipe)); | 439 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_pipe)); |
437 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_dump)); | 440 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_dump)); |
438 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_winexe)); | 441 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_winexe)); |
439 | 442 |
440 EXPECT_TRUE(policyGen.AddRule(kNtFakeOpenFile, &pr_adobe)); | 443 EXPECT_TRUE(policyGen.AddRule(kNtFakeOpenFile, &pr_adobe)); |
441 EXPECT_TRUE(policyGen.AddRule(kNtFakeOpenFile, &pr_pipe)); | 444 EXPECT_TRUE(policyGen.AddRule(kNtFakeOpenFile, &pr_pipe)); |
442 | 445 |
443 EXPECT_TRUE(policyGen.AddRule(kNtFakeNone, &pr_none)); | 446 EXPECT_TRUE(policyGen.AddRule(kNtFakeNone, &pr_none)); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 policy->entry[kNtFakeCreateFile]->opcodes[0].GetID()); | 482 policy->entry[kNtFakeCreateFile]->opcodes[0].GetID()); |
480 EXPECT_EQ(OP_ACTION, | 483 EXPECT_EQ(OP_ACTION, |
481 policy->entry[kNtFakeCreateFile]->opcodes[tc2-1].GetID()); | 484 policy->entry[kNtFakeCreateFile]->opcodes[tc2-1].GetID()); |
482 EXPECT_EQ(OP_WSTRING_MATCH, | 485 EXPECT_EQ(OP_WSTRING_MATCH, |
483 policy->entry[kNtFakeOpenFile]->opcodes[0].GetID()); | 486 policy->entry[kNtFakeOpenFile]->opcodes[0].GetID()); |
484 EXPECT_EQ(OP_ACTION, policy->entry[kNtFakeOpenFile]->opcodes[tc3-1].GetID()); | 487 EXPECT_EQ(OP_ACTION, policy->entry[kNtFakeOpenFile]->opcodes[tc3-1].GetID()); |
485 | 488 |
486 // Test the policy evaluation. | 489 // Test the policy evaluation. |
487 | 490 |
488 const wchar_t* filename = L""; | 491 const wchar_t* filename = L""; |
489 uint32 creation_mode = OPEN_EXISTING; | 492 uint32_t creation_mode = OPEN_EXISTING; |
490 uint32 flags = FILE_ATTRIBUTE_NORMAL; | 493 uint32_t flags = FILE_ATTRIBUTE_NORMAL; |
491 void* security_descriptor = NULL; | 494 void* security_descriptor = NULL; |
492 | 495 |
493 POLPARAMS_BEGIN(params) | 496 POLPARAMS_BEGIN(params) |
494 POLPARAM(filename) // Argument 0 | 497 POLPARAM(filename) // Argument 0 |
495 POLPARAM(creation_mode) // Argument 1 | 498 POLPARAM(creation_mode) // Argument 1 |
496 POLPARAM(flags) // Argument 2 | 499 POLPARAM(flags) // Argument 2 |
497 POLPARAM(security_descriptor) | 500 POLPARAM(security_descriptor) |
498 POLPARAMS_END; | 501 POLPARAMS_END; |
499 | 502 |
500 PolicyResult result; | 503 PolicyResult result; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 name = L"domo.txt"; | 612 name = L"domo.txt"; |
610 result = pol_ev_copy.Evaluate(kShortEval, eval_params, _countof(eval_params)); | 613 result = pol_ev_copy.Evaluate(kShortEval, eval_params, _countof(eval_params)); |
611 EXPECT_EQ(NO_POLICY_MATCH, result); | 614 EXPECT_EQ(NO_POLICY_MATCH, result); |
612 | 615 |
613 name = L"hello.bmp"; | 616 name = L"hello.bmp"; |
614 result = pol_ev_copy.Evaluate(kShortEval, eval_params, _countof(eval_params)); | 617 result = pol_ev_copy.Evaluate(kShortEval, eval_params, _countof(eval_params)); |
615 EXPECT_EQ(POLICY_MATCH, result); | 618 EXPECT_EQ(POLICY_MATCH, result); |
616 EXPECT_EQ(ASK_BROKER, pol_ev_copy.GetAction()); | 619 EXPECT_EQ(ASK_BROKER, pol_ev_copy.GetAction()); |
617 } | 620 } |
618 } // namespace sandbox | 621 } // namespace sandbox |
OLD | NEW |