普通文本  |  199行  |  5.81 KB

// Copyright (c) 2010 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 "chrome/browser/chromeos/login/cryptohome_op.h"

#include <string>

#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/cryptohome_library.h"
#include "chrome/browser/chromeos/login/auth_attempt_state.h"
#include "chrome/browser/chromeos/login/auth_attempt_state_resolver.h"
#include "content/browser/browser_thread.h"

namespace chromeos {

CryptohomeOp::CryptohomeOp(AuthAttemptState* current_attempt,
                           AuthAttemptStateResolver* callback)
    : attempt_(current_attempt),
      resolver_(callback) {
  CHECK(chromeos::CrosLibrary::Get()->EnsureLoaded());
}

CryptohomeOp::~CryptohomeOp() {}

void CryptohomeOp::OnComplete(bool success, int return_code) {
  BrowserThread::PostTask(
      BrowserThread::IO, FROM_HERE,
      NewRunnableMethod(this,
                        &CryptohomeOp::TriggerResolve,
                        success, return_code));
}

void CryptohomeOp::TriggerResolve(bool success, int return_code) {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
  attempt_->RecordCryptohomeStatus(success, return_code);
  resolver_->Resolve();
}

class MountAttempt : public CryptohomeOp {
 public:
  MountAttempt(AuthAttemptState* current_attempt,
               AuthAttemptStateResolver* callback,
               bool create_if_missing)
      : CryptohomeOp(current_attempt, callback),
        create_if_missing_(create_if_missing) {
  }

  virtual ~MountAttempt() {}

  bool Initiate() {
    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
    CryptohomeLibrary* lib = CrosLibrary::Get()->GetCryptohomeLibrary();
    return lib->AsyncMount(attempt_->username,
                           attempt_->ascii_hash,
                           create_if_missing_,
                           this);
  }

 private:
  const bool create_if_missing_;
  DISALLOW_COPY_AND_ASSIGN(MountAttempt);
};

class MountGuestAttempt : public CryptohomeOp {
 public:
  MountGuestAttempt(AuthAttemptState* current_attempt,
                    AuthAttemptStateResolver* callback)
      : CryptohomeOp(current_attempt, callback) {
  }

  virtual ~MountGuestAttempt() {}

  bool Initiate() {
    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
    CryptohomeLibrary* lib = CrosLibrary::Get()->GetCryptohomeLibrary();
    return lib->AsyncMountForBwsi(this);
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(MountGuestAttempt);
};

class MigrateAttempt : public CryptohomeOp {
 public:
  // TODO(cmasone): get rid of passing_old_hash arg, as it's always true.
  MigrateAttempt(AuthAttemptState* current_attempt,
                 AuthAttemptStateResolver* callback,
                 bool passing_old_hash,
                 const std::string& hash)
      : CryptohomeOp(current_attempt, callback),
        is_old_hash_(passing_old_hash),
        hash_(hash) {
  }

  virtual ~MigrateAttempt() {}

  bool Initiate() {
    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
    CryptohomeLibrary* lib = CrosLibrary::Get()->GetCryptohomeLibrary();
    if (is_old_hash_) {
      return lib->AsyncMigrateKey(attempt_->username,
                                  hash_,
                                  attempt_->ascii_hash,
                                  this);
    } else {
      return lib->AsyncMigrateKey(attempt_->username,
                                  attempt_->ascii_hash,
                                  hash_,
                                  this);
    }
  }

 private:
  const bool is_old_hash_;
  const std::string hash_;

  DISALLOW_COPY_AND_ASSIGN(MigrateAttempt);
};

class RemoveAttempt : public CryptohomeOp {
 public:
  RemoveAttempt(AuthAttemptState* current_attempt,
                AuthAttemptStateResolver* callback)
      : CryptohomeOp(current_attempt, callback) {
  }

  virtual ~RemoveAttempt() {}

  bool Initiate() {
    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
    CryptohomeLibrary* lib = CrosLibrary::Get()->GetCryptohomeLibrary();
    return lib->AsyncRemove(attempt_->username, this);
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(RemoveAttempt);
};

class CheckKeyAttempt : public CryptohomeOp {
 public:
  CheckKeyAttempt(AuthAttemptState* current_attempt,
                  AuthAttemptStateResolver* callback)
      : CryptohomeOp(current_attempt, callback) {
  }

  virtual ~CheckKeyAttempt() {}

  bool Initiate() {
    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
    CryptohomeLibrary* lib = CrosLibrary::Get()->GetCryptohomeLibrary();
    return lib->AsyncCheckKey(attempt_->username, attempt_->ascii_hash, this);
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(CheckKeyAttempt);
};

// static
CryptohomeOp* CryptohomeOp::CreateMountAttempt(
    AuthAttemptState* current_attempt,
    AuthAttemptStateResolver* callback,
    bool create_if_missing) {
  return new MountAttempt(current_attempt, callback, create_if_missing);
}

// static
CryptohomeOp* CryptohomeOp::CreateMountGuestAttempt(
      AuthAttemptState* current_attempt,
      AuthAttemptStateResolver* callback) {
  return new MountGuestAttempt(current_attempt, callback);
}

// static
CryptohomeOp* CryptohomeOp::CreateMigrateAttempt(
    AuthAttemptState* current_attempt,
    AuthAttemptStateResolver* callback,
    bool passing_old_hash,
    const std::string& hash) {
  return new MigrateAttempt(current_attempt, callback, passing_old_hash, hash);
}

// static
CryptohomeOp* CryptohomeOp::CreateRemoveAttempt(
    AuthAttemptState* current_attempt,
    AuthAttemptStateResolver* callback) {
  return new RemoveAttempt(current_attempt, callback);
}

// static
CryptohomeOp* CryptohomeOp::CreateCheckKeyAttempt(
    AuthAttemptState* current_attempt,
    AuthAttemptStateResolver* callback) {

  return new CheckKeyAttempt(current_attempt, callback);
}

}  // namespace chromeos