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

Side by Side Diff: components/proximity_auth/unlock_manager_impl.cc

Issue 2898513002: [EasyUnlock] Observe proximity changes and clean up TX power strategy. (Closed)
Patch Set: fix_unittest Created 3 years, 7 months 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
« no previous file with comments | « components/proximity_auth/unlock_manager_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/proximity_auth/unlock_manager_impl.h" 5 #include "components/proximity_auth/unlock_manager_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 SetWakingUpState(true); 144 SetWakingUpState(true);
145 } else { 145 } else {
146 proximity_monitor_.reset(); 146 proximity_monitor_.reset();
147 } 147 }
148 148
149 UpdateLockScreen(); 149 UpdateLockScreen();
150 } 150 }
151 151
152 void UnlockManagerImpl::OnLifeCycleStateChanged() { 152 void UnlockManagerImpl::OnLifeCycleStateChanged() {
153 RemoteDeviceLifeCycle::State state = life_cycle_->GetState(); 153 RemoteDeviceLifeCycle::State state = life_cycle_->GetState();
154 PA_LOG(INFO) << "[Unlock] RemoteDeviceLifeCycle state changed: " 154 PA_LOG(INFO) << "RemoteDeviceLifeCycle state changed: "
155 << static_cast<int>(state); 155 << static_cast<int>(state);
156 156
157 remote_screenlock_state_.reset(); 157 remote_screenlock_state_.reset();
158 if (state == RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED) { 158 if (state == RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED) {
159 DCHECK(life_cycle_->GetConnection()); 159 DCHECK(life_cycle_->GetConnection());
160 DCHECK(GetMessenger()); 160 DCHECK(GetMessenger());
161 proximity_monitor_ = CreateProximityMonitor(life_cycle_->GetConnection()); 161 proximity_monitor_ = CreateProximityMonitor(life_cycle_->GetConnection());
162 GetMessenger()->AddObserver(this); 162 GetMessenger()->AddObserver(this);
163 } 163 }
164 164
165 if (state == RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED) 165 if (state == RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED)
166 SetWakingUpState(false); 166 SetWakingUpState(false);
167 167
168 UpdateLockScreen(); 168 UpdateLockScreen();
169 } 169 }
170 170
171 void UnlockManagerImpl::OnUnlockEventSent(bool success) { 171 void UnlockManagerImpl::OnUnlockEventSent(bool success) {
172 if (!is_attempting_auth_) { 172 if (!is_attempting_auth_) {
173 PA_LOG(ERROR) << "[Unlock] Sent easy_unlock event, but no auth attempted."; 173 PA_LOG(ERROR) << "Sent easy_unlock event, but no auth attempted.";
174 return; 174 return;
175 } 175 }
176 176
177 AcceptAuthAttempt(success); 177 AcceptAuthAttempt(success);
178 } 178 }
179 179
180 void UnlockManagerImpl::OnRemoteStatusUpdate( 180 void UnlockManagerImpl::OnRemoteStatusUpdate(
181 const RemoteStatusUpdate& status_update) { 181 const RemoteStatusUpdate& status_update) {
182 PA_LOG(INFO) << "[Unlock] Status Update: (" 182 PA_LOG(INFO) << "Status Update: ("
183 << "user_present=" << status_update.user_presence << ", " 183 << "user_present=" << status_update.user_presence << ", "
184 << "secure_screen_lock=" 184 << "secure_screen_lock="
185 << status_update.secure_screen_lock_state << ", " 185 << status_update.secure_screen_lock_state << ", "
186 << "trust_agent=" << status_update.trust_agent_state << ")"; 186 << "trust_agent=" << status_update.trust_agent_state << ")";
187 metrics::RecordRemoteSecuritySettingsState( 187 metrics::RecordRemoteSecuritySettingsState(
188 GetRemoteSecuritySettingsState(status_update)); 188 GetRemoteSecuritySettingsState(status_update));
189 189
190 remote_screenlock_state_.reset(new RemoteScreenlockState( 190 remote_screenlock_state_.reset(new RemoteScreenlockState(
191 GetScreenlockStateFromRemoteUpdate(status_update))); 191 GetScreenlockStateFromRemoteUpdate(status_update)));
192 192
193 // This also calls |UpdateLockScreen()| 193 // This also calls |UpdateLockScreen()|
194 SetWakingUpState(false); 194 SetWakingUpState(false);
195 } 195 }
196 196
197 void UnlockManagerImpl::OnDecryptResponse(const std::string& decrypted_bytes) { 197 void UnlockManagerImpl::OnDecryptResponse(const std::string& decrypted_bytes) {
198 if (!is_attempting_auth_) { 198 if (!is_attempting_auth_) {
199 PA_LOG(ERROR) << "[Unlock] Decrypt response received but not attempting " 199 PA_LOG(ERROR) << "Decrypt response received but not attempting "
200 << "auth."; 200 << "auth.";
201 return; 201 return;
202 } 202 }
203 203
204 if (decrypted_bytes.empty()) { 204 if (decrypted_bytes.empty()) {
205 PA_LOG(WARNING) << "[Unlock] Failed to decrypt sign-in challenge."; 205 PA_LOG(WARNING) << "Failed to decrypt sign-in challenge.";
206 AcceptAuthAttempt(false); 206 AcceptAuthAttempt(false);
207 } else { 207 } else {
208 sign_in_secret_.reset(new std::string(decrypted_bytes)); 208 sign_in_secret_.reset(new std::string(decrypted_bytes));
209 GetMessenger()->DispatchUnlockEvent(); 209 GetMessenger()->DispatchUnlockEvent();
210 } 210 }
211 } 211 }
212 212
213 void UnlockManagerImpl::OnUnlockResponse(bool success) { 213 void UnlockManagerImpl::OnUnlockResponse(bool success) {
214 if (!is_attempting_auth_) { 214 if (!is_attempting_auth_) {
215 PA_LOG(ERROR) << "[Unlock] Unlock response received but not attempting " 215 PA_LOG(ERROR) << "Unlock response received but not attempting "
216 << "auth."; 216 << "auth.";
217 return; 217 return;
218 } 218 }
219 219
220 PA_LOG(INFO) << "[Unlock] Unlock response from remote device: " 220 PA_LOG(INFO) << "Unlock response from remote device: "
221 << (success ? "success" : "failure"); 221 << (success ? "success" : "failure");
222 if (success) 222 if (success)
223 GetMessenger()->DispatchUnlockEvent(); 223 GetMessenger()->DispatchUnlockEvent();
224 else 224 else
225 AcceptAuthAttempt(false); 225 AcceptAuthAttempt(false);
226 } 226 }
227 227
228 void UnlockManagerImpl::OnDisconnected() { 228 void UnlockManagerImpl::OnDisconnected() {
229 GetMessenger()->RemoveObserver(this); 229 GetMessenger()->RemoveObserver(this);
230 } 230 }
231 231
232 void UnlockManagerImpl::OnProximityStateChanged() {
233 PA_LOG(INFO) << "Proximity state changed.";
234 UpdateLockScreen();
235 }
236
232 void UnlockManagerImpl::OnScreenDidLock( 237 void UnlockManagerImpl::OnScreenDidLock(
233 ScreenlockBridge::LockHandler::ScreenType screen_type) { 238 ScreenlockBridge::LockHandler::ScreenType screen_type) {
234 OnScreenLockedOrUnlocked(true); 239 OnScreenLockedOrUnlocked(true);
235 } 240 }
236 241
237 void UnlockManagerImpl::OnScreenDidUnlock( 242 void UnlockManagerImpl::OnScreenDidUnlock(
238 ScreenlockBridge::LockHandler::ScreenType screen_type) { 243 ScreenlockBridge::LockHandler::ScreenType screen_type) {
239 OnScreenLockedOrUnlocked(false); 244 OnScreenLockedOrUnlocked(false);
240 } 245 }
241 246
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 279
275 #if defined(OS_CHROMEOS) 280 #if defined(OS_CHROMEOS)
276 void UnlockManagerImpl::SuspendDone(const base::TimeDelta& sleep_duration) { 281 void UnlockManagerImpl::SuspendDone(const base::TimeDelta& sleep_duration) {
277 SetWakingUpState(true); 282 SetWakingUpState(true);
278 } 283 }
279 #endif // defined(OS_CHROMEOS) 284 #endif // defined(OS_CHROMEOS)
280 285
281 void UnlockManagerImpl::OnAuthAttempted( 286 void UnlockManagerImpl::OnAuthAttempted(
282 ScreenlockBridge::LockHandler::AuthType auth_type) { 287 ScreenlockBridge::LockHandler::AuthType auth_type) {
283 if (is_attempting_auth_) { 288 if (is_attempting_auth_) {
284 PA_LOG(INFO) << "[Unlock] Already attempting auth."; 289 PA_LOG(INFO) << "Already attempting auth.";
285 return; 290 return;
286 } 291 }
287 292
288 if (auth_type != ScreenlockBridge::LockHandler::USER_CLICK) 293 if (auth_type != ScreenlockBridge::LockHandler::USER_CLICK)
289 return; 294 return;
290 295
291 is_attempting_auth_ = true; 296 is_attempting_auth_ = true;
292 297
293 if (!life_cycle_) { 298 if (!life_cycle_) {
294 PA_LOG(ERROR) << "[Unlock] No life_cycle active when auth is attempted"; 299 PA_LOG(ERROR) << "No life_cycle active when auth is attempted";
295 AcceptAuthAttempt(false); 300 AcceptAuthAttempt(false);
296 UpdateLockScreen(); 301 UpdateLockScreen();
297 return; 302 return;
298 } 303 }
299 304
300 if (!IsUnlockAllowed()) { 305 if (!IsUnlockAllowed()) {
301 AcceptAuthAttempt(false); 306 AcceptAuthAttempt(false);
302 UpdateLockScreen(); 307 UpdateLockScreen();
303 return; 308 return;
304 } 309 }
305 310
306 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 311 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
307 FROM_HERE, 312 FROM_HERE,
308 base::Bind(&UnlockManagerImpl::AcceptAuthAttempt, 313 base::Bind(&UnlockManagerImpl::AcceptAuthAttempt,
309 reject_auth_attempt_weak_ptr_factory_.GetWeakPtr(), false), 314 reject_auth_attempt_weak_ptr_factory_.GetWeakPtr(), false),
310 base::TimeDelta::FromSeconds(kAuthAttemptTimeoutSecs)); 315 base::TimeDelta::FromSeconds(kAuthAttemptTimeoutSecs));
311 316
312 if (screenlock_type_ == ProximityAuthSystem::SIGN_IN) { 317 if (screenlock_type_ == ProximityAuthSystem::SIGN_IN) {
313 SendSignInChallenge(); 318 SendSignInChallenge();
314 } else { 319 } else {
315 if (GetMessenger()->SupportsSignIn()) { 320 if (GetMessenger()->SupportsSignIn()) {
316 GetMessenger()->RequestUnlock(); 321 GetMessenger()->RequestUnlock();
317 } else { 322 } else {
318 PA_LOG(INFO) << "[Unlock] Protocol v3.1 not supported, skipping " 323 PA_LOG(INFO) << "Protocol v3.1 not supported, skipping request_unlock.";
319 << "request_unlock.";
320 GetMessenger()->DispatchUnlockEvent(); 324 GetMessenger()->DispatchUnlockEvent();
321 } 325 }
322 } 326 }
323 } 327 }
324 328
325 std::unique_ptr<ProximityMonitor> UnlockManagerImpl::CreateProximityMonitor( 329 std::unique_ptr<ProximityMonitor> UnlockManagerImpl::CreateProximityMonitor(
326 cryptauth::Connection* connection) { 330 cryptauth::Connection* connection) {
327 return base::MakeUnique<ProximityMonitorImpl>( 331 return base::MakeUnique<ProximityMonitorImpl>(
328 connection, base::WrapUnique(new base::DefaultTickClock())); 332 connection, base::WrapUnique(new base::DefaultTickClock()));
329 } 333 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 return ScreenlockState::NO_BLUETOOTH; 373 return ScreenlockState::NO_BLUETOOTH;
370 374
371 Messenger* messenger = GetMessenger(); 375 Messenger* messenger = GetMessenger();
372 if (screenlock_type_ == ProximityAuthSystem::SIGN_IN && messenger && 376 if (screenlock_type_ == ProximityAuthSystem::SIGN_IN && messenger &&
373 !messenger->SupportsSignIn()) 377 !messenger->SupportsSignIn())
374 return ScreenlockState::PHONE_UNSUPPORTED; 378 return ScreenlockState::PHONE_UNSUPPORTED;
375 379
376 // If the RSSI is too low, then the remote device is nowhere near the local 380 // If the RSSI is too low, then the remote device is nowhere near the local
377 // device. This message should take priority over messages about screen lock 381 // device. This message should take priority over messages about screen lock
378 // states. 382 // states.
379 if (!proximity_monitor_->IsUnlockAllowed()) 383 if (!proximity_monitor_->IsUnlockAllowed()) {
380 return ScreenlockState::RSSI_TOO_LOW; 384 if (remote_screenlock_state_ &&
385 *remote_screenlock_state_ == RemoteScreenlockState::UNLOCKED) {
386 return ScreenlockState::RSSI_TOO_LOW;
387 } else {
388 return ScreenlockState::PHONE_LOCKED_AND_RSSI_TOO_LOW;
389 }
390 }
381 391
382 if (remote_screenlock_state_) { 392 if (remote_screenlock_state_) {
383 switch (*remote_screenlock_state_) { 393 switch (*remote_screenlock_state_) {
384 case RemoteScreenlockState::DISABLED: 394 case RemoteScreenlockState::DISABLED:
385 return ScreenlockState::PHONE_NOT_LOCKABLE; 395 return ScreenlockState::PHONE_NOT_LOCKABLE;
386 396
387 case RemoteScreenlockState::LOCKED: 397 case RemoteScreenlockState::LOCKED:
388 return ScreenlockState::PHONE_LOCKED; 398 return ScreenlockState::PHONE_LOCKED;
389 399
390 case RemoteScreenlockState::UNKNOWN: 400 case RemoteScreenlockState::UNKNOWN:
391 return ScreenlockState::PHONE_UNSUPPORTED; 401 return ScreenlockState::PHONE_UNSUPPORTED;
392 402
393 case RemoteScreenlockState::UNLOCKED: 403 case RemoteScreenlockState::UNLOCKED:
394 // Handled by the code below. 404 // Handled by the code below.
395 break; 405 break;
396 } 406 }
397 } 407 }
398 408
399 return ScreenlockState::NO_PHONE; 409 return ScreenlockState::NO_PHONE;
400 } 410 }
401 411
402 void UnlockManagerImpl::UpdateLockScreen() { 412 void UnlockManagerImpl::UpdateLockScreen() {
403 UpdateProximityMonitorState(); 413 UpdateProximityMonitorState();
404 414
405 ScreenlockState new_state = GetScreenlockState(); 415 ScreenlockState new_state = GetScreenlockState();
406 if (screenlock_state_ == new_state) 416 if (screenlock_state_ == new_state)
407 return; 417 return;
408 418
419 PA_LOG(INFO) << "Updating screenlock state from "
420 << static_cast<int>(screenlock_state_) << " to "
421 << static_cast<int>(new_state);
409 proximity_auth_client_->UpdateScreenlockState(new_state); 422 proximity_auth_client_->UpdateScreenlockState(new_state);
410 screenlock_state_ = new_state; 423 screenlock_state_ = new_state;
411 } 424 }
412 425
413 void UnlockManagerImpl::UpdateProximityMonitorState() { 426 void UnlockManagerImpl::UpdateProximityMonitorState() {
414 if (!proximity_monitor_) 427 if (!proximity_monitor_)
415 return; 428 return;
416 429
417 if (is_locked_ && life_cycle_ && 430 if (is_locked_ && life_cycle_ &&
418 life_cycle_->GetState() == 431 life_cycle_->GetState() ==
419 RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED) { 432 RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED) {
433 proximity_monitor_->AddObserver(this);
420 proximity_monitor_->Start(); 434 proximity_monitor_->Start();
421 } else { 435 } else {
422 proximity_monitor_->Stop(); 436 proximity_monitor_->Stop();
423 } 437 }
424 } 438 }
425 439
426 void UnlockManagerImpl::SetWakingUpState(bool is_waking_up) { 440 void UnlockManagerImpl::SetWakingUpState(bool is_waking_up) {
427 is_waking_up_ = is_waking_up; 441 is_waking_up_ = is_waking_up;
428 442
429 // Clear the waking up state after a timeout. 443 // Clear the waking up state after a timeout.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 497
484 Messenger* UnlockManagerImpl::GetMessenger() { 498 Messenger* UnlockManagerImpl::GetMessenger() {
485 // TODO(tengs): We should use a weak pointer to hold the Messenger instance 499 // TODO(tengs): We should use a weak pointer to hold the Messenger instance
486 // instead. 500 // instead.
487 if (!life_cycle_) 501 if (!life_cycle_)
488 return nullptr; 502 return nullptr;
489 return life_cycle_->GetMessenger(); 503 return life_cycle_->GetMessenger();
490 } 504 }
491 505
492 } // namespace proximity_auth 506 } // namespace proximity_auth
OLDNEW
« no previous file with comments | « components/proximity_auth/unlock_manager_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698