]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
remote kill fixes
[user/henk/code/inspircd.git] / src / inspircd.cpp
index f44160abb0e6fd6d409556c3bebd85ee316e25a1..dd79bd0a13b5be2f30100eb0acd8e35923d4402e 100644 (file)
@@ -3911,11 +3911,45 @@ void handle_kill(char **parameters, int pcnt, userrec *user)
         log(DEBUG,"kill: %s %s",parameters[0],parameters[1]);
        if (u)
        {
-               WriteTo(user, u, "KILL %s :%s!%s!%s (%s)", u->nick, ServerName,user->dhost,user->nick,parameters[1]);
-               // :Brain!brain@NetAdmin.chatspike.net KILL [Brain] :homer!NetAdmin.chatspike.net!Brain (test kill)
-               WriteOpers("*** Local Kill by %s: %s!%s@%s (%s)",user->nick,u->nick,u->ident,u->host,parameters[1]);
-               sprintf(killreason,"Killed (%s (%s))",user->nick,parameters[1]);
-               kill_link(u,killreason);
+               if (strcmp(ServerName,u->server))
+               {
+                       // remote kill
+                       WriteOpers("*** Remote kill: %s!%s@%s (%s)",user->nick,u->nick,u->ident,u->host,parameters[1]);
+                       sprintf(killreason,"[%s] Killed (%s (%s))",u->server,user->nick,parameters[1]);
+                       WriteCommonExcept(u,"QUIT :%s",killreason);
+                       // K token must go to ALL servers!!!
+                       char buffer[MAXBUF];
+                               snprintf(buffer,MAXBUF,"K %s %s :%s",user->nick,u->nick,killreason);
+                       for (int j = 0; j < 255; j++)
+                       {
+                               if (servers[j] != NULL)
+                               {
+                                       if (strcmp(servers[j]->name,ServerName))
+                                       {
+                                               me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
+                                               log(DEBUG,"Sent K token");
+                                       }
+                               }
+                       }
+                       user_hash::iterator iter = clientlist.find(u->nick);
+                       if (iter != clientlist.end())
+                       {
+                               log(DEBUG,"deleting user hash value %d",iter->second);
+                               if ((iter->second) && (user->registered == 7)) {
+                                       delete iter->second;
+                                       }
+                       clientlist.erase(iter);
+                       }
+                       purge_empty_chans();
+               }
+               else
+               {
+                       // local kill
+                       WriteTo(user, u, "KILL %s :%s!%s!%s (%s)", u->nick, ServerName,user->dhost,user->nick,parameters[1]);
+                       WriteOpers("*** Local Kill by %s: %s!%s@%s (%s)",user->nick,u->nick,u->ident,u->host,parameters[1]);
+                       sprintf(killreason,"Killed (%s (%s))",user->nick,parameters[1]);
+                       kill_link(u,killreason);
+               }
        }
        else
        {
@@ -4903,23 +4937,45 @@ int usercount_unknown(void)
        return c;
 }
 
-int chancount(void)
+long chancount(void)
 {
        return chanlist.size();
 }
 
-int servercount(void)
+long count_servs(void)
 {
-       return 1;
+       int c = 0;
+       for (int j = 0; j < 255; j++)
+       {
+               if (servers[j] != NULL)
+                       c++;
+       }
+       return c;
 }
 
+long servercount(void)
+{
+       return count_servs()+1;
+}
+
+long local_count()
+{
+       int c = 0;
+       for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
+       {
+               if ((i->second->fd) && (isnick(i->second->nick)) && (!strcasecmp(i->second->server,ServerName))) c++;
+       }
+       return c;
+}
+
+
 void handle_lusers(char **parameters, int pcnt, userrec *user)
 {
        WriteServ(user->fd,"251 %s :There are %d users and %d invisible on %d servers",user->nick,usercnt()-usercount_invisible(),usercount_invisible(),servercount());
        WriteServ(user->fd,"252 %s %d :operator(s) online",user->nick,usercount_opers());
        WriteServ(user->fd,"253 %s %d :unknown connections",user->nick,usercount_unknown());
        WriteServ(user->fd,"254 %s %d :channels formed",user->nick,chancount());
-       WriteServ(user->fd,"254 %s :I have %d clients and 0 servers",user->nick,usercnt());
+       WriteServ(user->fd,"254 %s :I have %d clients and %d servers",user->nick,local_count(),count_servs());
 }
 
 void handle_admin(char **parameters, int pcnt, userrec *user)
