]> jfr.im git - irc/quakenet/newserv.git/blobdiff - nick/nickhandlers.c
merge
[irc/quakenet/newserv.git] / nick / nickhandlers.c
index bd47ff889f7ee52ff67f9d9464d59e9ba162ed6d..110c80f43dcf32cfd43e064d743b619ba6f86229 100644 (file)
@@ -27,6 +27,7 @@ int handlenickmsg(void *source, int cargc, char **cargv) {
   nick **nh;
   char *fakehost;
   char *accountts;
+  struct irc_in_addr ipaddress;
   
   if (cargc==2) { /* rename */
     /* Nyklon 1017697578 */
@@ -112,7 +113,13 @@ int handlenickmsg(void *source, int cargc, char **cargv) {
       Error("nick",ERR_WARNING,"Received NICK with invalid numeric %s from %s.",cargv[cargc-2],sender);
       return CMD_ERROR;
     }
-          
+
+    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();
     strncpy(np->nick,cargv[0],NICKLEN);
@@ -127,7 +134,11 @@ int handlenickmsg(void *source, int cargc, char **cargv) {
     np->nextbyrealname=np->realname->nicks;
     np->realname->nicks=np;
     np->timestamp=timestamp;
-    np->ipaddress=numerictolong(cargv[cargc-3],6);
+
+    base64toip(cargv[cargc-3], &ipaddress);
+    /* todo: use a single node for /64 prefixes */
+    np->ipnode = refnode(iptree, &ipaddress, irc_in_addr_is_ipv4(&ipaddress) ? PATRICIA_MAXBITS : 64);
+
     np->shident=NULL;
     np->sethost=NULL;
     np->umodes=0;
@@ -312,11 +323,11 @@ int handlewhoismsg(void *source, int cargc, char **cargv) {
       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 logged in as",myserver->content,sender->nick,target->nick,target->authname);
+      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)) {
+    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,
-         0,target->timestamp);
+         (getnettime() - target->timestamp) % (((target->numeric + target->timestamp) % 983) + 7),target->timestamp);
     }
   }
   
@@ -344,7 +355,7 @@ int handleaccountmsg(void *source, int cargc, char **cargv) {
   target->authname[ACCOUNTLEN]='\0';
 
   triggerhook(HOOK_NICK_ACCOUNT, (void *)target);
-  
+
   return CMD_OK;
 }