]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_sasl.cpp
Remove InspIRCd* parameters and fields
[user/henk/code/inspircd.git] / src / modules / m_sasl.cpp
index 45984b2303526584531b5cfe7549052294cfb945..48e07ef6d58b2aa278c1f5277a96f7a24e2ef08d 100644 (file)
@@ -34,11 +34,9 @@ class SaslAuthenticator : public classbase
        bool state_announced;
 
  public:
-       SaslAuthenticator(User *user_, std::string method, InspIRCd *instance, Module *ctor)
-               : ServerInstance(instance), user(user_), state(SASL_INIT), state_announced(false)
+       SaslAuthenticator(User *user_, std::string method, Module *ctor)
+               : user(user_), state(SASL_INIT), state_announced(false)
        {
-               this->user->Extend("sasl_authenticator", this);
-
                parameterlist params;
                params.push_back("*");
                params.push_back("SASL");
@@ -147,19 +145,17 @@ class SaslAuthenticator : public classbase
 
                this->state_announced = true;
        }
-
-       ~SaslAuthenticator()
-       {
-               this->user->Shrink("sasl_authenticator");
-               this->AnnounceState();
-       }
 };
 
 class CommandAuthenticate : public Command
 {
  public:
-       CommandAuthenticate (InspIRCd* Instance, Module* Creator) : Command(Instance, Creator, "AUTHENTICATE", 0, 1, true)
+       SimpleExtItem<SaslAuthenticator>& authExt;
+       GenericCap& cap;
+       CommandAuthenticate(Module* Creator, SimpleExtItem<SaslAuthenticator>& ext, GenericCap& Cap)
+               : Command(Creator, "AUTHENTICATE", 1), authExt(ext), cap(Cap)
        {
+               works_before_reg = true;
        }
 
        CmdResult Handle (const std::vector<std::string>& parameters, User *user)
@@ -167,14 +163,17 @@ class CommandAuthenticate : public Command
                /* Only allow AUTHENTICATE on unregistered clients */
                if (user->registered != REG_ALL)
                {
-                       if (!user->GetExt("sasl"))
+                       if (!cap.ext.get(user))
                                return CMD_FAILURE;
 
-                       SaslAuthenticator *sasl;
-                       if (!(user->GetExt("sasl_authenticator", sasl)))
-                               sasl = new SaslAuthenticator(user, parameters[0], ServerInstance, creator);
+                       SaslAuthenticator *sasl = authExt.get(user);
+                       if (!sasl)
+                               authExt.set(user, new SaslAuthenticator(user, parameters[0], creator));
                        else if (sasl->SendClientMessage(parameters) == false)  // IAL abort extension --nenolod
-                               delete sasl;
+                       {
+                               sasl->AnnounceState();
+                               authExt.unset(user);
+                       }
                }
                return CMD_FAILURE;
        }
@@ -183,7 +182,8 @@ class CommandAuthenticate : public Command
 class CommandSASL : public Command
 {
  public:
-       CommandSASL(InspIRCd* Instance, Module* Creator) : Command(Instance, Creator, "SASL", 0, 2)
+       SimpleExtItem<SaslAuthenticator>& authExt;
+       CommandSASL(Module* Creator, SimpleExtItem<SaslAuthenticator>& ext) : Command(Creator, "SASL", 2), authExt(ext)
        {
                this->disabled = true; // should not be called by users
        }
@@ -197,28 +197,34 @@ class CommandSASL : public Command
                        return CMD_FAILURE;
                }
 
-               SaslAuthenticator *sasl;
-               if (!target->GetExt("sasl_authenticator", sasl))
+               SaslAuthenticator *sasl = authExt.get(target);
+               if (!sasl)
                        return CMD_FAILURE;
 
                SaslState state = sasl->ProcessInboundMessage(parameters);
                if (state == SASL_DONE)
                {
-                       delete sasl;
-                       target->Shrink("sasl");
+                       sasl->AnnounceState();
+                       authExt.unset(target);
                }
                return CMD_SUCCESS;
        }
+
+       RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters)
+       {
+               return ROUTE_BROADCAST;
+       }
 };
 
 class ModuleSASL : public Module
 {
+       SimpleExtItem<SaslAuthenticator> authExt;
+       GenericCap cap;
        CommandAuthenticate auth;
        CommandSASL sasl;
  public:
-
-       ModuleSASL(InspIRCd* Me)
-               : Module(Me), auth(Me, this), sasl(Me, this)
+       ModuleSASL()
+               : authExt("sasl_auth", this), cap(this, "sasl"), auth(this, authExt, cap), sasl(this, authExt)
        {
                Implementation eventlist[] = { I_OnEvent, I_OnUserRegister, I_OnPostConnect, I_OnUserDisconnect, I_OnCleanup };
                ServerInstance->Modules->Attach(eventlist, this, 5);
@@ -226,64 +232,35 @@ class ModuleSASL : public Module
                ServerInstance->AddCommand(&auth);
                ServerInstance->AddCommand(&sasl);
 
+               Extensible::Register(&authExt);
                if (!ServerInstance->Modules->Find("m_services_account.so") || !ServerInstance->Modules->Find("m_cap.so"))
                        ServerInstance->Logs->Log("m_sasl", DEFAULT, "WARNING: m_services_account.so and m_cap.so are not loaded! m_sasl.so will NOT function correctly until these two modules are loaded!");
        }
 
-       virtual int OnUserRegister(User *user)
+       ModResult OnUserRegister(User *user)
        {
-               SaslAuthenticator *sasl_;
-               if (user->GetExt("sasl_authenticator", sasl_))
+               SaslAuthenticator *sasl_ = authExt.get(user);
+               if (sasl_)
                {
                        sasl_->Abort();
-                       delete sasl_;
-                       user->Shrink("sasl_authenticator");
+                       authExt.unset(user);
                }
 
-               return 0;
-       }
-
-       virtual void OnCleanup(int target_type, void *item)
-       {
-               if (target_type == TYPE_USER)
-                       OnUserDisconnect((User*)item);
-       }
-
-       virtual void OnUserDisconnect(User *user)
-       {
-               SaslAuthenticator *sasl_;
-               if (user->GetExt("sasl_authenticator", sasl_))
-               {
-                       delete sasl_;
-                       user->Shrink("sasl_authenticator");
-               }
-       }
-
-       virtual void OnPostConnect(User* user)
-       {
-               if (!IS_LOCAL(user))
-                       return;
-
-               std::string* str = NULL;
-
-               if (user->GetExt("accountname", str))
-                       ServerInstance->PI->SendMetaData(user, "accountname", *str);
-
-               return;
+               return MOD_RES_PASSTHRU;
        }
 
-       virtual ~ModuleSASL()
+       ~ModuleSASL()
        {
        }
 
-       virtual Version GetVersion()
+       Version GetVersion()
        {
-               return Version("$Id$",VF_VENDOR,API_VERSION);
+               return Version("Provides support for IRC Authentication Layer (aka: atheme SASL) via AUTHENTICATE.",VF_VENDOR,API_VERSION);
        }
 
-       virtual void OnEvent(Event *ev)
+       void OnEvent(Event *ev)
        {
-               GenericCapHandler(ev, "sasl", "sasl");
+               cap.HandleEvent(ev);
        }
 };