summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules/nickserv/sasl.h71
-rw-r--r--modules/nickserv/ns_sasl.cpp74
2 files changed, 73 insertions, 72 deletions
diff --git a/include/modules/nickserv/sasl.h b/include/modules/nickserv/sasl.h
index f23a5d32a..057c92c2a 100644
--- a/include/modules/nickserv/sasl.h
+++ b/include/modules/nickserv/sasl.h
@@ -85,77 +85,6 @@ namespace SASL
}
};
- class IdentifyRequest
- : public ::IdentifyRequest
- {
- Anope::string uid;
- Anope::string hostname;
-
- inline Anope::string GetUserInfo()
- {
- auto *u = User::Find(uid);
- if (u)
- return u->GetMask();
- if (!hostname.empty() && !GetAddress().empty())
- return Anope::printf("%s (%s)", hostname.c_str(), GetAddress().c_str());
- return "A user";
- };
-
- public:
- IdentifyRequest(Module *m, const Anope::string &id, const Anope::string &acc, const Anope::string &pass, const Anope::string &h, const Anope::string &i)
- : ::IdentifyRequest(m, acc, pass, i)
- , uid(id)
- , hostname(h)
- {
- }
-
- void OnSuccess() override
- {
- if (!service)
- return;
-
- NickAlias *na = NickAlias::Find(GetAccount());
- if (!na || na->nc->HasExt("NS_SUSPENDED") || na->nc->HasExt("UNCONFIRMED"))
- return OnFail();
-
- unsigned int maxlogins = Config->GetModule("ns_identify").Get<unsigned int>("maxlogins");
- if (maxlogins && na->nc->users.size() >= maxlogins)
- return OnFail();
-
- Session *s = service->GetSession(uid);
- if (s)
- {
- Log(this->GetOwner(), "sasl", Config->GetClient("NickServ")) << GetUserInfo() << " identified to account " << this->GetAccount() << " using SASL";
- service->Succeed(s, na->nc);
- delete s;
- }
- }
-
- void OnFail() override
- {
- if (!service)
- return;
-
- Session *s = service->GetSession(uid);
- if (s)
- {
- service->Fail(s);
- delete s;
- }
-
- Anope::string accountstatus;
- NickAlias *na = NickAlias::Find(GetAccount());
- if (!na)
- accountstatus = "nonexistent ";
- else if (na->nc->HasExt("NS_SUSPENDED"))
- accountstatus = "suspended ";
- else if (na->nc->HasExt("UNCONFIRMED"))
- accountstatus = "unconfirmed ";
-
- Log(this->GetOwner(), "sasl", Config->GetClient("NickServ")) << GetUserInfo() << " failed to identify for " << accountstatus << "account " << this->GetAccount() << " using SASL";
- }
- };
-
/** Sends IRCd messages used by the SASL module. */
class ProtocolInterface
: public ::Service
diff --git a/modules/nickserv/ns_sasl.cpp b/modules/nickserv/ns_sasl.cpp
index bf9ac9eae..44686fc4c 100644
--- a/modules/nickserv/ns_sasl.cpp
+++ b/modules/nickserv/ns_sasl.cpp
@@ -10,6 +10,78 @@
#include "modules/nickserv/cert.h"
#include "modules/nickserv/sasl.h"
+class SASLIdentifyRequest final
+ : public IdentifyRequest
+{
+private:
+ Anope::string uid;
+ Anope::string hostname;
+
+ inline Anope::string GetUserInfo()
+ {
+ auto *u = User::Find(uid);
+ if (u)
+ return u->GetMask();
+ if (!hostname.empty() && !GetAddress().empty())
+ return Anope::printf("%s (%s)", hostname.c_str(), GetAddress().c_str());
+ return "A user";
+ };
+
+public:
+ SASLIdentifyRequest(Module *m, const Anope::string &id, const Anope::string &acc, const Anope::string &pass, const Anope::string &h, const Anope::string &i)
+ : IdentifyRequest(m, acc, pass, i)
+ , uid(id)
+ , hostname(h)
+ {
+ }
+
+ void OnSuccess() override
+ {
+ if (!SASL::service)
+ return;
+
+ auto *na = NickAlias::Find(GetAccount());
+ if (!na || na->nc->HasExt("NS_SUSPENDED") || na->nc->HasExt("UNCONFIRMED"))
+ return OnFail();
+
+ auto maxlogins = Config->GetModule("ns_identify").Get<unsigned int>("maxlogins");
+ if (maxlogins && na->nc->users.size() >= maxlogins)
+ return OnFail();
+
+ auto *s = SASL::service->GetSession(uid);
+ if (s)
+ {
+ Log(this->GetOwner(), "sasl", Config->GetClient("NickServ")) << GetUserInfo() << " identified to account " << this->GetAccount() << " using SASL";
+ SASL::service->Succeed(s, na->nc);
+ delete s;
+ }
+ }
+
+ void OnFail() override
+ {
+ if (!SASL::service)
+ return;
+
+ auto *s = SASL::service->GetSession(uid);
+ if (s)
+ {
+ SASL::service->Fail(s);
+ delete s;
+ }
+
+ Anope::string accountstatus;
+ auto *na = NickAlias::Find(GetAccount());
+ if (!na)
+ accountstatus = "nonexistent ";
+ else if (na->nc->HasExt("NS_SUSPENDED"))
+ accountstatus = "suspended ";
+ else if (na->nc->HasExt("UNCONFIRMED"))
+ accountstatus = "unconfirmed ";
+
+ Log(this->GetOwner(), "sasl", Config->GetClient("NickServ")) << GetUserInfo() << " failed to identify for " << accountstatus << "account " << this->GetAccount() << " using SASL";
+ }
+};
+
class Plain final
: public SASL::Mechanism
{
@@ -51,7 +123,7 @@ public:
if (authcid.empty() || passwd.empty() || !IRCD->IsNickValid(authcid) || passwd.find_first_of("\r\n\0") != Anope::string::npos)
return false;
- SASL::IdentifyRequest *req = new SASL::IdentifyRequest(this->owner, m.source, authcid, passwd, sess->hostname, sess->ip);
+ auto *req = new SASLIdentifyRequest(this->owner, m.source, authcid, passwd, sess->hostname, sess->ip);
FOREACH_MOD(OnCheckAuthentication, (NULL, req));
req->Dispatch();
}