]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/command_parse.cpp
Forward port of CullList and my bragging rights
[user/henk/code/inspircd.git] / src / command_parse.cpp
index 56e080c904af749ebb016e20bcb27e0298f29ae2..7a26f209ba0d537e949fecec536270cbbf95b543 100644 (file)
  * ---------------------------------------------------
  */
 
-using namespace std;
-
 #include "inspircd_config.h"
 #include "inspircd.h"
-#include "inspircd_io.h"
+#include "configreader.h"
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/errno.h>
@@ -26,15 +24,8 @@ using namespace std;
 #include <sys/utsname.h>
 #include <time.h>
 #include <string>
-#ifdef GCC3
-#include <ext/hash_map>
-#else
-#include <hash_map>
-#endif
-#include <map>
 #include <sstream>
 #include <vector>
-#include <deque>
 #include <sched.h>
 #ifdef THREADED_DNS
 #include <pthread.h>
@@ -89,6 +80,11 @@ extern ServerConfig *Config;
 extern user_hash clientlist;
 extern chan_hash chanlist;
 
+/* Special commands which may occur without registration of the user */
+cmd_user* command_user;
+cmd_nick* command_nick;
+cmd_pass* command_pass;
+
 /* This function pokes and hacks at a parameter list like the following:
  *
  * PART #winbot,#darkgalaxy :m00!
@@ -302,7 +298,7 @@ int CommandParser::LoopCall(command_t* fn, char **parameters, int pcnt, userrec
        return 1;
 }
 
-bool CommandParser::IsValidCommand(std::string &commandname, int pcnt, userrec * user)
+bool CommandParser::IsValidCommand(const std::string &commandname, int pcnt, userrec * user)
 {
        nspace::hash_map<std::string,command_t*>::iterator n = cmdlist.find(commandname);
 
@@ -314,27 +310,18 @@ bool CommandParser::IsValidCommand(std::string &commandname, int pcnt, userrec *
                        {
                                if (n->second->flags_needed)
                                {
-                                       if ((user->HasPermission(commandname)) || (is_uline(user->server)))
-                                       {
-                                               return true;
-                                       }
-                                       else
-                                       {
-                                               return false;
-                                       }
+                                       return ((user->HasPermission(commandname)) || (is_uline(user->server)));
                                }
-
                                return true;
                        }
                }
        }
-
        return false;
 }
 
 // calls a handler function for a command
 
-bool CommandParser::CallHandler(std::string &commandname,char **parameters, int pcnt, userrec *user)
+bool CommandParser::CallHandler(const std::string &commandname,char **parameters, int pcnt, userrec *user)
 {
        nspace::hash_map<std::string,command_t*>::iterator n = cmdlist.find(commandname);
 
@@ -366,7 +353,6 @@ bool CommandParser::CallHandler(std::string &commandname,char **parameters, int
 int CommandParser::ProcessParameters(char **command_p,char *parameters)
 {
        int j = 0;
-       //int q = strlen(parameters);
 
        if (!*parameters)
        {
@@ -635,7 +621,7 @@ void CommandParser::ProcessCommand(userrec *user, char* cmd)
                        }
                        /* if the command isnt USER, PASS, or NICK, and nick is empty,
                         * deny command! */
-                       if ((strncmp(command,"USER",4)) && (strncmp(command,"NICK",4)) && (strncmp(command,"PASS",4)))
+                       if ((cm->second != command_user) && (cm->second != command_nick) && (cm->second != command_pass))
                        {
                                if ((!isnick(user->nick)) || (user->registered != 7))
                                {
@@ -658,7 +644,7 @@ void CommandParser::ProcessCommand(userrec *user, char* cmd)
                                        }
                                }
                        }
-                       if ((user->registered == 7) || (!strncmp(command,"USER",4)) || (!strncmp(command,"NICK",4)) || (!strncmp(command,"PASS",4)))
+                       if ((user->registered == 7) || (cm->second == command_user) || (cm->second == command_nick) || (cm->second == command_pass))
                        {
                                /* ikky /stats counters */
                                if (temp)
@@ -779,8 +765,19 @@ CommandParser::CommandParser()
 
 void CommandParser::SetupCommandTable()
 {
-       this->CreateCommand(new cmd_user);
-       this->CreateCommand(new cmd_nick);
+       /* These three are special (can occur without
+        * full user registration) and so are saved
+        * for later use.
+        */
+       command_user = new cmd_user;
+       command_nick = new cmd_nick;
+       command_pass = new cmd_pass;
+       this->CreateCommand(command_user);
+       this->CreateCommand(command_nick);
+       this->CreateCommand(command_pass);
+
+       /* The rest of these arent special. boo hoo.
+        */
        this->CreateCommand(new cmd_quit);
        this->CreateCommand(new cmd_version);
        this->CreateCommand(new cmd_ping);
@@ -815,7 +812,6 @@ void CommandParser::SetupCommandTable()
        this->CreateCommand(new cmd_summon);
        this->CreateCommand(new cmd_users);
        this->CreateCommand(new cmd_invite);
-       this->CreateCommand(new cmd_pass);
        this->CreateCommand(new cmd_trace);
        this->CreateCommand(new cmd_whowas);
        this->CreateCommand(new cmd_connect);
@@ -833,4 +829,3 @@ void CommandParser::SetupCommandTable()
        this->CreateCommand(new cmd_server);
        this->CreateCommand(new cmd_commands);
 }
-