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

Side by Side Diff: chrome/browser/chromeos/arc/policy/arc_android_management_checker.cc

Issue 2446563002: Refactor ArcAndroidManagementChecker. (Closed)
Patch Set: rebase Created 4 years, 1 month 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/chromeos/arc/policy/arc_android_management_checker.h" 5 #include "chrome/browser/chromeos/arc/policy/arc_android_management_checker.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback_helpers.h"
10 #include "base/threading/thread_task_runner_handle.h" 11 #include "base/threading/thread_task_runner_handle.h"
11 #include "chrome/browser/browser_process.h" 12 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/browser_process_platform_part.h" 13 #include "chrome/browser/browser_process_platform_part.h"
13 #include "chrome/browser/chromeos/arc/policy/arc_android_management_checker_dele gate.h" 14 #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
14 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 15 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
16 #include "chrome/browser/profiles/profile.h"
17 #include "components/policy/core/browser/browser_policy_connector.h"
15 #include "components/policy/core/common/cloud/device_management_service.h" 18 #include "components/policy/core/common/cloud/device_management_service.h"
16 #include "components/signin/core/browser/profile_oauth2_token_service.h" 19 #include "components/signin/core/browser/profile_oauth2_token_service.h"
17 20
18 namespace arc { 21 namespace arc {
19 22
20 namespace { 23 namespace {
21 24
22 constexpr base::TimeDelta kRetryDelayMin = base::TimeDelta::FromSeconds(10); 25 constexpr base::TimeDelta kRetryDelayMin = base::TimeDelta::FromSeconds(10);
23 constexpr base::TimeDelta kRetryDelayMax = base::TimeDelta::FromHours(1); 26 constexpr base::TimeDelta kRetryDelayMax = base::TimeDelta::FromHours(1);
24 27
25 policy::DeviceManagementService* GetDeviceManagementService() { 28 policy::DeviceManagementService* GetDeviceManagementService() {
26 policy::BrowserPolicyConnectorChromeOS* const connector = 29 policy::BrowserPolicyConnectorChromeOS* const connector =
27 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 30 g_browser_process->platform_part()->browser_policy_connector_chromeos();
28 return connector->device_management_service(); 31 return connector->device_management_service();
29 } 32 }
30 33
31 } // namespace 34 } // namespace
32 35
33 ArcAndroidManagementChecker::ArcAndroidManagementChecker( 36 ArcAndroidManagementChecker::ArcAndroidManagementChecker(
34 ArcAndroidManagementCheckerDelegate* delegate, 37 Profile* profile,
35 ProfileOAuth2TokenService* token_service, 38 ProfileOAuth2TokenService* token_service,
36 const std::string& account_id, 39 const std::string& account_id,
37 bool background_mode) 40 bool retry_on_error)
38 : delegate_(delegate), 41 : profile_(profile),
39 token_service_(token_service), 42 token_service_(token_service),
40 account_id_(account_id), 43 account_id_(account_id),
41 background_mode_(background_mode), 44 retry_on_error_(retry_on_error),
42 retry_delay_(kRetryDelayMin), 45 retry_delay_(kRetryDelayMin),
43 android_management_client_(GetDeviceManagementService(), 46 android_management_client_(GetDeviceManagementService(),
44 g_browser_process->system_request_context(), 47 g_browser_process->system_request_context(),
45 account_id, 48 account_id,
46 token_service), 49 token_service),
47 weak_ptr_factory_(this) { 50 weak_ptr_factory_(this) {}
48 if (token_service_->RefreshTokenIsAvailable(account_id_)) {
49 StartCheck();
50 } else {
51 DCHECK(background_mode_);
52 token_service_->AddObserver(this);
53 }
54 }
55 51
56 ArcAndroidManagementChecker::~ArcAndroidManagementChecker() { 52 ArcAndroidManagementChecker::~ArcAndroidManagementChecker() {
57 token_service_->RemoveObserver(this); 53 token_service_->RemoveObserver(this);
58 } 54 }
59 55
60 // static 56 // static
61 void ArcAndroidManagementChecker::StartClient() { 57 void ArcAndroidManagementChecker::StartClient() {
62 GetDeviceManagementService()->ScheduleInitialization(0); 58 GetDeviceManagementService()->ScheduleInitialization(0);
63 } 59 }
64 60
61 void ArcAndroidManagementChecker::StartCheck(const CheckCallback& callback) {
62 DCHECK(callback_.is_null());
63
64 // Do not send requests for Chrome OS managed users, nor for well-known
65 // consumer domains.
66 if (policy_util::IsAccountManaged(profile_) ||
67 policy::BrowserPolicyConnector::IsNonEnterpriseUser(
68 profile_->GetProfileUserName())) {
69 callback.Run(policy::AndroidManagementClient::Result::RESULT_UNMANAGED);
70 return;
71 }
72
73 callback_ = callback;
74 EnsureRefreshTokenLoaded();
75 }
76
77 void ArcAndroidManagementChecker::EnsureRefreshTokenLoaded() {
78 if (token_service_->RefreshTokenIsAvailable(account_id_)) {
79 // If the refresh token is already available, just start the management
80 // check immediately.
81 StartCheckInternal();
82 return;
83 }
84
85 // Set the observer to the token service so the callback will be called
86 // when the token is loaded.
87 token_service_->AddObserver(this);
88 }
89
65 void ArcAndroidManagementChecker::OnRefreshTokenAvailable( 90 void ArcAndroidManagementChecker::OnRefreshTokenAvailable(
66 const std::string& account_id) { 91 const std::string& account_id) {
67 if (account_id != account_id_) 92 if (account_id != account_id_)
68 return; 93 return;
69 OnRefreshTokensLoaded(); 94 OnRefreshTokensLoaded();
70 } 95 }
71 96
72 void ArcAndroidManagementChecker::OnRefreshTokensLoaded() { 97 void ArcAndroidManagementChecker::OnRefreshTokensLoaded() {
73 token_service_->RemoveObserver(this); 98 token_service_->RemoveObserver(this);
74 StartCheck(); 99 StartCheckInternal();
75 } 100 }
76 101
77 void ArcAndroidManagementChecker::StartCheck() { 102 void ArcAndroidManagementChecker::StartCheckInternal() {
103 DCHECK(!callback_.is_null());
104
78 if (!token_service_->RefreshTokenIsAvailable(account_id_)) { 105 if (!token_service_->RefreshTokenIsAvailable(account_id_)) {
79 VLOG(2) << "No refresh token is available for android management check."; 106 VLOG(2) << "No refresh token is available for android management check.";
80 OnAndroidManagementChecked( 107 base::ResetAndReturn(&callback_)
81 policy::AndroidManagementClient::Result::RESULT_ERROR); 108 .Run(policy::AndroidManagementClient::Result::RESULT_ERROR);
82 return; 109 return;
83 } 110 }
84 111
85 VLOG(2) << "Start android management check."; 112 VLOG(2) << "Start android management check.";
86 android_management_client_.StartCheckAndroidManagement( 113 android_management_client_.StartCheckAndroidManagement(
87 base::Bind(&ArcAndroidManagementChecker::OnAndroidManagementChecked, 114 base::Bind(&ArcAndroidManagementChecker::OnAndroidManagementChecked,
88 weak_ptr_factory_.GetWeakPtr())); 115 weak_ptr_factory_.GetWeakPtr()));
89 } 116 }
90 117
91 void ArcAndroidManagementChecker::ScheduleCheck() { 118 void ArcAndroidManagementChecker::OnAndroidManagementChecked(
92 DCHECK(background_mode_); 119 policy::AndroidManagementClient::Result result) {
120 DCHECK(!callback_.is_null());
121 VLOG(2) << "Android management check done " << result << ".";
122 if (retry_on_error_ &&
123 result == policy::AndroidManagementClient::Result::RESULT_ERROR) {
124 ScheduleRetry();
125 return;
126 }
127
128 base::ResetAndReturn(&callback_).Run(result);
129 }
130
131 void ArcAndroidManagementChecker::ScheduleRetry() {
132 DCHECK(retry_on_error_);
133 DCHECK(!callback_.is_null());
93 VLOG(2) << "Schedule next android management check in " << retry_delay_; 134 VLOG(2) << "Schedule next android management check in " << retry_delay_;
94 135
95 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 136 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
96 FROM_HERE, base::Bind(&ArcAndroidManagementChecker::StartCheck, 137 FROM_HERE, base::Bind(&ArcAndroidManagementChecker::StartCheckInternal,
97 weak_ptr_factory_.GetWeakPtr()), 138 weak_ptr_factory_.GetWeakPtr()),
98 retry_delay_); 139 retry_delay_);
99 retry_delay_ = std::min(retry_delay_ * 2, kRetryDelayMax); 140 retry_delay_ = std::min(retry_delay_ * 2, kRetryDelayMax);
100 } 141 }
101 142
102 void ArcAndroidManagementChecker::DispatchResult(
103 policy::AndroidManagementClient::Result result) {
104 DCHECK(delegate_);
105 delegate_->OnAndroidManagementChecked(result);
106 }
107
108 void ArcAndroidManagementChecker::OnAndroidManagementChecked(
109 policy::AndroidManagementClient::Result result) {
110 VLOG(2) << "Android management check done " << result << ".";
111 if (background_mode_ &&
112 result == policy::AndroidManagementClient::Result::RESULT_ERROR) {
113 ScheduleCheck();
114 return;
115 }
116
117 base::ThreadTaskRunnerHandle::Get()->PostTask(
118 FROM_HERE, base::Bind(&ArcAndroidManagementChecker::DispatchResult,
119 weak_ptr_factory_.GetWeakPtr(), result));
120 }
121
122 } // namespace arc 143 } // namespace arc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698