From b70a2d931144ec3dfa9f505f37713da331114ede Mon Sep 17 00:00:00 2001 From: "estade@chromium.org" Date: Thu, 28 Jun 2012 19:51:21 +0000 Subject: retry r144574 with read-after-free fix. Modify experimental identity flow to display scope descriptions and details. Only desktop Linux should be affected for now. largely based on patch by jstritar BUG=130206 TEST=manual Review URL: https://chromiumcodereview.appspot.com/10706005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@144782 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser/extensions/extension_install_prompt.cc | 74 ++++++++++++++++++++-- 1 file changed, 69 insertions(+), 5 deletions(-) (limited to 'chrome/browser/extensions/extension_install_prompt.cc') diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc index 2254cdd..43472be 100644 --- a/chrome/browser/extensions/extension_install_prompt.cc +++ b/chrome/browser/extensions/extension_install_prompt.cc @@ -17,6 +17,8 @@ #include "chrome/browser/extensions/extension_install_dialog.h" #include "chrome/browser/extensions/extension_install_ui.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/token_service.h" +#include "chrome/browser/signin/token_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/tab_contents/tab_contents.h" @@ -102,6 +104,11 @@ void ExtensionInstallPrompt::Prompt::SetPermissions( permissions_ = permissions; } +void ExtensionInstallPrompt::Prompt::SetOAuthIssueAdvice( + const IssueAdviceInfo& issue_advice) { + oauth_issue_advice_ = issue_advice; +} + void ExtensionInstallPrompt::Prompt::SetInlineInstallWebstoreData( const std::string& localized_user_count, double average_rating, @@ -209,6 +216,16 @@ string16 ExtensionInstallPrompt::Prompt::GetPermission(size_t index) const { IDS_EXTENSION_PERMISSION_LINE, permissions_[index]); } +size_t ExtensionInstallPrompt::Prompt::GetOAuthIssueCount() const { + return oauth_issue_advice_.size(); +} + +const IssueAdviceInfoEntry& ExtensionInstallPrompt::Prompt::GetOAuthIssue( + size_t index) const { + CHECK_LT(index, oauth_issue_advice_.size()); + return oauth_issue_advice_[index]; +} + // static scoped_refptr ExtensionInstallPrompt::GetLocalizedExtensionForDisplay( @@ -240,7 +257,8 @@ scoped_refptr } ExtensionInstallPrompt::ExtensionInstallPrompt(Browser* browser) - : browser_(browser), + : record_oauth2_grant_(ShouldAutomaticallyApproveScopes()), + browser_(browser), ui_loop_(MessageLoop::current()), extension_(NULL), install_ui_(ExtensionInstallUI::Create(browser)), @@ -262,7 +280,7 @@ void ExtensionInstallPrompt::ConfirmBundleInstall( delegate_ = bundle; prompt_type_ = BUNDLE_INSTALL_PROMPT; - ShowConfirmation(); + FetchOAuthIssueAdviceIfNeeded(); } void ExtensionInstallPrompt::ConfirmInlineInstall( @@ -278,7 +296,7 @@ void ExtensionInstallPrompt::ConfirmInlineInstall( prompt_type_ = INLINE_INSTALL_PROMPT; SetIcon(icon); - ShowConfirmation(); + FetchOAuthIssueAdviceIfNeeded(); } void ExtensionInstallPrompt::ConfirmWebstoreInstall(Delegate* delegate, @@ -366,13 +384,13 @@ void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image, const std::string& extension_id, int index) { SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap()); - ShowConfirmation(); + FetchOAuthIssueAdviceIfNeeded(); } void ExtensionInstallPrompt::LoadImageIfNeeded() { // Bundle install prompts do not have an icon. if (!icon_.empty()) { - ShowConfirmation(); + FetchOAuthIssueAdviceIfNeeded(); return; } @@ -385,6 +403,46 @@ void ExtensionInstallPrompt::LoadImageIfNeeded() { ImageLoadingTracker::DONT_CACHE); } +void ExtensionInstallPrompt::FetchOAuthIssueAdviceIfNeeded() { + const Extension::OAuth2Info& oauth2_info = extension_->oauth2_info(); + if (ShouldAutomaticallyApproveScopes() || + oauth2_info.client_id.empty() || + permissions_->scopes().empty() || + prompt_type_ == BUNDLE_INSTALL_PROMPT || + prompt_type_ == INLINE_INSTALL_PROMPT) { + ShowConfirmation(); + return; + } + + Profile* profile = install_ui_->browser()->profile(); + TokenService* token_service = TokenServiceFactory::GetForProfile(profile); + std::vector scopes; + scopes.assign(permissions_->scopes().begin(), permissions_->scopes().end()); + + token_flow_.reset(new OAuth2MintTokenFlow( + profile->GetRequestContext(), + this, + OAuth2MintTokenFlow::Parameters( + token_service->GetOAuth2LoginRefreshToken(), + extension_->id(), + oauth2_info.client_id, + scopes, + OAuth2MintTokenFlow::MODE_ISSUE_ADVICE))); + token_flow_->Start(); +} + +void ExtensionInstallPrompt::OnIssueAdviceSuccess( + const IssueAdviceInfo& advice_info) { + prompt_.SetOAuthIssueAdvice(advice_info); + record_oauth2_grant_ = true; + ShowConfirmation(); +} + +void ExtensionInstallPrompt::OnMintTokenFailure( + const GoogleServiceAuthError& error) { + ShowConfirmation(); +} + void ExtensionInstallPrompt::ShowConfirmation() { prompt_.set_type(prompt_type_); prompt_.SetPermissions(permissions_->GetWarningMessages()); @@ -409,3 +467,9 @@ void ExtensionInstallPrompt::ShowConfirmation() { break; } } + +// static +bool ExtensionInstallPrompt::ShouldAutomaticallyApproveScopes() { + return !CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDemandUserScopeApproval); +} -- cgit v1.1