summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAdam <adam@sigterm.info>2014-02-14 19:15:43 -0500
committerAdam <adam@sigterm.info>2014-02-14 19:15:43 -0500
commit50d7bf710ec0501b7309892646a31da065aaae5a (patch)
tree85e664dfdeb38c1cae4bb03bddc76a183ab2d34e /include
parentca85df2d7475d42579c29d822f424d2c9713774b (diff)
parentd44bcef31b7a6cbb607249bf39273c0e32b1f60a (diff)
Merge pull request #48 from ShutterQuick/2.0+nnghsasl
Add SASL mechanisms DH-AES and DH-BLOWFISH
Diffstat (limited to 'include')
-rw-r--r--include/anope.h1
-rw-r--r--include/modules/sasl.h80
2 files changed, 67 insertions, 14 deletions
diff --git a/include/anope.h b/include/anope.h
index 28bc50512..638661440 100644
--- a/include/anope.h
+++ b/include/anope.h
@@ -115,6 +115,7 @@ namespace Anope
* The following functions return the various types of strings.
*/
inline const char *c_str() const { return this->_string.c_str(); }
+ inline const char *data() const { return this->_string.data(); }
inline std::string &str() { return this->_string; }
inline const std::string &str() const { return this->_string; }
inline ci::string ci_str() const { return ci::string(this->_string.c_str()); }
diff --git a/include/modules/sasl.h b/include/modules/sasl.h
index 836c26d19..a7c440110 100644
--- a/include/modules/sasl.h
+++ b/include/modules/sasl.h
@@ -18,6 +18,29 @@ namespace SASL
};
class Mechanism;
+ struct Session;
+
+ class Service : public ::Service
+ {
+ public:
+ Service(Module *o) : ::Service(o, "SASL::Service", "sasl") { }
+
+ virtual void ProcessMessage(const Message &) = 0;
+
+ virtual Anope::string GetAgent() = 0;
+
+ virtual Session* GetSession(const Anope::string &uid) = 0;
+
+ virtual void SendMessage(SASL::Session *session, const Anope::string &type, const Anope::string &data) = 0;
+
+ virtual void Succeed(Session *, NickCore *) = 0;
+ virtual void Fail(Session *) = 0;
+ virtual void SendMechs(Session *) = 0;
+ virtual void DeleteSessions(Mechanism *, bool = false) = 0;
+ virtual void RemoveSession(Session *) = 0;
+ };
+
+ static ServiceReference<SASL::Service> sasl("SASL::Service", "sasl");
struct Session
{
@@ -26,11 +49,15 @@ namespace SASL
Reference<Mechanism> mech;
Session(Mechanism *m, const Anope::string &u) : created(Anope::CurTime), uid(u), mech(m) { }
- virtual ~Session() { }
+ virtual ~Session()
+ {
+ if (sasl)
+ sasl->RemoveSession(this);
+ }
};
/* PLAIN, EXTERNAL, etc */
- class Mechanism : public Service
+ class Mechanism : public ::Service
{
public:
Mechanism(Module *o, const Anope::string &sname) : Service(o, "SASL::Mechanism", sname) { }
@@ -38,26 +65,51 @@ namespace SASL
virtual Session* CreateSession(const Anope::string &uid) { return new Session(this, uid); }
virtual void ProcessMessage(Session *session, const Message &) = 0;
+
+ virtual ~Mechanism()
+ {
+ if (sasl)
+ sasl->DeleteSessions(this, true);
+ }
};
- class Service : public ::Service
+ class IdentifyRequest : public ::IdentifyRequest
{
+ Anope::string uid;
+
public:
- Service(Module *o) : ::Service(o, "SASL::Service", "sasl") { }
+ IdentifyRequest(Module *m, const Anope::string &id, const Anope::string &acc, const Anope::string &pass) : ::IdentifyRequest(m, acc, pass), uid(id) { }
- virtual void ProcessMessage(const Message &) = 0;
+ void OnSuccess() anope_override
+ {
+ if (!sasl)
+ return;
- virtual Anope::string GetAgent() = 0;
+ NickAlias *na = NickAlias::Find(GetAccount());
+ if (!na)
+ return OnFail();
- virtual Session* GetSession(const Anope::string &uid) = 0;
+ Session *s = sasl->GetSession(uid);
+ if (s)
+ {
+ sasl->Succeed(s, na->nc);
+ delete s;
+ }
+ }
- virtual void SendMessage(SASL::Session *session, const Anope::string &type, const Anope::string &data) = 0;
+ void OnFail() anope_override
+ {
+ if (!sasl)
+ return;
- virtual void Succeed(Session *, NickCore *) = 0;
- virtual void Fail(Session *) = 0;
- virtual void SendMechs(Session *) = 0;
+ Session *s = sasl->GetSession(uid);
+ if (s)
+ {
+ sasl->Fail(s);
+ delete s;
+ }
+
+ Log(Config->GetClient("NickServ")) << "A user failed to identify for account " << this->GetAccount() << " using SASL";
+ }
};
}
-
-static ServiceReference<SASL::Service> sasl("SASL::Service", "sasl");
-