Skip to content

Commit

Permalink
AsioTlsStream: inherit from SharedObject
Browse files Browse the repository at this point in the history
All usages of `AsioTlsStream` were already using `Shared<AsioTlsStream>` to
keep a reference-counted instance. This commit moves the reference counting to
`AsioTlsStream` itself by inheriting from `SharedObject`. This will allow to
implement methods making use of the fact that these objects are
reference-counted.

The changes outside of `lib/base/tlsstream.hpp` are merely replacing
`Shared<AsioTlsStream>::Ptr` with `AsioTlsStream::Ptr` everywhere.
  • Loading branch information
julianbrost committed Feb 16, 2024
1 parent 7d1c887 commit 0ff5002
Show file tree
Hide file tree
Showing 21 changed files with 61 additions and 54 deletions.
8 changes: 4 additions & 4 deletions lib/base/netstring.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ size_t NetString::WriteStringToStream(const Stream::Ptr& stream, const String& s
* @exception invalid_argument The input stream is invalid.
* @see https://github.com/PeterScott/netstring-c/blob/master/netstring.c
*/
String NetString::ReadStringFromStream(const Shared<AsioTlsStream>::Ptr& stream,
String NetString::ReadStringFromStream(const AsioTlsStream::Ptr& stream,
ssize_t maxMessageLength)
{
namespace asio = boost::asio;
Expand Down Expand Up @@ -205,7 +205,7 @@ String NetString::ReadStringFromStream(const Shared<AsioTlsStream>::Ptr& stream,
* @exception invalid_argument The input stream is invalid.
* @see https://github.com/PeterScott/netstring-c/blob/master/netstring.c
*/
String NetString::ReadStringFromStream(const Shared<AsioTlsStream>::Ptr& stream,
String NetString::ReadStringFromStream(const AsioTlsStream::Ptr& stream,
boost::asio::yield_context yc, ssize_t maxMessageLength)
{
namespace asio = boost::asio;
Expand Down Expand Up @@ -284,7 +284,7 @@ String NetString::ReadStringFromStream(const Shared<AsioTlsStream>::Ptr& stream,
*
* @return The amount of bytes written.
*/
size_t NetString::WriteStringToStream(const Shared<AsioTlsStream>::Ptr& stream, const String& str)
size_t NetString::WriteStringToStream(const AsioTlsStream::Ptr& stream, const String& str)
{
namespace asio = boost::asio;

Expand All @@ -307,7 +307,7 @@ size_t NetString::WriteStringToStream(const Shared<AsioTlsStream>::Ptr& stream,
*
* @return The amount of bytes written.
*/
size_t NetString::WriteStringToStream(const Shared<AsioTlsStream>::Ptr& stream, const String& str, boost::asio::yield_context yc)
size_t NetString::WriteStringToStream(const AsioTlsStream::Ptr& stream, const String& str, boost::asio::yield_context yc)
{
namespace asio = boost::asio;

Expand Down
8 changes: 4 additions & 4 deletions lib/base/netstring.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ class NetString
public:
static StreamReadStatus ReadStringFromStream(const Stream::Ptr& stream, String *message, StreamReadContext& context,
bool may_wait = false, ssize_t maxMessageLength = -1);
static String ReadStringFromStream(const Shared<AsioTlsStream>::Ptr& stream, ssize_t maxMessageLength = -1);
static String ReadStringFromStream(const Shared<AsioTlsStream>::Ptr& stream,
static String ReadStringFromStream(const AsioTlsStream::Ptr& stream, ssize_t maxMessageLength = -1);
static String ReadStringFromStream(const AsioTlsStream::Ptr& stream,
boost::asio::yield_context yc, ssize_t maxMessageLength = -1);
static size_t WriteStringToStream(const Stream::Ptr& stream, const String& message);
static size_t WriteStringToStream(const Shared<AsioTlsStream>::Ptr& stream, const String& message);
static size_t WriteStringToStream(const Shared<AsioTlsStream>::Ptr& stream, const String& message, boost::asio::yield_context yc);
static size_t WriteStringToStream(const AsioTlsStream::Ptr& stream, const String& message);
static size_t WriteStringToStream(const AsioTlsStream::Ptr& stream, const String& message, boost::asio::yield_context yc);
static void WriteStringToStream(std::ostream& stream, const String& message);

private:
Expand Down
13 changes: 10 additions & 3 deletions lib/base/tlsstream.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#define TLSSTREAM_H

#include "base/i2-base.hpp"
#include "base/shared.hpp"
#include "base/shared-object.hpp"
#include "base/socket.hpp"
#include "base/stream.hpp"
#include "base/tlsutility.hpp"
Expand Down Expand Up @@ -104,15 +104,22 @@ class UnbufferedAsioTlsStream : public AsioTcpTlsStream
void BeforeHandshake(handshake_type type);
};

class AsioTlsStream : public boost::asio::buffered_stream<UnbufferedAsioTlsStream>
class AsioTlsStream : public SharedObject, public boost::asio::buffered_stream<UnbufferedAsioTlsStream>
{
public:
DECLARE_PTR_TYPEDEFS(AsioTlsStream);

inline
AsioTlsStream(boost::asio::io_context& ioContext, boost::asio::ssl::context& sslContext, const String& hostname = String())
: AsioTlsStream(UnbufferedAsioTlsStreamParams{ioContext, sslContext, hostname})
{
}

static AsioTlsStream::Ptr Make(boost::asio::io_context& ioContext, boost::asio::ssl::context& sslContext, const String& hostname = String())
{
return new AsioTlsStream(ioContext, sslContext, hostname);
}

private:
inline
AsioTlsStream(UnbufferedAsioTlsStreamParams init)
Expand All @@ -122,7 +129,7 @@ class AsioTlsStream : public boost::asio::buffered_stream<UnbufferedAsioTlsStrea
};

typedef boost::asio::buffered_stream<boost::asio::ip::tcp::socket> AsioTcpStream;
typedef std::pair<Shared<AsioTlsStream>::Ptr, Shared<AsioTcpStream>::Ptr> OptionalTlsStream;
typedef std::pair<AsioTlsStream::Ptr, Shared<AsioTcpStream>::Ptr> OptionalTlsStream;

}

Expand Down
6 changes: 3 additions & 3 deletions lib/cli/consolecommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ namespace po = boost::program_options;

static ScriptFrame *l_ScriptFrame;
static Url::Ptr l_Url;
static Shared<AsioTlsStream>::Ptr l_TlsStream;
static AsioTlsStream::Ptr l_TlsStream;
static String l_Session;

REGISTER_CLICOMMAND("console", ConsoleCommand);
Expand Down Expand Up @@ -522,7 +522,7 @@ int ConsoleCommand::RunScriptConsole(ScriptFrame& scriptFrame, const String& con
*
* @returns AsioTlsStream pointer for future HTTP connections.
*/
Shared<AsioTlsStream>::Ptr ConsoleCommand::Connect()
AsioTlsStream::Ptr ConsoleCommand::Connect()
{
Shared<boost::asio::ssl::context>::Ptr sslContext;

Expand All @@ -537,7 +537,7 @@ Shared<AsioTlsStream>::Ptr ConsoleCommand::Connect()
String host = l_Url->GetHost();
String port = l_Url->GetPort();

Shared<AsioTlsStream>::Ptr stream = Shared<AsioTlsStream>::Make(IoEngine::Get().GetIoContext(), *sslContext, host);
AsioTlsStream::Ptr stream = AsioTlsStream::Make(IoEngine::Get().GetIoContext(), *sslContext, host);

try {
icinga::Connect(stream->lowest_layer(), host, port);
Expand Down
2 changes: 1 addition & 1 deletion lib/cli/consolecommand.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class ConsoleCommand final : public CLICommand
mutable std::mutex m_Mutex;
mutable std::condition_variable m_CV;

static Shared<AsioTlsStream>::Ptr Connect();
static AsioTlsStream::Ptr Connect();

static Value ExecuteScript(const String& session, const String& command, bool sandboxed);
static Array::Ptr AutoCompleteScript(const String& session, const String& command, bool sandboxed);
Expand Down
2 changes: 1 addition & 1 deletion lib/icingadb/redisconnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ void RedisConnection::Connect(asio::yield_context& yc)
Log(m_Parent ? LogNotice : LogInformation, "IcingaDB")
<< "Trying to connect to Redis server (async, TLS) on host '" << m_Host << ":" << m_Port << "'";

auto conn (Shared<AsioTlsStream>::Make(m_Strand.context(), *m_TLSContext, m_Host));
auto conn (AsioTlsStream::Make(m_Strand.context(), *m_TLSContext, m_Host));
auto& tlsConn (conn->next_layer());
auto connectTimeout (MakeTimeout(conn));
Defer cancelTimeout ([&connectTimeout]() { connectTimeout->Cancel(); });
Expand Down
2 changes: 1 addition & 1 deletion lib/icingadb/redisconnection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ namespace icinga
boost::asio::io_context::strand m_Strand;
Shared<TcpConn>::Ptr m_TcpConn;
Shared<UnixConn>::Ptr m_UnixConn;
Shared<AsioTlsStream>::Ptr m_TlsConn;
AsioTlsStream::Ptr m_TlsConn;
Atomic<bool> m_Connecting, m_Connected, m_Started;

struct {
Expand Down
2 changes: 1 addition & 1 deletion lib/methods/ifwapichecktask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -507,7 +507,7 @@ void IfwApiCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
return;
}

auto conn (Shared<AsioTlsStream>::Make(io, *ctx, expectedSan));
auto conn (AsioTlsStream::Make(io, *ctx, expectedSan));

IoEngine::SpawnCoroutine(
*strand,
Expand Down
2 changes: 1 addition & 1 deletion lib/perfdata/elasticsearchwriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,7 @@ OptionalTlsStream ElasticsearchWriter::Connect()
throw;
}

stream.first = Shared<AsioTlsStream>::Make(IoEngine::Get().GetIoContext(), *sslContext, GetHost());
stream.first = AsioTlsStream::Make(IoEngine::Get().GetIoContext(), *sslContext, GetHost());

} else {
stream.second = Shared<AsioTcpStream>::Make(IoEngine::Get().GetIoContext());
Expand Down
2 changes: 1 addition & 1 deletion lib/perfdata/gelfwriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ void GelfWriter::ReconnectInternal()
throw;
}

m_Stream.first = Shared<AsioTlsStream>::Make(IoEngine::Get().GetIoContext(), *sslContext, GetHost());
m_Stream.first = AsioTlsStream::Make(IoEngine::Get().GetIoContext(), *sslContext, GetHost());

} else {
m_Stream.second = Shared<AsioTcpStream>::Make(IoEngine::Get().GetIoContext());
Expand Down
2 changes: 1 addition & 1 deletion lib/perfdata/influxdbcommonwriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ OptionalTlsStream InfluxdbCommonWriter::Connect()
throw;
}

stream.first = Shared<AsioTlsStream>::Make(IoEngine::Get().GetIoContext(), *sslContext, GetHost());
stream.first = AsioTlsStream::Make(IoEngine::Get().GetIoContext(), *sslContext, GetHost());

} else {
stream.second = Shared<AsioTcpStream>::Make(IoEngine::Get().GetIoContext());
Expand Down
8 changes: 4 additions & 4 deletions lib/remote/apilistener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ void ApiListener::ListenerCoroutineProc(boost::asio::yield_context yc, const Sha
}

boost::shared_lock<decltype(m_SSLContextMutex)> lock (m_SSLContextMutex);
auto sslConn (Shared<AsioTlsStream>::Make(io, *m_SSLContext));
auto sslConn (AsioTlsStream::Make(io, *m_SSLContext));

lock.unlock();
sslConn->lowest_layer() = std::move(socket);
Expand Down Expand Up @@ -580,7 +580,7 @@ void ApiListener::AddConnection(const Endpoint::Ptr& endpoint)

try {
boost::shared_lock<decltype(m_SSLContextMutex)> lock (m_SSLContextMutex);
auto sslConn (Shared<AsioTlsStream>::Make(io, *m_SSLContext, endpoint->GetName()));
auto sslConn (AsioTlsStream::Make(io, *m_SSLContext, endpoint->GetName()));

lock.unlock();

Expand Down Expand Up @@ -614,7 +614,7 @@ void ApiListener::AddConnection(const Endpoint::Ptr& endpoint)

void ApiListener::NewClientHandler(
boost::asio::yield_context yc, const Shared<boost::asio::io_context::strand>::Ptr& strand,
const Shared<AsioTlsStream>::Ptr& client, const String& hostname, ConnectionRole role
const AsioTlsStream::Ptr& client, const String& hostname, ConnectionRole role
)
{
try {
Expand Down Expand Up @@ -653,7 +653,7 @@ static const auto l_MyCapabilities (
*/
void ApiListener::NewClientHandlerInternal(
boost::asio::yield_context yc, const Shared<boost::asio::io_context::strand>::Ptr& strand,
const Shared<AsioTlsStream>::Ptr& client, const String& hostname, ConnectionRole role
const AsioTlsStream::Ptr& client, const String& hostname, ConnectionRole role
)
{
namespace asio = boost::asio;
Expand Down
4 changes: 2 additions & 2 deletions lib/remote/apilistener.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,11 +191,11 @@ class ApiListener final : public ObjectImpl<ApiListener>

void NewClientHandler(
boost::asio::yield_context yc, const Shared<boost::asio::io_context::strand>::Ptr& strand,
const Shared<AsioTlsStream>::Ptr& client, const String& hostname, ConnectionRole role
const AsioTlsStream::Ptr& client, const String& hostname, ConnectionRole role
);
void NewClientHandlerInternal(
boost::asio::yield_context yc, const Shared<boost::asio::io_context::strand>::Ptr& strand,
const Shared<AsioTlsStream>::Ptr& client, const String& hostname, ConnectionRole role
const AsioTlsStream::Ptr& client, const String& hostname, ConnectionRole role
);
void ListenerCoroutineProc(boost::asio::yield_context yc, const Shared<boost::asio::ip::tcp::acceptor>::Ptr& server);

Expand Down
4 changes: 2 additions & 2 deletions lib/remote/httpserverconnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,12 @@ using namespace icinga;

auto const l_ServerHeader ("Icinga/" + Application::GetAppVersion());

HttpServerConnection::HttpServerConnection(const String& identity, bool authenticated, const Shared<AsioTlsStream>::Ptr& stream)
HttpServerConnection::HttpServerConnection(const String& identity, bool authenticated, const AsioTlsStream::Ptr& stream)
: HttpServerConnection(identity, authenticated, stream, IoEngine::Get().GetIoContext())
{
}

HttpServerConnection::HttpServerConnection(const String& identity, bool authenticated, const Shared<AsioTlsStream>::Ptr& stream, boost::asio::io_context& io)
HttpServerConnection::HttpServerConnection(const String& identity, bool authenticated, const AsioTlsStream::Ptr& stream, boost::asio::io_context& io)
: m_Stream(stream), m_Seen(Utility::GetTime()), m_IoStrand(io), m_ShuttingDown(false), m_HasStartedStreaming(false),
m_CheckLivenessTimer(io)
{
Expand Down
6 changes: 3 additions & 3 deletions lib/remote/httpserverconnection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class HttpServerConnection final : public Object
public:
DECLARE_PTR_TYPEDEFS(HttpServerConnection);

HttpServerConnection(const String& identity, bool authenticated, const Shared<AsioTlsStream>::Ptr& stream);
HttpServerConnection(const String& identity, bool authenticated, const AsioTlsStream::Ptr& stream);

void Start();
void Disconnect();
Expand All @@ -35,15 +35,15 @@ class HttpServerConnection final : public Object

private:
ApiUser::Ptr m_ApiUser;
Shared<AsioTlsStream>::Ptr m_Stream;
AsioTlsStream::Ptr m_Stream;
double m_Seen;
String m_PeerAddress;
boost::asio::io_context::strand m_IoStrand;
bool m_ShuttingDown;
bool m_HasStartedStreaming;
boost::asio::deadline_timer m_CheckLivenessTimer;

HttpServerConnection(const String& identity, bool authenticated, const Shared<AsioTlsStream>::Ptr& stream, boost::asio::io_context& io);
HttpServerConnection(const String& identity, bool authenticated, const AsioTlsStream::Ptr& stream, boost::asio::io_context& io);

void ProcessMessages(boost::asio::yield_context yc);
void CheckLiveness(boost::asio::yield_context yc);
Expand Down
10 changes: 5 additions & 5 deletions lib/remote/jsonrpc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ static bool GetDebugJsonRpcCached()
*
* @return The amount of bytes sent.
*/
size_t JsonRpc::SendMessage(const Shared<AsioTlsStream>::Ptr& stream, const Dictionary::Ptr& message)
size_t JsonRpc::SendMessage(const AsioTlsStream::Ptr& stream, const Dictionary::Ptr& message)
{
String json = JsonEncode(message);

Expand All @@ -71,7 +71,7 @@ size_t JsonRpc::SendMessage(const Shared<AsioTlsStream>::Ptr& stream, const Dict
*
* @return The amount of bytes sent.
*/
size_t JsonRpc::SendMessage(const Shared<AsioTlsStream>::Ptr& stream, const Dictionary::Ptr& message, boost::asio::yield_context yc)
size_t JsonRpc::SendMessage(const AsioTlsStream::Ptr& stream, const Dictionary::Ptr& message, boost::asio::yield_context yc)
{
return JsonRpc::SendRawMessage(stream, JsonEncode(message), yc);
}
Expand All @@ -85,7 +85,7 @@ size_t JsonRpc::SendMessage(const Shared<AsioTlsStream>::Ptr& stream, const Dict
*
* @return bytes sent
*/
size_t JsonRpc::SendRawMessage(const Shared<AsioTlsStream>::Ptr& stream, const String& json, boost::asio::yield_context yc)
size_t JsonRpc::SendRawMessage(const AsioTlsStream::Ptr& stream, const String& json, boost::asio::yield_context yc)
{
#ifdef I2_DEBUG
if (GetDebugJsonRpcCached())
Expand All @@ -104,7 +104,7 @@ size_t JsonRpc::SendRawMessage(const Shared<AsioTlsStream>::Ptr& stream, const S
* @return A JSON string
*/

String JsonRpc::ReadMessage(const Shared<AsioTlsStream>::Ptr& stream, ssize_t maxMessageLength)
String JsonRpc::ReadMessage(const AsioTlsStream::Ptr& stream, ssize_t maxMessageLength)
{
String jsonString = NetString::ReadStringFromStream(stream, maxMessageLength);

Expand All @@ -125,7 +125,7 @@ String JsonRpc::ReadMessage(const Shared<AsioTlsStream>::Ptr& stream, ssize_t ma
*
* @return A JSON string
*/
String JsonRpc::ReadMessage(const Shared<AsioTlsStream>::Ptr& stream, boost::asio::yield_context yc, ssize_t maxMessageLength)
String JsonRpc::ReadMessage(const AsioTlsStream::Ptr& stream, boost::asio::yield_context yc, ssize_t maxMessageLength)
{
String jsonString = NetString::ReadStringFromStream(stream, yc, maxMessageLength);

Expand Down
10 changes: 5 additions & 5 deletions lib/remote/jsonrpc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ namespace icinga
class JsonRpc
{
public:
static size_t SendMessage(const Shared<AsioTlsStream>::Ptr& stream, const Dictionary::Ptr& message);
static size_t SendMessage(const Shared<AsioTlsStream>::Ptr& stream, const Dictionary::Ptr& message, boost::asio::yield_context yc);
static size_t SendRawMessage(const Shared<AsioTlsStream>::Ptr& stream, const String& json, boost::asio::yield_context yc);
static size_t SendMessage(const AsioTlsStream::Ptr& stream, const Dictionary::Ptr& message);
static size_t SendMessage(const AsioTlsStream::Ptr& stream, const Dictionary::Ptr& message, boost::asio::yield_context yc);
static size_t SendRawMessage(const AsioTlsStream::Ptr& stream, const String& json, boost::asio::yield_context yc);

static String ReadMessage(const Shared<AsioTlsStream>::Ptr& stream, ssize_t maxMessageLength = -1);
static String ReadMessage(const Shared<AsioTlsStream>::Ptr& stream, boost::asio::yield_context yc, ssize_t maxMessageLength = -1);
static String ReadMessage(const AsioTlsStream::Ptr& stream, ssize_t maxMessageLength = -1);
static String ReadMessage(const AsioTlsStream::Ptr& stream, boost::asio::yield_context yc, ssize_t maxMessageLength = -1);

static Dictionary::Ptr DecodeMessage(const String& message);

Expand Down
6 changes: 3 additions & 3 deletions lib/remote/jsonrpcconnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@ REGISTER_APIFUNCTION(SetLogPosition, log, &SetLogPositionHandler);
static RingBuffer l_TaskStats (15 * 60);

JsonRpcConnection::JsonRpcConnection(const String& identity, bool authenticated,
const Shared<AsioTlsStream>::Ptr& stream, ConnectionRole role)
const AsioTlsStream::Ptr& stream, ConnectionRole role)
: JsonRpcConnection(identity, authenticated, stream, role, IoEngine::Get().GetIoContext())
{
}

JsonRpcConnection::JsonRpcConnection(const String& identity, bool authenticated,
const Shared<AsioTlsStream>::Ptr& stream, ConnectionRole role, boost::asio::io_context& io)
const AsioTlsStream::Ptr& stream, ConnectionRole role, boost::asio::io_context& io)
: m_Identity(identity), m_Authenticated(authenticated), m_Stream(stream), m_Role(role),
m_Timestamp(Utility::GetTime()), m_Seen(Utility::GetTime()), m_NextHeartbeat(0), m_IoStrand(io),
m_OutgoingMessagesQueued(io), m_WriterDone(io), m_ShuttingDown(false),
Expand Down Expand Up @@ -151,7 +151,7 @@ Endpoint::Ptr JsonRpcConnection::GetEndpoint() const
return m_Endpoint;
}

Shared<AsioTlsStream>::Ptr JsonRpcConnection::GetStream() const
AsioTlsStream::Ptr JsonRpcConnection::GetStream() const
{
return m_Stream;
}
Expand Down

0 comments on commit 0ff5002

Please sign in to comment.