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

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

Issue 1231853005: Revert of Sandbox: Make CreateRestrictedToken return a ScopedHandle. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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"
13 #include "sandbox/win/src/restricted_token.h" 11 #include "sandbox/win/src/restricted_token.h"
14 #include "sandbox/win/src/sid.h" 12 #include "sandbox/win/src/sid.h"
15 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
16 14
17 namespace sandbox { 15 namespace sandbox {
18 16
19 // Tests the initializatioin with an invalid token handle. 17 // Tests the initializatioin with an invalid token handle.
20 TEST(RestrictedTokenTest, InvalidHandle) { 18 TEST(RestrictedTokenTest, InvalidHandle) {
21 RestrictedToken token; 19 RestrictedToken token;
22 ASSERT_EQ(ERROR_INVALID_HANDLE, token.Init(reinterpret_cast<HANDLE>(0x5555))); 20 ASSERT_EQ(ERROR_INVALID_HANDLE, token.Init(reinterpret_cast<HANDLE>(0x5555)));
(...skipping 10 matching lines...) Expand all
33 31
34 ATL::CAccessToken access_token; 32 ATL::CAccessToken access_token;
35 access_token.Attach(token_handle); 33 access_token.Attach(token_handle);
36 34
37 // Create the token using the current token. 35 // Create the token using the current token.
38 RestrictedToken token_default; 36 RestrictedToken token_default;
39 ASSERT_EQ(ERROR_SUCCESS, token_default.Init(NULL)); 37 ASSERT_EQ(ERROR_SUCCESS, token_default.Init(NULL));
40 38
41 // Get the handle to the restricted token. 39 // Get the handle to the restricted token.
42 40
43 base::win::ScopedHandle restricted_token_handle; 41 HANDLE restricted_token_handle = NULL;
44 ASSERT_EQ(ERROR_SUCCESS, 42 ASSERT_EQ(ERROR_SUCCESS,
45 token_default.GetRestrictedToken(&restricted_token_handle)); 43 token_default.GetRestrictedTokenHandle(&restricted_token_handle));
46 44
47 ATL::CAccessToken restricted_token; 45 ATL::CAccessToken restricted_token;
48 restricted_token.Attach(restricted_token_handle.Take()); 46 restricted_token.Attach(restricted_token_handle);
49 47
50 ATL::CSid sid_user_restricted; 48 ATL::CSid sid_user_restricted;
51 ATL::CSid sid_user_default; 49 ATL::CSid sid_user_default;
52 ATL::CSid sid_owner_restricted; 50 ATL::CSid sid_owner_restricted;
53 ATL::CSid sid_owner_default; 51 ATL::CSid sid_owner_default;
54 ASSERT_TRUE(restricted_token.GetUser(&sid_user_restricted)); 52 ASSERT_TRUE(restricted_token.GetUser(&sid_user_restricted));
55 ASSERT_TRUE(access_token.GetUser(&sid_user_default)); 53 ASSERT_TRUE(access_token.GetUser(&sid_user_default));
56 ASSERT_TRUE(restricted_token.GetOwner(&sid_owner_restricted)); 54 ASSERT_TRUE(restricted_token.GetOwner(&sid_owner_restricted));
57 ASSERT_TRUE(access_token.GetOwner(&sid_owner_default)); 55 ASSERT_TRUE(access_token.GetOwner(&sid_owner_default));
58 56
(...skipping 16 matching lines...) Expand all
75 73
76 // Change the primary group. 74 // Change the primary group.
77 access_token.SetPrimaryGroup(ATL::Sids::World()); 75 access_token.SetPrimaryGroup(ATL::Sids::World());
78 76
79 // Create the token using the current token. 77 // Create the token using the current token.
80 RestrictedToken token; 78 RestrictedToken token;
81 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); 79 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle()));
82 80
83 // Get the handle to the restricted token. 81 // Get the handle to the restricted token.
84 82
85 base::win::ScopedHandle restricted_token_handle; 83 HANDLE restricted_token_handle = NULL;
86 ASSERT_EQ(ERROR_SUCCESS, 84 ASSERT_EQ(ERROR_SUCCESS,
87 token.GetRestrictedToken(&restricted_token_handle)); 85 token.GetRestrictedTokenHandle(&restricted_token_handle));
88 86
89 ATL::CAccessToken restricted_token; 87 ATL::CAccessToken restricted_token;
90 restricted_token.Attach(restricted_token_handle.Take()); 88 restricted_token.Attach(restricted_token_handle);
91 89
92 ATL::CSid sid_restricted; 90 ATL::CSid sid_restricted;
93 ATL::CSid sid_default; 91 ATL::CSid sid_default;
94 ASSERT_TRUE(restricted_token.GetPrimaryGroup(&sid_restricted)); 92 ASSERT_TRUE(restricted_token.GetPrimaryGroup(&sid_restricted));
95 ASSERT_TRUE(access_token.GetPrimaryGroup(&sid_default)); 93 ASSERT_TRUE(access_token.GetPrimaryGroup(&sid_default));
96 94
97 // Check if both token have the same owner. 95 // Check if both token have the same owner.
98 ASSERT_EQ(sid_restricted, sid_default); 96 ASSERT_EQ(sid_restricted, sid_default);
99 } 97 }
100 98
101 // Verifies that the token created by the object are valid. 99 // Verifies that the token created by the object are valid.
102 TEST(RestrictedTokenTest, ResultToken) { 100 TEST(RestrictedTokenTest, ResultToken) {
103 RestrictedToken token; 101 RestrictedToken token;
104 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 102 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
105 103
106 ASSERT_EQ(ERROR_SUCCESS, 104 ASSERT_EQ(ERROR_SUCCESS,
107 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); 105 token.AddRestrictingSid(ATL::Sids::World().GetPSID()));
108 106
109 base::win::ScopedHandle restricted_token; 107 HANDLE restricted_token;
110 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&restricted_token)); 108 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&restricted_token));
111 109
112 ASSERT_TRUE(::IsTokenRestricted(restricted_token.Get())); 110 ASSERT_TRUE(::IsTokenRestricted(restricted_token));
113 111
114 DWORD length = 0; 112 DWORD length = 0;
115 TOKEN_TYPE type; 113 TOKEN_TYPE type;
116 ASSERT_TRUE(::GetTokenInformation(restricted_token.Get(), 114 ASSERT_TRUE(::GetTokenInformation(restricted_token,
117 ::TokenType, 115 ::TokenType,
118 &type, 116 &type,
119 sizeof(type), 117 sizeof(type),
120 &length)); 118 &length));
121 119
122 ASSERT_EQ(type, TokenPrimary); 120 ASSERT_EQ(type, TokenPrimary);
123 121
124 base::win::ScopedHandle impersonation_token; 122 HANDLE impersonation_token;
125 ASSERT_EQ(ERROR_SUCCESS, 123 ASSERT_EQ(ERROR_SUCCESS,
126 token.GetRestrictedTokenForImpersonation(&impersonation_token)); 124 token.GetRestrictedTokenHandleForImpersonation(&impersonation_token));
127 125
128 ASSERT_TRUE(::IsTokenRestricted(impersonation_token.Get())); 126 ASSERT_TRUE(::IsTokenRestricted(impersonation_token));
129 127
130 ASSERT_TRUE(::GetTokenInformation(impersonation_token.Get(), 128 ASSERT_TRUE(::GetTokenInformation(impersonation_token,
131 ::TokenType, 129 ::TokenType,
132 &type, 130 &type,
133 sizeof(type), 131 sizeof(type),
134 &length)); 132 &length));
135 133
136 ASSERT_EQ(type, TokenImpersonation); 134 ASSERT_EQ(type, TokenImpersonation);
135
136 ::CloseHandle(impersonation_token);
137 ::CloseHandle(restricted_token);
137 } 138 }
138 139
139 // Verifies that the token created has "Restricted" in its default dacl. 140 // Verifies that the token created has "Restricted" in its default dacl.
140 TEST(RestrictedTokenTest, DefaultDacl) { 141 TEST(RestrictedTokenTest, DefaultDacl) {
141 RestrictedToken token; 142 RestrictedToken token;
142 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 143 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
143 144
144 ASSERT_EQ(ERROR_SUCCESS, 145 ASSERT_EQ(ERROR_SUCCESS,
145 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); 146 token.AddRestrictingSid(ATL::Sids::World().GetPSID()));
146 147
147 base::win::ScopedHandle handle; 148 HANDLE handle;
148 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&handle)); 149 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&handle));
149 150
150 ATL::CAccessToken restricted_token; 151 ATL::CAccessToken restricted_token;
151 restricted_token.Attach(handle.Take()); 152 restricted_token.Attach(handle);
152 153
153 ATL::CDacl dacl; 154 ATL::CDacl dacl;
154 ASSERT_TRUE(restricted_token.GetDefaultDacl(&dacl)); 155 ASSERT_TRUE(restricted_token.GetDefaultDacl(&dacl));
155 156
156 bool restricted_found = false; 157 bool restricted_found = false;
157 158
158 unsigned int ace_count = dacl.GetAceCount(); 159 unsigned int ace_count = dacl.GetAceCount();
159 for (unsigned int i = 0; i < ace_count ; ++i) { 160 for (unsigned int i = 0; i < ace_count ; ++i) {
160 ATL::CSid sid; 161 ATL::CSid sid;
161 ACCESS_MASK mask = 0; 162 ACCESS_MASK mask = 0;
162 dacl.GetAclEntry(i, &sid, &mask); 163 dacl.GetAclEntry(i, &sid, &mask);
163 if (sid == ATL::Sids::RestrictedCode() && mask == GENERIC_ALL) { 164 if (sid == ATL::Sids::RestrictedCode() && mask == GENERIC_ALL) {
164 restricted_found = true; 165 restricted_found = true;
165 break; 166 break;
166 } 167 }
167 } 168 }
168 169
169 ASSERT_TRUE(restricted_found); 170 ASSERT_TRUE(restricted_found);
170 } 171 }
171 172
172 // Tests the method "AddSidForDenyOnly". 173 // Tests the method "AddSidForDenyOnly".
173 TEST(RestrictedTokenTest, DenySid) { 174 TEST(RestrictedTokenTest, DenySid) {
174 RestrictedToken token; 175 RestrictedToken token;
175 base::win::ScopedHandle token_handle; 176 HANDLE token_handle = NULL;
176 177
177 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 178 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
178 ASSERT_EQ(ERROR_SUCCESS, token.AddSidForDenyOnly(Sid(WinWorldSid))); 179 ASSERT_EQ(ERROR_SUCCESS, token.AddSidForDenyOnly(Sid(WinWorldSid)));
179 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); 180 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
180 181
181 ATL::CAccessToken restricted_token; 182 ATL::CAccessToken restricted_token;
182 restricted_token.Attach(token_handle.Take()); 183 restricted_token.Attach(token_handle);
183 184
184 ATL::CTokenGroups groups; 185 ATL::CTokenGroups groups;
185 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 186 ASSERT_TRUE(restricted_token.GetGroups(&groups));
186 187
187 ATL::CSid::CSidArray sids; 188 ATL::CSid::CSidArray sids;
188 ATL::CAtlArray<DWORD> attributes; 189 ATL::CAtlArray<DWORD> attributes;
189 groups.GetSidsAndAttributes(&sids, &attributes); 190 groups.GetSidsAndAttributes(&sids, &attributes);
190 191
191 for (unsigned int i = 0; i < sids.GetCount(); i++) { 192 for (unsigned int i = 0; i < sids.GetCount(); i++) {
192 if (ATL::Sids::World() == sids[i]) { 193 if (ATL::Sids::World() == sids[i]) {
193 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, 194 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY,
194 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 195 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
195 } 196 }
196 } 197 }
197 } 198 }
198 199
199 // Tests the method "AddAllSidsForDenyOnly". 200 // Tests the method "AddAllSidsForDenyOnly".
200 TEST(RestrictedTokenTest, DenySids) { 201 TEST(RestrictedTokenTest, DenySids) {
201 RestrictedToken token; 202 RestrictedToken token;
202 base::win::ScopedHandle token_handle; 203 HANDLE token_handle = NULL;
203 204
204 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 205 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
205 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(NULL)); 206 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(NULL));
206 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); 207 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
207 208
208 ATL::CAccessToken restricted_token; 209 ATL::CAccessToken restricted_token;
209 restricted_token.Attach(token_handle.Take()); 210 restricted_token.Attach(token_handle);
210 211
211 ATL::CTokenGroups groups; 212 ATL::CTokenGroups groups;
212 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 213 ASSERT_TRUE(restricted_token.GetGroups(&groups));
213 214
214 ATL::CSid::CSidArray sids; 215 ATL::CSid::CSidArray sids;
215 ATL::CAtlArray<DWORD> attributes; 216 ATL::CAtlArray<DWORD> attributes;
216 groups.GetSidsAndAttributes(&sids, &attributes); 217 groups.GetSidsAndAttributes(&sids, &attributes);
217 218
218 // Verify that all sids are really gone. 219 // Verify that all sids are really gone.
219 for (unsigned int i = 0; i < sids.GetCount(); i++) { 220 for (unsigned int i = 0; i < sids.GetCount(); i++) {
220 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 && 221 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 &&
221 (attributes[i] & SE_GROUP_INTEGRITY) == 0) { 222 (attributes[i] & SE_GROUP_INTEGRITY) == 0) {
222 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, 223 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY,
223 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 224 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
224 } 225 }
225 } 226 }
226 } 227 }
227 228
228 // Tests the method "AddAllSidsForDenyOnly" using an exception list. 229 // Tests the method "AddAllSidsForDenyOnly" using an exception list.
229 TEST(RestrictedTokenTest, DenySidsException) { 230 TEST(RestrictedTokenTest, DenySidsException) {
230 RestrictedToken token; 231 RestrictedToken token;
231 base::win::ScopedHandle token_handle; 232 HANDLE token_handle = NULL;
232 233
233 std::vector<Sid> sids_exception; 234 std::vector<Sid> sids_exception;
234 sids_exception.push_back(Sid(WinWorldSid)); 235 sids_exception.push_back(Sid(WinWorldSid));
235 236
236 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 237 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
237 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(&sids_exception)); 238 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(&sids_exception));
238 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); 239 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
239 240
240 ATL::CAccessToken restricted_token; 241 ATL::CAccessToken restricted_token;
241 restricted_token.Attach(token_handle.Take()); 242 restricted_token.Attach(token_handle);
242 243
243 ATL::CTokenGroups groups; 244 ATL::CTokenGroups groups;
244 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 245 ASSERT_TRUE(restricted_token.GetGroups(&groups));
245 246
246 ATL::CSid::CSidArray sids; 247 ATL::CSid::CSidArray sids;
247 ATL::CAtlArray<DWORD> attributes; 248 ATL::CAtlArray<DWORD> attributes;
248 groups.GetSidsAndAttributes(&sids, &attributes); 249 groups.GetSidsAndAttributes(&sids, &attributes);
249 250
250 // Verify that all sids are really gone. 251 // Verify that all sids are really gone.
251 for (unsigned int i = 0; i < sids.GetCount(); i++) { 252 for (unsigned int i = 0; i < sids.GetCount(); i++) {
252 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 && 253 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 &&
253 (attributes[i] & SE_GROUP_INTEGRITY) == 0) { 254 (attributes[i] & SE_GROUP_INTEGRITY) == 0) {
254 if (ATL::Sids::World() == sids[i]) { 255 if (ATL::Sids::World() == sids[i]) {
255 ASSERT_EQ(NULL, attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 256 ASSERT_EQ(NULL, attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
256 } else { 257 } else {
257 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, 258 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY,
258 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 259 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
259 } 260 }
260 } 261 }
261 } 262 }
262 } 263 }
263 264
264 // Tests test method AddOwnerSidForDenyOnly. 265 // Tests test method AddOwnerSidForDenyOnly.
265 TEST(RestrictedTokenTest, DenyOwnerSid) { 266 TEST(RestrictedTokenTest, DenyOwnerSid) {
266 RestrictedToken token; 267 RestrictedToken token;
267 base::win::ScopedHandle token_handle; 268 HANDLE token_handle = NULL;
268 269
269 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 270 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
270 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly()); 271 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly());
271 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); 272 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
272 273
273 ATL::CAccessToken restricted_token; 274 ATL::CAccessToken restricted_token;
274 restricted_token.Attach(token_handle.Take()); 275 restricted_token.Attach(token_handle);
275 276
276 ATL::CTokenGroups groups; 277 ATL::CTokenGroups groups;
277 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 278 ASSERT_TRUE(restricted_token.GetGroups(&groups));
278 279
279 ATL::CSid::CSidArray sids; 280 ATL::CSid::CSidArray sids;
280 ATL::CAtlArray<DWORD> attributes; 281 ATL::CAtlArray<DWORD> attributes;
281 groups.GetSidsAndAttributes(&sids, &attributes); 282 groups.GetSidsAndAttributes(&sids, &attributes);
282 283
283 ATL::CSid user_sid; 284 ATL::CSid user_sid;
284 ASSERT_TRUE(restricted_token.GetUser(&user_sid)); 285 ASSERT_TRUE(restricted_token.GetUser(&user_sid));
285 286
286 for (unsigned int i = 0; i < sids.GetCount(); ++i) { 287 for (unsigned int i = 0; i < sids.GetCount(); ++i) {
287 if (user_sid == sids[i]) { 288 if (user_sid == sids[i]) {
288 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, 289 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY,
289 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); 290 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY);
290 } 291 }
291 } 292 }
292 } 293 }
293 294
294 // Tests test method AddOwnerSidForDenyOnly with a custom effective token. 295 // Tests test method AddOwnerSidForDenyOnly with a custom effective token.
295 TEST(RestrictedTokenTest, DenyOwnerSidCustom) { 296 TEST(RestrictedTokenTest, DenyOwnerSidCustom) {
296 // Get the current process token. 297 // Get the current process token.
297 HANDLE access_handle = INVALID_HANDLE_VALUE; 298 HANDLE token_handle = INVALID_HANDLE_VALUE;
298 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, 299 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS,
299 &access_handle)); 300 &token_handle));
300 301
301 ASSERT_NE(INVALID_HANDLE_VALUE, access_handle); 302 ASSERT_NE(INVALID_HANDLE_VALUE, token_handle);
302 303
303 ATL::CAccessToken access_token; 304 ATL::CAccessToken access_token;
304 access_token.Attach(access_handle); 305 access_token.Attach(token_handle);
305 306
306 RestrictedToken token; 307 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.GetRestrictedToken(&token_handle)); 310 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
311 311
312 ATL::CAccessToken restricted_token; 312 ATL::CAccessToken restricted_token;
313 restricted_token.Attach(token_handle.Take()); 313 restricted_token.Attach(token_handle);
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 base::win::ScopedHandle token_handle; 336 HANDLE token_handle = NULL;
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.GetRestrictedToken(&token_handle)); 340 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
341 341
342 ATL::CAccessToken restricted_token; 342 ATL::CAccessToken restricted_token;
343 restricted_token.Attach(token_handle.Take()); 343 restricted_token.Attach(token_handle);
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 base::win::ScopedHandle token_handle; 354 HANDLE token_handle = NULL;
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.GetRestrictedToken(&token_handle)); 361 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
362 362
363 ATL::CAccessToken restricted_token; 363 ATL::CAccessToken restricted_token;
364 restricted_token.Attach(token_handle.Take()); 364 restricted_token.Attach(token_handle);
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 base::win::ScopedHandle token_handle; 384 HANDLE token_handle = NULL;
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.GetRestrictedToken(&token_handle)); 388 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
389 389
390 ATL::CAccessToken restricted_token; 390 ATL::CAccessToken restricted_token;
391 restricted_token.Attach(token_handle.Take()); 391 restricted_token.Attach(token_handle);
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 base::win::ScopedHandle token_handle; 444 HANDLE token_handle = NULL;
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.GetRestrictedToken(&token_handle)); 449 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
450 450
451 ATL::CAccessToken restricted_token; 451 ATL::CAccessToken restricted_token;
452 restricted_token.Attach(token_handle.Take()); 452 restricted_token.Attach(token_handle);
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 base::win::ScopedHandle token_handle; 460 HANDLE token_handle = NULL;
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.GetRestrictedToken(&token_handle)); 464 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
465 465
466 ATL::CAccessToken restricted_token; 466 ATL::CAccessToken restricted_token;
467 restricted_token.Attach(token_handle.Take()); 467 restricted_token.Attach(token_handle);
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 access_handle = INVALID_HANDLE_VALUE; 477 HANDLE token_handle = INVALID_HANDLE_VALUE;
478 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, 478 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS,
479 &access_handle)); 479 &token_handle));
480 480
481 ASSERT_NE(INVALID_HANDLE_VALUE, access_handle); 481 ASSERT_NE(INVALID_HANDLE_VALUE, token_handle);
482 482
483 ATL::CAccessToken access_token; 483 ATL::CAccessToken access_token;
484 access_token.Attach(access_handle); 484 access_token.Attach(token_handle);
485 485
486 RestrictedToken token; 486 RestrictedToken token;
487 base::win::ScopedHandle token_handle;
488 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); 487 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle()));
489 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); 488 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser());
490 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); 489 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
491 490
492 ATL::CAccessToken restricted_token; 491 ATL::CAccessToken restricted_token;
493 restricted_token.Attach(token_handle.Take()); 492 restricted_token.Attach(token_handle);
494 ATL::CSid user; 493 ATL::CSid user;
495 restricted_token.GetUser(&user); 494 restricted_token.GetUser(&user);
496 495
497 CheckRestrictingSid(restricted_token, user, 1); 496 CheckRestrictingSid(restricted_token, user, 1);
498 } 497 }
499 498
500 // Tests the method AddRestrictingSidLogonSession. 499 // Tests the method AddRestrictingSidLogonSession.
501 TEST(RestrictedTokenTest, AddRestrictingSidLogonSession) { 500 TEST(RestrictedTokenTest, AddRestrictingSidLogonSession) {
502 RestrictedToken token; 501 RestrictedToken token;
503 base::win::ScopedHandle token_handle; 502 HANDLE token_handle = NULL;
504 503
505 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 504 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
506 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession()); 505 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession());
507 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); 506 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
508 507
509 ATL::CAccessToken restricted_token; 508 ATL::CAccessToken restricted_token;
510 restricted_token.Attach(token_handle.Take()); 509 restricted_token.Attach(token_handle);
511 ATL::CSid session; 510 ATL::CSid session;
512 restricted_token.GetLogonSid(&session); 511 restricted_token.GetLogonSid(&session);
513 512
514 CheckRestrictingSid(restricted_token, session, 1); 513 CheckRestrictingSid(restricted_token, session, 1);
515 } 514 }
516 515
517 // Tests adding a lot of restricting sids. 516 // Tests adding a lot of restricting sids.
518 TEST(RestrictedTokenTest, AddMultipleRestrictingSids) { 517 TEST(RestrictedTokenTest, AddMultipleRestrictingSids) {
519 RestrictedToken token; 518 RestrictedToken token;
520 base::win::ScopedHandle token_handle; 519 HANDLE token_handle = NULL;
521 520
522 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 521 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
523 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); 522 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser());
524 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession()); 523 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession());
525 ASSERT_EQ(ERROR_SUCCESS, 524 ASSERT_EQ(ERROR_SUCCESS,
526 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); 525 token.AddRestrictingSid(ATL::Sids::World().GetPSID()));
527 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); 526 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
528 527
529 ATL::CAccessToken restricted_token; 528 ATL::CAccessToken restricted_token;
530 restricted_token.Attach(token_handle.Take()); 529 restricted_token.Attach(token_handle);
531 ATL::CSid session; 530 ATL::CSid session;
532 restricted_token.GetLogonSid(&session); 531 restricted_token.GetLogonSid(&session);
533 532
534 DWORD length = 8192; 533 DWORD length = 8192;
535 BYTE *memory = new BYTE[length]; 534 BYTE *memory = new BYTE[length];
536 TOKEN_GROUPS *groups = reinterpret_cast<TOKEN_GROUPS*>(memory); 535 TOKEN_GROUPS *groups = reinterpret_cast<TOKEN_GROUPS*>(memory);
537 ASSERT_TRUE(::GetTokenInformation(restricted_token.GetHandle(), 536 ASSERT_TRUE(::GetTokenInformation(restricted_token.GetHandle(),
538 TokenRestrictedSids, 537 TokenRestrictedSids,
539 groups, 538 groups,
540 length, 539 length,
541 &length)); 540 &length));
542 541
543 ATL::CTokenGroups atl_groups(*groups); 542 ATL::CTokenGroups atl_groups(*groups);
544 delete[] memory; 543 delete[] memory;
545 544
546 ASSERT_EQ(3, atl_groups.GetCount()); 545 ASSERT_EQ(3, atl_groups.GetCount());
547 } 546 }
548 547
549 // Tests the method "AddRestrictingSidAllSids". 548 // Tests the method "AddRestrictingSidAllSids".
550 TEST(RestrictedTokenTest, AddAllSidToRestrictingSids) { 549 TEST(RestrictedTokenTest, AddAllSidToRestrictingSids) {
551 RestrictedToken token; 550 RestrictedToken token;
552 base::win::ScopedHandle token_handle; 551 HANDLE token_handle = NULL;
553 552
554 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 553 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
555 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidAllSids()); 554 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidAllSids());
556 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); 555 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle));
557 556
558 ATL::CAccessToken restricted_token; 557 ATL::CAccessToken restricted_token;
559 restricted_token.Attach(token_handle.Take()); 558 restricted_token.Attach(token_handle);
560 559
561 ATL::CTokenGroups groups; 560 ATL::CTokenGroups groups;
562 ASSERT_TRUE(restricted_token.GetGroups(&groups)); 561 ASSERT_TRUE(restricted_token.GetGroups(&groups));
563 562
564 ATL::CSid::CSidArray sids; 563 ATL::CSid::CSidArray sids;
565 ATL::CAtlArray<DWORD> attributes; 564 ATL::CAtlArray<DWORD> attributes;
566 groups.GetSidsAndAttributes(&sids, &attributes); 565 groups.GetSidsAndAttributes(&sids, &attributes);
567 566
568 // Verify that all group sids are in the restricting sid list. 567 // Verify that all group sids are in the restricting sid list.
569 for (unsigned int i = 0; i < sids.GetCount(); i++) { 568 for (unsigned int i = 0; i < sids.GetCount(); i++) {
(...skipping 10 matching lines...) Expand all
580 579
581 // Checks the error code when the object is initialized twice. 580 // Checks the error code when the object is initialized twice.
582 TEST(RestrictedTokenTest, DoubleInit) { 581 TEST(RestrictedTokenTest, DoubleInit) {
583 RestrictedToken token; 582 RestrictedToken token;
584 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); 583 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL));
585 584
586 ASSERT_EQ(ERROR_ALREADY_INITIALIZED, token.Init(NULL)); 585 ASSERT_EQ(ERROR_ALREADY_INITIALIZED, token.Init(NULL));
587 } 586 }
588 587
589 } // namespace sandbox 588 } // 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