• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/chromeos/policy/wildcard_login_checker.h"
6 
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h"
11 #include "chrome/browser/policy/browser_policy_connector.h"
12 #include "net/url_request/url_request_context_getter.h"
13 
14 namespace policy {
15 
16 namespace {
17 
18 // Presence of this key in the userinfo response indicates whether the user is
19 // on a hosted domain.
20 const char kHostedDomainKey[] = "hd";
21 
22 }  // namespace
23 
WildcardLoginChecker()24 WildcardLoginChecker::WildcardLoginChecker() {}
25 
~WildcardLoginChecker()26 WildcardLoginChecker::~WildcardLoginChecker() {}
27 
Start(scoped_refptr<net::URLRequestContextGetter> signin_context,const StatusCallback & callback)28 void WildcardLoginChecker::Start(
29     scoped_refptr<net::URLRequestContextGetter> signin_context,
30     const StatusCallback& callback) {
31   CHECK(!token_fetcher_);
32   CHECK(!user_info_fetcher_);
33   callback_ = callback;
34   token_fetcher_.reset(new PolicyOAuth2TokenFetcher(
35       signin_context,
36       g_browser_process->system_request_context(),
37       base::Bind(&WildcardLoginChecker::OnPolicyTokenFetched,
38                  base::Unretained(this))));
39   token_fetcher_->Start();
40 }
41 
StartWithAccessToken(const std::string & access_token,const StatusCallback & callback)42 void WildcardLoginChecker::StartWithAccessToken(
43     const std::string& access_token,
44     const StatusCallback& callback) {
45   CHECK(!token_fetcher_);
46   CHECK(!user_info_fetcher_);
47   callback_ = callback;
48 
49   StartUserInfoFetcher(access_token);
50 }
51 
OnGetUserInfoSuccess(const base::DictionaryValue * response)52 void WildcardLoginChecker::OnGetUserInfoSuccess(
53     const base::DictionaryValue* response) {
54   OnCheckCompleted(response->HasKey(kHostedDomainKey));
55 }
56 
OnGetUserInfoFailure(const GoogleServiceAuthError & error)57 void WildcardLoginChecker::OnGetUserInfoFailure(
58     const GoogleServiceAuthError& error) {
59   LOG(ERROR) << "Failed to fetch user info " << error.ToString();
60   OnCheckCompleted(false);
61 }
62 
OnPolicyTokenFetched(const std::string & access_token,const GoogleServiceAuthError & error)63 void WildcardLoginChecker::OnPolicyTokenFetched(
64     const std::string& access_token,
65     const GoogleServiceAuthError& error) {
66   if (error.state() != GoogleServiceAuthError::NONE) {
67     LOG(ERROR) << "Failed to fetch policy token " << error.ToString();
68     OnCheckCompleted(false);
69     return;
70   }
71 
72   token_fetcher_.reset();
73   StartUserInfoFetcher(access_token);
74 }
75 
StartUserInfoFetcher(const std::string & access_token)76 void WildcardLoginChecker::StartUserInfoFetcher(
77     const std::string& access_token) {
78   user_info_fetcher_.reset(
79       new UserInfoFetcher(this, g_browser_process->system_request_context()));
80   user_info_fetcher_->Start(access_token);
81 }
82 
OnCheckCompleted(bool result)83 void WildcardLoginChecker::OnCheckCompleted(bool result) {
84   if (!callback_.is_null())
85     callback_.Run(result);
86 }
87 
88 }  // namespace policy
89