X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcommands.cpp;h=5011b7d618b784ae043247b18834d94453a3f0f5;hb=55bc98f87d824e2803141aef1632fffc6eef4496;hp=6cda474acce19df2d52c751909016ec9f1d5bf94;hpb=31900d8083615e8d3af2317410360fdaa75eba56;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/commands.cpp b/src/commands.cpp index 6cda474ac..5011b7d61 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -14,15 +14,27 @@ * --------------------------------------------------- */ +using namespace std; + #include "inspircd.h" #include "inspircd_io.h" #include "inspircd_util.h" #include "inspircd_config.h" #include -#include #include #include #include + +#ifdef USE_KQUEUE +#include +#include +#include +#endif + +#ifdef USE_EPOLL +#include +#endif + #include #include #include @@ -34,11 +46,7 @@ #include #include #include -#include #include -#include -#include -#include #include #include #include @@ -59,14 +67,16 @@ #include "xline.h" #include "inspstring.h" #include "dnsqueue.h" +#include "helperfuncs.h" +#include "hashcomp.h" -#ifdef GCC3 -#define nspace __gnu_cxx -#else -#define nspace std +#ifdef USE_KQUEUE +extern int kq; #endif -using namespace std; +#ifdef USE_EPOLL +int ep; +#endif extern int MODCOUNT; extern std::vector modules; @@ -105,7 +115,7 @@ extern std::vector module_names; extern char MyExecutable[1024]; extern int boundPortCount; extern int portCount; -extern int UDPportCount; +extern int SERVERportCount; extern int ports[MAXSOCKS]; extern int defaultRoute; @@ -124,80 +134,16 @@ const long duration_d = duration_h * 24; const long duration_w = duration_d * 7; const long duration_y = duration_w * 52; -namespace nspace -{ -#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 -{ - - bool operator()(const string& s1, const string& s2) const - { - char a[MAXBUF],b[MAXBUF]; - strlcpy(a,s1.c_str(),MAXBUF); - strlcpy(b,s2.c_str(),MAXBUF); - strlower(a); - strlower(b); - return (strcasecmp(a,b) == 0); - } - -}; - -struct InAddr_HashComp -{ - - bool operator()(const in_addr &s1, const in_addr &s2) const - { - size_t q; - size_t p; - - memcpy(&q,&s1,sizeof(size_t)); - memcpy(&p,&s2,sizeof(size_t)); - - return (q == p); - } - -}; - - -typedef nspace::hash_map, StrHashComp> user_hash; -typedef nspace::hash_map, StrHashComp> chan_hash; -typedef nspace::hash_map, InAddr_HashComp> address_cache; +typedef nspace::hash_map, irc::StrHashComp> user_hash; +typedef nspace::hash_map, irc::StrHashComp> chan_hash; +typedef nspace::hash_map, irc::InAddr_HashComp> address_cache; +typedef nspace::hash_map, irc::StrHashComp> whowas_hash; typedef std::deque command_table; extern user_hash clientlist; extern chan_hash chanlist; -extern user_hash whowas; +extern whowas_hash whowas; extern command_table cmdlist; extern file_cache MOTD; extern file_cache RULES; @@ -453,59 +399,75 @@ void handle_pass(char **parameters, int pcnt, userrec *user) void handle_invite(char **parameters, int pcnt, userrec *user) { - userrec* u = Find(parameters[0]); - chanrec* c = FindChan(parameters[1]); - - if ((!c) || (!u)) + if (pcnt == 2) { - if (!c) + userrec* u = Find(parameters[0]); + chanrec* c = FindChan(parameters[1]); + + if ((!c) || (!u)) { - WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[1]); + if (!c) + { + WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[1]); + } + else + { + if (c->binarymodes & CM_INVITEONLY) + { + WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]); + } + } + + return; } - else + + if (c->binarymodes & CM_INVITEONLY) { - if (c->inviteonly) + if (cstatus(user,c) < STATUS_HOP) { - WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]); + WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, c->name); + return; } } + if (has_channel(u,c)) + { + WriteServ(user->fd,"443 %s %s %s :Is already on channel %s",user->nick,u->nick,c->name,c->name); + return; + } + if (!has_channel(user,c)) + { + WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name); + return; + } - return; - } + int MOD_RESULT = 0; + FOREACH_RESULT(OnUserPreInvite(user,u,c)); + if (MOD_RESULT == 1) { + return; + } - if (c->inviteonly) + u->InviteTo(c->name); + WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name); + WriteServ(user->fd,"341 %s %s %s",user->nick,u->nick,c->name); + + // i token must go to ALL servers!!! + char buffer[MAXBUF]; + snprintf(buffer,MAXBUF,"i %s %s %s",u->nick,user->nick,c->name); + NetSendToAll(buffer); + } + else { - if (cstatus(user,c) < STATUS_HOP) + // pinched from ircu - invite with not enough parameters shows channels + // youve been invited to but haven't joined yet. + InvitedList* il = user->GetInviteList(); + for (InvitedList::iterator i = il->begin(); i != il->end(); i++) { - WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, c->name); - return; + if (i->channel) { + WriteServ(user->fd,"346 %s :%s",user->nick,i->channel); + } } + WriteServ(user->fd,"347 %s :End of INVITE list",user->nick); } - if (has_channel(u,c)) - { - WriteServ(user->fd,"443 %s %s %s :Is already on channel %s",user->nick,u->nick,c->name,c->name); - return; - } - if (!has_channel(user,c)) - { - WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name); - return; - } - - int MOD_RESULT = 0; - FOREACH_RESULT(OnUserPreInvite(user,u,c)); - if (MOD_RESULT == 1) { - return; - } - - u->InviteTo(c->name); - WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name); - WriteServ(user->fd,"341 %s %s %s",user->nick,u->nick,c->name); - - // i token must go to ALL servers!!! - char buffer[MAXBUF]; - snprintf(buffer,MAXBUF,"i %s %s %s",u->nick,user->nick,c->name); - NetSendToAll(buffer); } void handle_topic(char **parameters, int pcnt, userrec *user) @@ -519,7 +481,7 @@ void handle_topic(char **parameters, int pcnt, userrec *user) Ptr = FindChan(parameters[0]); if (Ptr) { - if (((Ptr) && (!has_channel(user,Ptr))) && (Ptr->secret)) + if (((Ptr) && (!has_channel(user,Ptr))) && (Ptr->binarymodes & CM_SECRET)) { WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name); return; @@ -553,7 +515,7 @@ void handle_topic(char **parameters, int pcnt, userrec *user) WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name); return; } - if ((Ptr->topiclock) && (cstatus(user,Ptr)binarymodes & CM_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); return; @@ -607,7 +569,7 @@ void handle_names(char **parameters, int pcnt, userrec *user) c = FindChan(parameters[0]); if (c) { - if (((c) && (!has_channel(user,c))) && (c->secret)) + if (((c) && (!has_channel(user,c))) && (c->binarymodes & CM_SECRET)) { WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name); return; @@ -635,12 +597,12 @@ void handle_privmsg(char **parameters, int pcnt, userrec *user) chan = FindChan(parameters[0]); if (chan) { - if ((chan->noexternal) && (!has_channel(user,chan))) + if ((chan->binarymodes & CM_NOEXTERNAL) && (!has_channel(user,chan))) { WriteServ(user->fd,"404 %s %s :Cannot send to channel (no external messages)", user->nick, chan->name); return; } - if ((chan->moderated) && (cstatus(user,chan)binarymodes & CM_MODERATED) && (cstatus(user,chan)fd,"404 %s %s :Cannot send to channel (+m)", user->nick, chan->name); return; @@ -654,6 +616,12 @@ void handle_privmsg(char **parameters, int pcnt, userrec *user) return; } parameters[1] = (char*)temp.c_str(); + + if (temp == "") + { + WriteServ(user->fd,"412 %s No text to send", user->nick); + return; + } ChanExceptSender(chan, user, "PRIVMSG %s :%s", chan->name, parameters[1]); @@ -723,12 +691,12 @@ void handle_notice(char **parameters, int pcnt, userrec *user) chan = FindChan(parameters[0]); if (chan) { - if ((chan->noexternal) && (!has_channel(user,chan))) + if ((chan->binarymodes & CM_NOEXTERNAL) && (!has_channel(user,chan))) { WriteServ(user->fd,"404 %s %s :Cannot send to channel (no external messages)", user->nick, chan->name); return; } - if ((chan->moderated) && (cstatus(user,chan)binarymodes & CM_MODERATED) && (cstatus(user,chan)fd,"404 %s %s :Cannot send to channel (+m)", user->nick, chan->name); return; @@ -743,6 +711,12 @@ void handle_notice(char **parameters, int pcnt, userrec *user) } parameters[1] = (char*)temp.c_str(); + if (temp == "") + { + WriteServ(user->fd,"412 %s No text to send", user->nick); + return; + } + ChanExceptSender(chan, user, "NOTICE %s :%s", chan->name, parameters[1]); // if any users of this channel are on remote servers, broadcast the packet @@ -860,11 +834,12 @@ void handle_whois(char **parameters, int pcnt, userrec *user) WriteServ(user->fd,"311 %s %s %s %s * :%s",user->nick, dest->nick, dest->ident, dest->dhost, dest->fullname); if ((user == dest) || (strchr(user->modes,'o'))) { - WriteServ(user->fd,"378 %s %s :is connecting from *@%s",user->nick, dest->nick, dest->host); + WriteServ(user->fd,"378 %s %s :is connecting from *@%s %s",user->nick, dest->nick, dest->host, dest->ip); } - if (strcmp(chlist(dest),"")) + char* cl = chlist(dest,user); + if (strcmp(cl,"")) { - WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, chlist(dest)); + WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, cl); } WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, dest->server, GetServerDescription(dest->server).c_str()); if (strcmp(dest->awaymsg,"")) @@ -888,12 +863,14 @@ void handle_whois(char **parameters, int pcnt, userrec *user) else { WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]); + WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]); } } else { /* no such nick/channel */ WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]); + WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]); } } @@ -945,8 +922,27 @@ void handle_quit(char **parameters, int pcnt, userrec *user) /* push the socket on a stack of sockets due to be closed at the next opportunity */ if (user->fd > -1) { - shutdown(user->fd,2); - close(user->fd); +#ifdef USE_KQUEUE + struct kevent ke; + EV_SET(&ke, user->fd, EVFILT_READ, EV_DELETE, 0, 0, NULL); + int i = kevent(kq, &ke, 1, 0, 0, NULL); + if (i == -1) + { + log(DEBUG,"kqueue: Failed to remove user from queue!"); + } +#endif +#ifdef USE_EPOLL + struct epoll_event ev; + ev.events = EPOLLIN | EPOLLET; + ev.data.fd = user->fd; + int i = epoll_ctl(ep, EPOLL_CTL_DEL, user->fd, &ev); + if (i < 0) + { + log(DEBUG,"epoll: List deletion failure!"); + } +#endif + shutdown(user->fd,2); + close(user->fd); } if (iter != clientlist.end()) @@ -1087,7 +1083,8 @@ void handle_list(char **parameters, int pcnt, userrec *user) WriteServ(user->fd,"321 %s Channel :Users Name",user->nick); for (chan_hash::const_iterator i = chanlist.begin(); i != chanlist.end(); i++) { - if ((!i->second->c_private) && (!i->second->secret)) + // if the channel is not private/secret, OR the user is on the channel anyway + if (((!(i->second->binarymodes & CM_PRIVATE)) && (!(i->second->binarymodes & CM_SECRET))) || (has_channel(user,i->second))) { WriteServ(user->fd,"322 %s %s %d :[+%s] %s",user->nick,i->second->name,usercount_i(i->second),chanmodes(i->second),i->second->topic); } @@ -1230,7 +1227,7 @@ void handle_away(char **parameters, int pcnt, userrec *user) void handle_whowas(char **parameters, int pcnt, userrec* user) { - user_hash::iterator i = whowas.find(parameters[0]); + whowas_hash::iterator i = whowas.find(parameters[0]); if (i == whowas.end()) { @@ -1665,6 +1662,10 @@ void handle_map(char **parameters, int pcnt, userrec *user) bool is_uline(const char* server) { + if (!server) + return false; + if (!(*server)) + return true; char ServName[MAXBUF]; for (int i = 0; i < ConfValueEnum("uline",&config_f); i++) { @@ -1879,7 +1880,7 @@ void handle_nick(char **parameters, int pcnt, userrec *user) } -void handle_v(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_v(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* servername = strtok(params," "); char* versionstr = strtok(NULL,"\r\n"); @@ -1903,7 +1904,7 @@ void handle_v(char token,char* params,serverrec* source,serverrec* reply, char* } } -void handle_V(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_V(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* src = strtok(params," "); char* dest = strtok(NULL," :"); @@ -1947,7 +1948,7 @@ void handle_V(char token,char* params,serverrec* source,serverrec* reply, char* } -void handle_P(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_P(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* src = strtok(params," "); char* dest = strtok(NULL," :"); @@ -1979,7 +1980,7 @@ void handle_P(char token,char* params,serverrec* source,serverrec* reply, char* } -void handle_i(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_i(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* nick = strtok(params," "); char* from = strtok(NULL," "); @@ -1998,7 +1999,7 @@ void handle_i(char token,char* params,serverrec* source,serverrec* reply, char* } } -void handle_t(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_t(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* setby = strtok(params," "); char* channel = strtok(NULL," :"); @@ -2020,7 +2021,7 @@ void handle_t(char token,char* params,serverrec* source,serverrec* reply, char* } -void handle_T(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_T(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* tm = strtok(params," "); char* setby = strtok(NULL," "); @@ -2045,7 +2046,7 @@ void handle_T(char token,char* params,serverrec* source,serverrec* reply, char* } } -void handle_M(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_M(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* pars[128]; char original[MAXBUF],target[MAXBUF]; @@ -2080,7 +2081,7 @@ void handle_M(char token,char* params,serverrec* source,serverrec* reply, char* // m is modes set by users only (not servers) valid targets are channels or users. -void handle_m(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_m(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { // m blah #chatspike +b *!test@*4 char* pars[128]; @@ -2123,7 +2124,7 @@ void handle_m(char token,char* params,serverrec* source,serverrec* reply, char* } -void handle_L(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_L(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* nick = NULL; char* channel = NULL; @@ -2161,7 +2162,7 @@ void handle_L(char token,char* params,serverrec* source,serverrec* reply, char* } } -void handle_K(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_K(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* src = strtok(params," "); char* nick = strtok(NULL," :"); @@ -2176,14 +2177,14 @@ void handle_K(char token,char* params,serverrec* source,serverrec* reply, char* 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(kreason,MAXBUF,"[%s] Killed (From: '%s' (%s))",source->name,user->nick,reason); + WriteTo(user, u, "KILL %s :%s!%s!%s!%s (%s)", u->nick, tcp_host, ServerName, user->dhost,user->nick,reason); + WriteOpers("*** Remote kill from %s by %s: %s!%s@%s (%s)",tcp_host,user->nick,u->nick,u->ident,u->host,reason); + snprintf(kreason,MAXBUF,"[%s] Killed (From: '%s' (%s))",tcp_host,user->nick,reason); kill_link(u,kreason); } } -void handle_Q(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_Q(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* nick = strtok(params," :"); char* reason = strtok(NULL,"\r\n"); @@ -2220,7 +2221,7 @@ void handle_Q(char token,char* params,serverrec* source,serverrec* reply, char* } } -void handle_n(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_n(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* oldnick = strtok(params," "); char* newnick = strtok(NULL," "); @@ -2252,7 +2253,7 @@ void handle_n(char token,char* params,serverrec* source,serverrec* reply, char* // broadcast this because its a services thingy char buffer[MAXBUF]; snprintf(buffer,MAXBUF,"n %s %s",user->nick,newnick); - NetSendToAllExcept(tcp_host,buffer); + NetSendToAllExcept_WithSum(tcp_host,buffer,tcp_sum); } WriteCommon(user,"NICK %s",newnick); user = ReHashNick(user->nick, newnick); @@ -2264,7 +2265,7 @@ void handle_n(char token,char* params,serverrec* source,serverrec* reply, char* } // k : -void handle_k(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_k(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* src = strtok(params," "); char* dest = strtok(NULL," "); @@ -2292,7 +2293,7 @@ void handle_k(char token,char* params,serverrec* source,serverrec* reply, char* } } -void handle_AT(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_AT(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* who = strtok(params," :"); char* text = strtok(NULL,"\r\n"); @@ -2308,7 +2309,7 @@ void handle_AT(char token,char* params,serverrec* source,serverrec* reply, char* } } -void handle_H(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_H(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { log(DEBUG,"Adding ULined server %s to my map",params); ircd_connector s; @@ -2339,7 +2340,7 @@ void handle_H(char token,char* params,serverrec* source,serverrec* reply, char* WriteOpers("Non-Mesh server %s has joined the network",params); } -void handle_N(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_N(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* tm = strtok(params," "); char* nick = strtok(NULL," "); @@ -2383,7 +2384,7 @@ void handle_N(char token,char* params,serverrec* source,serverrec* reply, char* strlcpy(clientlist[nick]->server, server,256); strlcpy(clientlist[nick]->ident, ident,10); // +1 char to compensate for tilde strlcpy(clientlist[nick]->fullname, gecos,128); - strlcpy(clientlist[nick]->ip,ipaddr,32); + strlcpy(clientlist[nick]->ip,ipaddr,16); clientlist[nick]->signon = TS; clientlist[nick]->nping = 0; // this is ignored for a remote user anyway. clientlist[nick]->lastping = 1; @@ -2402,7 +2403,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) +void handle_F(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { if (!params) return; @@ -2411,7 +2412,7 @@ void handle_F(char token,char* params,serverrec* source,serverrec* reply, char* WriteOpers("TS split for %s -> %s: %d",source->name,reply->name,tdiff); } -void handle_a(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_a(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* nick = strtok(params," :"); char* gecos = strtok(NULL,"\r\n"); @@ -2425,7 +2426,7 @@ void handle_a(char token,char* params,serverrec* source,serverrec* reply, char* strlcpy(user->fullname,gecos,MAXBUF); } -void handle_b(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_b(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* nick = strtok(params," "); char* host = strtok(NULL," "); @@ -2439,7 +2440,7 @@ void handle_b(char token,char* params,serverrec* source,serverrec* reply, char* strlcpy(user->dhost,host,160); } -void handle_plus(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_plus(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { // %s %s %d %d // + test3.chatspike.net 7010 -2016508415 @@ -2476,7 +2477,7 @@ void handle_plus(char token,char* params,serverrec* source,serverrec* reply, cha me[defaultRoute]->MeshCookie(ipaddr,atoi(ipport),atoi(cookie),servername); } -void handle_R(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_R(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* server = strtok(params," "); char* data = strtok(NULL,"\r\n"); @@ -2491,11 +2492,8 @@ void handle_R(char token,char* params,serverrec* source,serverrec* reply, char* NetSendToOne(server,data); } -void handle_J(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_J(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { - // IMPORTANT NOTE - // The J token currently has no timestamp - this needs looking at - // because it will allow splitriding. char* nick = strtok(params," "); char* channel = strtok(NULL," "); @@ -2548,7 +2546,7 @@ void handle_J(char token,char* params,serverrec* source,serverrec* reply, char* } } -void handle_dollar(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_dollar(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { log(DEBUG,"Storing routing table..."); char* sourceserver = strtok(params," "); @@ -2582,7 +2580,7 @@ void handle_dollar(char token,char* params,serverrec* source,serverrec* reply, c log(DEBUG,"Warning! routing table received from nonexistent server!"); } -void handle_amp(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_amp(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { if (!params) return; @@ -2635,7 +2633,7 @@ void handle_amp(char token,char* params,serverrec* source,serverrec* reply, char unsigned long authcookie; -void handle_hash(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_hash(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { // # : log(DEBUG,"Adding G-line"); @@ -2664,7 +2662,7 @@ void handle_hash(char token,char* params,serverrec* source,serverrec* reply, cha apply_lines(); } -void handle_dot(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_dot(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { log(DEBUG,"Removing G-line"); char* mask = strtok(params," "); @@ -2685,7 +2683,7 @@ void handle_dot(char token,char* params,serverrec* source,serverrec* reply, char } } -void handle_add_sqline(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_add_sqline(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { // { : log(DEBUG,"Adding Q-line"); @@ -2715,7 +2713,7 @@ void handle_add_sqline(char token,char* params,serverrec* source,serverrec* repl apply_lines(); } -void handle_del_sqline(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_del_sqline(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { log(DEBUG,"Removing Q-line"); char* mask = strtok(params," "); @@ -2736,7 +2734,7 @@ void handle_del_sqline(char token,char* params,serverrec* source,serverrec* repl } } -void handle_add_szline(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_add_szline(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { // } : log(DEBUG,"Adding Z-line"); @@ -2766,7 +2764,7 @@ void handle_add_szline(char token,char* params,serverrec* source,serverrec* repl apply_lines(); } -void handle_del_szline(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_del_szline(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { log(DEBUG,"Removing Z-line"); char* mask = strtok(params," "); @@ -2787,7 +2785,7 @@ void handle_del_szline(char token,char* params,serverrec* source,serverrec* repl } } -void handle_pipe(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host) +void handle_pipe(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host, char* tcp_sum) { char* nick = strtok(params," "); char* type = strtok(params," "); @@ -2803,7 +2801,7 @@ void handle_pipe(char token,char* params,serverrec* source,serverrec* reply, cha } -void process_restricted_commands(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host,char* ipaddr,int port) +void process_restricted_commands(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host,char* ipaddr,int port,char* tcp_sum) { char buffer[MAXBUF]; int MOD_RESULT = 0; @@ -2819,7 +2817,7 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve // except the newcomer. They'll all attempt to connect back to it. authcookie = rand()*rand(); snprintf(buffer,MAXBUF,"~ %lu",(unsigned long)authcookie); - NetSendToAll(buffer); + NetSendToAll_WithSum(buffer,tcp_sum); break; // ~ // Store authcookie @@ -2831,22 +2829,22 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve break; // connect back to a server using an authcookie case '+': - handle_plus(token,params,source,reply,tcp_host); + handle_plus(token,params,source,reply,tcp_host,tcp_sum); break; // routing table case '$': - handle_dollar(token,params,source,reply,tcp_host); + handle_dollar(token,params,source,reply,tcp_host,tcp_sum); break; // node unreachable - we cant route to a server, sooooo we slit it off. // servers can generate these for themselves for an squit. case '&': - handle_amp(token,params,source,reply,tcp_host); + handle_amp(token,params,source,reply,tcp_host,tcp_sum); break; // R // redirect token, send all of along to the given // server as this server has been found to still have a route to it case 'R': - handle_R(token,params,source,reply,tcp_host); + handle_R(token,params,source,reply,tcp_host,tcp_sum); break; // ? // ping @@ -2867,144 +2865,144 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve // N : // introduce remote client case 'N': - handle_N(token,params,source,reply,tcp_host); + handle_N(token,params,source,reply,tcp_host,tcp_sum); break; // a : // change GECOS (SETNAME) case 'a': - handle_a(token,params,source,reply,tcp_host); + handle_a(token,params,source,reply,tcp_host,tcp_sum); break; // b : // change displayed host (SETHOST) case 'b': - handle_b(token,params,source,reply,tcp_host); + handle_b(token,params,source,reply,tcp_host,tcp_sum); break; // t : // change a channel topic case 't': - handle_t(token,params,source,reply,tcp_host); + handle_t(token,params,source,reply,tcp_host,tcp_sum); break; // i // invite a user to a channel case 'i': - handle_i(token,params,source,reply,tcp_host); + handle_i(token,params,source,reply,tcp_host,tcp_sum); break; // k : // kick a user from a channel case 'k': - handle_k(token,params,source,reply,tcp_host); + handle_k(token,params,source,reply,tcp_host,tcp_sum); break; // n // change nickname of client -- a server should only be able to // change the nicknames of clients that reside on it unless // they are ulined. case 'n': - handle_n(token,params,source,reply,tcp_host); + handle_n(token,params,source,reply,tcp_host,tcp_sum); break; // J // Join user to channel list, merge channel permissions case 'J': - handle_J(token,params,source,reply,tcp_host); + handle_J(token,params,source,reply,tcp_host,tcp_sum); break; // T : // change channel topic (netburst only) case 'T': - handle_T(token,params,source,reply,tcp_host); + handle_T(token,params,source,reply,tcp_host,tcp_sum); break; // M [MODE-PARAMETERS] // Server setting modes on an object case 'M': - handle_M(token,params,source,reply,tcp_host); + handle_M(token,params,source,reply,tcp_host,tcp_sum); break; // m [MODE-PARAMETERS] // User setting modes on an object case 'm': - handle_m(token,params,source,reply,tcp_host); + handle_m(token,params,source,reply,tcp_host,tcp_sum); break; // P : // Send a private/channel message case 'P': - handle_P(token,params,source,reply,tcp_host); + handle_P(token,params,source,reply,tcp_host,tcp_sum); break; // V : // Send a private/channel notice case 'V': - handle_V(token,params,source,reply,tcp_host); + handle_V(token,params,source,reply,tcp_host,tcp_sum); break; // v case 'v': - handle_v(token,params,source,reply,tcp_host); + handle_v(token,params,source,reply,tcp_host,tcp_sum); break; // L : // User parting a channel case 'L': - handle_L(token,params,source,reply,tcp_host); + handle_L(token,params,source,reply,tcp_host,tcp_sum); break; // Q : // user quitting case 'Q': - handle_Q(token,params,source,reply,tcp_host); + handle_Q(token,params,source,reply,tcp_host,tcp_sum); break; // H // introduce non-meshable server (such as a services server) case 'H': - handle_H(token,params,source,reply,tcp_host); + handle_H(token,params,source,reply,tcp_host,tcp_sum); break; // K : // remote kill case 'K': - handle_K(token,params,source,reply,tcp_host); + handle_K(token,params,source,reply,tcp_host,tcp_sum); break; // @ : // wallops case '@': - handle_AT(token,params,source,reply,tcp_host); + handle_AT(token,params,source,reply,tcp_host,tcp_sum); break; // # : // add gline case '#': - handle_hash(token,params,source,reply,tcp_host); + handle_hash(token,params,source,reply,tcp_host,tcp_sum); break; // . // remove gline case '.': - handle_dot(token,params,source,reply,tcp_host); + handle_dot(token,params,source,reply,tcp_host,tcp_sum); break; // # : // add gline case '{': - handle_add_sqline(token,params,source,reply,tcp_host); + handle_add_sqline(token,params,source,reply,tcp_host,tcp_sum); break; // . // remove gline case '[': - handle_del_sqline(token,params,source,reply,tcp_host); + handle_del_sqline(token,params,source,reply,tcp_host,tcp_sum); break; // # : // add gline case '}': - handle_add_szline(token,params,source,reply,tcp_host); + handle_add_szline(token,params,source,reply,tcp_host,tcp_sum); break; // . // remove gline case ']': - handle_del_szline(token,params,source,reply,tcp_host); + handle_del_szline(token,params,source,reply,tcp_host,tcp_sum); break; // | // set opertype case '|': - handle_pipe(token,params,source,reply,tcp_host); + handle_pipe(token,params,source,reply,tcp_host,tcp_sum); break; // F // end netburst case 'F': WriteOpers("Server %s has completed netburst. (%d secs)",tcp_host,TIME-nb_start); - handle_F(token,params,source,reply,tcp_host); + handle_F(token,params,source,reply,tcp_host,tcp_sum); nb_start = 0; // tell all the other servers to use this authcookie to connect back again // got '+ test3.chatspike.net 7010 -2016508415' from test.chatspike.net snprintf(buffer,MAXBUF,"+ %s %s %d %lu",tcp_host,ipaddr,port,(unsigned long)authcookie); - NetSendToAllExcept(tcp_host,buffer); + NetSendToAllExcept_WithSum(tcp_host,buffer,tcp_sum); break; case '/': WriteOpers("Server %s is IRCServices-based server (assumes-SVSMODE) - Nickname Services: %s",tcp_host,params); @@ -3014,12 +3012,12 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve // end netburst with no mesh creation case 'f': WriteOpers("Server %s has completed netburst. (%d secs)",tcp_host,TIME-nb_start); - handle_F(token,params,source,reply,tcp_host); + handle_F(token,params,source,reply,tcp_host,tcp_sum); nb_start = 0; // tell everyone else about the new server name so they just add it in the disconnected // state snprintf(buffer,MAXBUF,"u %s :%s",tcp_host,GetServerDescription(tcp_host).c_str()); - NetSendToAllExcept(tcp_host,buffer); + NetSendToAllExcept_WithSum(tcp_host,buffer,tcp_sum); break; // X // Send netburst now @@ -3063,9 +3061,9 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve } -void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) +void handle_link_packet(char* tcp_msg, char* tcp_host, serverrec *serv,char* tcp_sum) { - if ((!strncmp(udp_msg,"USER ",5)) || (!strncmp(udp_msg,"NICK ",5)) || (!strncmp(udp_msg,"PASS ",5)) || (!strncmp(udp_msg,"SERVER ",7))) + if ((!strncmp(tcp_msg,"USER ",5)) || (!strncmp(tcp_msg,"NICK ",5)) || (!strncmp(tcp_msg,"PASS ",5)) || (!strncmp(tcp_msg,"SERVER ",7))) { // a user on a server port, just close their connection. RemoveServer(tcp_host); @@ -3073,33 +3071,39 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) } char response[10240]; - char token = udp_msg[0]; - char* old = udp_msg; + char token = tcp_msg[0]; + char* old = tcp_msg; + + if (!strncmp(tcp_msg,"PING",4)) + { + // some muppet of a server is sending PING. We don't know what PING is. drop it silently. + return; + } - if ((token != ':') && (strlen(udp_msg)>1) && (udp_msg[1] != ' ')) + if ((token != ':') && (strlen(tcp_msg)>1) && (tcp_msg[1] != ' ')) { - WriteOpers("*** Discarded %d chars illegal data from %s",strlen(udp_msg),tcp_host); + WriteOpers("*** Discarded %d chars illegal data from %s",strlen(tcp_msg),tcp_host); } if (token == ':') // leading :servername or details - strip them off (services does this, sucky) { - char* src = udp_msg+1; - while (udp_msg[0] != ' ') - udp_msg++; - udp_msg[0] = 0; - udp_msg++; - char* comd = udp_msg; - while (udp_msg[0] != ' ') - udp_msg++; - udp_msg[0] = 0; - udp_msg++; + char* src = tcp_msg+1; + while (tcp_msg[0] != ' ') + tcp_msg++; + tcp_msg[0] = 0; + tcp_msg++; + char* comd = tcp_msg; + while (tcp_msg[0] != ' ') + tcp_msg++; + tcp_msg[0] = 0; + tcp_msg++; char data[MAXBUF]; char source[MAXBUF]; char command[MAXBUF]; - strlcpy(data,udp_msg,512); + strlcpy(data,tcp_msg,512); strlcpy(source,src,MAXBUF); strlcpy(command,comd,MAXBUF); - udp_msg = old; + tcp_msg = old; // unused numeric: // :services-dev.chatspike.net 433 Craig Craig :Nickname is registered to someone else @@ -3117,13 +3121,13 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) } if (!strcmp(command,"NOTICE")) { - snprintf(udp_msg,MAXBUF,"V %s %s",source,data); - log(DEBUG,"Rewrote NOTICE from services to: '%s'",udp_msg); - token = udp_msg[0]; + snprintf(tcp_msg,MAXBUF,"V %s %s",source,data); + log(DEBUG,"Rewrote NOTICE from services to: '%s'",tcp_msg); + token = tcp_msg[0]; } if (!strcmp(command,"QUIT")) { - if ((!udp_msg) || (!strcmp(data,"")) || (strcmp(data,":"))) + if ((!tcp_msg) || (!strcmp(data,"")) || (strcmp(data,":"))) { strcpy(data,":No reason"); } @@ -3131,70 +3135,70 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) { strcpy(data,":No reason"); } - snprintf(udp_msg,MAXBUF,"Q %s %s",source,data); - log(DEBUG,"Rewrote QUIT from services to: '%s'",udp_msg); - token = udp_msg[0]; + snprintf(tcp_msg,MAXBUF,"Q %s %s",source,data); + log(DEBUG,"Rewrote QUIT from services to: '%s'",tcp_msg); + token = tcp_msg[0]; } if (!strcmp(command,"SQUIT")) { - snprintf(udp_msg,MAXBUF,"& %s",source); - log(DEBUG,"Rewrote SQUIT from services to: '%s'",udp_msg); - token = udp_msg[0]; + snprintf(tcp_msg,MAXBUF,"& %s",source); + log(DEBUG,"Rewrote SQUIT from services to: '%s'",tcp_msg); + token = tcp_msg[0]; } if (!strcmp(command,"SVSMODE")) { - snprintf(udp_msg,MAXBUF,"m %s %s",source,data); - log(DEBUG,"Rewrote SVSMODE from services to: '%s'",udp_msg); - token = udp_msg[0]; + snprintf(tcp_msg,MAXBUF,"m %s %s",source,data); + log(DEBUG,"Rewrote SVSMODE from services to: '%s'",tcp_msg); + token = tcp_msg[0]; } if (!strcmp(command,"SVS2MODE")) { - snprintf(udp_msg,MAXBUF,"m %s %s",source,data); - log(DEBUG,"Rewrote SVS2MODE from services to: '%s'",udp_msg); - token = udp_msg[0]; + snprintf(tcp_msg,MAXBUF,"m %s %s",source,data); + log(DEBUG,"Rewrote SVS2MODE from services to: '%s'",tcp_msg); + token = tcp_msg[0]; } // todo: this wont work without u:lines // in give_ops etc allow nick on a u:lined serv to do just about anything if (!strcmp(command,"MODE")) { - snprintf(udp_msg,MAXBUF,"m %s %s",source,data); - log(DEBUG,"Rewrote MODE from services to: '%s'",udp_msg); - token = udp_msg[0]; + snprintf(tcp_msg,MAXBUF,"m %s %s",source,data); + log(DEBUG,"Rewrote MODE from services to: '%s'",tcp_msg); + token = tcp_msg[0]; } if (!strcmp(command,"KICK")) { - snprintf(udp_msg,MAXBUF,"k %s %s",source,data); - log(DEBUG,"Rewrote KICK from services to: '%s'",udp_msg); - token = udp_msg[0]; + snprintf(tcp_msg,MAXBUF,"k %s %s",source,data); + log(DEBUG,"Rewrote KICK from services to: '%s'",tcp_msg); + token = tcp_msg[0]; } if (!strcmp(command,"KILL")) { - snprintf(udp_msg,MAXBUF,"K %s %s",source,data); - log(DEBUG,"Rewrote KILL from services to: '%s'",udp_msg); - token = udp_msg[0]; + snprintf(tcp_msg,MAXBUF,"K %s %s",source,data); + log(DEBUG,"Rewrote KILL from services to: '%s'",tcp_msg); + token = tcp_msg[0]; } if (!strcmp(command,"SVSJOIN")) { - snprintf(udp_msg,MAXBUF,"J %s",data); - NetSendToOne(tcp_host,udp_msg); + snprintf(tcp_msg,MAXBUF,"J %s",data); + NetSendToOne(tcp_host,tcp_msg); char* nick = strtok(data," "); char* chan = strtok(NULL," "); - log(DEBUG,"Rewrote SVSJOIN from services to: '%s'",udp_msg); + log(DEBUG,"Rewrote SVSJOIN from services to: '%s'",tcp_msg); userrec* u = Find(nick); if (u) { add_channel(u,chan,"",true); } - token = udp_msg[0]; + token = tcp_msg[0]; } } - char* params = udp_msg + 2; + char* params = tcp_msg + 2; char finalparam[1024]; strcpy(finalparam," :xxxx"); - if (strstr(udp_msg," :")) { - strlcpy(finalparam,strstr(udp_msg," :"),1024); + if (strstr(tcp_msg," :")) { + strlcpy(finalparam,strstr(tcp_msg," :"),1024); } @@ -3313,7 +3317,7 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) { // we have a matching link line - // send a 'diminutive' server message back... - snprintf(response,10240,"s %s %s :%s",ServerName,Link_SendPass,ServerDesc); + snprintf(response,10240,"%s s %s %s :%s",CreateSum().c_str(),ServerName,Link_SendPass,ServerDesc); serv->SendPacket(response,servername); for (int t = 0; t < serv->connectors.size(); t++) @@ -3386,7 +3390,7 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) char buffer[MAXBUF]; me[j]->connectors[k].SetDescription(serverdesc); me[j]->connectors[k].SetState(STATE_CONNECTED); - snprintf(buffer,MAXBUF,"X 0"); + snprintf(buffer,MAXBUF,"%s X 0",CreateSum().c_str()); serv->SendPacket(buffer,tcp_host); DoSync(me[j],tcp_host); NetSendMyRoutingTable(); @@ -3477,9 +3481,9 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) me[j]->connectors[k].SetDescription(serverdesc); me[j]->connectors[k].SetServerName(servername); me[j]->connectors[k].SetState(STATE_SERVICES); - snprintf(buffer,MAXBUF,"X 0"); + snprintf(buffer,MAXBUF,"%s X 0",CreateSum().c_str()); serv->SendPacket(buffer,servername); - snprintf(buffer,MAXBUF,"s %s %s %lu :%s",ServerName,Link_SendPass,LinkPort,ServerDesc); + snprintf(buffer,MAXBUF,"%s s %s %s %lu :%s",CreateSum().c_str(),ServerName,Link_SendPass,LinkPort,ServerDesc); serv->SendPacket(buffer,servername); DoSync(me[j],servername); snprintf(buffer,MAXBUF,"H %s",servername); @@ -3530,7 +3534,7 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv) { // found a valid ircd_connector. if ((params) && (*params)) - process_restricted_commands(token,params,me[j],serv,tcp_host,me[j]->connectors[x].GetServerIP(),me[j]->connectors[x].GetServerPort()); + process_restricted_commands(token,params,me[j],serv,tcp_host,me[j]->connectors[x].GetServerIP(),me[j]->connectors[x].GetServerPort(),tcp_sum); return; } }