]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/channels.cpp
Canonicalize bind addresses when creating listen sockets
[user/henk/code/inspircd.git] / src / channels.cpp
index 19899d300e87821c6f144b77d353c5ac837da604..a6ed3406d28bbe62f79167b3a86d484258b293b1 100644 (file)
@@ -34,27 +34,22 @@ Channel::Channel(InspIRCd* Instance, const std::string &cname, time_t ts) : Serv
 void Channel::SetMode(char mode,bool mode_on)
 {
        modes[mode-65] = mode_on;
-       if (!mode_on)
-               this->SetModeParam(mode,"",false);
 }
 
-
-void Channel::SetModeParam(char mode,const char* parameter,bool mode_on)
+void Channel::SetModeParam(char mode, std::string parameter)
 {
        CustomModeList::iterator n = custom_mode_params.find(mode);
-
-       if (mode_on)
+       // always erase, even if changing, so that the map gets the new value
+       if (n != custom_mode_params.end())
+               custom_mode_params.erase(n);
+       if (parameter.empty())
        {
-               if (n == custom_mode_params.end())
-                       custom_mode_params[mode] = strdup(parameter);
+               modes[mode-65] = false;
        }
        else
        {
-               if (n != custom_mode_params.end())
-               {
-                       free(n->second);
-                       custom_mode_params.erase(n);
-               }
+               custom_mode_params[mode] = parameter;
+               modes[mode-65] = true;
        }
 }
 
@@ -248,7 +243,8 @@ void Channel::SetDefaultModes()
  */
 Channel* Channel::JoinUser(InspIRCd* Instance, User *user, const char* cn, bool override, const char* key, bool bursting, time_t TS)
 {
-       if (!user || !cn)
+       // Fix: unregistered users could be joined using /SAJOIN
+       if (!user || !cn || user->registered != REG_ALL)
                return NULL;
 
        char cname[MAXBUF];
@@ -597,7 +593,7 @@ long Channel::PartUser(User *user, std::string &reason)
        return this->GetUserCounter();
 }
 
-long Channel::ServerKickUser(User* user, const char* reason, bool triggerevents, const char* servername)
+long Channel::ServerKickUser(User* user, const char* reason, const char* servername)
 {
        bool silent = false;
 
@@ -616,10 +612,7 @@ long Channel::ServerKickUser(User* user, const char* reason, bool triggerevents,
        if (servername == NULL || *ServerInstance->Config->HideWhoisServer)
                servername = ServerInstance->Config->ServerName;
 
-       if (triggerevents)
-       {
-               FOREACH_MOD(I_OnUserKick,OnUserKick(NULL, user, this, reason, silent));
-       }
+       FOREACH_MOD(I_OnUserKick,OnUserKick(NULL, user, this, reason, silent));
 
        UCListIter i = user->chans.find(this);
        if (i != user->chans.end())