]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Tidied the code to use Azhrarns new ConfigReader::ReadFlag method
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 6a8b853487d588f8a2b33c5a66a5c8aca90c6c4d..6fc06f0e7c5b72f039cb7022fb5041e812cccb8e 100644 (file)
@@ -1310,6 +1310,7 @@ chanrec* add_channel(userrec *user, const char* cn, const char* key, bool overri
 
        if (!FindChan(cname))
        {
+               int MOD_RESULT = 0;
                FOREACH_RESULT(OnUserPreJoin(user,NULL,cname));
                if (MOD_RESULT) {
                        return NULL;
@@ -1347,6 +1348,7 @@ chanrec* add_channel(userrec *user, const char* cn, const char* key, bool overri
                        // and bans (used by servers)
                        if (!override)
                        {
+                               int MOD_RESULT = 0;
                                FOREACH_RESULT(OnUserPreJoin(user,Ptr,cname));
                                if (MOD_RESULT) {
                                        return NULL;
@@ -1600,18 +1602,28 @@ void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
                WriteServ(src->fd,"441 %s %s %s :They are not on that channel",src->nick, user->nick, Ptr->name);
                return;
        }
-       if (((cstatus(src,Ptr) < STATUS_HOP) || (cstatus(src,Ptr) < cstatus(user,Ptr))) && (!is_uline(src->server)))
+
+       int MOD_RESULT = 0;
+       FOREACH_RESULT(OnAccessCheck(src,user,Ptr,AC_KICK));
+       
+       if (MOD_RESULT == ACR_DENY)
+               return;
+
+       if (MOD_RESULT == ACR_DEFAULT)
        {
-               if (cstatus(src,Ptr) == STATUS_HOP)
+               if (((cstatus(src,Ptr) < STATUS_HOP) || (cstatus(src,Ptr) < cstatus(user,Ptr))) && (!is_uline(src->server)))
                {
-                       WriteServ(src->fd,"482 %s %s :You must be a channel operator",src->nick, Ptr->name);
-               }
-               else
-               {
-                       WriteServ(src->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",src->nick, Ptr->name);
+                       if (cstatus(src,Ptr) == STATUS_HOP)
+                       {
+                               WriteServ(src->fd,"482 %s %s :You must be a channel operator",src->nick, Ptr->name);
+                       }
+                       else
+                       {
+                               WriteServ(src->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",src->nick, Ptr->name);
+                       }
+                       
+                       return;
                }
-               
-               return;
        }
        
        for (int i =0; i != MAXCHANS; i++)
@@ -2592,7 +2604,8 @@ void process_command(userrec *user, char* cmd)
        // another phidjit bug...
        if (total_params > 126)
        {
-               kill_link(user,"Protocol violation (1)");
+               //kill_link(user,"Protocol violation (1)");
+               WriteServ(user->fd,"421 %s * :Unknown command",user->nick);
                return;
        }
        
@@ -2675,7 +2688,8 @@ void process_command(userrec *user, char* cmd)
        
        if (strlen(command)>MAXCOMMAND)
        {
-               kill_link(user,"Protocol violation (2)");
+               //kill_link(user,"Protocol violation (2)");
+               WriteServ(user->fd,"421 %s * :Unknown command",user->nick);
                return;
        }
        
@@ -2685,9 +2699,10 @@ void process_command(userrec *user, char* cmd)
                {
                        if (((command[x] < '0') || (command[x]> '9')) && (command[x] != '-'))
                        {
-                               if (!strchr("@!\"$%^&*(){}[]_-=+;:'#~,.<>/?\\|`",command[x]))
+                               if (strchr("@!\"$%^&*(){}[]_=+;:'#~,<>/?\\|`",command[x]))
                                {
-                                       kill_link(user,"Protocol violation (3)");
+                                       //kill_link(user,"Protocol violation (3)");
+                                       WriteServ(user->fd,"421 %s * :Unknown command",user->nick);
                                        return;
                                }
                        }
@@ -2739,6 +2754,13 @@ void process_command(userrec *user, char* cmd)
                                                cmd_found = 1;
                                                return;
                                        }
+                                       if ((cmdlist[i].flags_needed) && (!user->HasPermission(command)))
+                                       {
+                                               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)))
@@ -2925,6 +2947,15 @@ void DoSync(serverrec* serv, char* tcp_host)
        {
                snprintf(data,MAXBUF,"N %d %s %s %s %s +%s %s %s :%s",u->second->age,u->second->nick,u->second->host,u->second->dhost,u->second->ident,u->second->modes,u->second->ip,u->second->server,u->second->fullname);
                serv->SendPacket(data,tcp_host);
+               for (int i = 0; i <= MODCOUNT; i++)
+               {
+                       string_list l = modules[i]->OnUserSync(u->second);
+                       for (int j = 0; j < l.size(); j++)
+                       {
+                               strncpy(data,l[j].c_str(),MAXBUF);
+                               serv->SendPacket(data,tcp_host);
+                       }
+               }
                if (strcmp(chlist(u->second),""))
                {
                        snprintf(data,MAXBUF,"J %s %s",u->second->nick,chlist(u->second));
@@ -2936,6 +2967,15 @@ void DoSync(serverrec* serv, char* tcp_host)
        {
                snprintf(data,MAXBUF,"M %s +%s",c->second->name,chanmodes(c->second));
                serv->SendPacket(data,tcp_host);
+               for (int i = 0; i <= MODCOUNT; i++)
+               {
+                       string_list l = modules[i]->OnChannelSync(c->second);
+                       for (int j = 0; j < l.size(); j++)
+                       {
+                               strncpy(data,l[j].c_str(),MAXBUF);
+                               serv->SendPacket(data,tcp_host);
+                       }
+               }
                if (strcmp(c->second->topic,""))
                {
                        snprintf(data,MAXBUF,"T %d %s %s :%s",c->second->topicset,c->second->setby,c->second->name,c->second->topic);