blob: 7b92ea843b9cb70a9cc7a1178647ea7aea118a73 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS 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 LOGIN_MANAGER_DEVICE_LOCAL_ACCOUNT_POLICY_SERVICE_H_
#define LOGIN_MANAGER_DEVICE_LOCAL_ACCOUNT_POLICY_SERVICE_H_
#include <map>
#include <string>
#include <vector>
#include <base/basictypes.h>
#include <base/files/file_path.h>
#include <base/memory/ref_counted.h>
#include <gtest/gtest.h>
#include "login_manager/policy_service.h"
namespace base {
class MessageLoopProxy;
}
namespace enterprise_management {
class ChromeDeviceSettingsProto;
}
namespace login_manager {
class PolicyKey;
// Manages policy blobs for device-local accounts, loading/storing them from/to
// disk, making sure signature checks are performed on store operations and
// restricting access to the accounts defined in device settings.
class DeviceLocalAccountPolicyService {
public:
// Name of the subdirectory to store policy in.
static const base::FilePath::CharType kPolicyDir[];
// File name of the file within |kPolicyDir| that holds the policy blob.
static const base::FilePath::CharType kPolicyFileName[];
DeviceLocalAccountPolicyService(
const base::FilePath& device_local_account_dir,
PolicyKey* owner_key,
const scoped_refptr<base::MessageLoopProxy>& main_loop);
~DeviceLocalAccountPolicyService();
// Store policy for |account_id|, return false if the device-local account is
// not defined in device policy.
bool Store(const std::string& account_id,
const uint8* policy_data,
uint32 policy_data_size,
PolicyService::Completion* completion);
// Load policy for a given |account_id| and places the result in
// |policy_data|. Returns true if the account exists and policy could be read
// successfully, false otherwise.
bool Retrieve(const std::string& account_id,
std::vector<uint8>* policy_data);
// Updates device settings, i.e. what device-local accounts are available.
// This will purge any on-disk state for accounts that are no longer defined
// in device settings. Later requests to Load() and Store() will respect the
// new list of device-local accounts and fail for accounts that are not
// present.
void UpdateDeviceSettings(
const enterprise_management::ChromeDeviceSettingsProto& device_settings);
private:
// Migrate uppercase local-account directories to their lowercase variants.
// This is to repair the damage caused by http://crbug.com/225472.
bool MigrateUppercaseDirs(void);
// Obtains the PolicyService instance that manages disk storage for
// |account_id| after checking that |account_id| is valid. The PolicyService
// is lazily created on the fly if not present yet.
PolicyService* GetPolicyService(const std::string& account_id);
// Returns the identifier for a given |account_id|. The value returned is safe
// to use as a file system name. This may fail, in which case the returned
// string will be empty.
std::string GetAccountKey(const std::string& account_id);
// Checks whether the passed string is a properly formatted account key.
bool IsValidAccountKey(const std::string& str);
// The base path for storing device-local account information on disk.
const base::FilePath device_local_account_dir_;
// The policy key to verify signatures against.
PolicyKey* owner_key_;
// Main loop for the policy service to use.
scoped_refptr<base::MessageLoopProxy> main_loop_;
// Keeps lazily-created instances of the device-local account policy services.
// The keys present in this map are kept in sync with device policy. Entries
// that are not present are invalid, entries that contain a NULL pointer
// indicate the respective policy blob hasn't been pulled from disk yet.
std::map<std::string, PolicyService*> policy_map_;
FRIEND_TEST(DeviceLocalAccountPolicyServiceTest, MigrateUppercaseDirs);
DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyService);
};
} // namespace login_manager
#endif // LOGIN_MANAGER_DEVICE_LOCAL_ACCOUNT_POLICY_SERVICE_H_