@@ -5312,14 +5368,18 @@ void handle_connect(char **parameters, int pcnt, userrec *user)
        
        for (int i = 0; i < ConfValueEnum("link",&config_f); i++)
        {
-               ConfValue("link","name",i,Link_ServerName,&config_f);
-               ConfValue("link","ipaddr",i,Link_IPAddr,&config_f);
-               ConfValue("link","port",i,Link_Port,&config_f);
-               ConfValue("link","sendpass",i,Link_Pass,&config_f);
-               log(DEBUG,"(%d) Comparing against name='%s', ipaddr='%s', port='%s', recvpass='%s'",i,Link_ServerName,Link_IPAddr,Link_Port,Link_Pass);
-               LinkPort = atoi(Link_Port);
-               if (match(Link_ServerName,parameters[0])) {
-                       found = true;
+               if (!found)
+               {
+                       ConfValue("link","name",i,Link_ServerName,&config_f);
+                       ConfValue("link","ipaddr",i,Link_IPAddr,&config_f);
+                       ConfValue("link","port",i,Link_Port,&config_f);
+                       ConfValue("link","sendpass",i,Link_Pass,&config_f);
+                       log(DEBUG,"(%d) Comparing against name='%s', ipaddr='%s', port='%s', recvpass='%s'",i,Link_ServerName,Link_IPAddr,Link_Port,Link_Pass);
+                       LinkPort = atoi(Link_Port);
+                       if (match(Link_ServerName,parameters[0])) {
+                               found = true;
+                               break;
+                       }
                }
        }
        
@@ -5340,6 +5400,7 @@ void handle_connect(char **parameters, int pcnt, userrec *user)
                for (int j = 0; j < 255; j++) {
                        if (servers[j] == NULL) {
                                servers[j] = new serverrec;
+                               //servers[j]->initiator = true;
                                strcpy(servers[j]->internal_addr,Link_IPAddr);
                                servers[j]->internal_port = LinkPort;
                                strcpy(servers[j]->name,Link_ServerName);
@@ -5386,17 +5447,7 @@ long map_count(serverrec* s)
        int c = 0;
        for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
        {
-               if ((i->second->fd) && (isnick(i->second->nick)) && (strcasecmp(i->second->server,s->name))) c++;
-       }
-       return c;
-}
-
-long local_count()
-{
-       int c = 0;
-       for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
-       {
-               if ((i->second->fd) && (isnick(i->second->nick)) && (strcasecmp(i->second->server,ServerName))) c++;
+               if ((i->second->fd) && (isnick(i->second->nick)) && (!strcasecmp(i->second->server,s->name))) c++;
        }
        return c;
 }
@@ -5418,7 +5469,7 @@ void handle_map(char **parameters, int pcnt, userrec *user)
 {
        char line[MAXBUF];
        snprintf(line,MAXBUF,"006 %s :%s",user->nick,ServerName);
-       while (strlen(line) < 40)
+       while (strlen(line) < 50)
                strcat(line," ");
        WriteServ(user->fd,"%s%d (%.2f%%)",line,local_count(),(float)(((float)local_count()/(float)usercnt())*100));
        for (int j = 0; j < 255; j++)
@@ -5426,7 +5477,7 @@ void handle_map(char **parameters, int pcnt, userrec *user)
                if (servers[j] != NULL)
                {
                        snprintf(line,MAXBUF,"006 %s :%c-%s",user->nick,islast(servers[j]),servers[j]->name);
-                       while (strlen(line) < 40)
+                       while (strlen(line) < 50)
                                strcat(line," ");
                        WriteServ(user->fd,"%s%d (%.2f%%)",line,map_count(servers[j]),(float)(((float)map_count(servers[j])/(float)usercnt())*100));
                }
@@ -6216,6 +6267,25 @@ void handle_L(char token,char* params,serverrec* source,serverrec* reply, char*
        }
 }
 
+void handle_K(char token,char* params,serverrec* source,serverrec* reply, char* udp_host,int udp_port)
+{
+       char* src = strtok(params," ");
+       char* nick = strtok(NULL," :");
+       char* reason = strtok(NULL,"\r\n");
+       reason++;
+
+       userrec* u = Find(nick);
+       userrec* user = Find(src);
+       
+       if ((user) && (u))
+       {
+               WriteTo(user, u, "KILL %s :%s!%s!%s!%s (%s)", u->nick, source->name,ServerName,user->dhost,user->nick,reason);
+               WriteOpers("*** Remote kill from %s by %s: %s!%s@%s (%s)",source->name,user->nick,u->nick,u->ident,u->host,reason);
+               snprintf(reason,MAXQUIT,"[%s] Killed (%s (%s))",source->name,user->nick,reason);
+               kill_link(u,reason);
+       }
+}
+
 void handle_Q(char token,char* params,serverrec* source,serverrec* reply, char* udp_host,int udp_port)
 {
        char* nick = strtok(params," :");
@@ -6484,6 +6554,11 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve
                case 'Q':
                        handle_Q(token,params,source,reply,udp_host,udp_port);
                break;
+               // K <SOURCE> :<REASON>
+               // remote kill
+               case 'K':
+                       handle_K(token,params,source,reply,udp_host,udp_port);
+               break;
                // F <TS>
                // end netburst
                case 'F':
@@ -6549,6 +6624,7 @@ void handle_link_packet(long theirkey, char* udp_msg, char* udp_host, int udp_po
                                                                strcpy(servers[j]->description,serverdesc);
                                                                servers[j]->internal_port = udp_port;
                                                                // create a server record for this server
+                                                               WriteOpers("Server %s authenticated, exchanging server keys...",servername);
                                                                snprintf(response,10240,"O %d",MyKey);
                                                                serv->SendPacket(response,udp_host,udp_port,0);
                                                                return;
@@ -6881,7 +6957,7 @@ int InspIRCd(void)
        {
 
                fd_set sfd;
-               struct timeval tval;
+               timeval tval;
                FD_ZERO(&sfd);
 
                user_hash::iterator count2 = clientlist.begin();