| OLD | NEW |
| 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 #include "chrome/browser/extensions/api/file_system/file_system_api.h" | 5 #include "chrome/browser/extensions/api/file_system/file_system_api.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 #if defined(OS_WIN) | 75 #if defined(OS_WIN) |
| 76 #define ToStringType base::UTF8ToWide | 76 #define ToStringType base::UTF8ToWide |
| 77 #else | 77 #else |
| 78 #define ToStringType | 78 #define ToStringType |
| 79 #endif | 79 #endif |
| 80 | 80 |
| 81 #if defined(OS_CHROMEOS) | 81 #if defined(OS_CHROMEOS) |
| 82 // Registers a request for a user consent by incrementing the counter. | 82 // Registers a request for a user consent by incrementing the counter. |
| 83 // Additionally simulates completing the user consent request with the | 83 // Additionally simulates completing the user consent request with the |
| 84 // |response| result. | 84 // |response| result. |
| 85 void OnUserConsentRequested(int* counter, | 85 void OnAskUser(int* counter, |
| 86 const ConsentProvider::Consent response, | 86 const ConsentProvider::Consent response, |
| 87 const VolumeInfo& volume_info, | 87 const VolumeInfo& volume_info, |
| 88 bool writable, | 88 bool writable, |
| 89 const ConsentProvider::ConsentCallback& callback) { | 89 const ConsentProvider::ConsentCallback& callback) { |
| 90 (*counter)++; | 90 (*counter)++; |
| 91 callback.Run(response); | 91 callback.Run(response); |
| 92 } | 92 } |
| 93 | 93 |
| 94 // Registers user notifications about auto-granting permissions. |
| 95 void OnNotifyUser(int* counter, const VolumeInfo& volume_info, bool writable) { |
| 96 (*counter)++; |
| 97 } |
| 98 |
| 94 // Rewrites result of a consent request from |result| to |log|. | 99 // Rewrites result of a consent request from |result| to |log|. |
| 95 void OnConsentReceived(ConsentProvider::Consent* log, | 100 void OnConsentReceived(ConsentProvider::Consent* log, |
| 96 const ConsentProvider::Consent result) { | 101 const ConsentProvider::Consent result) { |
| 97 *log = result; | 102 *log = result; |
| 98 } | 103 } |
| 99 | 104 |
| 100 // Returns a fake value whether an extension is auto launched or not. | 105 // Returns a fake value whether an extension is auto launched or not. |
| 101 bool OnIsAutoLaunched(bool response, const Extension& extension) { | 106 bool OnIsAutoLaunched(bool response, const Extension& extension) { |
| 102 return response; | 107 return response; |
| 103 } | 108 } |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 #endif | 269 #endif |
| 265 } | 270 } |
| 266 | 271 |
| 267 #if defined(OS_CHROMEOS) | 272 #if defined(OS_CHROMEOS) |
| 268 TEST_F(FileSystemApiConsentProviderTest, ForNonKioskApps) { | 273 TEST_F(FileSystemApiConsentProviderTest, ForNonKioskApps) { |
| 269 // Component apps are not granted unless they are whitelisted. | 274 // Component apps are not granted unless they are whitelisted. |
| 270 { | 275 { |
| 271 scoped_refptr<Extension> component_extension( | 276 scoped_refptr<Extension> component_extension( |
| 272 test_util::BuildApp(ExtensionBuilder().SetLocation(Manifest::COMPONENT)) | 277 test_util::BuildApp(ExtensionBuilder().SetLocation(Manifest::COMPONENT)) |
| 273 .Build()); | 278 .Build()); |
| 274 int user_consent_counter = 0; | 279 int ask_user_counter = 0; |
| 275 ConsentProvider provider(base::Bind(&OnUserConsentRequested, | 280 int notify_user_counter = 0; |
| 276 &user_consent_counter, | 281 ConsentProvider provider(base::Bind(&OnAskUser, &ask_user_counter, |
| 277 ConsentProvider::CONSENT_GRANTED)); | 282 ConsentProvider::CONSENT_GRANTED), |
| 283 base::Bind(&OnNotifyUser, ¬ify_user_counter)); |
| 278 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); | 284 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); |
| 279 EXPECT_FALSE(provider.IsGrantable(*component_extension)); | 285 EXPECT_FALSE(provider.IsGrantable(*component_extension)); |
| 280 | 286 |
| 281 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 287 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 282 provider.RequestConsent(*component_extension.get(), volume_info_, | 288 provider.RequestConsent(*component_extension.get(), volume_info_, |
| 283 true /* writable */, | 289 true /* writable */, |
| 284 base::Bind(&OnConsentReceived, &result)); | 290 base::Bind(&OnConsentReceived, &result)); |
| 285 base::RunLoop().RunUntilIdle(); | 291 base::RunLoop().RunUntilIdle(); |
| 286 | 292 |
| 287 EXPECT_EQ(0, user_consent_counter); | 293 EXPECT_EQ(0, ask_user_counter); |
| 294 EXPECT_EQ(0, notify_user_counter); |
| 288 EXPECT_EQ(ConsentProvider::CONSENT_REJECTED, result); | 295 EXPECT_EQ(ConsentProvider::CONSENT_REJECTED, result); |
| 289 } | 296 } |
| 290 | 297 |
| 291 // Whitelitsted component apps are instantly granted access without asking | 298 // Whitelitsted component apps are instantly granted access without asking |
| 292 // user. | 299 // user. |
| 293 { | 300 { |
| 294 scoped_refptr<Extension> whitelisted_component_extension( | 301 scoped_refptr<Extension> whitelisted_component_extension( |
| 295 test_util::BuildApp(ExtensionBuilder().SetLocation(Manifest::COMPONENT)) | 302 test_util::BuildApp(ExtensionBuilder().SetLocation(Manifest::COMPONENT)) |
| 296 .Build()); | 303 .Build()); |
| 297 int user_consent_counter = 0; | 304 int ask_user_counter = 0; |
| 298 ConsentProvider provider(base::Bind(&OnUserConsentRequested, | 305 int notify_user_counter = 0; |
| 299 &user_consent_counter, | 306 ConsentProvider provider(base::Bind(&OnAskUser, &ask_user_counter, |
| 300 ConsentProvider::CONSENT_REJECTED)); | 307 ConsentProvider::CONSENT_REJECTED), |
| 308 base::Bind(&OnNotifyUser, ¬ify_user_counter)); |
| 301 std::set<std::string> whitelist; | 309 std::set<std::string> whitelist; |
| 302 whitelist.insert(whitelisted_component_extension->id()); | 310 whitelist.insert(whitelisted_component_extension->id()); |
| 303 provider.SetComponentWhitelistForTesting(whitelist); | 311 provider.SetComponentWhitelistForTesting(whitelist); |
| 304 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); | 312 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); |
| 305 EXPECT_TRUE(provider.IsGrantable(*whitelisted_component_extension)); | 313 EXPECT_TRUE(provider.IsGrantable(*whitelisted_component_extension)); |
| 306 | 314 |
| 307 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 315 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 308 provider.RequestConsent(*whitelisted_component_extension.get(), | 316 provider.RequestConsent(*whitelisted_component_extension.get(), |
| 309 volume_info_, true /* writable */, | 317 volume_info_, true /* writable */, |
| 310 base::Bind(&OnConsentReceived, &result)); | 318 base::Bind(&OnConsentReceived, &result)); |
| 311 base::RunLoop().RunUntilIdle(); | 319 base::RunLoop().RunUntilIdle(); |
| 312 | 320 |
| 313 EXPECT_EQ(0, user_consent_counter); | 321 EXPECT_EQ(0, ask_user_counter); |
| 322 EXPECT_EQ(0, notify_user_counter); |
| 314 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); | 323 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); |
| 315 } | 324 } |
| 316 | 325 |
| 317 // Non-component apps in non-kiosk mode will be rejected instantly, without | 326 // Non-component apps in non-kiosk mode will be rejected instantly, without |
| 318 // asking for user consent. | 327 // asking for user consent. |
| 319 { | 328 { |
| 320 scoped_refptr<Extension> non_component_extension( | 329 scoped_refptr<Extension> non_component_extension( |
| 321 test_util::CreateEmptyExtension()); | 330 test_util::CreateEmptyExtension()); |
| 322 int user_consent_counter = 0; | 331 int ask_user_counter = 0; |
| 323 ConsentProvider provider(base::Bind(&OnUserConsentRequested, | 332 int notify_user_counter = 0; |
| 324 &user_consent_counter, | 333 ConsentProvider provider(base::Bind(&OnAskUser, &ask_user_counter, |
| 325 ConsentProvider::CONSENT_GRANTED)); | 334 ConsentProvider::CONSENT_GRANTED), |
| 335 base::Bind(&OnNotifyUser, ¬ify_user_counter)); |
| 326 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); | 336 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); |
| 327 EXPECT_FALSE(provider.IsGrantable(*non_component_extension)); | 337 EXPECT_FALSE(provider.IsGrantable(*non_component_extension)); |
| 328 | 338 |
| 329 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 339 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 330 provider.RequestConsent(*non_component_extension.get(), volume_info_, | 340 provider.RequestConsent(*non_component_extension.get(), volume_info_, |
| 331 true /* writable */, | 341 true /* writable */, |
| 332 base::Bind(&OnConsentReceived, &result)); | 342 base::Bind(&OnConsentReceived, &result)); |
| 333 base::RunLoop().RunUntilIdle(); | 343 base::RunLoop().RunUntilIdle(); |
| 334 | 344 |
| 335 EXPECT_EQ(0, user_consent_counter); | 345 EXPECT_EQ(0, ask_user_counter); |
| 346 EXPECT_EQ(0, notify_user_counter); |
| 336 EXPECT_EQ(ConsentProvider::CONSENT_REJECTED, result); | 347 EXPECT_EQ(ConsentProvider::CONSENT_REJECTED, result); |
| 337 } | 348 } |
| 338 } | 349 } |
| 339 | 350 |
| 340 TEST_F(FileSystemApiConsentProviderTest, ForKioskApps) { | 351 TEST_F(FileSystemApiConsentProviderTest, ForKioskApps) { |
| 341 // Non-component apps in auto-launch kiosk mode will be granted access | 352 // Non-component apps in auto-launch kiosk mode will be granted access |
| 342 // instantly without asking for user consent. | 353 // instantly without asking for user consent, but with a notification. |
| 343 { | 354 { |
| 344 scoped_refptr<Extension> auto_launch_kiosk_app( | 355 scoped_refptr<Extension> auto_launch_kiosk_app( |
| 345 test_util::BuildApp(ExtensionBuilder().Pass()) | 356 test_util::BuildApp(ExtensionBuilder().Pass()) |
| 346 .MergeManifest(DictionaryBuilder() | 357 .MergeManifest(DictionaryBuilder() |
| 347 .SetBoolean("kiosk_enabled", true) | 358 .SetBoolean("kiosk_enabled", true) |
| 348 .SetBoolean("kiosk_only", true)) | 359 .SetBoolean("kiosk_only", true)) |
| 349 .Build()); | 360 .Build()); |
| 350 user_manager_->AddKioskAppUser(auto_launch_kiosk_app->id()); | 361 user_manager_->AddKioskAppUser(auto_launch_kiosk_app->id()); |
| 351 user_manager_->LoginUser(auto_launch_kiosk_app->id()); | 362 user_manager_->LoginUser(auto_launch_kiosk_app->id()); |
| 352 | 363 |
| 353 int user_consent_counter = 0; | 364 int ask_user_counter = 0; |
| 354 ConsentProvider provider(base::Bind(&OnUserConsentRequested, | 365 int notify_user_counter = 0; |
| 355 &user_consent_counter, | 366 ConsentProvider provider(base::Bind(&OnAskUser, &ask_user_counter, |
| 356 ConsentProvider::CONSENT_REJECTED)); | 367 ConsentProvider::CONSENT_REJECTED), |
| 368 base::Bind(&OnNotifyUser, ¬ify_user_counter)); |
| 357 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, true)); | 369 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, true)); |
| 358 EXPECT_TRUE(provider.IsGrantable(*auto_launch_kiosk_app)); | 370 EXPECT_TRUE(provider.IsGrantable(*auto_launch_kiosk_app)); |
| 359 | 371 |
| 360 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 372 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 361 provider.RequestConsent(*auto_launch_kiosk_app.get(), volume_info_, | 373 provider.RequestConsent(*auto_launch_kiosk_app.get(), volume_info_, |
| 362 true /* writable */, | 374 true /* writable */, |
| 363 base::Bind(&OnConsentReceived, &result)); | 375 base::Bind(&OnConsentReceived, &result)); |
| 364 base::RunLoop().RunUntilIdle(); | 376 base::RunLoop().RunUntilIdle(); |
| 365 | 377 |
| 366 EXPECT_EQ(0, user_consent_counter); | 378 EXPECT_EQ(0, ask_user_counter); |
| 379 EXPECT_EQ(1, notify_user_counter); |
| 367 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); | 380 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); |
| 368 } | 381 } |
| 369 | 382 |
| 370 // Non-component apps in manual-launch kiosk mode will be granted access after | 383 // Non-component apps in manual-launch kiosk mode will be granted access after |
| 371 // receiving a user consent. | 384 // receiving a user consent. |
| 372 scoped_refptr<Extension> manual_launch_kiosk_app( | 385 scoped_refptr<Extension> manual_launch_kiosk_app( |
| 373 test_util::BuildApp(ExtensionBuilder().Pass()) | 386 test_util::BuildApp(ExtensionBuilder().Pass()) |
| 374 .MergeManifest(DictionaryBuilder() | 387 .MergeManifest(DictionaryBuilder() |
| 375 .SetBoolean("kiosk_enabled", true) | 388 .SetBoolean("kiosk_enabled", true) |
| 376 .SetBoolean("kiosk_only", true)) | 389 .SetBoolean("kiosk_only", true)) |
| 377 .Build()); | 390 .Build()); |
| 378 user_manager_->KioskAppLoggedIn(manual_launch_kiosk_app->id()); | 391 user_manager_->KioskAppLoggedIn(manual_launch_kiosk_app->id()); |
| 379 { | 392 { |
| 380 int user_consent_counter = 0; | 393 int ask_user_counter = 0; |
| 381 ConsentProvider provider(base::Bind(&OnUserConsentRequested, | 394 int notify_user_counter = 0; |
| 382 &user_consent_counter, | 395 ConsentProvider provider(base::Bind(&OnAskUser, &ask_user_counter, |
| 383 ConsentProvider::CONSENT_GRANTED)); | 396 ConsentProvider::CONSENT_GRANTED), |
| 397 base::Bind(&OnNotifyUser, ¬ify_user_counter)); |
| 384 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); | 398 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); |
| 385 EXPECT_TRUE(provider.IsGrantable(*manual_launch_kiosk_app)); | 399 EXPECT_TRUE(provider.IsGrantable(*manual_launch_kiosk_app)); |
| 386 | 400 |
| 387 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 401 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 388 provider.RequestConsent(*manual_launch_kiosk_app.get(), volume_info_, | 402 provider.RequestConsent(*manual_launch_kiosk_app.get(), volume_info_, |
| 389 true /* writable */, | 403 true /* writable */, |
| 390 base::Bind(&OnConsentReceived, &result)); | 404 base::Bind(&OnConsentReceived, &result)); |
| 391 base::RunLoop().RunUntilIdle(); | 405 base::RunLoop().RunUntilIdle(); |
| 392 | 406 |
| 393 EXPECT_EQ(1, user_consent_counter); | 407 EXPECT_EQ(1, ask_user_counter); |
| 408 EXPECT_EQ(0, notify_user_counter); |
| 394 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); | 409 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); |
| 395 } | 410 } |
| 396 | 411 |
| 397 // Non-component apps in manual-launch kiosk mode will be rejected access | 412 // Non-component apps in manual-launch kiosk mode will be rejected access |
| 398 // after rejecting by a user. | 413 // after rejecting by a user. |
| 399 { | 414 { |
| 400 int user_consent_counter = 0; | 415 int ask_user_counter = 0; |
| 401 ConsentProvider provider(base::Bind(&OnUserConsentRequested, | 416 int notify_user_counter = 0; |
| 402 &user_consent_counter, | 417 ConsentProvider provider(base::Bind(&OnAskUser, &ask_user_counter, |
| 403 ConsentProvider::CONSENT_REJECTED)); | 418 ConsentProvider::CONSENT_REJECTED), |
| 419 base::Bind(&OnNotifyUser, ¬ify_user_counter)); |
| 404 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); | 420 provider.SetIsAutoLaunchedForTesting(base::Bind(&OnIsAutoLaunched, false)); |
| 405 EXPECT_TRUE(provider.IsGrantable(*manual_launch_kiosk_app)); | 421 EXPECT_TRUE(provider.IsGrantable(*manual_launch_kiosk_app)); |
| 406 | 422 |
| 407 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 423 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 408 provider.RequestConsent(*manual_launch_kiosk_app.get(), volume_info_, | 424 provider.RequestConsent(*manual_launch_kiosk_app.get(), volume_info_, |
| 409 true /* writable */, | 425 true /* writable */, |
| 410 base::Bind(&OnConsentReceived, &result)); | 426 base::Bind(&OnConsentReceived, &result)); |
| 411 base::RunLoop().RunUntilIdle(); | 427 base::RunLoop().RunUntilIdle(); |
| 412 | 428 |
| 413 EXPECT_EQ(1, user_consent_counter); | 429 EXPECT_EQ(1, ask_user_counter); |
| 430 EXPECT_EQ(0, notify_user_counter); |
| 414 EXPECT_EQ(ConsentProvider::CONSENT_REJECTED, result); | 431 EXPECT_EQ(ConsentProvider::CONSENT_REJECTED, result); |
| 415 } | 432 } |
| 416 } | 433 } |
| 417 #endif | 434 #endif |
| 418 | 435 |
| 419 } // namespace extensions | 436 } // namespace extensions |
| OLD | NEW |