Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1201)

Side by Side Diff: sandbox/win/src/restricted_token_unittest.cc

Issue 1232963002: Sandbox: Make CreateRestrictedToken return a ScopedHandle. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix remoting Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sandbox/win/src/restricted_token.cc ('k') | sandbox/win/src/restricted_token_utils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 // This file contains unit tests for the RestrictedToken. 5 // This file contains unit tests for the RestrictedToken.
6 6
7 #define _ATL_NO_EXCEPTIONS 7 #define _ATL_NO_EXCEPTIONS
8 #include <atlbase.h> 8 #include <atlbase.h>
9 #include <atlsecurity.h> 9 #include <atlsecurity.h>
10 #include <vector> 10 #include <vector>
11
12 #include "base/win/scoped_handle.h"
11 #include "sandbox/win/src/restricted_token.h" 13 #include "sandbox/win/src/restricted_token.h"
12 #include "sandbox/win/src/sid.h" 14 #include "sandbox/win/src/sid.h"
13 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
14 16
15 namespace sandbox { 17 namespace sandbox {
16 18
17 // Tests the initializatioin with an invalid token handle. 19 // Tests the initializatioin with an invalid token handle.
18 TEST(RestrictedTokenTest, InvalidHandle) { 20 TEST(RestrictedTokenTest, InvalidHandle) {
19 RestrictedToken token; 21 RestrictedToken token;
20 ASSERT_EQ(ERROR_INVALID_HANDLE, token.Init(reinterpret_cast<HANDLE>(0x5555))); 22 ASSERT_EQ(ERROR_INVALID_HANDLE, token.Init(reinterpret_cast<HANDLE>(0x5555)));
(...skipping 10 matching lines...) Expand all
31 33
32 ATL::CAccessToken access_token; 34 ATL::CAccessToken access_token;
33 access_token.Attach(token_handle); 35 access_token.Attach(token_handle);
34 36
35 // Create the token using the current token. 37 // Create the token using the current token.
36 RestrictedToken token_default; 38 RestrictedToken token_default;
37 ASSERT_EQ(ERROR_SUCCESS, token_default.Init(NULL)); 39 ASSERT_EQ(ERROR_SUCCESS, token_default.Init(NULL));
38 40
39 // Get the handle to the restricted token. 41 // Get the handle to the restricted token.
40 42
41 HANDLE restricted_token_handle = NULL; 43 base::win::ScopedHandle restricted_token_handle;
42 ASSERT_EQ(ERROR_SUCCESS, 44 ASSERT_EQ(ERROR_SUCCESS,
43 token_default.GetRestrictedTokenHandle(&restricted_token_handle)); 45 token_default.GetRestrictedToken(&restricted_token_handle));
44 46
45 ATL::CAccessToken restricted_token; 47 ATL::CAccessToken restricted_token;
46 restricted_token.Attach(restricted_token_handle); 48 restricted_token.Attach(restricted_token_handle.Take());
47 49
48 ATL::CSid sid_user_restricted; 50 ATL::CSid sid_user_restricted;
49 ATL::CSid sid_user_default; 51 ATL::CSid sid_user_default;
50 ATL::CSid sid_owner_restricted; 52 ATL::CSid sid_owner_restricted;
51 ATL::CSid sid_owner_default; 53 ATL::CSid sid_owner_default;
52 ASSERT_TRUE(restricted_token.GetUser(&sid_user_restricted)); 54 ASSERT_TRUE(restricted_token.GetUser(&sid_user_restricted));
53 ASSERT_TRUE(access_token.GetUser(&sid_user_default)); 55 ASSERT_TRUE(access_token.GetUser(&sid_user_default));
54 ASSERT_TRUE(restricted_token.GetOwner(&sid_owner_restricted)); 56 ASSERT_TRUE(restricted_token.GetOwner(&sid_owner_restricted));
55 ASSERT_TRUE(access_token.GetOwner(&sid_owner_default)); 57 ASSERT_TRUE(access_token.GetOwner(&sid_owner_default));
56 58
(...skipping 16 matching lines...) Expand all
73 75
74 // Change the primary group. 76 // Change the primary group.
75 access_token.SetPrimaryGroup(ATL::Sids::World()); 77 access_token.SetPrimaryGroup(ATL::Sids::World());
76 78
77 // Create the token using the current token. 79 // Create the token using the current token.
78 RestrictedToken token; 80 RestrictedToken token;
79 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); 81 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle()));
80 82
81 // Get the handle to the restricted token. 83 // Get the handle to the restricted token.
82 84
83 HANDLE restricted_token_handle = NULL; 85 base::win::ScopedHandle restricted_token_handle;
84 ASSERT_EQ(ERROR_SUCCESS, 86 ASSERT_EQ(ERROR_SUCCESS,
85 token.GetRestrictedTokenHandle(&restricted_token_handle)); 87 token.GetRestrictedToken(&restricted_token_handle));
86 88
87 ATL::CAccessToken restricted_token; 89 ATL::CAccessToken restricted_token;
88 restricted_token.Attach(restricted_token_handle); 90 restricted_token.Attach(restricted_token_handle.Take());
89 91
90 ATL::CSid sid_restricted; 92 ATL::CSid sid_restricted;
91 ATL::CSid sid_default; 93 ATL::CSid sid_default;
92 ASSERT_TRUE(restricted_token.GetPrimaryGroup(&sid_restricted)); 94 ASSERT_TRUE(restricted_token.GetPrimaryGroup(&sid_restricted));
93 ASSERT_TRUE(access_token.GetPrimaryGroup(&sid_default)); 95 ASSERT_TRUE(access_token.GetPrimaryGroup(&sid_default));
94 96
95 // Check if both token have the same owner. 97 // Check if both token have the same owner.
96 ASSERT_EQ(sid_restricted, sid_default); 98 ASSERT_EQ(sid_restricted, sid_default);
97 } 99 }
98 100
99 // Verifies that the token created by the object are valid. 101 // Verifies that the token created by the object are valid.
100 TEST(RestrictedTokenTest, ResultToken) { 102 TEST(RestrictedTokenTest, ResultToken) {
101 RestrictedToken token; 103 RestrictedToken token;
102 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 104 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
103 105
104 ASSERT_EQ(ERROR_SUCCESS, 106 ASSERT_EQ(ERROR_SUCCESS,
105 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); 107 token.AddRestrictingSid(ATL::Sids::World().GetPSID()));
106 108
107 HANDLE restricted_token; 109 base::win::ScopedHandle restricted_token;
108 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&restricted_token)); 110 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&restricted_token));
109 111
110 ASSERT_TRUE(::IsTokenRestricted(restricted_token)); 112 ASSERT_TRUE(::IsTokenRestricted(restricted_token.Get()));
111 113
112 DWORD length = 0; 114 DWORD length = 0;
113 TOKEN_TYPE type; 115 TOKEN_TYPE type;
114 ASSERT_TRUE(::GetTokenInformation(restricted_token, 116 ASSERT_TRUE(::GetTokenInformation(restricted_token.Get(),
115 ::TokenType, 117 ::TokenType,
116 &type, 118 &type,
117 sizeof(type), 119 sizeof(type),
118 &length)); 120 &length));
119 121
120 ASSERT_EQ(type, TokenPrimary); 122 ASSERT_EQ(type, TokenPrimary);
121 123
122 HANDLE impersonation_token; 124 base::win::ScopedHandle impersonation_token;
123 ASSERT_EQ(ERROR_SUCCESS, 125 ASSERT_EQ(ERROR_SUCCESS,
124 token.GetRestrictedTokenHandleForImpersonation(&impersonation_token)); 126 token.GetRestrictedTokenForImpersonation(&impersonation_token));
125 127
126 ASSERT_TRUE(::IsTokenRestricted(impersonation_token)); 128 ASSERT_TRUE(::IsTokenRestricted(impersonation_token.Get()));
127 129
128 ASSERT_TRUE(::GetTokenInformation(impersonation_token, 130 ASSERT_TRUE(::GetTokenInformation(impersonation_token.Get(),
129 ::TokenType, 131 ::TokenType,
130 &type, 132 &type,
131 sizeof(type), 133 sizeof(type),
132 &length)); 134 &length));
133 135
134 ASSERT_EQ(type, TokenImpersonation); 136 ASSERT_EQ(type, TokenImpersonation);
135
136 ::CloseHandle(impersonation_token);
137 ::CloseHandle(restricted_token);
138 } 137 }
139 138
140 // Verifies that the token created has "Restricted" in its default dacl. 139 // Verifies that the token created has "Restricted" in its default dacl.
141 TEST(RestrictedTokenTest, DefaultDacl) { 140 TEST(RestrictedTokenTest, DefaultDacl) {
142 RestrictedToken token; 141 RestrictedToken token;
143 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 142 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
144 143
145 ASSERT_EQ(ERROR_SUCCESS, 144 ASSERT_EQ(ERROR_SUCCESS,
146 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); 145 token.AddRestrictingSid(ATL::Sids::World().GetPSID()));
147 146
148 HANDLE handle; 147 base::win::ScopedHandle handle;
149 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&handle)); 148 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&handle));
150 149
151 ATL::CAccessToken restricted_token; 150 ATL::CAccessToken restricted_token;
152 restricted_token.Attach(handle); 151 restricted_token.Attach(handle.Take());
153 152
154 ATL::CDacl dacl; 153 ATL::CDacl dacl;
155 ASSERT_TRUE(restricted_token.GetDefaultDacl(&dacl)); 154 ASSERT_TRUE(restricted_token.GetDefaultDacl(&dacl));
156 155
157 bool restricted_found = false; 156 bool restricted_found = false;
158 157
159 unsigned int ace_count = dacl.GetAceCount(); 158 unsigned int ace_count = dacl.GetAceCount();
160 for (unsigned int i = 0; i < ace_count ; ++i) { 159 for (unsigned int i = 0; i < ace_count ; ++i) {
161 ATL::CSid sid; 160 ATL::CSid sid;
162 ACCESS_MASK mask = 0; 161 ACCESS_MASK mask = 0;
163 dacl.GetAclEntry(i, &sid, &mask); 162 dacl.GetAclEntry(i, &sid, &mask);
164 if (sid == ATL::Sids::RestrictedCode() && mask == GENERIC_ALL) { 163 if (sid == ATL::Sids::RestrictedCode() && mask == GENERIC_ALL) {
165 restricted_found = true; 164 restricted_found = true;
166 break; 165 break;
167 } 166 }
168 } 167 }
169 168
170 ASSERT_TRUE(restricted_found); 169 ASSERT_TRUE(restricted_found);
171 } 170 }
172 171
173 // Tests the method "AddSidForDenyOnly". 172 // Tests the method "AddSidForDenyOnly".
174 TEST(RestrictedTokenTest, DenySid) { 173 TEST(RestrictedTokenTest, DenySid) {
175 RestrictedToken token; 174 RestrictedToken token;
176 HANDLE token_handle = NULL; 175 base::win::ScopedHandle token_handle;
177 176
178 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 177 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
179 ASSERT_EQ(ERROR_SUCCESS, token.AddSidForDenyOnly(Sid(WinWorldSid))); 178 ASSERT_EQ(ERROR_SUCCESS, token.AddSidForDenyOnly(Sid(WinWorldSid)));
180 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 179 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
181 180
182 ATL::CAccessToken restricted_token; 181 ATL::CAccessToken restricted_token;
183 restricted_token.Attach(token_handle); 182 restricted_token.Attach(token_handle.Take());
184 183
185 ATL::CTokenGroups groups; 184 ATL::CTokenGroups groups;
186 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 185 ASSERT_TRUE(restricted_token.GetGroups(&groups));
187 186
188 ATL::CSid::CSidArray sids; 187 ATL::CSid::CSidArray sids;
189 ATL::CAtlArray<DWORD> attributes; 188 ATL::CAtlArray<DWORD> attributes;
190 groups.GetSidsAndAttributes(&sids, &attributes); 189 groups.GetSidsAndAttributes(&sids, &attributes);
191 190
192 for (unsigned int i = 0; i < sids.GetCount(); i++) { 191 for (unsigned int i = 0; i < sids.GetCount(); i++) {
193 if (ATL::Sids::World() == sids[i]) { 192 if (ATL::Sids::World() == sids[i]) {
194 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, 193 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY,
195 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 194 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
196 } 195 }
197 } 196 }
198 } 197 }
199 198
200 // Tests the method "AddAllSidsForDenyOnly". 199 // Tests the method "AddAllSidsForDenyOnly".
201 TEST(RestrictedTokenTest, DenySids) { 200 TEST(RestrictedTokenTest, DenySids) {
202 RestrictedToken token; 201 RestrictedToken token;
203 HANDLE token_handle = NULL; 202 base::win::ScopedHandle token_handle;
204 203
205 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 204 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
206 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(NULL)); 205 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(NULL));
207 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 206 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
208 207
209 ATL::CAccessToken restricted_token; 208 ATL::CAccessToken restricted_token;
210 restricted_token.Attach(token_handle); 209 restricted_token.Attach(token_handle.Take());
211 210
212 ATL::CTokenGroups groups; 211 ATL::CTokenGroups groups;
213 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 212 ASSERT_TRUE(restricted_token.GetGroups(&groups));
214 213
215 ATL::CSid::CSidArray sids; 214 ATL::CSid::CSidArray sids;
216 ATL::CAtlArray<DWORD> attributes; 215 ATL::CAtlArray<DWORD> attributes;
217 groups.GetSidsAndAttributes(&sids, &attributes); 216 groups.GetSidsAndAttributes(&sids, &attributes);
218 217
219 // Verify that all sids are really gone. 218 // Verify that all sids are really gone.
220 for (unsigned int i = 0; i < sids.GetCount(); i++) { 219 for (unsigned int i = 0; i < sids.GetCount(); i++) {
221 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 && 220 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 &&
222 (attributes[i] & SE_GROUP_INTEGRITY) == 0) { 221 (attributes[i] & SE_GROUP_INTEGRITY) == 0) {
223 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, 222 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY,
224 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 223 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
225 } 224 }
226 } 225 }
227 } 226 }
228 227
229 // Tests the method "AddAllSidsForDenyOnly" using an exception list. 228 // Tests the method "AddAllSidsForDenyOnly" using an exception list.
230 TEST(RestrictedTokenTest, DenySidsException) { 229 TEST(RestrictedTokenTest, DenySidsException) {
231 RestrictedToken token; 230 RestrictedToken token;
232 HANDLE token_handle = NULL; 231 base::win::ScopedHandle token_handle;
233 232
234 std::vector<Sid> sids_exception; 233 std::vector<Sid> sids_exception;
235 sids_exception.push_back(Sid(WinWorldSid)); 234 sids_exception.push_back(Sid(WinWorldSid));
236 235
237 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 236 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
238 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(&sids_exception)); 237 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(&sids_exception));
239 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 238 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
240 239
241 ATL::CAccessToken restricted_token; 240 ATL::CAccessToken restricted_token;
242 restricted_token.Attach(token_handle); 241 restricted_token.Attach(token_handle.Take());
243 242
244 ATL::CTokenGroups groups; 243 ATL::CTokenGroups groups;
245 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 244 ASSERT_TRUE(restricted_token.GetGroups(&groups));
246 245
247 ATL::CSid::CSidArray sids; 246 ATL::CSid::CSidArray sids;
248 ATL::CAtlArray<DWORD> attributes; 247 ATL::CAtlArray<DWORD> attributes;
249 groups.GetSidsAndAttributes(&sids, &attributes); 248 groups.GetSidsAndAttributes(&sids, &attributes);
250 249
251 // Verify that all sids are really gone. 250 // Verify that all sids are really gone.
252 for (unsigned int i = 0; i < sids.GetCount(); i++) { 251 for (unsigned int i = 0; i < sids.GetCount(); i++) {
253 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 && 252 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 &&
254 (attributes[i] & SE_GROUP_INTEGRITY) == 0) { 253 (attributes[i] & SE_GROUP_INTEGRITY) == 0) {
255 if (ATL::Sids::World() == sids[i]) { 254 if (ATL::Sids::World() == sids[i]) {
256 ASSERT_EQ(NULL, attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 255 ASSERT_EQ(NULL, attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
257 } else { 256 } else {
258 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, 257 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY,
259 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 258 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
260 } 259 }
261 } 260 }
262 } 261 }
263 } 262 }
264 263
265 // Tests test method AddOwnerSidForDenyOnly. 264 // Tests test method AddOwnerSidForDenyOnly.
266 TEST(RestrictedTokenTest, DenyOwnerSid) { 265 TEST(RestrictedTokenTest, DenyOwnerSid) {
267 RestrictedToken token; 266 RestrictedToken token;
268 HANDLE token_handle = NULL; 267 base::win::ScopedHandle token_handle;
269 268
270 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 269 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
271 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly()); 270 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly());
272 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 271 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
273 272
274 ATL::CAccessToken restricted_token; 273 ATL::CAccessToken restricted_token;
275 restricted_token.Attach(token_handle); 274 restricted_token.Attach(token_handle.Take());
276 275
277 ATL::CTokenGroups groups; 276 ATL::CTokenGroups groups;
278 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 277 ASSERT_TRUE(restricted_token.GetGroups(&groups));
279 278
280 ATL::CSid::CSidArray sids; 279 ATL::CSid::CSidArray sids;
281 ATL::CAtlArray<DWORD> attributes; 280 ATL::CAtlArray<DWORD> attributes;
282 groups.GetSidsAndAttributes(&sids, &attributes); 281 groups.GetSidsAndAttributes(&sids, &attributes);
283 282
284 ATL::CSid user_sid; 283 ATL::CSid user_sid;
285 ASSERT_TRUE(restricted_token.GetUser(&user_sid)); 284 ASSERT_TRUE(restricted_token.GetUser(&user_sid));
286 285
287 for (unsigned int i = 0; i < sids.GetCount(); ++i) { 286 for (unsigned int i = 0; i < sids.GetCount(); ++i) {
288 if (user_sid == sids[i]) { 287 if (user_sid == sids[i]) {
289 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, 288 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY,
290 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 289 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
291 } 290 }
292 } 291 }
293 } 292 }
294 293
295 // Tests test method AddOwnerSidForDenyOnly with a custom effective token. 294 // Tests test method AddOwnerSidForDenyOnly with a custom effective token.
296 TEST(RestrictedTokenTest, DenyOwnerSidCustom) { 295 TEST(RestrictedTokenTest, DenyOwnerSidCustom) {
297 // Get the current process token. 296 // Get the current process token.
298 HANDLE token_handle = INVALID_HANDLE_VALUE; 297 HANDLE access_handle = INVALID_HANDLE_VALUE;
299 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, 298 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS,
300 &token_handle)); 299 &access_handle));
301 300
302 ASSERT_NE(INVALID_HANDLE_VALUE, token_handle); 301 ASSERT_NE(INVALID_HANDLE_VALUE, access_handle);
303 302
304 ATL::CAccessToken access_token; 303 ATL::CAccessToken access_token;
305 access_token.Attach(token_handle); 304 access_token.Attach(access_handle);
306 305
307 RestrictedToken token; 306 RestrictedToken token;
307 base::win::ScopedHandle token_handle;
308 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); 308 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle()));
309 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly()); 309 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly());
310 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 310 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
311 311
312 ATL::CAccessToken restricted_token; 312 ATL::CAccessToken restricted_token;
313 restricted_token.Attach(token_handle); 313 restricted_token.Attach(token_handle.Take());
314 314
315 ATL::CTokenGroups groups; 315 ATL::CTokenGroups groups;
316 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 316 ASSERT_TRUE(restricted_token.GetGroups(&groups));
317 317
318 ATL::CSid::CSidArray sids; 318 ATL::CSid::CSidArray sids;
319 ATL::CAtlArray<DWORD> attributes; 319 ATL::CAtlArray<DWORD> attributes;
320 groups.GetSidsAndAttributes(&sids, &attributes); 320 groups.GetSidsAndAttributes(&sids, &attributes);
321 321
322 ATL::CSid user_sid; 322 ATL::CSid user_sid;
323 ASSERT_TRUE(restricted_token.GetUser(&user_sid)); 323 ASSERT_TRUE(restricted_token.GetUser(&user_sid));
324 324
325 for (unsigned int i = 0; i < sids.GetCount(); ++i) { 325 for (unsigned int i = 0; i < sids.GetCount(); ++i) {
326 if (user_sid == sids[i]) { 326 if (user_sid == sids[i]) {
327 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, 327 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY,
328 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 328 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
329 } 329 }
330 } 330 }
331 } 331 }
332 332
333 // Tests the method DeleteAllPrivileges. 333 // Tests the method DeleteAllPrivileges.
334 TEST(RestrictedTokenTest, DeleteAllPrivileges) { 334 TEST(RestrictedTokenTest, DeleteAllPrivileges) {
335 RestrictedToken token; 335 RestrictedToken token;
336 HANDLE token_handle = NULL; 336 base::win::ScopedHandle token_handle;
337 337
338 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 338 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
339 ASSERT_EQ(ERROR_SUCCESS, token.DeleteAllPrivileges(NULL)); 339 ASSERT_EQ(ERROR_SUCCESS, token.DeleteAllPrivileges(NULL));
340 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 340 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
341 341
342 ATL::CAccessToken restricted_token; 342 ATL::CAccessToken restricted_token;
343 restricted_token.Attach(token_handle); 343 restricted_token.Attach(token_handle.Take());
344 344
345 ATL::CTokenPrivileges privileges; 345 ATL::CTokenPrivileges privileges;
346 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges)); 346 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges));
347 347
348 ASSERT_EQ(0, privileges.GetCount()); 348 ASSERT_EQ(0, privileges.GetCount());
349 } 349 }
350 350
351 // Tests the method DeleteAllPrivileges with an exception list. 351 // Tests the method DeleteAllPrivileges with an exception list.
352 TEST(RestrictedTokenTest, DeleteAllPrivilegesException) { 352 TEST(RestrictedTokenTest, DeleteAllPrivilegesException) {
353 RestrictedToken token; 353 RestrictedToken token;
354 HANDLE token_handle = NULL; 354 base::win::ScopedHandle token_handle;
355 355
356 std::vector<base::string16> exceptions; 356 std::vector<base::string16> exceptions;
357 exceptions.push_back(SE_CHANGE_NOTIFY_NAME); 357 exceptions.push_back(SE_CHANGE_NOTIFY_NAME);
358 358
359 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 359 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
360 ASSERT_EQ(ERROR_SUCCESS, token.DeleteAllPrivileges(&exceptions)); 360 ASSERT_EQ(ERROR_SUCCESS, token.DeleteAllPrivileges(&exceptions));
361 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 361 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
362 362
363 ATL::CAccessToken restricted_token; 363 ATL::CAccessToken restricted_token;
364 restricted_token.Attach(token_handle); 364 restricted_token.Attach(token_handle.Take());
365 365
366 ATL::CTokenPrivileges privileges; 366 ATL::CTokenPrivileges privileges;
367 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges)); 367 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges));
368 368
369 ATL::CTokenPrivileges::CNames privilege_names; 369 ATL::CTokenPrivileges::CNames privilege_names;
370 ATL::CTokenPrivileges::CAttributes privilege_name_attributes; 370 ATL::CTokenPrivileges::CAttributes privilege_name_attributes;
371 privileges.GetNamesAndAttributes(&privilege_names, 371 privileges.GetNamesAndAttributes(&privilege_names,
372 &privilege_name_attributes); 372 &privilege_name_attributes);
373 373
374 ASSERT_EQ(1, privileges.GetCount()); 374 ASSERT_EQ(1, privileges.GetCount());
375 375
376 for (unsigned int i = 0; i < privileges.GetCount(); ++i) { 376 for (unsigned int i = 0; i < privileges.GetCount(); ++i) {
377 ASSERT_EQ(privilege_names[i], SE_CHANGE_NOTIFY_NAME); 377 ASSERT_EQ(privilege_names[i], SE_CHANGE_NOTIFY_NAME);
378 } 378 }
379 } 379 }
380 380
381 // Tests the method DeletePrivilege. 381 // Tests the method DeletePrivilege.
382 TEST(RestrictedTokenTest, DeletePrivilege) { 382 TEST(RestrictedTokenTest, DeletePrivilege) {
383 RestrictedToken token; 383 RestrictedToken token;
384 HANDLE token_handle = NULL; 384 base::win::ScopedHandle token_handle;
385 385
386 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 386 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
387 ASSERT_EQ(ERROR_SUCCESS, token.DeletePrivilege(SE_CHANGE_NOTIFY_NAME)); 387 ASSERT_EQ(ERROR_SUCCESS, token.DeletePrivilege(SE_CHANGE_NOTIFY_NAME));
388 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 388 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
389 389
390 ATL::CAccessToken restricted_token; 390 ATL::CAccessToken restricted_token;
391 restricted_token.Attach(token_handle); 391 restricted_token.Attach(token_handle.Take());
392 392
393 ATL::CTokenPrivileges privileges; 393 ATL::CTokenPrivileges privileges;
394 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges)); 394 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges));
395 395
396 ATL::CTokenPrivileges::CNames privilege_names; 396 ATL::CTokenPrivileges::CNames privilege_names;
397 ATL::CTokenPrivileges::CAttributes privilege_name_attributes; 397 ATL::CTokenPrivileges::CAttributes privilege_name_attributes;
398 privileges.GetNamesAndAttributes(&privilege_names, 398 privileges.GetNamesAndAttributes(&privilege_names,
399 &privilege_name_attributes); 399 &privilege_name_attributes);
400 400
401 for (unsigned int i = 0; i < privileges.GetCount(); ++i) { 401 for (unsigned int i = 0; i < privileges.GetCount(); ++i) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 break; 434 break;
435 } 435 }
436 } 436 }
437 437
438 ASSERT_TRUE(present); 438 ASSERT_TRUE(present);
439 } 439 }
440 440
441 // Tests the method AddRestrictingSid. 441 // Tests the method AddRestrictingSid.
442 TEST(RestrictedTokenTest, AddRestrictingSid) { 442 TEST(RestrictedTokenTest, AddRestrictingSid) {
443 RestrictedToken token; 443 RestrictedToken token;
444 HANDLE token_handle = NULL; 444 base::win::ScopedHandle token_handle;
445 445
446 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 446 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
447 ASSERT_EQ(ERROR_SUCCESS, 447 ASSERT_EQ(ERROR_SUCCESS,
448 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); 448 token.AddRestrictingSid(ATL::Sids::World().GetPSID()));
449 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 449 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
450 450
451 ATL::CAccessToken restricted_token; 451 ATL::CAccessToken restricted_token;
452 restricted_token.Attach(token_handle); 452 restricted_token.Attach(token_handle.Take());
453 453
454 CheckRestrictingSid(restricted_token, ATL::Sids::World(), 1); 454 CheckRestrictingSid(restricted_token, ATL::Sids::World(), 1);
455 } 455 }
456 456
457 // Tests the method AddRestrictingSidCurrentUser. 457 // Tests the method AddRestrictingSidCurrentUser.
458 TEST(RestrictedTokenTest, AddRestrictingSidCurrentUser) { 458 TEST(RestrictedTokenTest, AddRestrictingSidCurrentUser) {
459 RestrictedToken token; 459 RestrictedToken token;
460 HANDLE token_handle = NULL; 460 base::win::ScopedHandle token_handle;
461 461
462 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 462 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
463 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); 463 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser());
464 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 464 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
465 465
466 ATL::CAccessToken restricted_token; 466 ATL::CAccessToken restricted_token;
467 restricted_token.Attach(token_handle); 467 restricted_token.Attach(token_handle.Take());
468 ATL::CSid user; 468 ATL::CSid user;
469 restricted_token.GetUser(&user); 469 restricted_token.GetUser(&user);
470 470
471 CheckRestrictingSid(restricted_token, user, 1); 471 CheckRestrictingSid(restricted_token, user, 1);
472 } 472 }
473 473
474 // Tests the method AddRestrictingSidCurrentUser with a custom effective token. 474 // Tests the method AddRestrictingSidCurrentUser with a custom effective token.
475 TEST(RestrictedTokenTest, AddRestrictingSidCurrentUserCustom) { 475 TEST(RestrictedTokenTest, AddRestrictingSidCurrentUserCustom) {
476 // Get the current process token. 476 // Get the current process token.
477 HANDLE token_handle = INVALID_HANDLE_VALUE; 477 HANDLE access_handle = INVALID_HANDLE_VALUE;
478 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, 478 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS,
479 &token_handle)); 479 &access_handle));
480 480
481 ASSERT_NE(INVALID_HANDLE_VALUE, token_handle); 481 ASSERT_NE(INVALID_HANDLE_VALUE, access_handle);
482 482
483 ATL::CAccessToken access_token; 483 ATL::CAccessToken access_token;
484 access_token.Attach(token_handle); 484 access_token.Attach(access_handle);
485 485
486 RestrictedToken token; 486 RestrictedToken token;
487 base::win::ScopedHandle token_handle;
487 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); 488 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle()));
488 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); 489 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser());
489 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 490 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
490 491
491 ATL::CAccessToken restricted_token; 492 ATL::CAccessToken restricted_token;
492 restricted_token.Attach(token_handle); 493 restricted_token.Attach(token_handle.Take());
493 ATL::CSid user; 494 ATL::CSid user;
494 restricted_token.GetUser(&user); 495 restricted_token.GetUser(&user);
495 496
496 CheckRestrictingSid(restricted_token, user, 1); 497 CheckRestrictingSid(restricted_token, user, 1);
497 } 498 }
498 499
499 // Tests the method AddRestrictingSidLogonSession. 500 // Tests the method AddRestrictingSidLogonSession.
500 TEST(RestrictedTokenTest, AddRestrictingSidLogonSession) { 501 TEST(RestrictedTokenTest, AddRestrictingSidLogonSession) {
501 RestrictedToken token; 502 RestrictedToken token;
502 HANDLE token_handle = NULL; 503 base::win::ScopedHandle token_handle;
503 504
504 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 505 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
505 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession()); 506 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession());
506 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 507 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
507 508
508 ATL::CAccessToken restricted_token; 509 ATL::CAccessToken restricted_token;
509 restricted_token.Attach(token_handle); 510 restricted_token.Attach(token_handle.Take());
510 ATL::CSid session; 511 ATL::CSid session;
511 restricted_token.GetLogonSid(&session); 512 restricted_token.GetLogonSid(&session);
512 513
513 CheckRestrictingSid(restricted_token, session, 1); 514 CheckRestrictingSid(restricted_token, session, 1);
514 } 515 }
515 516
516 // Tests adding a lot of restricting sids. 517 // Tests adding a lot of restricting sids.
517 TEST(RestrictedTokenTest, AddMultipleRestrictingSids) { 518 TEST(RestrictedTokenTest, AddMultipleRestrictingSids) {
518 RestrictedToken token; 519 RestrictedToken token;
519 HANDLE token_handle = NULL; 520 base::win::ScopedHandle token_handle;
520 521
521 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 522 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
522 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); 523 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser());
523 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession()); 524 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession());
524 ASSERT_EQ(ERROR_SUCCESS, 525 ASSERT_EQ(ERROR_SUCCESS,
525 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); 526 token.AddRestrictingSid(ATL::Sids::World().GetPSID()));
526 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 527 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
527 528
528 ATL::CAccessToken restricted_token; 529 ATL::CAccessToken restricted_token;
529 restricted_token.Attach(token_handle); 530 restricted_token.Attach(token_handle.Take());
530 ATL::CSid session; 531 ATL::CSid session;
531 restricted_token.GetLogonSid(&session); 532 restricted_token.GetLogonSid(&session);
532 533
533 DWORD length = 8192; 534 DWORD length = 8192;
534 BYTE *memory = new BYTE[length]; 535 BYTE *memory = new BYTE[length];
535 TOKEN_GROUPS *groups = reinterpret_cast<TOKEN_GROUPS*>(memory); 536 TOKEN_GROUPS *groups = reinterpret_cast<TOKEN_GROUPS*>(memory);
536 ASSERT_TRUE(::GetTokenInformation(restricted_token.GetHandle(), 537 ASSERT_TRUE(::GetTokenInformation(restricted_token.GetHandle(),
537 TokenRestrictedSids, 538 TokenRestrictedSids,
538 groups, 539 groups,
539 length, 540 length,
540 &length)); 541 &length));
541 542
542 ATL::CTokenGroups atl_groups(*groups); 543 ATL::CTokenGroups atl_groups(*groups);
543 delete[] memory; 544 delete[] memory;
544 545
545 ASSERT_EQ(3, atl_groups.GetCount()); 546 ASSERT_EQ(3, atl_groups.GetCount());
546 } 547 }
547 548
548 // Tests the method "AddRestrictingSidAllSids". 549 // Tests the method "AddRestrictingSidAllSids".
549 TEST(RestrictedTokenTest, AddAllSidToRestrictingSids) { 550 TEST(RestrictedTokenTest, AddAllSidToRestrictingSids) {
550 RestrictedToken token; 551 RestrictedToken token;
551 HANDLE token_handle = NULL; 552 base::win::ScopedHandle token_handle;
552 553
553 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 554 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
554 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidAllSids()); 555 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidAllSids());
555 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); 556 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle));
556 557
557 ATL::CAccessToken restricted_token; 558 ATL::CAccessToken restricted_token;
558 restricted_token.Attach(token_handle); 559 restricted_token.Attach(token_handle.Take());
559 560
560 ATL::CTokenGroups groups; 561 ATL::CTokenGroups groups;
561 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 562 ASSERT_TRUE(restricted_token.GetGroups(&groups));
562 563
563 ATL::CSid::CSidArray sids; 564 ATL::CSid::CSidArray sids;
564 ATL::CAtlArray<DWORD> attributes; 565 ATL::CAtlArray<DWORD> attributes;
565 groups.GetSidsAndAttributes(&sids, &attributes); 566 groups.GetSidsAndAttributes(&sids, &attributes);
566 567
567 // Verify that all group sids are in the restricting sid list. 568 // Verify that all group sids are in the restricting sid list.
568 for (unsigned int i = 0; i < sids.GetCount(); i++) { 569 for (unsigned int i = 0; i < sids.GetCount(); i++) {
(...skipping 10 matching lines...) Expand all
579 580
580 // Checks the error code when the object is initialized twice. 581 // Checks the error code when the object is initialized twice.
581 TEST(RestrictedTokenTest, DoubleInit) { 582 TEST(RestrictedTokenTest, DoubleInit) {
582 RestrictedToken token; 583 RestrictedToken token;
583 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 584 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
584 585
585 ASSERT_EQ(ERROR_ALREADY_INITIALIZED, token.Init(NULL)); 586 ASSERT_EQ(ERROR_ALREADY_INITIALIZED, token.Init(NULL));
586 } 587 }
587 588
588 } // namespace sandbox 589 } // namespace sandbox
OLDNEW
« no previous file with comments | « sandbox/win/src/restricted_token.cc ('k') | sandbox/win/src/restricted_token_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698