X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcommands.cpp;h=dc757c80328d8e8acf3bb2fa590a0d582dcb585a;hb=406ab09f22f46a6cee5559e96f0325768188ffa4;hp=0b9624ea810372b0956124b32b6619e82d7e0eab;hpb=ca049db71a518655e7c3bfe0f0d8a057ec88c8bb;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/commands.cpp b/src/commands.cpp index 0b9624ea8..dc757c803 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -50,6 +50,8 @@ #include "message.h" #include "mode.h" #include "xline.h" +#include "inspstring.h" +#include "dnsqueue.h" #ifdef GCC3 #define nspace __gnu_cxx @@ -60,8 +62,8 @@ using namespace std; extern int MODCOUNT; -extern vector modules; -extern vector factory; +extern std::vector modules; +extern std::vector factory; extern int LogLevel; extern char ServerName[MAXBUF]; @@ -89,6 +91,8 @@ extern time_t nb_start; extern bool nofork; +extern time_t TIME; + extern std::vector fd_reap; extern std::vector module_names; @@ -116,28 +120,35 @@ const long duration_y = duration_w * 52; namespace nspace { - template<> struct nspace::hash - { - size_t operator()(const struct in_addr &a) const - { - size_t q; - memcpy(&q,&a,sizeof(size_t)); - return q; - } - }; - - template<> struct nspace::hash - { - size_t operator()(const string &s) const - { - char a[MAXBUF]; - static struct hash strhash; - strlcpy(a,s.c_str(),MAXBUF); - strlower(a); - return strhash(a); - } - }; -} +#ifdef GCC34 + template<> struct hash +#else + template<> struct nspace::hash +#endif + { + size_t operator()(const struct in_addr &a) const + { + size_t q; + memcpy(&q,&a,sizeof(size_t)); + return q; + } + }; +#ifdef GCC34 + template<> struct hash +#else + template<> struct nspace::hash +#endif + { + size_t operator()(const string &s) const + { + char a[MAXBUF]; + static struct hash strhash; + strlcpy(a,s.c_str(),MAXBUF); + strlower(a); + return strhash(a); + } + }; +} struct StrHashComp @@ -253,12 +264,36 @@ void handle_kick(char **parameters, int pcnt, userrec *user) } // this must be propogated so that channel membership is kept in step network-wide - char buffer[MAXBUF]; snprintf(buffer,MAXBUF,"k %s %s %s :%s",user->nick,u->nick,Ptr->name,reason); NetSendToAll(buffer); } +void handle_loadmodule(char **parameters, int pcnt, userrec *user) +{ + if (LoadModule(parameters[0])) + { + WriteOpers("*** NEW MODULE: %s",parameters[0]); + WriteServ(user->fd,"975 %s %s :Module successfully loaded.",user->nick, parameters[0]); + } + else + { + WriteServ(user->fd,"974 %s %s :Failed to load module: %s",user->nick, parameters[0],ModuleError()); + } +} + +void handle_unloadmodule(char **parameters, int pcnt, userrec *user) +{ + if (UnloadModule(parameters[0])) + { + WriteOpers("*** MODULE UNLOADED: %s",parameters[0]); + WriteServ(user->fd,"973 %s %s :Module successfully unloaded.",user->nick, parameters[0]); + } + else + { + WriteServ(user->fd,"972 %s %s :Failed to unload module: %s",user->nick, parameters[0],ModuleError()); + } +} void handle_die(char **parameters, int pcnt, userrec *user) { @@ -326,10 +361,18 @@ void handle_kill(char **parameters, int pcnt, userrec *user) { userrec *u = Find(parameters[0]); char killreason[MAXBUF]; - + log(DEBUG,"kill: %s %s",parameters[0],parameters[1]); if (u) { + log(DEBUG,"into kill mechanism"); + int MOD_RESULT = 0; + FOREACH_RESULT(OnKill(user,u,parameters[1])); + if (MOD_RESULT) { + log(DEBUG,"A module prevented the kill with result %d",MOD_RESULT); + return; + } + if (strcmp(ServerName,u->server)) { // remote kill @@ -347,14 +390,15 @@ void handle_kill(char **parameters, int pcnt, userrec *user) log(DEBUG,"deleting user hash value %d",iter->second); if ((iter->second) && (user->registered == 7)) { delete iter->second; - } - clientlist.erase(iter); + } + clientlist.erase(iter); } purge_empty_chans(); } else { // local kill + log(DEFAULT,"LOCAL KILL: %s :%s!%s!%s (%s)", u->nick, ServerName,user->dhost,user->nick,parameters[1]); 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]); snprintf(killreason,MAXBUF,"Killed (%s (%s))",user->nick,parameters[1]); @@ -459,6 +503,11 @@ void handle_topic(char **parameters, int pcnt, userrec *user) Ptr = FindChan(parameters[0]); if (Ptr) { + if (((Ptr) && (!has_channel(user,Ptr))) && (Ptr->secret)) + { + WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name); + return; + } if (Ptr->topicset) { WriteServ(user->fd,"332 %s %s :%s", user->nick, Ptr->name, Ptr->topic); @@ -483,6 +532,11 @@ void handle_topic(char **parameters, int pcnt, userrec *user) Ptr = FindChan(parameters[0]); if (Ptr) { + if ((Ptr) && (!has_channel(user,Ptr))) + { + WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name); + return; + } if ((Ptr->topiclock) && (cstatus(user,Ptr)fd,"482 %s %s :You must be at least a half-operator to change modes on this channel", user->nick, Ptr->name); @@ -498,7 +552,7 @@ void handle_topic(char **parameters, int pcnt, userrec *user) strlcpy(Ptr->topic,topic,MAXBUF); strlcpy(Ptr->setby,user->nick,NICKMAX); - Ptr->topicset = time(NULL); + Ptr->topicset = TIME; WriteChannel(Ptr,user,"TOPIC %s :%s",Ptr->name, Ptr->topic); // t token must go to ALL servers!!! @@ -518,12 +572,22 @@ void handle_names(char **parameters, int pcnt, userrec *user) { chanrec* c; + if (!pcnt) + { + WriteServ(user->fd,"366 %s * :End of /NAMES list.",user->nick); + return; + } + if (loop_call(handle_names,parameters,pcnt,user,0,pcnt-1,0)) return; c = FindChan(parameters[0]); if (c) { - /*WriteServ(user->fd,"353 %s = %s :%s", user->nick, c->name,*/ + if (((c) && (!has_channel(user,c))) && (c->secret)) + { + WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name); + return; + } userlist(user,c); WriteServ(user->fd,"366 %s %s :End of /NAMES list.", user->nick, c->name); } @@ -538,7 +602,7 @@ void handle_privmsg(char **parameters, int pcnt, userrec *user) userrec *dest; chanrec *chan; - user->idle_lastmsg = time(NULL); + user->idle_lastmsg = TIME; if (loop_call(handle_privmsg,parameters,pcnt,user,0,pcnt-2,0)) return; @@ -626,7 +690,7 @@ void handle_notice(char **parameters, int pcnt, userrec *user) userrec *dest; chanrec *chan; - user->idle_lastmsg = time(NULL); + user->idle_lastmsg = TIME; if (loop_call(handle_notice,parameters,pcnt,user,0,pcnt-2,0)) return; @@ -754,7 +818,7 @@ void handle_whois(char **parameters, int pcnt, userrec *user) { WriteServ(user->fd,"301 %s %s :%s",user->nick, dest->nick, dest->awaymsg); } - if (strchr(dest->modes,'o')) + if ((strchr(dest->modes,'o')) && (strcmp(dest->oper,""))) { WriteServ(user->fd,"313 %s %s :is %s %s on %s",user->nick, dest->nick, (strchr("aeiou",dest->oper[0]) ? "an" : "a"),dest->oper, Network); @@ -763,7 +827,7 @@ void handle_whois(char **parameters, int pcnt, userrec *user) if (!strcasecmp(user->server,dest->server)) { // idle time and signon line can only be sent if youre on the same server (according to RFC) - WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, abs((dest->idle_lastmsg)-time(NULL)), dest->signon); + WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, abs((dest->idle_lastmsg)-TIME), dest->signon); } WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, dest->nick); @@ -876,11 +940,11 @@ void handle_who(char **parameters, int pcnt, userrec *user) } if (Ptr) { - WriteServ(user->fd,"315 %s %s :End of /WHO list.",user->nick, Ptr->name); + WriteServ(user->fd,"315 %s %s :End of /WHO list.",user->nick , parameters[0]); } else { - WriteServ(user->fd,"315 %s %s :End of /WHO list.",user->nick, user->nick); + WriteServ(user->fd,"315 %s %s :End of /WHO list.",user->nick, parameters[0]); } return; } @@ -905,7 +969,7 @@ void handle_who(char **parameters, int pcnt, userrec *user) WriteServ(user->fd,"352 %s %s %s %s %s %s %s :0 %s",user->nick, Ptr->name, i->second->ident, i->second->dhost, i->second->server, i->second->nick, tmp, i->second->fullname); } } - WriteServ(user->fd,"315 %s %s :End of /WHO list.",user->nick, Ptr->name); + WriteServ(user->fd,"315 %s %s :End of /WHO list.",user->nick, parameters[0]); } else { @@ -953,7 +1017,7 @@ void handle_who(char **parameters, int pcnt, userrec *user) } } } - WriteServ(user->fd,"315 %s %s :End of /WHO list.",user->nick, user->nick); + WriteServ(user->fd,"315 %s %s :End of /WHO list.",user->nick, parameters[0]); return; } } @@ -983,7 +1047,7 @@ void handle_list(char **parameters, int pcnt, userrec *user) void handle_rehash(char **parameters, int pcnt, userrec *user) { WriteServ(user->fd,"382 %s %s :Rehashing",user->nick,CleanFilename(CONFIG_FILE)); - ReadConfig(); + ReadConfig(false,user); FOREACH_MOD OnRehash(); WriteOpers("%s is rehashing config file %s",user->nick,CleanFilename(CONFIG_FILE)); } @@ -1167,10 +1231,29 @@ void handle_modules(char **parameters, int pcnt, userrec *user) { for (int i = 0; i < module_names.size(); i++) { - Version V = modules[i]->GetVersion(); - char modulename[MAXBUF]; - strlcpy(modulename,module_names[i].c_str(),256); - WriteServ(user->fd,"900 %s :0x%08lx %d.%d.%d.%d %s",user->nick,modules[i],V.Major,V.Minor,V.Revision,V.Build,CleanFilename(modulename)); + Version V = modules[i]->GetVersion(); + char modulename[MAXBUF]; + char flagstate[MAXBUF]; + strcpy(flagstate,""); + if (V.Flags & VF_STATIC) + strlcat(flagstate,", static",MAXBUF); + if (V.Flags & VF_VENDOR) + strlcat(flagstate,", vendor",MAXBUF); + if (V.Flags & VF_COMMON) + strlcat(flagstate,", common",MAXBUF); + if (V.Flags & VF_SERVICEPROVIDER) + strlcat(flagstate,", service provider",MAXBUF); + if (!strlen(flagstate)) + strcpy(flagstate," "); + strlcpy(modulename,module_names[i].c_str(),256); + if (strchr(user->modes,'o')) + { + WriteServ(user->fd,"900 %s :0x%08lx %d.%d.%d.%d %s (%s)",user->nick,modules[i],V.Major,V.Minor,V.Revision,V.Build,CleanFilename(modulename),flagstate+2); + } + else + { + WriteServ(user->fd,"900 %s :%s",user->nick,CleanFilename(modulename)); + } } } @@ -1236,7 +1319,7 @@ void handle_stats(char **parameters, int pcnt, userrec *user) { if (strchr(i->second->modes,'o')) { - WriteServ(user->fd,"249 %s :%s (%s@%s) Idle: %d",user->nick,i->second->nick,i->second->ident,i->second->dhost,(time(NULL) - i->second->idle_lastmsg)); + WriteServ(user->fd,"249 %s :%s (%s@%s) Idle: %d",user->nick,i->second->nick,i->second->ident,i->second->dhost,(TIME - i->second->idle_lastmsg)); idx++; } } @@ -1264,6 +1347,11 @@ void handle_stats(char **parameters, int pcnt, userrec *user) stats_z(user); } + if (!strcmp(parameters[0],"e")) + { + stats_e(user); + } + /* stats m (list number of times each command has been used, plus bytecount) */ if (!strcmp(parameters[0],"m")) { @@ -1331,7 +1419,7 @@ void handle_stats(char **parameters, int pcnt, userrec *user) if (!strcmp(parameters[0],"u")) { time_t current_time = 0; - current_time = time(NULL); + current_time = TIME; time_t server_uptime = current_time - startup_time; struct tm* stime; stime = gmtime(&server_uptime); @@ -1437,7 +1525,7 @@ void handle_map(char **parameters, int pcnt, userrec *user) snprintf(line,MAXBUF,"006 %s :%s",user->nick,ServerName); while (strlen(line) < 50) strcat(line," "); - WriteServ(user->fd,"%s%d (%.2f%%)",line,local_count(),(float)(((float)local_count()/(float)usercnt())*100)); + WriteServ(user->fd,"%s%d (%.2f%%)",line,local_count(),(float)(((float)local_count()/(float)registered_usercount())*100)); for (int j = 0; j < 32; j++) { if (me[j] != NULL) @@ -1447,7 +1535,7 @@ void handle_map(char **parameters, int pcnt, userrec *user) snprintf(line,MAXBUF,"006 %s :%c-%s",user->nick,islast(me[j]->connectors[k].GetServerName().c_str()),me[j]->connectors[k].GetServerName().c_str()); while (strlen(line) < 50) strcat(line," "); - WriteServ(user->fd,"%s%d (%.2f%%)",line,map_count(me[j]->connectors[k].GetServerName().c_str()),(float)(((float)map_count(me[j]->connectors[k].GetServerName().c_str())/(float)usercnt())*100)); + WriteServ(user->fd,"%s%d (%.2f%%)",line,map_count(me[j]->connectors[k].GetServerName().c_str()),(float)(((float)map_count(me[j]->connectors[k].GetServerName().c_str())/(float)registered_usercount())*100)); } } } @@ -1477,47 +1565,76 @@ void handle_oper(char **parameters, int pcnt, userrec *user) char Password[MAXBUF]; char OperType[MAXBUF]; char TypeName[MAXBUF]; - char Hostname[MAXBUF]; + char HostName[MAXBUF]; + char TheHost[MAXBUF]; int i,j; + bool found = false; + bool fail2 = false; + char global[MAXBUF]; + + snprintf(TheHost,MAXBUF,"%s@%s",user->ident,user->host); for (int i = 0; i < ConfValueEnum("oper",&config_f); i++) { ConfValue("oper","name",i,LoginName,&config_f); ConfValue("oper","password",i,Password,&config_f); - if ((!strcmp(LoginName,parameters[0])) && (!strcmp(Password,parameters[1]))) + ConfValue("oper","type",i,OperType,&config_f); + ConfValue("oper","host",i,HostName,&config_f); + if ((!strcmp(LoginName,parameters[0])) && (!strcmp(Password,parameters[1])) && (match(TheHost,HostName))) { - /* correct oper credentials */ - ConfValue("oper","type",i,OperType,&config_f); - WriteOpers("*** %s (%s@%s) is now an IRC operator of type %s",user->nick,user->ident,user->host,OperType); - WriteServ(user->fd,"381 %s :You are now an IRC operator of type %s",user->nick,OperType); - WriteServ(user->fd,"MODE %s :+o",user->nick); - char global[MAXBUF]; - snprintf(global,MAXBUF,"M %s +o",user->nick); - NetSendToAll(global); + fail2 = true; for (j =0; j < ConfValueEnum("type",&config_f); j++) { ConfValue("type","name",j,TypeName,&config_f); + if (!strcmp(TypeName,OperType)) { /* found this oper's opertype */ snprintf(global,MAXBUF,"| %s %s",user->nick,TypeName); NetSendToAll(global); - ConfValue("type","host",j,Hostname,&config_f); - ChangeDisplayedHost(user,Hostname); + ConfValue("type","host",j,HostName,&config_f); + ChangeDisplayedHost(user,HostName); strlcpy(user->oper,TypeName,NICKMAX); + found = true; + fail2 = false; + break; } } - if (!strchr(user->modes,'o')) - { - strcat(user->modes,"o"); - } + } + if (found) + break; + } + if (found) + { + /* correct oper credentials */ + WriteOpers("*** %s (%s@%s) is now an IRC operator of type %s",user->nick,user->ident,user->host,OperType); + WriteServ(user->fd,"381 %s :You are now an IRC operator of type %s",user->nick,OperType); + if (!strchr(user->modes,'o')) + { + strcat(user->modes,"o"); + WriteServ(user->fd,"MODE %s :+o",user->nick); + snprintf(global,MAXBUF,"M %s +o",user->nick); + NetSendToAll(global); FOREACH_MOD OnOper(user); - return; + log(DEFAULT,"OPER: %s!%s@%s opered as type: %s",user->nick,user->ident,user->host,OperType); } } - /* no such oper */ - WriteServ(user->fd,"491 %s :Invalid oper credentials",user->nick); - WriteOpers("*** WARNING! Failed oper attempt by %s!%s@%s!",user->nick,user->ident,user->host); + else + { + if (!fail2) + { + WriteServ(user->fd,"491 %s :Invalid oper credentials",user->nick); + WriteOpers("*** WARNING! Failed oper attempt by %s!%s@%s!",user->nick,user->ident,user->host); + log(DEFAULT,"OPER: Failed oper attempt by %s!%s@%s: user, host or password did not match.",user->nick,user->ident,user->host); + } + else + { + WriteServ(user->fd,"491 %s :Your oper block does not have a valid opertype associated with it",user->nick); + WriteOpers("*** CONFIGURATION ERROR! Oper block mismatch for OperType %s",OperType); + log(DEFAULT,"OPER: Failed oper attempt by %s!%s@%s: credentials valid, but oper type nonexistent.",user->nick,user->ident,user->host); + } + } + return; } void handle_nick(char **parameters, int pcnt, userrec *user) @@ -1594,9 +1711,11 @@ void handle_nick(char **parameters, int pcnt, userrec *user) char buffer[MAXBUF]; snprintf(buffer,MAXBUF,"n %s %s",user->nick,parameters[0]); NetSendToAll(buffer); - } + char oldnick[NICKMAX]; + strlcpy(oldnick,user->nick,NICKMAX); + /* change the nick of the user in the users_hash */ user = ReHashNick(user->nick, parameters[0]); /* actually change the nick within the record */ @@ -1608,12 +1727,23 @@ void handle_nick(char **parameters, int pcnt, userrec *user) log(DEBUG,"new nick set: %s",user->nick); if (user->registered < 3) + { user->registered = (user->registered | 2); + // dont attempt to look up the dns until they pick a nick... because otherwise their pointer WILL change + // and unless we're lucky we'll get a duff one later on. + user->dns_done = (!lookup_dns(user->nick)); + if (user->dns_done) + log(DEBUG,"Aborting dns lookup of %s because dns server experienced a failure.",user->nick); + } if (user->registered == 3) { /* user is registered now, bit 0 = USER command, bit 1 = sent a NICK command */ ConnectUser(user); } + if (user->registered == 7) + { + FOREACH_MOD OnUserPostNick(user,oldnick); + } } @@ -1703,7 +1833,7 @@ void handle_t(char token,char* params,serverrec* source,serverrec* reply, char* WriteChannelLocal(c,u,"TOPIC %s :%s",c->name,topic); strlcpy(c->topic,topic,MAXTOPIC); strlcpy(c->setby,u->nick,NICKMAX); - c->topicset = time(NULL); + c->topicset = TIME; } } @@ -2007,7 +2137,7 @@ void handle_N(char token,char* params,serverrec* source,serverrec* reply, char* clientlist[nick]->lastping = 1; clientlist[nick]->port = 0; // so is this... clientlist[nick]->registered = 7; // this however we need to set for them to receive messages and appear online - clientlist[nick]->idle_lastmsg = time(NULL); // this is unrealiable and wont actually be used locally + clientlist[nick]->idle_lastmsg = TIME; // this is unrealiable and wont actually be used locally for (int i = 0; i < MAXCHANS; i++) { clientlist[nick]->chans[i].channel = NULL; @@ -2017,7 +2147,7 @@ void handle_N(char token,char* params,serverrec* source,serverrec* reply, char* void handle_F(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) { - long tdiff = time(NULL) - atoi(params); + long tdiff = TIME - atoi(params); if (tdiff) WriteOpers("TS split for %s -> %s: %d",source->name,reply->name,tdiff); } @@ -2232,7 +2362,7 @@ void handle_hash(char token,char* params,serverrec* source,serverrec* reply, cha char* create_time = strtok(NULL," "); char* duration = strtok(NULL," :"); char* reason = strtok(NULL,"\r\n"); - add_gline(atoi(duration),who,reason,mask); + add_gline(atoi(duration),(const char*)who,(const char*)reason,(const char*)mask); // we must update the creation time on this gline // now that we've added it, or it wont expire at the right time. gline_set_creation_time(mask,atoi(create_time)); @@ -2254,7 +2384,7 @@ void handle_dot(char token,char* params,serverrec* source,serverrec* reply, char char* who = strtok(NULL," "); if (mask) { - if (del_gline(mask)) + if (del_gline((const char*)mask)) { if (who) { @@ -2273,7 +2403,7 @@ void handle_add_sqline(char token,char* params,serverrec* source,serverrec* repl char* create_time = strtok(NULL," "); char* duration = strtok(NULL," :"); char* reason = strtok(NULL,"\r\n"); - add_qline(atoi(duration),who,reason,mask); + add_qline(atoi(duration),(const char*)who,(const char*)reason,(const char*)mask); // we must update the creation time on this gline // now that we've added it, or it wont expire at the right time. qline_set_creation_time(mask,atoi(create_time)); @@ -2296,7 +2426,7 @@ void handle_del_sqline(char token,char* params,serverrec* source,serverrec* repl char* who = strtok(NULL," "); if (mask) { - if (del_qline(mask)) + if (del_qline((const char*)mask)) { if (who) { @@ -2315,7 +2445,7 @@ void handle_add_szline(char token,char* params,serverrec* source,serverrec* repl char* create_time = strtok(NULL," "); char* duration = strtok(NULL," :"); char* reason = strtok(NULL,"\r\n"); - add_zline(atoi(duration),who,reason,mask); + add_zline(atoi(duration),(const char*)who,(const char*)reason,(const char*)mask); // we must update the creation time on this gline // now that we've added it, or it wont expire at the right time. zline_set_creation_time(mask,atoi(create_time)); @@ -2338,7 +2468,7 @@ void handle_del_szline(char token,char* params,serverrec* source,serverrec* repl char* who = strtok(NULL," "); if (mask) { - if (del_zline(mask)) + if (del_zline((const char*)mask)) { if (who) { @@ -2369,7 +2499,7 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve // Y // start netburst case 'Y': - nb_start = time(NULL); + nb_start = TIME; WriteOpers("Server %s is starting netburst.",tcp_host); // now broadcast this new servers address out to all servers that are linked to us, // except the newcomer. They'll all attempt to connect back to it. @@ -2547,7 +2677,7 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve // F // end netburst case 'F': - WriteOpers("Server %s has completed netburst. (%d secs)",tcp_host,time(NULL)-nb_start); + WriteOpers("Server %s has completed netburst. (%d secs)",tcp_host,TIME-nb_start); handle_F(token,params,source,reply,tcp_host); nb_start = 0; // tell all the other servers to use this authcookie to connect back again @@ -2562,7 +2692,7 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve // F // end netburst with no mesh creation case 'f': - WriteOpers("Server %s has completed netburst. (%d secs)",tcp_host,time(NULL)-nb_start); + WriteOpers("Server %s has completed netburst. (%d secs)",tcp_host,TIME-nb_start); handle_F(token,params,source,reply,tcp_host); nb_start = 0; // tell everyone else about the new server name so they just add it in the disconnected @@ -2629,6 +2759,10 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) { token = '*'; } + if (!strcmp(command,"PING")) + { + token = '*'; + } if (!strcmp(command,"NOTICE")) { snprintf(udp_msg,MAXBUF,"V %s %s",source,data); @@ -2817,7 +2951,7 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) ConfValue("link","sendpass",i,Link_SendPass,&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 (!strcasecmp(Link_ServerName,servername)) + if ((!strcasecmp(Link_ServerName,servername)) && (!strcmp(Link_Pass,password))) { // we have a matching link line - // send a 'diminutive' server message back... @@ -2930,6 +3064,8 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) char Link_Pass[1024]; char Link_SendPass[1024]; int LinkPort = 0; + + log(DEBUG,"U-token linked server detected."); // search for a corresponding block in the config files for (int i = 0; i < ConfValueEnum("link",&config_f); i++) @@ -2941,7 +3077,7 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) ConfValue("link","sendpass",i,Link_SendPass,&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 (!strcasecmp(Link_ServerName,servername)) + if ((!strcasecmp(Link_ServerName,servername)) && (!strcmp(Link_Pass,password))) { // matching link at this end too, we're all done! // at this point we must begin key exchange and insert this @@ -3020,14 +3156,14 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) } } -long duration(char* str) +long duration(const char* str) { char n_field[MAXBUF]; long total = 0; - char* str_end = str + strlen(str); + const char* str_end = str + strlen(str); n_field[0] = 0; - for (char* i = str; i < str_end; i++) + for (char* i = (char*)str; i < str_end; i++) { // if we have digits, build up a string for the value in n_field, // up to 10 digits in size. @@ -3102,6 +3238,34 @@ void handle_kline(char **parameters, int pcnt, userrec *user) apply_lines(); } +void handle_eline(char **parameters, int pcnt, userrec *user) +{ + if (pcnt >= 3) + { + add_eline(duration(parameters[1]),user->nick,parameters[2],parameters[0]); + if (!duration(parameters[1])) + { + WriteOpers("*** %s added permenant E-line for %s.",user->nick,parameters[0]); + } + else + { + WriteOpers("*** %s added timed E-line for %s, expires in %d seconds.",user->nick,parameters[0],duration(parameters[1])); + } + } + else + { + if (del_eline(parameters[0])) + { + WriteOpers("*** %s Removed E-line on %s.",user->nick,parameters[0]); + } + else + { + WriteServ(user->fd,"NOTICE %s :*** E-Line %s not found in list, try /stats e.",user->nick,parameters[0]); + } + } + // no need to apply the lines for an eline +} + void handle_gline(char **parameters, int pcnt, userrec *user) { char netdata[MAXBUF]; @@ -3109,7 +3273,7 @@ void handle_gline(char **parameters, int pcnt, userrec *user) { add_gline(duration(parameters[1]),user->nick,parameters[2],parameters[0]); // # : - snprintf(netdata,MAXBUF,"# %s %s %ld %ld :%s",parameters[0],user->nick,time(NULL),duration(parameters[1]),parameters[2]); + snprintf(netdata,MAXBUF,"# %s %s %ld %ld :%s",parameters[0],user->nick,TIME,duration(parameters[1]),parameters[2]); NetSendToAll(netdata); if (!duration(parameters[1])) {