Index: chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.cc |
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..36255812cc3fc93d5a12e88420cb6d6a570662ed |
--- /dev/null |
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.cc |
@@ -0,0 +1,124 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/bind.h" |
+#include "base/message_loop/message_loop.h" |
+#include "chrome/browser/chrome_notification_types.h" |
+#include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.h" |
+#include "chrome/browser/chromeos/login/lock/screen_locker.h" |
+#include "chrome/browser/signin/screenlock_bridge.h" |
+#include "chrome/grit/generated_resources.h" |
+#include "chromeos/dbus/dbus_thread_manager.h" |
+#include "chromeos/dbus/session_manager_client.h" |
+#include "chromeos/login/auth/auth_status_consumer.h" |
+#include "chromeos/login/auth/user_context.h" |
+#include "content/public/browser/notification_details.h" |
+#include "content/public/browser/notification_observer.h" |
+#include "content/public/browser/notification_registrar.h" |
+#include "content/public/browser/notification_service.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+namespace chromeos { |
+ |
+// Performs the actual reauth flow and returns the user context it obtains. |
+class EasyUnlockReauth::ReauthHandler : public content::NotificationObserver, |
+ public chromeos::AuthStatusConsumer { |
+ public: |
+ explicit ReauthHandler(EasyUnlockReauth::UserContextCallback callback) |
+ : callback_(callback) {} |
+ |
+ virtual ~ReauthHandler() {} |
+ |
+ bool Start() { |
+ ScreenLocker* screen_locker = ScreenLocker::default_screen_locker(); |
+ if (screen_locker && screen_locker->locked()) { |
+ DCHECK(false) << "Screen should not be locked when attempting reauth."; |
+ return false; |
+ } |
+ |
+ // Only primary profile's can set up Easy Unlock right now. |
tbarzic
2014/10/27 21:44:43
the comment doesn't really match the logic.
I don'
xiyuan
2014/10/28 20:38:03
Yep, let's do primary user check here since we onl
Tim Song
2014/10/31 17:57:37
Done.
|
+ if (!user_manager::UserManager::Get()->CanCurrentUserLock()) { |
+ DCHECK(false) << "Only primary users are currently supported for reauth."; |
+ return false; |
+ } |
+ |
+ notification_registrar_.Add(this, |
+ chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, |
+ content::NotificationService::AllSources()); |
+ |
+ SessionManagerClient* session_manager = |
+ chromeos::DBusThreadManager::Get()->GetSessionManagerClient(); |
+ session_manager->RequestLockScreen(); |
+ return true; |
+ } |
+ |
+ // content::NotificationObserver |
+ void Observe(int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ CHECK(type == chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED); |
+ bool is_screen_locked = *content::Details<bool>(details).ptr(); |
+ DCHECK(is_screen_locked); |
+ notification_registrar_.RemoveAll(); |
+ |
+ // TODO(tengs): Add an explicit reauth state to the locker and account |
+ // picker, so we can customize the UI. |
+ ScreenLocker* screen_locker = ScreenLocker::default_screen_locker(); |
+ screen_locker->SetLoginStatusConsumer(this); |
+ |
+ // Show tooltip explaining reauth. |
+ ScreenlockBridge::UserPodCustomIconOptions icon_options; |
+ icon_options.SetIcon(ScreenlockBridge::USER_POD_CUSTOM_ICON_NONE); |
+ icon_options.SetTooltip( |
+ l10n_util::GetStringUTF16( |
+ IDS_SMART_LOCK_SCREENLOCK_TOOLTIP_HARDLOCK_REAUTH_USER), |
+ true); |
+ |
+ const user_manager::UserList& lock_users = screen_locker->users(); |
+ DCHECK(lock_users.size() == 1); |
tbarzic
2014/10/27 21:44:43
I don't think this necessary holds
xiyuan
2014/10/28 20:38:03
We probably should pass in the reauth user and pic
Tim Song
2014/10/31 17:57:36
I plan on introducing a new Reauth state to the sc
|
+ ScreenlockBridge::Get()->lock_handler()->ShowUserPodCustomIcon( |
+ lock_users[0]->email(), icon_options); |
+ } |
+ |
+ // chromeos::AuthStatusConsumer: |
+ virtual void OnAuthSuccess( |
+ const chromeos::UserContext& user_context) override { |
+ callback_.Run(user_context); |
+ // Schedule deletion. |
+ base::MessageLoopForUI::current()->PostTask( |
+ FROM_HERE, base::Bind(&EasyUnlockReauth::EndReauthAttempt)); |
+ } |
+ |
+ virtual void OnAuthFailure(const chromeos::AuthFailure& error) override {} |
+ |
+ private: |
+ content::NotificationRegistrar notification_registrar_; |
+ EasyUnlockReauth::UserContextCallback callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ReauthHandler); |
+}; |
+ |
+EasyUnlockReauth::ReauthHandler* EasyUnlockReauth::reauth_handler_ = NULL; |
+ |
+// static. |
+bool EasyUnlockReauth::ReauthForUserContext( |
+ base::Callback<void(const UserContext&)> callback) { |
+ DCHECK(base::MessageLoopForUI::IsCurrent()); |
+ if (reauth_handler_) |
+ return false; |
+ |
+ reauth_handler_ = new ReauthHandler(callback); |
+ return reauth_handler_->Start(); |
+} |
+ |
+// static. |
+void EasyUnlockReauth::EndReauthAttempt() { |
+ DCHECK(base::MessageLoopForUI::IsCurrent()); |
+ DCHECK(reauth_handler_); |
+ if (reauth_handler_) |
+ delete reauth_handler_; |
+ reauth_handler_ = NULL; |
+} |
+ |
+} // namespace chromeos |