pissircd/src/modules/tls_cipher.c

119 lines
2.3 KiB
C

/*
* Store TLS cipher in ModData
* (C) Copyright 2021-.. Syzop and The UnrealIRCd Team
* License: GPLv2 or later
*/
#include "unrealircd.h"
ModuleHeader MOD_HEADER
= {
"tls_cipher",
"5.0",
"Store and retrieve TLS cipher string",
"UnrealIRCd Team",
"unrealircd-6",
};
/* Forward declarations */
void tls_cipher_free(ModData *m);
const char *tls_cipher_serialize(ModData *m);
void tls_cipher_unserialize(const char *str, ModData *m);
int tls_cipher_handshake(Client *client);
int tls_cipher_connect(Client *client);
int tls_cipher_whois(Client *client, Client *target);
int tls_json_expand_client(Client *client, int detail, json_t *j);
ModDataInfo *tls_cipher_md; /* Module Data structure which we acquire */
MOD_INIT()
{
ModDataInfo mreq;
MARK_AS_OFFICIAL_MODULE(modinfo);
memset(&mreq, 0, sizeof(mreq));
mreq.name = "tls_cipher";
mreq.free = tls_cipher_free;
mreq.serialize = tls_cipher_serialize;
mreq.unserialize = tls_cipher_unserialize;
mreq.sync = MODDATA_SYNC_EARLY;
mreq.type = MODDATATYPE_CLIENT;
tls_cipher_md = ModDataAdd(modinfo->handle, mreq);
if (!tls_cipher_md)
abort();
HookAdd(modinfo->handle, HOOKTYPE_HANDSHAKE, 0, tls_cipher_handshake);
HookAdd(modinfo->handle, HOOKTYPE_SERVER_HANDSHAKE_OUT, 0, tls_cipher_handshake);
HookAdd(modinfo->handle, HOOKTYPE_JSON_EXPAND_CLIENT, 0, tls_json_expand_client);
return MOD_SUCCESS;
}
MOD_LOAD()
{
return MOD_SUCCESS;
}
MOD_UNLOAD()
{
return MOD_SUCCESS;
}
int tls_cipher_handshake(Client *client)
{
if (client->local->ssl)
{
const char *cipher = tls_get_cipher(client);
if (!cipher)
return 0;
moddata_client_set(client, "tls_cipher", cipher);
}
return 0;
}
void tls_cipher_free(ModData *m)
{
safe_free(m->str);
}
const char *tls_cipher_serialize(ModData *m)
{
if (!m->str)
return NULL;
return m->str;
}
void tls_cipher_unserialize(const char *str, ModData *m)
{
safe_strdup(m->str, str);
}
int tls_json_expand_client(Client *client, int detail, json_t *j)
{
json_t *tls;
const char *str;
if (detail < 2)
return 0;
str = moddata_client_get(client, "tls_cipher");
if (!str)
return 0;
tls = json_object_get(j, "tls");
if (!tls)
{
tls = json_object();
json_object_set_new(j, "tls", tls);
}
json_object_set_new(tls, "cipher", json_string_unreal(str));
return 0;
}