blob: 736f84c4f04112ffa5fe455e5b197bb007cf23d7 [file] [log] [blame]
// Copyright 2019 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 "chromeos/dbus/kerberos/fake_kerberos_client.h"
#include <utility>
#include "base/bind.h"
#include "base/location.h"
#include "base/threading/thread_task_runner_handle.h"
#include "third_party/cros_system_api/dbus/kerberos/dbus-constants.h"
namespace chromeos {
namespace {
// Posts |callback| on the current thread's task runner, passing it the
// |response| message.
template <class TProto>
void PostProtoResponse(base::OnceCallback<void(const TProto&)> callback,
const TProto& response) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), response));
}
// Similar to PostProtoResponse(), but posts |callback| with a proto containing
// only the given |error|.
template <class TProto>
void PostResponse(base::OnceCallback<void(const TProto&)> callback,
kerberos::ErrorType error) {
TProto response;
response.set_error(error);
PostProtoResponse(std::move(callback), response);
}
} // namespace
FakeKerberosClient::FakeKerberosClient() = default;
FakeKerberosClient::~FakeKerberosClient() = default;
void FakeKerberosClient::AddAccount(const kerberos::AddAccountRequest& request,
AddAccountCallback callback) {
if (accounts_.find(request.principal_name()) != accounts_.end()) {
PostResponse(std::move(callback), kerberos::ERROR_DUPLICATE_PRINCIPAL_NAME);
return;
}
accounts_[request.principal_name()] = AccountData();
PostResponse(std::move(callback), kerberos::ERROR_NONE);
}
void FakeKerberosClient::RemoveAccount(
const kerberos::RemoveAccountRequest& request,
RemoveAccountCallback callback) {
kerberos::ErrorType error = accounts_.erase(request.principal_name()) == 0
? kerberos::ERROR_UNKNOWN_PRINCIPAL_NAME
: kerberos::ERROR_NONE;
PostResponse(std::move(callback), error);
}
void FakeKerberosClient::SetConfig(const kerberos::SetConfigRequest& request,
SetConfigCallback callback) {
base::Optional<AccountData> data = GetAccountData(request.principal_name());
if (!data) {
PostResponse(std::move(callback), kerberos::ERROR_UNKNOWN_PRINCIPAL_NAME);
return;
}
data->krb5conf = request.krb5conf();
PostResponse(std::move(callback), kerberos::ERROR_NONE);
}
void FakeKerberosClient::AcquireKerberosTgt(
const kerberos::AcquireKerberosTgtRequest& request,
int password_fd,
AcquireKerberosTgtCallback callback) {
base::Optional<AccountData> data = GetAccountData(request.principal_name());
if (!data) {
PostResponse(std::move(callback), kerberos::ERROR_UNKNOWN_PRINCIPAL_NAME);
return;
}
// It worked! Magic!
data->has_tgt = true;
PostResponse(std::move(callback), kerberos::ERROR_NONE);
}
void FakeKerberosClient::GetKerberosFiles(
const kerberos::GetKerberosFilesRequest& request,
GetKerberosFilesCallback callback) {
base::Optional<AccountData> data = GetAccountData(request.principal_name());
if (!data) {
PostResponse(std::move(callback), kerberos::ERROR_UNKNOWN_PRINCIPAL_NAME);
return;
}
kerberos::GetKerberosFilesResponse response;
if (data->has_tgt) {
response.mutable_files()->set_krb5cc("Fake Kerberos credential cache");
response.mutable_files()->set_krb5conf("Fake Kerberos configuration");
}
response.set_error(kerberos::ERROR_NONE);
PostProtoResponse(std::move(callback), response);
}
void FakeKerberosClient::ConnectToKerberosFileChangedSignal(
KerberosFilesChangedCallback callback) {
DCHECK(!kerberos_files_changed_callback_);
kerberos_files_changed_callback_ = callback;
}
base::Optional<FakeKerberosClient::AccountData>
FakeKerberosClient::GetAccountData(const std::string& principal_name) {
auto it = accounts_.find(principal_name);
if (it == accounts_.end())
return base::nullopt;
return it->second;
}
KerberosClient::TestInterface* FakeKerberosClient::GetTestInterface() {
return this;
}
void FakeKerberosClient::FakeKerberosClient::set_started(bool started) {
started_ = started;
}
bool FakeKerberosClient::FakeKerberosClient::started() const {
return started_;
}
} // namespace chromeos