| 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/updater/extension_downloader.h" | 5 #include "chrome/browser/extensions/updater/extension_downloader.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 version(version), | 169 version(version), |
| 170 request_ids(request_ids), | 170 request_ids(request_ids), |
| 171 credentials(CREDENTIALS_NONE), | 171 credentials(CREDENTIALS_NONE), |
| 172 oauth2_attempt_count(0) { | 172 oauth2_attempt_count(0) { |
| 173 } | 173 } |
| 174 | 174 |
| 175 ExtensionDownloader::ExtensionFetch::~ExtensionFetch() {} | 175 ExtensionDownloader::ExtensionFetch::~ExtensionFetch() {} |
| 176 | 176 |
| 177 ExtensionDownloader::ExtensionDownloader( | 177 ExtensionDownloader::ExtensionDownloader( |
| 178 ExtensionDownloaderDelegate* delegate, | 178 ExtensionDownloaderDelegate* delegate, |
| 179 net::URLRequestContextGetter* request_context, | 179 net::URLRequestContextGetter* request_context) |
| 180 IdentityProvider* webstore_identity_provider) | |
| 181 : OAuth2TokenService::Consumer(kTokenServiceConsumerId), | 180 : OAuth2TokenService::Consumer(kTokenServiceConsumerId), |
| 182 delegate_(delegate), | 181 delegate_(delegate), |
| 183 request_context_(request_context), | 182 request_context_(request_context), |
| 184 weak_ptr_factory_(this), | 183 weak_ptr_factory_(this), |
| 185 manifests_queue_(&kDefaultBackoffPolicy, | 184 manifests_queue_(&kDefaultBackoffPolicy, |
| 186 base::Bind(&ExtensionDownloader::CreateManifestFetcher, | 185 base::Bind(&ExtensionDownloader::CreateManifestFetcher, |
| 187 base::Unretained(this))), | 186 base::Unretained(this))), |
| 188 extensions_queue_(&kDefaultBackoffPolicy, | 187 extensions_queue_(&kDefaultBackoffPolicy, |
| 189 base::Bind(&ExtensionDownloader::CreateExtensionFetcher, | 188 base::Bind(&ExtensionDownloader::CreateExtensionFetcher, |
| 190 base::Unretained(this))), | 189 base::Unretained(this))), |
| 191 extension_cache_(NULL), | 190 extension_cache_(NULL) { |
| 192 identity_provider_(webstore_identity_provider) { | |
| 193 DCHECK(delegate_); | 191 DCHECK(delegate_); |
| 194 DCHECK(request_context_); | 192 DCHECK(request_context_); |
| 195 } | 193 } |
| 196 | 194 |
| 197 ExtensionDownloader::~ExtensionDownloader() {} | 195 ExtensionDownloader::~ExtensionDownloader() {} |
| 198 | 196 |
| 199 bool ExtensionDownloader::AddExtension(const Extension& extension, | 197 bool ExtensionDownloader::AddExtension(const Extension& extension, |
| 200 int request_id) { | 198 int request_id) { |
| 201 // Skip extensions with empty update URLs converted from user | 199 // Skip extensions with empty update URLs converted from user |
| 202 // scripts. | 200 // scripts. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 request_id)); | 270 request_id)); |
| 273 DCHECK(blacklist_fetch->base_url().SchemeIsSecure()); | 271 DCHECK(blacklist_fetch->base_url().SchemeIsSecure()); |
| 274 blacklist_fetch->AddExtension(kBlacklistAppID, | 272 blacklist_fetch->AddExtension(kBlacklistAppID, |
| 275 version, | 273 version, |
| 276 &ping_data, | 274 &ping_data, |
| 277 std::string(), | 275 std::string(), |
| 278 kDefaultInstallSource); | 276 kDefaultInstallSource); |
| 279 StartUpdateCheck(blacklist_fetch.Pass()); | 277 StartUpdateCheck(blacklist_fetch.Pass()); |
| 280 } | 278 } |
| 281 | 279 |
| 280 void ExtensionDownloader::SetWebstoreIdentityProvider( |
| 281 scoped_ptr<IdentityProvider> identity_provider) { |
| 282 identity_provider_.swap(identity_provider); |
| 283 } |
| 284 |
| 282 bool ExtensionDownloader::AddExtensionData(const std::string& id, | 285 bool ExtensionDownloader::AddExtensionData(const std::string& id, |
| 283 const Version& version, | 286 const Version& version, |
| 284 Manifest::Type extension_type, | 287 Manifest::Type extension_type, |
| 285 const GURL& extension_update_url, | 288 const GURL& extension_update_url, |
| 286 const std::string& update_url_data, | 289 const std::string& update_url_data, |
| 287 int request_id) { | 290 int request_id) { |
| 288 GURL update_url(extension_update_url); | 291 GURL update_url(extension_update_url); |
| 289 // Skip extensions with non-empty invalid update URLs. | 292 // Skip extensions with non-empty invalid update URLs. |
| 290 if (!update_url.is_empty() && !update_url.is_valid()) { | 293 if (!update_url.is_empty() && !update_url.is_valid()) { |
| 291 LOG(WARNING) << "Extension " << id << " has invalid update url " | 294 LOG(WARNING) << "Extension " << id << " has invalid update url " |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 extension_fetcher_->SaveResponseToTemporaryFile( | 742 extension_fetcher_->SaveResponseToTemporaryFile( |
| 740 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); | 743 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); |
| 741 } | 744 } |
| 742 | 745 |
| 743 if (fetch->credentials == ExtensionFetch::CREDENTIALS_OAUTH2_TOKEN && | 746 if (fetch->credentials == ExtensionFetch::CREDENTIALS_OAUTH2_TOKEN && |
| 744 is_secure) { | 747 is_secure) { |
| 745 if (access_token_.empty()) { | 748 if (access_token_.empty()) { |
| 746 // We should try OAuth2, but we have no token cached. This | 749 // We should try OAuth2, but we have no token cached. This |
| 747 // ExtensionFetcher will be started once the token fetch is complete, | 750 // ExtensionFetcher will be started once the token fetch is complete, |
| 748 // in either OnTokenFetchSuccess or OnTokenFetchFailure. | 751 // in either OnTokenFetchSuccess or OnTokenFetchFailure. |
| 749 DCHECK(identity_provider_); | 752 DCHECK(identity_provider_.get()); |
| 750 OAuth2TokenService::ScopeSet webstore_scopes; | 753 OAuth2TokenService::ScopeSet webstore_scopes; |
| 751 webstore_scopes.insert(kWebstoreOAuth2Scope); | 754 webstore_scopes.insert(kWebstoreOAuth2Scope); |
| 752 access_token_request_ = | 755 access_token_request_ = |
| 753 identity_provider_->GetTokenService()->StartRequest( | 756 identity_provider_->GetTokenService()->StartRequest( |
| 754 identity_provider_->GetActiveAccountId(), | 757 identity_provider_->GetActiveAccountId(), |
| 755 webstore_scopes, | 758 webstore_scopes, |
| 756 this); | 759 this); |
| 757 return; | 760 return; |
| 758 } | 761 } |
| 759 extension_fetcher_->AddExtraRequestHeader( | 762 extension_fetcher_->AddExtraRequestHeader( |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 } else { | 867 } else { |
| 865 fetch->credentials = ExtensionFetch::CREDENTIALS_COOKIES; | 868 fetch->credentials = ExtensionFetch::CREDENTIALS_COOKIES; |
| 866 } | 869 } |
| 867 return true; | 870 return true; |
| 868 case ExtensionFetch::CREDENTIALS_OAUTH2_TOKEN: | 871 case ExtensionFetch::CREDENTIALS_OAUTH2_TOKEN: |
| 869 fetch->oauth2_attempt_count++; | 872 fetch->oauth2_attempt_count++; |
| 870 // OAuth2 may fail due to an expired access token, in which case we | 873 // OAuth2 may fail due to an expired access token, in which case we |
| 871 // should invalidate the token and try again. | 874 // should invalidate the token and try again. |
| 872 if (response_code == net::HTTP_UNAUTHORIZED && | 875 if (response_code == net::HTTP_UNAUTHORIZED && |
| 873 fetch->oauth2_attempt_count <= kMaxOAuth2Attempts) { | 876 fetch->oauth2_attempt_count <= kMaxOAuth2Attempts) { |
| 874 DCHECK(identity_provider_ != NULL); | 877 DCHECK(identity_provider_.get()); |
| 875 OAuth2TokenService::ScopeSet webstore_scopes; | 878 OAuth2TokenService::ScopeSet webstore_scopes; |
| 876 webstore_scopes.insert(kWebstoreOAuth2Scope); | 879 webstore_scopes.insert(kWebstoreOAuth2Scope); |
| 877 identity_provider_->GetTokenService()->InvalidateToken( | 880 identity_provider_->GetTokenService()->InvalidateToken( |
| 878 identity_provider_->GetActiveAccountId(), | 881 identity_provider_->GetActiveAccountId(), |
| 879 webstore_scopes, | 882 webstore_scopes, |
| 880 access_token_); | 883 access_token_); |
| 881 access_token_.clear(); | 884 access_token_.clear(); |
| 882 return true; | 885 return true; |
| 883 } | 886 } |
| 884 // Either there is no Gaia identity available, the active identity | 887 // Either there is no Gaia identity available, the active identity |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 919 | 922 |
| 920 void ExtensionDownloader::OnGetTokenFailure( | 923 void ExtensionDownloader::OnGetTokenFailure( |
| 921 const OAuth2TokenService::Request* request, | 924 const OAuth2TokenService::Request* request, |
| 922 const GoogleServiceAuthError& error) { | 925 const GoogleServiceAuthError& error) { |
| 923 // If we fail to get an access token, kick the pending fetch and let it fall | 926 // If we fail to get an access token, kick the pending fetch and let it fall |
| 924 // back on cookies. | 927 // back on cookies. |
| 925 extension_fetcher_->Start(); | 928 extension_fetcher_->Start(); |
| 926 } | 929 } |
| 927 | 930 |
| 928 } // namespace extensions | 931 } // namespace extensions |
| OLD | NEW |