blob: ce6f5c1ca884424f0b11118936b3b4939be224ec [file] [log] [blame]
// Copyright 2016 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.
#include <base/logging.h>
#include <brillo/daemons/dbus_daemon.h>
#include <brillo/dbus/async_event_sequencer.h>
#include <chromeos/dbus/service_constants.h>
#include <install_attributes/libinstallattributes.h>
#include "authpolicy/org.chromium.AuthPolicy.h"
using brillo::dbus_utils::AsyncEventSequencer;
namespace org {
namespace chromium {
namespace authpolicy {
const char kObjectServicePath[] = "/org/chromium/AuthPolicy/ObjectManager";
class Domain : public org::chromium::AuthPolicyInterface {
public:
explicit Domain(brillo::dbus_utils::ExportedObjectManager* object_manager)
: dbus_object_{new brillo::dbus_utils::DBusObject{
object_manager, object_manager->GetBus(),
org::chromium::AuthPolicyAdaptor::GetObjectPath()}} {
}
~Domain() override = default;
bool AuthenticateUser(
brillo::ErrorPtr* error,
const std::string& in_user_principal_name,
const dbus::FileDescriptor& in_password_fd,
int32_t* out_code,
std::string* account_id) override {
return false;
}
bool JoinADDomain(
brillo::ErrorPtr* error,
const std::string& in_machine_name,
const std::string& in_user_principal_name,
const dbus::FileDescriptor& in_password_fd,
int32_t* out_code) override {
return false;
}
void RegisterAsync(
const AsyncEventSequencer::CompletionAction& completion_callback) {
scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer());
dbus_adaptor_.RegisterWithDBusObject(dbus_object_.get());
dbus_object_->RegisterAsync(
sequencer->GetHandler("Failed exporting Domain.", true));
sequencer->OnAllTasksCompletedCall({completion_callback});
}
private:
org::chromium::AuthPolicyAdaptor dbus_adaptor_{this};
std::unique_ptr<brillo::dbus_utils::DBusObject> dbus_object_;
};
class Daemon : public brillo::DBusServiceDaemon {
public:
Daemon() : DBusServiceDaemon(::authpolicy::kAuthPolicyInterface,
kObjectServicePath) {
}
protected:
void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override {
domain_.reset(new Domain(object_manager_.get()));
domain_->RegisterAsync(
sequencer->GetHandler("Domain.RegisterAsync() failed.", true));
}
void OnShutdown(int* return_code) override {
DBusServiceDaemon::OnShutdown(return_code);
domain_.reset();
}
private:
std::unique_ptr<Domain> domain_;
DISALLOW_COPY_AND_ASSIGN(Daemon);
};
} // namespace authpolicy
} // namespace chromium
} // namespace org
int main() {
// Safety check to ensure that authpolicyd cannot run after the device has
// been locked to a mode other than enterprise_ad. (The lifetime management
// of authpolicyd happens through upstart, this check only serves as a second
// line of defense.)
InstallAttributesReader install_attributes_reader;
if (install_attributes_reader.IsLocked()) {
const std::string& mode =
install_attributes_reader.GetAttribute(
InstallAttributesReader::kAttrMode);
if (mode != InstallAttributesReader::kDeviceModeEnterpriseAD) {
LOG(ERROR) << "OOBE completed but device not in AD management mode.";
// Exit with "success" to prevent respawn by upstart.
exit(0);
}
}
org::chromium::authpolicy::Daemon daemon;
return daemon.Run();
}