blob: b43c217d6229141e9bafe74c66d5e33d12e47df4 [file] [log] [blame]
// Copyright 2019 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 KERBEROS_ACCOUNT_MANAGER_H_
#define KERBEROS_ACCOUNT_MANAGER_H_
#include <memory>
#include <string>
#include <unordered_map>
#include <base/compiler_specific.h>
#include <base/macros.h>
#include <base/optional.h>
#include "kerberos/proto_bindings/kerberos_service.pb.h"
namespace kerberos {
// Manages Kerberos tickets for a set of accounts keyed by principal name
// (user@REALM.COM).
class AccountManager {
public:
AccountManager();
~AccountManager();
// Adds an account keyed by |principal_name| (user@REALM.COM) to the list of
// accounts. Returns |ERROR_DUPLICATE_PRINCIPAL_NAME| if the account is
// already present.
ErrorType AddAccount(const std::string& principal_name) WARN_UNUSED_RESULT;
// Removes the account keyed by |principal_name| (user@REALM.COM) from the
// list of accounts. Returns |ERROR_UNKNOWN_PRINCIPAL_NAME| if there is no
// such account.
ErrorType RemoveAccount(const std::string& principal_name) WARN_UNUSED_RESULT;
// Sets the Kerberos configuration (krb5.conf) used for the given
// |principal_name|.
ErrorType SetConfig(const std::string& principal_name,
const std::string& krb5_conf) WARN_UNUSED_RESULT;
// Acquires a Kerberos ticket-granting-ticket for the account keyed by
// |principal_name| (user@REALM.COM). Returns |ERROR_UNKNOWN_PRINCIPAL_NAME|
// if there is no such account.
ErrorType AcquireTgt(const std::string& principal_name,
const std::string& password) WARN_UNUSED_RESULT;
// Retrieves the Kerberos credential cache and the configuration file for the
// account keyed by |principal_name| (user@REALM.COM). Returns
// |ERROR_UNKNOWN_PRINCIPAL_NAME| if there is no such account.
ErrorType GetKerberosFiles(const std::string& principal_name,
KerberosFiles* files) WARN_UNUSED_RESULT;
private:
struct AccountData {};
// Returns the AccountData for |principal_name| if available or nullopt
// otherwise.
base::Optional<AccountData> GetAccountData(const std::string& principal_name);
// Maps principal name (user@REALM.COM) to account data.
using AccountsMap =
std::unordered_map<std::string, std::unique_ptr<AccountData>>;
AccountsMap accounts_;
DISALLOW_COPY_AND_ASSIGN(AccountManager);
};
} // namespace kerberos
#endif // KERBEROS_ACCOUNT_MANAGER_H_