blob: d0f3dd6259bc90ff1589046641f2fcd90289c46e [file] [log] [blame]
// Copyright 2015 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 WEBSERVER_WEBSERVD_SERVER_H_
#define WEBSERVER_WEBSERVD_SERVER_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <brillo/dbus/dbus_object.h>
#include <brillo/dbus/exported_object_manager.h>
#include <brillo/secure_blob.h>
#include "dbus_bindings/org.chromium.WebServer.Server.h"
#include "webservd/encryptor.h"
#include "webservd/firewall_interface.h"
#include "webservd/server_interface.h"
#include "webservd/temp_file_manager.h"
namespace webservd {
class DBusProtocolHandler;
class DBusServerRequest;
// Top-level D-Bus object to interface with the server as a whole.
class Server final : public org::chromium::WebServer::ServerInterface,
public ServerInterface {
public:
Server(brillo::dbus_utils::ExportedObjectManager* object_manager,
const Config& config,
std::unique_ptr<FirewallInterface> firewall);
// Need to off-line the destructor to allow |protocol_handler_map_| to contain
// a forward-declared pointer to DBusProtocolHandler.
~Server();
void RegisterAsync(
const brillo::dbus_utils::AsyncEventSequencer::CompletionAction& cb);
// Overrides from org::chromium::WebServer::ServerInterface.
std::string Ping() override;
// Overrides from webservd::ServerInterface.
void ProtocolHandlerStarted(ProtocolHandler* handler) override;
void ProtocolHandlerStopped(ProtocolHandler* handler) override;
const Config& GetConfig() const override { return config_; }
TempFileManager* GetTempFileManager() override { return &temp_file_manager_; }
scoped_refptr<dbus::Bus> GetBus() { return dbus_object_->GetBus(); }
// Allows injection of a non-default |encryptor| (used for testing). The
// caller retains ownership of the pointer.
void SetEncryptor(Encryptor* encryptor) { encryptor_ = encryptor; }
private:
void CreateProtocolHandler(Config::ProtocolHandler* handler_config);
void InitTlsData();
void OnFirewallServiceOnline();
base::FilePath GetUploadDirectory() const;
org::chromium::WebServer::ServerAdaptor dbus_adaptor_{this};
std::unique_ptr<brillo::dbus_utils::DBusObject> dbus_object_;
std::unique_ptr<Encryptor> default_encryptor_;
Encryptor* encryptor_;
Config config_;
int last_protocol_handler_index_{0};
brillo::Blob TLS_certificate_;
brillo::Blob TLS_certificate_fingerprint_;
brillo::SecureBlob TLS_private_key_;
std::map<ProtocolHandler*, std::unique_ptr<DBusProtocolHandler>>
protocol_handler_map_;
// |protocol_handlers_| is currently used to maintain the lifetime of
// ProtocolHandler object instances. When (if) we start to add/remove
// protocol handlers dynamically at run-time, it will be used to locate
// existing handlers so they can be removed.
std::vector<std::unique_ptr<ProtocolHandler>> protocol_handlers_;
// The firewall service handler.
const std::unique_ptr<FirewallInterface> firewall_;
FileDeleter file_deleter_;
TempFileManager temp_file_manager_{GetUploadDirectory(), &file_deleter_};
base::WeakPtrFactory<Server> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(Server);
};
} // namespace webservd
#endif // WEBSERVER_WEBSERVD_SERVER_H_