12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/terms_of_service_screen.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/screen_observer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/wizard_controller.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_response_headers.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_fetcher.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_status.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TermsOfServiceScreen::TermsOfServiceScreen(ScreenObserver* screen_observer, 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TermsOfServiceScreenActor* actor) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : WizardScreen(screen_observer), 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_(actor) { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(actor_); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->SetDelegate(this); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TermsOfServiceScreen::~TermsOfServiceScreen() { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->SetDelegate(NULL); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TermsOfServiceScreen::PrepareToShow() { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TermsOfServiceScreen::Show() { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!actor_) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the domain name whose Terms of Service are being shown. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::BrowserPolicyConnectorChromeOS* connector = 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->platform_part()->browser_policy_connector_chromeos(); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) actor_->SetDomain(connector->GetEnterpriseDomain()); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Show the screen. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->Show(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading the Terms of Service. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartDownload(); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TermsOfServiceScreen::Hide() { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->Hide(); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string TermsOfServiceScreen::GetName() const { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return WizardController::kTermsOfServiceScreenName; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TermsOfServiceScreen::OnDecline() { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_screen_observer()->OnExit(ScreenObserver::TERMS_OF_SERVICE_DECLINED); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TermsOfServiceScreen::OnAccept() { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_screen_observer()->OnExit(ScreenObserver::TERMS_OF_SERVICE_ACCEPTED); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TermsOfServiceScreen::OnActorDestroyed(TermsOfServiceScreenActor* actor) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_ == actor) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_ = NULL; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TermsOfServiceScreen::StartDownload() { 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If an URL from which the Terms of Service can be downloaded has not been 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // set, show an error message to the user. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string terms_of_service_url = 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs->GetString(prefs::kTermsOfServiceURL); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (terms_of_service_url.empty()) { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->OnLoadError(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start downloading the Terms of Service. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) terms_of_service_fetcher_.reset(net::URLFetcher::Create( 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(terms_of_service_url), net::URLFetcher::GET, this)); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) terms_of_service_fetcher_->SetRequestContext( 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->system_request_context()); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Request a text/plain MIME type as only plain-text Terms of Service are 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // accepted. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) terms_of_service_fetcher_->AddExtraRequestHeader("Accept: text/plain"); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Retry up to three times if network changes are detected during the 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // download. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) terms_of_service_fetcher_->SetAutomaticallyRetryOnNetworkChanges(3); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) terms_of_service_fetcher_->Start(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Abort the download attempt if it takes longer than one minute. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_timer_.Start(FROM_HERE, base::TimeDelta::FromMinutes(1), 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, &TermsOfServiceScreen::OnDownloadTimeout); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TermsOfServiceScreen::OnDownloadTimeout() { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Abort the download attempt. 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) terms_of_service_fetcher_.reset(); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Show an error message to the user. 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->OnLoadError(); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TermsOfServiceScreen::OnURLFetchComplete(const net::URLFetcher* source) { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (source != terms_of_service_fetcher_.get()) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Callback from foreign URL fetcher"; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) download_timer_.Stop(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Destroy the fetcher when this method returns. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLFetcher> fetcher(terms_of_service_fetcher_.Pass()); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!actor_) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string terms_of_service; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string mime_type; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the Terms of Service could not be downloaded, do not have a MIME type of 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // text/plain or are empty, show an error message to the user. 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!source->GetStatus().is_success() || 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !source->GetResponseHeaders()->GetMimeType(&mime_type) || 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mime_type != "text/plain" || 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !source->GetResponseAsString(&terms_of_service)) { 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->OnLoadError(); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the Terms of Service were downloaded successfully, show them to the 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // user. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->OnLoadSuccess(terms_of_service); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 152