Home | History | Annotate | Download | only in login
      1 // Copyright (c) 2012 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/login/tpm_password_fetcher.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/compiler_specific.h"
      9 #include "base/message_loop/message_loop.h"
     10 #include "chromeos/dbus/cryptohome_client.h"
     11 #include "chromeos/dbus/dbus_thread_manager.h"
     12 
     13 namespace chromeos {
     14 
     15 namespace {
     16 
     17 // Interval between TPM password checks.
     18 const int kTpmCheckIntervalMs = 500;
     19 
     20 }  // namespace
     21 
     22 TpmPasswordFetcher::TpmPasswordFetcher(TpmPasswordFetcherDelegate* delegate)
     23     : weak_factory_(this),
     24       delegate_(delegate) {
     25   DCHECK(delegate_);
     26 }
     27 
     28 TpmPasswordFetcher::~TpmPasswordFetcher() {
     29 }
     30 
     31 void TpmPasswordFetcher::Fetch() {
     32   // Since this method is also called directly.
     33   weak_factory_.InvalidateWeakPtrs();
     34 
     35   DBusThreadManager::Get()->GetCryptohomeClient()->TpmIsReady(
     36       base::Bind(&TpmPasswordFetcher::OnTpmIsReady,
     37                  weak_factory_.GetWeakPtr()));
     38 }
     39 
     40 void TpmPasswordFetcher::OnTpmIsReady(DBusMethodCallStatus call_status,
     41                                       bool tpm_is_ready) {
     42   if (call_status == DBUS_METHOD_CALL_SUCCESS && tpm_is_ready) {
     43     DBusThreadManager::Get()->GetCryptohomeClient()->TpmGetPassword(
     44         base::Bind(&TpmPasswordFetcher::OnTpmGetPassword,
     45                    weak_factory_.GetWeakPtr()));
     46   } else {
     47     // Password hasn't been acquired, reschedule fetch.
     48     RescheduleFetch();
     49   }
     50 }
     51 
     52 void TpmPasswordFetcher::OnTpmGetPassword(DBusMethodCallStatus call_status,
     53                                           const std::string& password) {
     54   if (call_status == DBUS_METHOD_CALL_SUCCESS) {
     55     if (password.empty()) {
     56       // For a fresh OOBE flow TPM is uninitialized,
     57       // ownership process is started at the EULA screen,
     58       // password is cleared after EULA is accepted.
     59       LOG(ERROR) << "TPM returned an empty password.";
     60     }
     61     delegate_->OnPasswordFetched(password);
     62   } else {
     63     // Password hasn't been acquired, reschedule fetch.
     64     RescheduleFetch();
     65   }
     66 }
     67 
     68 void TpmPasswordFetcher::RescheduleFetch() {
     69   base::MessageLoop::current()->PostDelayedTask(
     70       FROM_HERE,
     71       base::Bind(&TpmPasswordFetcher::Fetch, weak_factory_.GetWeakPtr()),
     72       base::TimeDelta::FromMilliseconds(kTpmCheckIntervalMs));
     73 }
     74 
     75 }  // namespace chromeos
     76