summaryrefslogtreecommitdiff
path: root/modules/nickserv/cert.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/nickserv/cert.cpp')
-rw-r--r--modules/nickserv/cert.cpp81
1 files changed, 48 insertions, 33 deletions
diff --git a/modules/nickserv/cert.cpp b/modules/nickserv/cert.cpp
index cb089e26e..eb6f5f3d0 100644
--- a/modules/nickserv/cert.cpp
+++ b/modules/nickserv/cert.cpp
@@ -24,35 +24,6 @@
static Anope::hash_map<NickServ::Account *> certmap;
-class CertServiceImpl : public CertService
-{
- public:
- CertServiceImpl(Module *o) : CertService(o) { }
-
- NickServ::Account* FindAccountFromCert(const Anope::string &cert) override
- {
-#warning "use serialize find"
- Anope::hash_map<NickServ::Account *>::iterator it = certmap.find(cert);
- if (it != certmap.end())
- return it->second;
- return NULL;
- }
-
- bool Matches(User *u, NickServ::Account *nc) override
- {
- std::vector<NSCertEntry *> cl = nc->GetRefs<NSCertEntry *>();
- return !u->fingerprint.empty() && FindCert(cl, u->fingerprint);
- }
-
- NSCertEntry *FindCert(const std::vector<NSCertEntry *> &cl, const Anope::string &certfp) override
- {
- for (NSCertEntry *e : cl)
- if (e->GetCert() == certfp)
- return e;
- return nullptr;
- }
-};
-
class NSCertEntryImpl : public NSCertEntry
{
friend class NSCertEntryType;
@@ -78,7 +49,7 @@ class NSCertEntryType : public Serialize::Type<NSCertEntryImpl>
{
using Serialize::ObjectField<NSCertEntryImpl, NickServ::Account *>::ObjectField;
- void OnSet(NSCertEntryImpl *s, NickServ::Account *acc) override
+ void OnSet(NSCertEntryImpl *s, NickServ::Account *old, NickServ::Account *acc) override
{
const Anope::string &cert = s->GetCert();
@@ -91,9 +62,8 @@ class NSCertEntryType : public Serialize::Type<NSCertEntryImpl>
{
using Serialize::Field<NSCertEntryImpl, Anope::string>::Field;
- void OnSet(NSCertEntryImpl *s, const Anope::string &m) override
+ void OnSet(NSCertEntryImpl *s, Anope::string *old, const Anope::string &m) override
{
- Anope::string *old = this->Get_(s);
if (old != nullptr)
certmap.erase(*old);
@@ -107,6 +77,49 @@ class NSCertEntryType : public Serialize::Type<NSCertEntryImpl>
, mask(this, "mask", &NSCertEntryImpl::cert)
{
}
+
+ NickServ::Account *FindAccount(const Anope::string &cert)
+ {
+ Serialize::ID id;
+ EventReturn result = EventManager::Get()->Dispatch(&Event::SerializeEvents::OnSerializeFind, this, &this->mask, cert, id);
+ if (result == EVENT_ALLOW)
+ return RequireID(id)->GetAccount();
+
+ Anope::hash_map<NickServ::Account *>::iterator it = certmap.find(cert);
+ if (it != certmap.end())
+ return it->second;
+ return nullptr;
+ }
+};
+
+class CertServiceImpl : public CertService
+{
+ NSCertEntryType &cert_type;
+
+ public:
+ CertServiceImpl(Module *o, NSCertEntryType &ct) : CertService(o)
+ , cert_type(ct)
+ {
+ }
+
+ NickServ::Account* FindAccountFromCert(const Anope::string &cert) override
+ {
+ return cert_type.FindAccount(cert);
+ }
+
+ bool Matches(User *u, NickServ::Account *nc) override
+ {
+ std::vector<NSCertEntry *> cl = nc->GetRefs<NSCertEntry *>();
+ return !u->fingerprint.empty() && FindCert(cl, u->fingerprint);
+ }
+
+ NSCertEntry *FindCert(const std::vector<NSCertEntry *> &cl, const Anope::string &certfp) override
+ {
+ for (NSCertEntry *e : cl)
+ if (e->GetCert() == certfp)
+ return e;
+ return nullptr;
+ }
};
NSCertEntryImpl::~NSCertEntryImpl()
@@ -317,6 +330,7 @@ class NSCert : public Module
, public EventHook<Event::Fingerprint>
, public EventHook<NickServ::Event::NickValidate>
{
+ NSCertEntryType certtype;
CommandNSCert commandnscert;
CertServiceImpl cs;
@@ -324,8 +338,9 @@ class NSCert : public Module
NSCert(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR)
, EventHook<Event::Fingerprint>(this)
, EventHook<NickServ::Event::NickValidate>(this)
+ , certtype(this)
, commandnscert(this)
- , cs(this)
+ , cs(this, certtype)
{
if (!IRCD || !IRCD->CanCertFP)
throw ModuleException("Your IRCd does not support ssl client certificates");