#include "inspircd.h"
#include "modules/ssl.h"
-/* $ModDesc: Provides SSL metadata, including /WHOIS information and /SSLINFO command */
-
class SSLCertExt : public ExtensionItem {
public:
SSLCertExt(Module* parent) : ExtensionItem("ssl_cert", parent) {}
}
};
+class UserCertificateAPIImpl : public UserCertificateAPIBase
+{
+ SSLCertExt& ext;
+
+ public:
+ UserCertificateAPIImpl(Module* mod, SSLCertExt& certext)
+ : UserCertificateAPIBase(mod), ext(certext)
+ {
+ }
+
+ ssl_cert* GetCertificate(User* user) CXX11_OVERRIDE
+ {
+ return ext.get(user);
+ }
+};
+
class ModuleSSLInfo : public Module
{
CommandSSLInfo cmd;
+ UserCertificateAPIImpl APIImpl;
public:
- ModuleSSLInfo() : cmd(this)
+ ModuleSSLInfo()
+ : cmd(this), APIImpl(this, cmd.CertExt)
{
}
void init() CXX11_OVERRIDE
{
+ ServerInstance->Modules->AddService(APIImpl);
ServerInstance->Modules->AddService(cmd);
-
ServerInstance->Modules->AddService(cmd.CertExt);
-
- Implementation eventlist[] = { I_OnWhois, I_OnPreCommand, I_OnSetConnectClass, I_OnUserConnect, I_OnPostConnect };
- ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
}
Version GetVersion() CXX11_OVERRIDE
void OnUserConnect(LocalUser* user) CXX11_OVERRIDE
{
- SocketCertificateRequest req(&user->eh, this);
- if (!req.cert)
- return;
- cmd.CertExt.set(user, req.cert);
+ ssl_cert* cert = SSLClientCert::GetCertificate(&user->eh);
+ if (cert)
+ cmd.CertExt.set(user, cert);
}
void OnPostConnect(User* user) CXX11_OVERRIDE
ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass) CXX11_OVERRIDE
{
- SocketCertificateRequest req(&user->eh, this);
+ ssl_cert* cert = SSLClientCert::GetCertificate(&user->eh);
bool ok = true;
if (myclass->config->getString("requiressl") == "trusted")
{
- ok = (req.cert && req.cert->IsCAVerified());
+ ok = (cert && cert->IsCAVerified());
}
else if (myclass->config->getBool("requiressl"))
{
- ok = (req.cert != NULL);
+ ok = (cert != NULL);
}
if (!ok)
return MOD_RES_DENY;
return MOD_RES_PASSTHRU;
}
-
- void OnRequest(Request& request) CXX11_OVERRIDE
- {
- if (strcmp("GET_USER_CERT", request.id) == 0)
- {
- UserCertificateRequest& req = static_cast<UserCertificateRequest&>(request);
- req.cert = cmd.CertExt.get(req.user);
- }
- }
};
MODULE_INIT(ModuleSSLInfo)