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

Side by Side Diff: chrome/browser/extensions/api/identity/identity_api.cc

Issue 1306053013: White-listing Chrome Remote Desktop to use the identity API in Public Session (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Return error on failure Created 5 years, 2 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
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 #include "chrome/browser/extensions/api/identity/identity_api.h" 5 #include "chrome/browser/extensions/api/identity/identity_api.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 const char kCanceled[] = "canceled"; 65 const char kCanceled[] = "canceled";
66 66
67 const int kCachedIssueAdviceTTLSeconds = 1; 67 const int kCachedIssueAdviceTTLSeconds = 1;
68 } // namespace identity_constants 68 } // namespace identity_constants
69 69
70 namespace { 70 namespace {
71 71
72 static const char kChromiumDomainRedirectUrlPattern[] = 72 static const char kChromiumDomainRedirectUrlPattern[] =
73 "https://%s.chromiumapp.org/"; 73 "https://%s.chromiumapp.org/";
74 74
75 #if defined(OS_CHROMEOS)
76 // The list of apps that are allowed to use the Identity API to retrieve the
77 // token from the device robot account in a public session.
78 const char* const kPublicSessionAllowedOrigins[] = {
79 // Chrome Remote Desktop - Chromium branding.
80 "chrome-extension://ljacajndfccfgnfohlgkdphmbnpkjflk/",
81 // Chrome Remote Desktop - Official branding.
82 "chrome-extension://gbchcmhmhahfdphkhkmpfmihenigjmpp/"};
83 #endif
84
75 std::string GetPrimaryAccountId(content::BrowserContext* context) { 85 std::string GetPrimaryAccountId(content::BrowserContext* context) {
76 SigninManagerBase* signin_manager = 86 SigninManagerBase* signin_manager =
77 SigninManagerFactory::GetForProfile(Profile::FromBrowserContext(context)); 87 SigninManagerFactory::GetForProfile(Profile::FromBrowserContext(context));
78 return signin_manager->GetAuthenticatedAccountId(); 88 return signin_manager->GetAuthenticatedAccountId();
79 } 89 }
80 90
81 } // namespace 91 } // namespace
82 92
83 namespace identity = api::identity; 93 namespace identity = api::identity;
84 94
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 374
365 token_key_.reset( 375 token_key_.reset(
366 new ExtensionTokenKey(extension()->id(), account_key, scopes)); 376 new ExtensionTokenKey(extension()->id(), account_key, scopes));
367 377
368 // From here on out, results must be returned asynchronously. 378 // From here on out, results must be returned asynchronously.
369 StartAsyncRun(); 379 StartAsyncRun();
370 380
371 #if defined(OS_CHROMEOS) 381 #if defined(OS_CHROMEOS)
372 policy::BrowserPolicyConnectorChromeOS* connector = 382 policy::BrowserPolicyConnectorChromeOS* connector =
373 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 383 g_browser_process->platform_part()->browser_policy_connector_chromeos();
374 if (user_manager::UserManager::Get()->IsLoggedInAsKioskApp() && 384 bool is_kiosk = user_manager::UserManager::Get()->IsLoggedInAsKioskApp();
375 connector->IsEnterpriseManaged()) { 385 bool is_public_session =
386 user_manager::UserManager::Get()->IsLoggedInAsPublicAccount();
387
388 if (connector->IsEnterpriseManaged() && (is_kiosk || is_public_session)) {
389 if (is_public_session && !IsOriginWhitelistedInPublicSession()) {
390 CompleteFunctionWithError(identity_constants::kUserNotSignedIn);
391 return true;
392 }
393
376 StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE); 394 StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE);
377 return true; 395 return true;
378 } 396 }
379 #endif 397 #endif
380 398
381 if (!HasLoginToken()) { 399 if (!HasLoginToken()) {
382 if (!should_prompt_for_signin_) { 400 if (!should_prompt_for_signin_) {
383 CompleteFunctionWithError(identity_constants::kUserNotSignedIn); 401 CompleteFunctionWithError(identity_constants::kUserNotSignedIn);
384 return true; 402 return true;
385 } 403 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension()); 505 const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension());
488 IdentityAPI* id_api = IdentityAPI::GetFactoryInstance()->Get(GetProfile()); 506 IdentityAPI* id_api = IdentityAPI::GetFactoryInstance()->Get(GetProfile());
489 IdentityTokenCacheValue cache_entry = id_api->GetCachedToken(*token_key_); 507 IdentityTokenCacheValue cache_entry = id_api->GetCachedToken(*token_key_);
490 IdentityTokenCacheValue::CacheValueStatus cache_status = 508 IdentityTokenCacheValue::CacheValueStatus cache_status =
491 cache_entry.status(); 509 cache_entry.status();
492 510
493 if (type == IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE) { 511 if (type == IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE) {
494 switch (cache_status) { 512 switch (cache_status) {
495 case IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND: 513 case IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND:
496 #if defined(OS_CHROMEOS) 514 #if defined(OS_CHROMEOS)
497 // Always force minting token for ChromeOS kiosk app. 515 // Always force minting token for ChromeOS kiosk app.
Andrew T Wilson (Slow) 2015/09/29 13:20:30 Comment is out of date since we support public ses
kelvinp 2015/09/29 18:08:50 Done.
498 if (user_manager::UserManager::Get()->IsLoggedInAsKioskApp()) { 516 if (user_manager::UserManager::Get()->IsLoggedInAsPublicAccount() &&
517 !IsOriginWhitelistedInPublicSession()) {
518 CompleteFunctionWithError(identity_constants::kUserNotSignedIn);
519 return;
520 }
521
522 if (user_manager::UserManager::Get()->IsLoggedInAsKioskApp() ||
523 user_manager::UserManager::Get()->IsLoggedInAsPublicAccount()) {
499 gaia_mint_token_mode_ = OAuth2MintTokenFlow::MODE_MINT_TOKEN_FORCE; 524 gaia_mint_token_mode_ = OAuth2MintTokenFlow::MODE_MINT_TOKEN_FORCE;
500 policy::BrowserPolicyConnectorChromeOS* connector = 525 policy::BrowserPolicyConnectorChromeOS* connector =
501 g_browser_process->platform_part() 526 g_browser_process->platform_part()
502 ->browser_policy_connector_chromeos(); 527 ->browser_policy_connector_chromeos();
503 if (connector->IsEnterpriseManaged()) { 528 if (connector->IsEnterpriseManaged()) {
504 StartDeviceLoginAccessTokenRequest(); 529 StartDeviceLoginAccessTokenRequest();
505 } else { 530 } else {
506 StartLoginAccessTokenRequest(); 531 StartLoginAccessTokenRequest();
507 } 532 }
508 return; 533 return;
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 chromeos::DeviceOAuth2TokenServiceFactory::Get(); 771 chromeos::DeviceOAuth2TokenServiceFactory::Get();
747 // Since robot account refresh tokens are scoped down to [any-api] only, 772 // Since robot account refresh tokens are scoped down to [any-api] only,
748 // request access token for [any-api] instead of login. 773 // request access token for [any-api] instead of login.
749 OAuth2TokenService::ScopeSet scopes; 774 OAuth2TokenService::ScopeSet scopes;
750 scopes.insert(GaiaConstants::kAnyApiOAuth2Scope); 775 scopes.insert(GaiaConstants::kAnyApiOAuth2Scope);
751 login_token_request_ = 776 login_token_request_ =
752 service->StartRequest(service->GetRobotAccountId(), 777 service->StartRequest(service->GetRobotAccountId(),
753 scopes, 778 scopes,
754 this); 779 this);
755 } 780 }
781
782 bool IdentityGetAuthTokenFunction::IsOriginWhitelistedInPublicSession() {
783 for (unsigned int i = 0; i < arraysize(kPublicSessionAllowedOrigins); i++) {
Andrew T Wilson (Slow) 2015/09/29 13:20:30 nit: should i be size_t, not unsigned int? Also, w
kelvinp 2015/09/29 18:08:50 Good catch.
784 URLPattern allowed_origin(URLPattern::SCHEME_ALL,
785 kPublicSessionAllowedOrigins[i]);
786 DCHECK(extension());
Andrew T Wilson (Slow) 2015/09/29 13:20:30 Move this DCHECK outside the loop? And maybe also
kelvinp 2015/09/29 18:08:49 Done.
787 if (allowed_origin.MatchesSecurityOrigin(extension()->url())) {
788 return true;
789 }
790 }
791 return false;
792 }
756 #endif 793 #endif
757 794
758 void IdentityGetAuthTokenFunction::StartLoginAccessTokenRequest() { 795 void IdentityGetAuthTokenFunction::StartLoginAccessTokenRequest() {
759 ProfileOAuth2TokenService* service = 796 ProfileOAuth2TokenService* service =
760 ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile()); 797 ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile());
761 #if defined(OS_CHROMEOS) 798 #if defined(OS_CHROMEOS)
762 if (chrome::IsRunningInForcedAppMode()) { 799 if (chrome::IsRunningInForcedAppMode()) {
763 std::string app_client_id; 800 std::string app_client_id;
764 std::string app_client_secret; 801 std::string app_client_secret;
765 if (chromeos::UserSessionManager::GetInstance()-> 802 if (chromeos::UserSessionManager::GetInstance()->
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 if (redirect_url.GetWithEmptyPath() == final_url_prefix_) { 1006 if (redirect_url.GetWithEmptyPath() == final_url_prefix_) {
970 SetResult(new base::StringValue(redirect_url.spec())); 1007 SetResult(new base::StringValue(redirect_url.spec()));
971 SendResponse(true); 1008 SendResponse(true);
972 if (auth_flow_) 1009 if (auth_flow_)
973 auth_flow_.release()->DetachDelegateAndDelete(); 1010 auth_flow_.release()->DetachDelegateAndDelete();
974 Release(); // Balanced in RunAsync. 1011 Release(); // Balanced in RunAsync.
975 } 1012 }
976 } 1013 }
977 1014
978 } // namespace extensions 1015 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698