blob: 2e54b74cdd5c0650f32b07dbc368d8e672711f7e [file] [log] [blame]
// 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.
#ifndef CHROMEOS_CRYPTOHOME_HOMEDIR_METHODS_H_
#define CHROMEOS_CRYPTOHOME_HOMEDIR_METHODS_H_
#include <stdint.h>
#include <string>
#include <vector>
#include "base/callback_forward.h"
#include "chromeos/chromeos_export.h"
#include "chromeos/cryptohome/cryptohome_parameters.h"
#include "chromeos/dbus/cryptohome_client.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace cryptohome {
// This class manages calls to Cryptohome service's home directory methods:
// Mount, CheckKey, Add/UpdateKey.
class CHROMEOS_EXPORT HomedirMethods {
public:
// Callbacks that are called back on the UI thread when the results of the
// respective method calls are ready.
typedef base::Callback<void(bool success, MountError return_code)> Callback;
typedef base::Callback<void(
bool success,
MountError return_code,
const std::vector<KeyDefinition>& key_definitions)> GetKeyDataCallback;
typedef base::Callback<
void(bool success, MountError return_code, const std::string& mount_hash)>
MountCallback;
typedef base::Callback<void(bool success, int64_t size)>
GetAccountDiskUsageCallback;
virtual ~HomedirMethods() {}
// Asks cryptohomed to return data about the key identified by |label| for the
// user identified by |id|. At present, this does not return any secret
// information and the request does not need to be authenticated.
virtual void GetKeyDataEx(const Identification& id,
const std::string& label,
const GetKeyDataCallback& callback) = 0;
// Asks cryptohomed to attempt authorization for user identified by |id| using
// |auth|. This can be used to unlock a user session.
virtual void CheckKeyEx(const Identification& id,
const Authorization& auth,
const Callback& callback) = 0;
// Asks cryptohomed to find the cryptohome for user identified by |id| and
// then mount it using |auth| to unlock the key.
// If the |create_keys| are not given and no cryptohome exists for |id|,
// the expected result is
// callback.Run(false, kCryptohomeMountErrorUserDoesNotExist, string()).
// Otherwise, the normal range of return codes is expected.
virtual void MountEx(const Identification& id,
const Authorization& auth,
const MountParameters& request,
const MountCallback& callback) = 0;
// Asks cryptohomed to try to add another |key| for user identified by |id|
// using |auth| to unlock the key.
// |clobber_if_exist| governs action if key with same label already exists for
// this user. if |true| old key will be replaced, if |false| old key will be
// preserved.
// Key used in |auth| should have PRIV_ADD privilege.
// |callback| will be called with status info on completion.
virtual void AddKeyEx(const Identification& id,
const Authorization& auth,
const KeyDefinition& key,
bool clobber_if_exist,
const Callback& callback) = 0;
// Asks cryptohomed to update |key| for user identified by |id| using |auth|
// to unlock the key.
// Label for |auth| and |key| have to be the same.
// Key used in |auth| should have PRIV_AUTHORIZED_UPDATE privilege.
// |signature| is used by cryptohome to verify the authentity of new key.
// |callback| will be called with status info on completion.
virtual void UpdateKeyEx(const Identification& id,
const Authorization& auth,
const KeyDefinition& key,
const std::string& signature,
const Callback& callback) = 0;
// Asks cryptohomed to remove specific key labeled with |label| for user
// identified by |id| using |auth|.
virtual void RemoveKeyEx(const Identification& id,
const Authorization& auth,
const std::string& label,
const Callback& callback) = 0;
// Asks cryptohomed to change cryptohome identification |id_from| to |id_to|,
// which results in cryptohome directory renaming.
virtual void RenameCryptohome(const Identification& id_from,
const Identification& id_to,
const Callback& callback) = 0;
// Asks cryptohomed to compute the size of cryptohome for user identified by
// |id|.
virtual void GetAccountDiskUsage(
const Identification& id,
const GetAccountDiskUsageCallback& callback) = 0;
// Creates the global HomedirMethods instance.
static void Initialize();
// Similar to Initialize(), but can inject an alternative
// HomedirMethods such as MockHomedirMethods for testing.
// The injected object will be owned by the internal pointer and deleted
// by Shutdown().
static void InitializeForTesting(HomedirMethods* homedir_methods);
// Destroys the global HomedirMethods instance if it exists.
static void Shutdown();
// Returns a pointer to the global HomedirMethods instance.
// Initialize() should already have been called.
static HomedirMethods* GetInstance();
};
} // namespace cryptohome
#endif // CHROMEOS_CRYPTOHOME_HOMEDIR_METHODS_H_