- strcpy(cmd,"");
- j = 0;
- /* strip out extraneous linefeeds through mirc's crappy pasting (thanks Craig) */
- for (unsigned int i = 0; i < strlen(temp); i++)
- {
- if ((temp[i] != 10) && (temp[i] != 13) && (temp[i] != 0) && (temp[i] != 7))
- {
- cmd[j++] = temp[i];
- cmd[j] = 0;
- }
- }
- /* split the full string into a command plus parameters */
- parameters = p;
- strcpy(p," ");
- command = cmd;
- if (strchr(cmd,' '))
- {
- for (unsigned int i = 0; i <= strlen(cmd); i++)
- {
- /* capitalise the command ONLY, leave params intact */
- cmd[i] = toupper(cmd[i]);
- /* are we nearly there yet?! :P */
- if (cmd[i] == ' ')
- {
- command = cmd;
- parameters = cmd+i+1;
- cmd[i] = '\0';
- break;
- }
- }
- }
- else
- {
- for (unsigned int i = 0; i <= strlen(cmd); i++)
- {
- cmd[i] = toupper(cmd[i]);
- }
- }
-
- }
- cmd_found = 0;
-
- if (strlen(command)>MAXCOMMAND)
- {
- WriteServ(user->fd,"421 %s %s :Command too long",user->nick,command);
- return;
- }
-
- for (unsigned int x = 0; x < strlen(command); x++)
- {
- if (((command[x] < 'A') || (command[x] > 'Z')) && (command[x] != '.'))
- {
- if (((command[x] < '0') || (command[x]> '9')) && (command[x] != '-'))
- {
- if (strchr("@!\"$%^&*(){}[]_=+;:'#~,<>/?\\|`",command[x]))
- {
- stats->statsUnknown++;
- WriteServ(user->fd,"421 %s %s :Unknown command",user->nick,command);
- return;
- }
- }
- }
- }
-
- std::string xcommand = command;
- for (unsigned int i = 0; i != cmdlist.size(); i++)
- {
- if (cmdlist[i].command[0])
- {
- if (strlen(command)>=(strlen(cmdlist[i].command))) if (!strncmp(command, cmdlist[i].command,MAXCOMMAND))
- {
- if (parameters)
- {
- if (parameters[0])
- {
- items = process_parameters(command_p,parameters);
- }
- else
- {
- items = 0;
- command_p[0] = NULL;
- }
- }
- else
- {
- items = 0;
- command_p[0] = NULL;
- }
-
- if (user)
- {
- /* activity resets the ping pending timer */
- user->nping = TIME + user->pingmax;
- if ((items) < cmdlist[i].min_params)
- {
- log(DEBUG,"process_command: not enough parameters: %s %s",user->nick,command);
- WriteServ(user->fd,"461 %s %s :Not enough parameters",user->nick,command);
- return;
- }
- if ((!strchr(user->modes,cmdlist[i].flags_needed)) && (cmdlist[i].flags_needed))
- {
- log(DEBUG,"process_command: permission denied: %s %s",user->nick,command);
- WriteServ(user->fd,"481 %s :Permission Denied- You do not have the required operator privilages",user->nick);
- cmd_found = 1;
- return;
- }
- if ((cmdlist[i].flags_needed) && (!user->HasPermission(xcommand)))
- {
- log(DEBUG,"process_command: permission denied: %s %s",user->nick,command);
- WriteServ(user->fd,"481 %s :Permission Denied- Oper type %s does not have access to command %s",user->nick,user->oper,command);
- cmd_found = 1;
- return;
- }
- /* 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 ((!isnick(user->nick)) || (user->registered != 7))
- {
- log(DEBUG,"process_command: not registered: %s %s",user->nick,command);
- WriteServ(user->fd,"451 %s :You have not registered",command);
- return;
- }
- }
- if ((user->registered == 7) && (!strchr(user->modes,'o')))
- {
- std::stringstream dcmds(Config->DisabledCommands);
- while (!dcmds.eof())
- {
- std::string thiscmd;
- dcmds >> thiscmd;
- if (!strcasecmp(thiscmd.c_str(),command))
- {
- // command is disabled!
- WriteServ(user->fd,"421 %s %s :This command has been disabled.",user->nick,command);
- return;
- }
- }
- }
- if ((user->registered == 7) || (!strncmp(command,"USER",4)) || (!strncmp(command,"NICK",4)) || (!strncmp(command,"PASS",4)))
- {
- if (cmdlist[i].handler_function)
- {
-
- /* ikky /stats counters */
- if (temp)
- {
- cmdlist[i].use_count++;
- cmdlist[i].total_bytes+=strlen(temp);
- }
-
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnPreCommand(command,command_p,items,user));
- if (MOD_RESULT == 1) {
- return;
- }
-
- /* WARNING: nothing may come after the
- * command handler call, as the handler
- * may free the user structure! */
-
- cmdlist[i].handler_function(command_p,items,user);
- }
- return;
- }
- else
- {
- WriteServ(user->fd,"451 %s :You have not registered",command);
- return;
- }
- }
- cmd_found = 1;
- }
- }
- }
- if ((!cmd_found) && (user))
- {
- stats->statsUnknown++;
- WriteServ(user->fd,"421 %s %s :Unknown command",user->nick,command);
- }
-}
-
-bool removecommands(const char* source)
-{
- bool go_again = true;
- while (go_again)
- {
- go_again = false;
- for (std::deque<command_t>::iterator i = cmdlist.begin(); i != cmdlist.end(); i++)
- {
- if (!strcmp(i->source,source))
- {
- log(DEBUG,"removecommands(%s) Removing dependent command: %s",i->source,i->command);
- cmdlist.erase(i);
- go_again = true;
- break;
- }
- }
- }
- return true;
-}
-
-
-void process_buffer(const char* cmdbuf,userrec *user)
-{
- if (!user)
- {
- log(DEFAULT,"*** BUG *** process_buffer was given an invalid parameter");
- return;
- }
- char cmd[MAXBUF];
- if (!cmdbuf)
- {
- log(DEFAULT,"*** BUG *** process_buffer was given an invalid parameter");
- return;
- }
- if (!cmdbuf[0])
- {
- return;
- }
- while (*cmdbuf == ' ') cmdbuf++; // strip leading spaces
-
- strlcpy(cmd,cmdbuf,MAXBUF);
- if (!cmd[0])
- {
- return;
- }
- int sl = strlen(cmd)-1;
- if ((cmd[sl] == 13) || (cmd[sl] == 10))
- {
- cmd[sl] = '\0';
- }
- sl = strlen(cmd)-1;
- if ((cmd[sl] == 13) || (cmd[sl] == 10))
- {
- cmd[sl] = '\0';
- }
- sl = strlen(cmd)-1;
- while (cmd[sl] == ' ') // strip trailing spaces
- {
- cmd[sl] = '\0';
- sl = strlen(cmd)-1;
- }
-
- if (!cmd[0])
- {
- return;
- }
- log(DEBUG,"CMDIN: %s %s",user->nick,cmd);
- tidystring(cmd);
- if ((user) && (cmd))
- {
- process_command(user,cmd);