]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Merge pull request #1071 from SaberUK/insp20+fix-lusers
authorAttila Molnar <attilamolnar@hush.com>
Fri, 12 Feb 2016 16:35:55 +0000 (17:35 +0100)
committerAttila Molnar <attilamolnar@hush.com>
Fri, 12 Feb 2016 16:35:55 +0000 (17:35 +0100)
[2.0] Fix hidden operators being shown in LUSERS.

src/modules/extra/m_ssl_gnutls.cpp
src/modules/m_cap.cpp
src/modules/m_cap.h

index 59ac1acb3bcd62295ba9ea5e531ef7479ed480e0..813a8ecfaa98990698339c32ac17ff15dd660ffa 100644 (file)
@@ -28,7 +28,7 @@
 #include "m_cap.h"
 
 #ifdef _WIN32
-# pragma comment(lib, "libgnutls-28.lib")
+# pragma comment(lib, "libgnutls-30.lib")
 #endif
 
 /* $ModDesc: Provides SSL support for clients */
index e9f4dae90e09684c37d9286e23543ca9d636817a..6b4387fdd96ccec55db075d0391be07a6478c02f 100644 (file)
@@ -66,23 +66,28 @@ class CommandCAP : public Command
 
                        while (cap_stream.GetToken(cap_))
                        {
-                               Data.wanted.push_back(cap_);
+                               // Whilst the handling of extraneous spaces is not currently defined in the CAP specification
+                               // every single other implementation ignores extraneous spaces. Lets copy them for
+                               // compatibility purposes.
+                               trim(cap_);
+                               if (!cap_.empty())
+                                       Data.wanted.push_back(cap_);
                        }
 
                        reghold.set(user, 1);
                        Data.Send();
 
-                       if (Data.ack.size() > 0)
+                       if (Data.wanted.empty())
                        {
-                               std::string AckResult = irc::stringjoiner(" ", Data.ack, 0, Data.ack.size() - 1).GetJoined();
-                               user->WriteServ("CAP %s ACK :%s", user->nick.c_str(), AckResult.c_str());
+                               user->WriteServ("CAP %s ACK :%s", user->nick.c_str(), parameters[1].c_str());
+                               return CMD_SUCCESS;
                        }
 
-                       if (Data.wanted.size() > 0)
-                       {
-                               std::string NakResult = irc::stringjoiner(" ", Data.wanted, 0, Data.wanted.size() - 1).GetJoined();
-                               user->WriteServ("CAP %s NAK :%s", user->nick.c_str(), NakResult.c_str());
-                       }
+                       // HACK: reset all of the caps which were enabled on this user because a cap request is atomic.
+                       for (std::vector<std::pair<GenericCap*, int> >::iterator iter = Data.changed.begin(); iter != Data.changed.end(); ++iter)
+                               iter->first->ext.set(user, iter->second);
+
+                       user->WriteServ("CAP %s NAK :%s", user->nick.c_str(), parameters[1].c_str());
                }
                else if (subcommand == "END")
                {
index 409671f482aeb5301cf3e62e3c6c75979424b917..23cf8cf69a748ef9a373340c1f3e5745b5340e2f 100644 (file)
@@ -21,6 +21,8 @@
 #ifndef M_CAP_H
 #define M_CAP_H
 
+class GenericCap;
+
 class CapEvent : public Event
 {
  public:
@@ -35,6 +37,7 @@ class CapEvent : public Event
        CapEventType type;
        std::vector<std::string> wanted;
        std::vector<std::string> ack;
+       std::vector<std::pair<GenericCap*, int> > changed; // HACK: clean this up before 2.2
        User* user;
        CapEvent(Module* sender, User* u, CapEventType capevtype) : Event(sender, "cap_request"), type(capevtype), user(u) {}
 };
@@ -67,7 +70,7 @@ class GenericCap
                                        // we can handle this, so ACK it, and remove it from the wanted list
                                        data->ack.push_back(*it);
                                        data->wanted.erase(it);
-                                       ext.set(data->user, enablecap ? 1 : 0);
+                                       data->changed.push_back(std::make_pair(this, ext.set(data->user, enablecap ? 1 : 0)));
                                        break;
                                }
                        }