]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/channels.cpp
Fix some more incorrect socket use
[user/henk/code/inspircd.git] / src / channels.cpp
index 31038484eb14baedf93858253908b0af711295da..5603ef1ddf2f16171b692663f1e845ea2d1081d9 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
  * See: http://wiki.inspircd.org/Credits
  *
  * This program is free but copyrighted software; see
@@ -81,29 +81,25 @@ std::string Channel::GetModeParameter(ModeHandler* mode)
 
 int Channel::SetTopic(User *u, std::string &ntopic, bool forceset)
 {
-       if (u)
+       if (!u)
+               u = ServerInstance->FakeClient;
+       if (IS_LOCAL(u) && !forceset)
        {
-               if(!forceset)
-               {
-                       ModResult res;
-                       /* 0: check status, 1: don't, -1: disallow change silently */
-
-                       FIRST_MOD_RESULT(OnPreTopicChange, res, (u,this,ntopic));
+               ModResult res;
+               FIRST_MOD_RESULT(OnPreTopicChange, res, (u,this,ntopic));
 
-                       if (res == MOD_RES_DENY)
-                               return CMD_FAILURE;
-                       if (res != MOD_RES_ALLOW)
+               if (res == MOD_RES_DENY)
+                       return CMD_FAILURE;
+               if (res != MOD_RES_ALLOW)
+               {
+                       bool defok = IsModeSet('t') ? GetPrefixValue(u) >= HALFOP_VALUE : HasUser(u);
+                       if (!ServerInstance->OnCheckExemption(u,this,"topiclock").check(defok))
                        {
                                if (!this->HasUser(u))
-                               {
                                        u->WriteNumeric(442, "%s %s :You're not on that channel!",u->nick.c_str(), this->name.c_str());
-                                       return CMD_FAILURE;
-                               }
-                               if ((this->IsModeSet('t')) && (this->GetPrefixValue(u) < HALFOP_VALUE))
-                               {
-                                       u->WriteNumeric(482, "%s %s :You must be at least a half-operator to change the topic on this channel", u->nick.c_str(), this->name.c_str());
-                                       return CMD_FAILURE;
-                               }
+                               else
+                                       u->WriteNumeric(482, "%s %s :You do not have access to change the topic on this channel", u->nick.c_str(), this->name.c_str());
+                               return CMD_FAILURE;
                        }
                }
        }
@@ -122,11 +118,7 @@ int Channel::SetTopic(User *u, std::string &ntopic, bool forceset)
 
        this->topicset = ServerInstance->Time();
 
-       // XXX: this check for 'u' is probably pre-fake-user, and it fucking sucks anyway. we need to change this.
-       if (u)
-       {
-               FOREACH_MOD(I_OnPostTopicChange,OnPostTopicChange(u, this, this->topic));
-       }
+       FOREACH_MOD(I_OnPostTopicChange,OnPostTopicChange(u, this, this->topic));
 
        return CMD_SUCCESS;
 }
@@ -753,20 +745,14 @@ void Channel::UserList(User *user)
 {
        char list[MAXBUF];
        size_t dlen, curlen;
-       ModResult call_modules;
 
        if (!IS_LOCAL(user))
                return;
 
-       FIRST_MOD_RESULT(OnUserList, call_modules, (user, this));
-
-       if (call_modules != MOD_RES_ALLOW)
+       if (this->IsModeSet('s') && !this->HasUser(user) && !user->HasPrivPermission("channels/auspex"))
        {
-               if ((this->IsModeSet('s')) && (!this->HasUser(user)))
-               {
-                       user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel",user->nick.c_str(), this->name.c_str());
-                       return;
-               }
+               user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel",user->nick.c_str(), this->name.c_str());
+               return;
        }
 
        dlen = curlen = snprintf(list,MAXBUF,"%s %c %s :", user->nick.c_str(), this->IsModeSet('s') ? '@' : this->IsModeSet('p') ? '*' : '=',  this->name.c_str());
@@ -793,14 +779,11 @@ void Channel::UserList(User *user)
                std::string prefixlist = this->GetPrefixChar(i->first);
                std::string nick = i->first->nick;
 
-               if (call_modules != MOD_RES_DENY)
-               {
-                       FOREACH_MOD(I_OnNamesListItem, OnNamesListItem(user, i->second, prefixlist, nick));
+               FOREACH_MOD(I_OnNamesListItem, OnNamesListItem(user, i->second, prefixlist, nick));
 
-                       /* Nick was nuked, a module wants us to skip it */
-                       if (nick.empty())
-                               continue;
-               }
+               /* Nick was nuked, a module wants us to skip it */
+               if (nick.empty())
+                       continue;
 
                size_t ptrlen = 0;
 
@@ -929,14 +912,14 @@ unsigned int Channel::GetPrefixValue(User* user)
        return m->second->getRank();
 }
 
-void Channel::SetPrefix(User* user, char prefix, bool adding)
+bool Channel::SetPrefix(User* user, char prefix, bool adding)
 {
        ModeHandler* delta_mh = ServerInstance->Modes->FindMode(prefix, MODETYPE_CHANNEL);
        if (!delta_mh)
-               return;
+               return false;
        UserMembIter m = userlist.find(user);
        if (m == userlist.end())
-               return;
+               return false;
        for(unsigned int i=0; i < m->second->modes.length(); i++)
        {
                char mchar = m->second->modes[i];
@@ -947,11 +930,12 @@ void Channel::SetPrefix(User* user, char prefix, bool adding)
                                m->second->modes.substr(0,i) +
                                (adding ? std::string(1, prefix) : "") +
                                m->second->modes.substr(mchar == prefix ? i+1 : i);
-                       return;
+                       return adding != (mchar == prefix);
                }
        }
        if (adding)
                m->second->modes += std::string(1, prefix);
+       return adding;
 }
 
 void Channel::RemoveAllPrefixes(User* user)