mirror of https://github.com/infosecn1nja/C3.git
76 lines
3.5 KiB
C++
76 lines
3.5 KiB
C++
#pragma once
|
|
|
|
#include "Distributor.h"
|
|
#include "Common/FSecure/C3/Internals/InterfaceFactory.h"
|
|
|
|
namespace FSecure::C3::Core
|
|
{
|
|
/// Last base layer class for both Relay types.
|
|
struct Relay : Distributor, FSecure::C3::Relay
|
|
{
|
|
/// Destructor
|
|
virtual ~Relay() = default;
|
|
|
|
/// Called whenever an attached Binder Peripheral wants to send a Command to its Connector Binder.
|
|
/// @param command full Command with arguments.
|
|
/// @param sender Interface that is sending the Command.
|
|
virtual void PostCommandToConnector(ByteView command, std::shared_ptr<DeviceBridge> sender) = 0;
|
|
AgentId GetAgentId() const { return m_AgentId; }
|
|
BuildId GetBuildId() const { return m_BuildId; }
|
|
|
|
/// Detaches an Device. This operation leads to (delayed) destruction of the Device.
|
|
/// @param iidOfDeviceToDetach ID of the Device to detach.
|
|
/// @throw std::invalid_argument on an attempt of removal of a non-existent Device.
|
|
virtual void DetachDevice(DeviceId const& iidOfDeviceToDetach);
|
|
|
|
protected:
|
|
using Distributor::On;
|
|
|
|
/// A protected constructor. @see Distributor::Distributor.
|
|
/// @param callbackOnLog callback fired whenever a new Log entry is being added.
|
|
/// @param interfaceFactory reference to Interface factory.
|
|
/// @param decryptionKey Relay's private asymmetric key.
|
|
/// @param broadcastKey Network's symmetric key.
|
|
/// @param buildId Build identifier.
|
|
/// @param agentId Agent identifier.
|
|
Relay(LoggerCallback callbackOnLog, InterfaceFactory& interfaceFactory, Crypto::PrivateKey const& decryptionKey, Crypto::SymmetricKey const& broadcastKey, BuildId buildId, AgentId agentId = AgentId::GenerateRandom());
|
|
|
|
/// Add a new Device.
|
|
/// @param iid preferred Identifier.
|
|
/// @param DeviceNameHash hash value of Device's name.
|
|
/// @param commandLine buffer containing Device's construction parameters.
|
|
/// @return newly created Device.
|
|
/// @throws std::runtime_error if couldn't find factory for specified Device name hash or other exceptions if factory was unable to process provided command-line.
|
|
virtual std::shared_ptr<DeviceBridge> CreateAndAttachDevice(DeviceId iid, HashT deviceNameHash, bool isNegotiationChannel, ByteView commandLine, bool negotiationClient = false);
|
|
|
|
/// Attaches provided Device to the Relay.
|
|
/// @param device provided Device.
|
|
/// @return same as device argument.
|
|
virtual std::shared_ptr<DeviceBridge> AttachDevice(std::shared_ptr<FSecure::C3::Core::DeviceBridge> device);
|
|
|
|
/// Close Relay (command handler)
|
|
virtual void Close();
|
|
|
|
/// Create route (command handler)
|
|
/// @param args - packed arguments of route to create
|
|
virtual void CreateRoute(ByteView args);
|
|
|
|
/// Remove route (command handler)
|
|
/// @param args - packed arguments of route to remove
|
|
virtual void RemoveRoute(ByteView args);
|
|
|
|
/// Finds attached Device from Device ID hex text.
|
|
/// @param did ID of the Device to find.
|
|
/// @return Device pointer to the Device if found or null.
|
|
std::shared_ptr<DeviceBridge> FindDevice(DeviceId did);
|
|
|
|
/// Waits for Relay to be terminated internally by a C3 API Command (e.g. from WebController).
|
|
void Join() override;
|
|
|
|
SafeSmartPointerContainer<std::weak_ptr<DeviceBridge>> m_Devices; ///< Container for all attached Devices.
|
|
const BuildId m_BuildId; ///< An unique identifier for the Relay's binary setup (Build identifier).
|
|
AgentId m_AgentId; ///< A run-time generated, unique identifier for this Relay's instance.
|
|
InterfaceFactory& m_InterfaceFactory; ///< Object responsible for crating new Devices.
|
|
};
|
|
}
|