]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_callerid.cpp
m_sasl: use host/ip from m_cgiirc if applicable
[user/henk/code/inspircd.git] / src / modules / m_callerid.cpp
index 37787b525ee5e1a504dca701b96cba852cc835cd..2df6d7af0cdb46c9a3c42b160bbe266ce69057aa 100644 (file)
@@ -68,7 +68,12 @@ struct CallerIDExtInfo : public ExtensionItem
 
        void unserialize(SerializeFormat format, Extensible* container, const std::string& value)
        {
+               void* old = get_raw(container);
+               if (old)
+                       this->free(old);
                callerid_data* dat = new callerid_data;
+               set_raw(container, dat);
+
                irc::commasepstream s(value);
                std::string tok;
                if (s.GetToken(tok))
@@ -89,10 +94,6 @@ struct CallerIDExtInfo : public ExtensionItem
                                }
                        }
                }
-
-               void* old = set_raw(container, dat);
-               if (old)
-                       this->free(old);
        }
 
        callerid_data* get(User* user, bool create)
@@ -146,7 +147,7 @@ public:
                extInfo(Creator)
        {
                allow_empty_last_param = false;
-               syntax = "{[+|-]<nicks>}|*}";
+               syntax = "*|(+|-)<nick>[,(+|-)<nick> ...]";
                TRANSLATE2(TR_CUSTOM, TR_END);
        }
 
@@ -171,6 +172,9 @@ public:
                                dash = true;
                                tok.erase(0, 1); // Remove the dash.
                        }
+                       else if (tok[0] == '+')
+                               tok.erase(0, 1);
+
                        User* u = ServerInstance->FindNick(tok);
                        if ((!u) || (u->registered != REG_ALL) || (u->quitting) || (IS_SERVER(u)))
                                continue;
@@ -194,7 +198,7 @@ public:
                /* Even if callerid mode is not set, we let them manage their ACCEPT list so that if they go +g they can
                 * have a list already setup. */
 
-               std::string tok = parameters[0];
+               const std::string& tok = parameters[0];
 
                if (tok == "*")
                {
@@ -204,7 +208,12 @@ public:
                }
                else if (tok[0] == '-')
                {
-                       User* whotoremove = ServerInstance->FindNick(tok.substr(1));
+                       User* whotoremove;
+                       if (IS_LOCAL(user))
+                               whotoremove = ServerInstance->FindNickOnly(tok.substr(1));
+                       else
+                               whotoremove = ServerInstance->FindNick(tok.substr(1));
+
                        if (whotoremove)
                                return (RemoveAccept(user, whotoremove) ? CMD_SUCCESS : CMD_FAILURE);
                        else
@@ -212,7 +221,13 @@ public:
                }
                else
                {
-                       User* whotoadd = ServerInstance->FindNick(tok[0] == '+' ? tok.substr(1) : tok);
+                       const std::string target = (tok[0] == '+' ? tok.substr(1) : tok);
+                       User* whotoadd;
+                       if (IS_LOCAL(user))
+                               whotoadd = ServerInstance->FindNickOnly(target);
+                       else
+                               whotoadd = ServerInstance->FindNick(target);
+
                        if ((whotoadd) && (whotoadd->registered == REG_ALL) && (!whotoadd->quitting) && (!IS_SERVER(whotoadd)))
                                return (AddAccept(user, whotoadd) ? CMD_SUCCESS : CMD_FAILURE);
                        else