]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/command_parse.cpp
Fix for crash found by potter if you set up two redirects in two channels to forward...
[user/henk/code/inspircd.git] / src / command_parse.cpp
index a16b73b25c5a7f2472b579bea4b1d4e9f431009b..0fa7c05b2783efefe9d9e6a2ebc3c5d19909ff42 100644 (file)
@@ -31,22 +31,33 @@ bool InspIRCd::ULine(const char* server)
        if (!*server)
                return true;
 
-       return (find(Config->ulines.begin(),Config->ulines.end(),server) != Config->ulines.end());
+       return (Config->ulines.find(server) != Config->ulines.end());
+}
+
+bool InspIRCd::SilentULine(const char* server)
+{
+       std::map<irc::string,bool>::iterator n = Config->ulines.find(server);
+       if (n != Config->ulines.end())
+               return n->second;
+       else return false;
 }
 
 int InspIRCd::OperPassCompare(const char* data,const char* input, int tagnumber)
 {
        int MOD_RESULT = 0;
        FOREACH_RESULT_I(this,I_OnOperCompare,OnOperCompare(data, input, tagnumber))
-       Log(DEBUG,"OperPassCompare: %d",MOD_RESULT);
        if (MOD_RESULT == 1)
                return 0;
        if (MOD_RESULT == -1)
                return 1;
-       Log(DEBUG,"strcmp fallback: '%s' '%s' %d",data,input,strcmp(data,input));
        return strcmp(data,input);
 }
 
+std::string InspIRCd::TimeString(time_t curtime)
+{
+       return std::string(ctime(&curtime),24);
+}
+
 long InspIRCd::Duration(const char* str)
 {
        char n_field[MAXBUF];
@@ -155,8 +166,7 @@ int CommandParser::LoopCall(userrec* user, command_t* CommandObj, const char** p
                        new_parameters[splithere] = item.c_str();
                        new_parameters[extra] = extrastuff.c_str();
 
-                       if (CommandObj->Handle(new_parameters,pcnt,user) == CMD_USER_DELETED)
-                               return 1;
+                       CommandObj->Handle(new_parameters,pcnt,user);
 
                        dupes[item.c_str()] = true;
                }
@@ -175,7 +185,6 @@ int CommandParser::LoopCall(userrec* user, command_t* CommandObj, const char** p
        std::map<irc::string, bool> dupes;
 
        /* Only one commasepstream here */
-       ServerInstance->Log(DEBUG,"Splitting '%s'",parameters[splithere]);
        irc::commasepstream items1(parameters[splithere]);
        std::string item = "*";
        unsigned int max = 0;
@@ -201,8 +210,7 @@ int CommandParser::LoopCall(userrec* user, command_t* CommandObj, const char** p
                         * record out from under us (e.g. if we /kill a comma sep list, and we're
                         * in that list ourselves) abort if we're gone.
                         */
-                       if (CommandObj->Handle(new_parameters,pcnt,user) == CMD_USER_DELETED)
-                               return 1;
+                       CommandObj->Handle(new_parameters,pcnt,user);
 
                        dupes[item.c_str()] = true;
                }
@@ -278,9 +286,18 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd)
        const char *command_p[127];
        int items = 0;
        irc::tokenstream tokens(cmd);
-       std::string command = tokens.GetToken();
+       std::string command;
+       tokens.GetToken(command);
 
-       while (((para[items] = tokens.GetToken()) != "") && (items < 127))
+       /* A client sent a nick prefix on their command (ick)
+        * rhapsody and some braindead bouncers do this --
+        * the rfc says they shouldnt but also says the ircd should
+        * discard it if they do.
+        */
+       if (*command.c_str() == ':')
+               tokens.GetToken(command);
+
+       while (tokens.GetToken(para[items]) && (items < 127))
        {
                command_p[items] = para[items].c_str();
                items++;
@@ -325,7 +342,7 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd)
                        {
                                user->WriteServ("461 %s %s :Not enough parameters.", user->nick, command.c_str());
                                /* If syntax is given, display this as the 461 reply */
-                               if ((ServerInstance->Config->SyntaxHints) && (cm->second->syntax.length()))
+                               if ((ServerInstance->Config->SyntaxHints) && (user->registered == REG_ALL) && (cm->second->syntax.length()))
                                        user->WriteServ("304 %s :SYNTAX %s %s", user->nick, cm->second->command.c_str(), cm->second->syntax.c_str());
                                return;
                        }
@@ -347,10 +364,7 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd)
                                 */
                                CmdResult result = cm->second->Handle(command_p,items,user);
 
-                               if (result != CMD_USER_DELETED)
-                               {
-                                       FOREACH_MOD(I_OnPostCommand,OnPostCommand(command, command_p, items, user, result,cmd));
-                               }
+                               FOREACH_MOD(I_OnPostCommand,OnPostCommand(command, command_p, items, user, result,cmd));
                                return;
                        }
                        else
@@ -410,8 +424,11 @@ void CommandParser::ProcessBuffer(std::string &buffer,userrec *user)
 
        if (buffer.length())
        {
-               ServerInstance->Log(DEBUG,"-> :%s %s",user->nick,buffer.c_str());
-               this->ProcessCommand(user,buffer);
+               if (!user->muted)
+               {
+                       ServerInstance->Log(DEBUG,"-> :%s %s",user->nick,buffer.c_str());
+                       this->ProcessCommand(user,buffer);
+               }
        }
 }
 
@@ -420,10 +437,7 @@ bool CommandParser::CreateCommand(command_t *f, void* so_handle)
        if (so_handle)
        {
                if (RFCCommands.find(f->command) == RFCCommands.end())
-               {
                        RFCCommands[f->command] = so_handle;
-                       ServerInstance->Log(DEBUG,"Monitoring RFC-specified reloadable command at %8x",so_handle);
-               }
                else
                {
                        ServerInstance->Log(DEFAULT,"ERK! Somehow, we loaded a cmd_*.so file twice! Only the first instance is being recorded.");
@@ -435,7 +449,6 @@ bool CommandParser::CreateCommand(command_t *f, void* so_handle)
        if (cmdlist.find(f->command) == cmdlist.end())
        {
                cmdlist[f->command] = f;
-               ServerInstance->Log(DEBUG,"Added command %s (%d parameters)", f->command.c_str(), f->min_params);
                return true;
        }
        else return false;
@@ -517,8 +530,6 @@ void CommandParser::LoadCommand(const char* name)
        command_t* (*cmd_factory_func)(InspIRCd*);
 
        snprintf(filename, MAXBUF, "%s/%s", LIBRARYDIR, name);
-       ServerInstance->Log(DEBUG,"Load command: %s", filename);
-
        h = dlopen(filename, RTLD_NOW | RTLD_GLOBAL);
 
        if (!h)