X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/f8ae848cdf6397dae42b03b8fe1f393dca0f7a61..84f32842287f0ba338a29dcab3aa406aa6ffc744:/nick/nickhandlers.c diff --git a/nick/nickhandlers.c b/nick/nickhandlers.c index 4b280cc6..6ab0d93d 100644 --- a/nick/nickhandlers.c +++ b/nick/nickhandlers.c @@ -29,7 +29,7 @@ int handlenickmsg(void *source, int cargc, char **cargv) { char *fakehost; char *accountts; char *accountflags; - struct irc_in_addr ipaddress; + struct irc_in_addr ipaddress, ipaddress_canonical; char *accountid; unsigned long userid; @@ -128,10 +128,6 @@ int handlenickmsg(void *source, int cargc, char **cargv) { } base64toip(cargv[cargc-3], &ipaddress); - if (!irc_in_addr_valid(&ipaddress)) { - Error("nick",ERR_ERROR,"Received NICK with invalid ipaddress for %s from %s.",cargv[0],sender); - return CMD_ERROR; - } /* At this stage the nick is cleared to proceed */ np=newnick(); @@ -148,8 +144,10 @@ int handlenickmsg(void *source, int cargc, char **cargv) { np->realname->nicks=np; np->timestamp=timestamp; - base64toip(cargv[cargc-3], &ipaddress); - np->ipnode = refnode(iptree, &ipaddress, PATRICIA_MAXBITS); + memcpy(&(np->ipaddress), &ipaddress, sizeof(ipaddress)); + + ip_canonicalize_tunnel(&ipaddress_canonical, &ipaddress); + np->ipnode = refnode(iptree, &ipaddress_canonical, PATRICIA_MAXBITS); node_increment_usercount(np->ipnode); np->away=NULL; @@ -162,6 +160,9 @@ int handlenickmsg(void *source, int cargc, char **cargv) { np->authname=NULLAUTHNAME; np->auth=NULL; np->accountts=0; + np->cloak_count = 0; + np->cloak_extra = NULL; + np->message = NULL; if(cargc>=9) { int sethostarg = 6, opernamearg = 6, accountarg = 6; @@ -283,6 +284,7 @@ int handleusermodemsg(void *source, int cargc, char **cargv) { nick *np; flag_t oldflags; char *fakehost; + void *args[2]; if (cargc<2) { Error("nick",ERR_WARNING,"Mode message with too few parameters"); @@ -305,6 +307,10 @@ int handleusermodemsg(void *source, int cargc, char **cargv) { oldflags=np->umodes; setflags(&(np->umodes),UMODE_ALL,cargv[1],umodeflags,REJECT_NONE); + args[0] = np; + args[1] = (void *)oldflags; + triggerhook(HOOK_NICK_MODECHANGE, args); + if (strchr(cargv[1],'o')) { /* o always comes on its own when being set */ if(serverlist[myhub].flags & SMODE_OPERNAME) { if((np->umodes & UMODE_OPER)) { @@ -341,60 +347,6 @@ int handleusermodemsg(void *source, int cargc, char **cargv) { return CMD_OK; } -int handlewhoismsg(void *source, int cargc, char **cargv) { - nick *sender,*target; - nick *nicks[2]; - - if (cargc<2) - return CMD_OK; - - if (strncmp(cargv[0],mynumeric->content,2)) { - return CMD_OK; - } - - /* Find the sender... */ - if ((sender=getnickbynumericstr((char *)source))==NULL) { - Error("localuser",ERR_WARNING,"WHOIS message from non existent numeric %s",(char *)source); - return CMD_OK; - } - - /* :hub.splidge.netsplit.net 311 moo splidge splidge ground.stbarnab.as * :splidge - :hub.splidge.netsplit.net 312 moo splidge splidge.netsplit.net :splidge's netsplit leaf - :hub.splidge.netsplit.net 313 moo splidge :is an IRC Operator - :hub.splidge.netsplit.net 318 moo splidge :End of /WHOIS list. - */ - - /* And the target... */ - if ((target=getnickbynick(cargv[1]))==NULL) { - irc_send(":%s 401 %s %s :No such nick",myserver->content,sender->nick,cargv[1]); - } else { - irc_send(":%s 311 %s %s %s %s * :%s",myserver->content,sender->nick,target->nick,target->ident, - target->host->name->content, target->realname->name->content); - nicks[0]=sender; nicks[1]=target; - triggerhook(HOOK_NICK_WHOISCHANNELS,nicks); - if (IsOper(sender) || !HIS_SERVER ) { - irc_send(":%s 312 %s %s %s :%s",myserver->content,sender->nick,target->nick, - serverlist[homeserver(target->numeric)].name->content, - serverlist[homeserver(target->numeric)].description->content); - } else { - irc_send(":%s 312 %s %s " HIS_SERVERNAME " :" HIS_SERVERDESC,myserver->content,sender->nick,target->nick); - } - if (IsOper(target)) { - irc_send(":%s 313 %s %s :is an IRC Operator",myserver->content,sender->nick,target->nick); - } - if (IsAccount(target)) { - irc_send(":%s 330 %s %s %s :is authed as",myserver->content,sender->nick,target->nick,target->authname); - } - if (homeserver(target->numeric)==mylongnum && !IsService(target) && !IsHideIdle(target)) { - irc_send(":%s 317 %s %s %ld %ld :seconds idle, signon time",myserver->content,sender->nick,target->nick, - (getnettime() - target->timestamp) % (((target->numeric + target->timestamp) % 983) + 7),target->timestamp); - } - } - - irc_send(":%s 318 %s %s :End of /WHOIS list.",myserver->content,sender->nick,cargv[1]); - return CMD_OK; -} - int handleaccountmsg(void *source, int cargc, char **cargv) { nick *target; unsigned long userid; @@ -456,63 +408,8 @@ int handleaccountmsg(void *source, int cargc, char **cargv) { return CMD_OK; } -int handlestatsmsg(void *source, int cargc, char **cargv) { - int sourceserver; - char *sender=(char *)source; - char *replytarget; - char *fromstring; - nick *np; - - if (cargc<2) { - Error("nick",ERR_WARNING,"STATS request without enough parameters!"); - return CMD_OK; - } - - if (strlen(sender)==5) { - /* client */ - np=getnickbynumericstr(sender); - if (!np) { - Error("nick",ERR_WARNING,"STATS request from unknown client %s",sender); - return CMD_OK; - } - replytarget=np->nick; - } else { - Error("nick",ERR_WARNING,"STATS request from odd source %s",sender); - return CMD_OK; - } - - /* Reply to stats for ANY server.. including any we are juping */ - sourceserver=numerictolong(cargv[1],2); - if (serverlist[sourceserver].maxusernum==0) { - Error("nick",ERR_WARNING,"Stats request for bad server %s",cargv[1]); - return CMD_OK; - } - fromstring=serverlist[sourceserver].name->content; - - switch(cargv[0][0]) { - case 'u': - irc_send(":%s 242 %s :Server Up %s",fromstring,replytarget, - longtoduration(time(NULL)-starttime, 0)); - irc_send(":%s 250 %s :Highest connection count: 10 (9 clients)",fromstring,replytarget); - break; - - case 'P': - irc_send(":%s 217 %s P none 0 :0x2000",fromstring,replytarget); - break; - - case 'm': - stats_m(fromstring, replytarget); - break; - } - - irc_send(":%s 219 %s %c :End of /STATS report",fromstring,replytarget,cargv[0][0]); - - return CMD_OK; -} - int handleprivmsg(void *source, int cargc, char **cargv) { nick *sender; - char *message; void *args[3]; if (cargc<2) @@ -526,8 +423,6 @@ int handleprivmsg(void *source, int cargc, char **cargv) { if (!match2strings(cargv[0] + 1,myserver->content)) return CMD_OK; - message=cargv[0]; - args[0]=sender; args[1]=cargv[0]; args[2]=cargv[1]; @@ -556,3 +451,37 @@ int handleawaymsg(void *source, int cargc, char **cargv) { return CMD_OK; } + +int handleaddcloak(void *source, int cargc, char **cargv) { + nick *sender, *target; + + /* Check source is a valid user */ + if (!(sender=getnickbynumericstr(source))) { + return CMD_OK; + } + + if (cargc < 1) + return CMD_OK; + + if (!(target=getnickbynumericstr(cargv[0]))) { + return CMD_OK; + } + + addcloaktarget(sender, target); + + return CMD_OK; +} + +int handleclearcloak(void *source, int cargc, char **cargv) { + nick *sender; + + /* Check source is a valid user */ + if (!(sender=getnickbynumericstr(source))) { + return CMD_OK; + } + + clearcloaktargets(sender); + + return CMD_OK; +} +