]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/usercmds/whois.c
Merge pull request #1 from meeb/meeb
[irc/quakenet/newserv.git] / chanserv / usercmds / whois.c
index 1aae1594d3fe71439a3640e5ca3843474408d450..ffc81d66ccf17b628aa559289609f1408ae88440 100644 (file)
@@ -7,23 +7,31 @@
  * CMDDESC: Displays information about a user.
  * CMDFUNC: csu_dowhois
  * CMDPROTO: int csu_dowhois(void *source, int cargc, char **cargv);
+ * CMDHELP: Usage: WHOIS <user>
+ * CMDHELP: Displays information about a user, where:
+ * CMDHELP: user  - user to request information for, either the nickname of an active user on
+ * CMDHELP:         the network or #accountname.
  */
 
 #include "../chanserv.h"
 #include "../../lib/irc_string.h"
+#include "../../lib/strlfunc.h"
+#include "../../lib/ccassert.h"
 #include <stdio.h>
 #include <string.h>
 
 int csu_dowhois(void *source, int cargc, char **cargv) {
   nick *sender=source;
-  reguser *rup=getreguserfromnick(sender), *target;
+  reguser *rup, *target;
   char buf[200];
   char nbpos=0;
-  nicklist *nlp;
-  struct tm *tmp;
   regchanuser *rcup, *rcup2;
   flag_t flagmask, flags;
   int doneheader=0;
+  authname *anp;
+  nick *tnp;
+
+  CCASSERT(sizeof(buf) > TIMELEN);
 
   if (!(rup=getreguserfromnick(sender)))
     return CMD_ERROR;
@@ -34,10 +42,10 @@ int csu_dowhois(void *source, int cargc, char **cargv) {
   }
   
   if (!(target=findreguser(sender, cargv[0]))) {
-    nicknp;
+    nick *np;
     
     if (cs_privcheck(QPRIV_VIEWFULLWHOIS, sender) && (np=getnickbynick(cargv[0]))) {
-      activeuseraup=getactiveuserfromnick(np);
+      activeuser *aup=getactiveuserfromnick(np);
       chanservsendmessage(sender, "%s has attempted to auth %d time%s.", np->nick, aup->authattempts, 
         aup->authattempts==1?"":"s");
     }
@@ -55,14 +63,69 @@ int csu_dowhois(void *source, int cargc, char **cargv) {
   }
 
   if (cs_privcheck(QPRIV_VIEWUSERFLAGS, sender)) {
-    flagmask=QUFLAG_ALL;
+    flagmask=QUFLAG_ALL & ~(QUFLAG_SUSPENDED | QUFLAG_GLINE | QUFLAG_DELAYEDGLINE);
+    if (UIsDev(rup))
+      flagmask=QUFLAG_ALL;
+
+    if (UHasSuspension(target)) {
+      char expiresbuf[100];
+      char *reason, *suspendtype, *whom;
+
+      CCASSERT(sizeof(expiresbuf) > TIMELEN);
+
+      if(UIsDelayedGline(target)) {
+        suspendtype = "delayed gline";
+      } else if(UIsGline(target)) {
+        suspendtype = "gline";
+      } else if(UIsSuspended(target)) {
+        suspendtype = "suspended";
+      } else {
+        suspendtype = "???";
+      }
+
+      if(target->suspendexp) {
+        if(time(NULL) >= target->suspendexp) {
+          strlcpy(expiresbuf, "(next auth)", sizeof(expiresbuf));
+        } else {
+          q9strftime(expiresbuf, sizeof(expiresbuf), target->suspendexp);
+        }
+      } else {
+        strlcpy(expiresbuf, "(never)", sizeof(expiresbuf));
+      }
+
+      if(cs_privcheck(QPRIV_VIEWSUSPENDEDBY, sender)) {
+        reguser *trup = findreguserbyID(target->suspendby);
+        if(trup) {
+          whom = trup->username;
+        } else {
+          whom = "(unknown)";
+        }
+      } else {
+        whom = "(hidden)";
+      }
+
+      if(target->suspendreason) {
+        reason = target->suspendreason->content;
+      } else {
+        reason = "(none)";
+      }
+
+      chanservstdmessage(sender, QM_USERSUSPENDEDTYPE, suspendtype);
+      chanservstdmessage(sender, QM_USERSUSPENDEDBY, whom);
+      chanservstdmessage(sender, QM_USERSUSPENDEDREASON, reason);
+      chanservstdmessage(sender, QM_USERSUSPENDEDAT, target->suspendtime);
+      chanservstdmessage(sender, QM_USERSUSPENDEDEXPIRY, expiresbuf);
+    }
   } else {  
+    /* Incidentally none of the QM_USERIS* mesages take parameters.  Just thought I'd mention it.. */
     if (UIsAdmin(target))
       chanservstdmessage(sender, QM_USERISADMIN, target->username);
     else if (UIsOper(target))
       chanservstdmessage(sender, QM_USERISOPER, target->username);
     else if (UIsHelper(target))
       chanservstdmessage(sender, QM_USERISHELPER, target->username);
+    else if (UIsStaff(target))
+      chanservstdmessage(sender, QM_USERISSTAFF, target->username);
     
     if (UIsDev(target))
       chanservstdmessage(sender, QM_USERISDEV, target->username);
@@ -71,56 +134,59 @@ int csu_dowhois(void *source, int cargc, char **cargv) {
   }
 
   if (rup==target)
-    flagmask|=(QUFLAG_OPER | QUFLAG_DEV | QUFLAG_HELPER | 
-              QUFLAG_ADMIN | QUFLAG_INFO | QUFLAG_NOTICE);
+    flagmask|=(QUFLAG_OPER | QUFLAG_DEV | QUFLAG_HELPER | QUFLAG_ADMIN |
+              QUFLAG_INFO | QUFLAG_NOTICE | QUFLAG_STAFF | QUFLAG_ACHIEVEMENTS);
 
   if (flagmask & target->flags)
-    chanservstdmessage(sender, QM_WHOIS_FLAGS, printflags(flagmask & target->flags, ruflags));
+    chanservstdmessage(sender, QM_WHOIS_FLAGS, printflagsornone(flagmask & target->flags, ruflags));
 
-  if (!target->nicks) {
+  if (!(anp=findauthname(target->ID)) || !anp->nicks) {
     chanservstdmessage(sender, QM_WHOIS_USERS, "(none)");
   } else {
-    for (nlp=target->nicks; ;nlp=nlp->next) {
-      if (nbpos>0 && (!nlp || nbpos+strlen(nlp->np->nick) > 60)) {
+    for (tnp=anp->nicks; ;tnp=tnp->nextbyauthname) {
+      if (nbpos>0 && (!tnp || nbpos+strlen(tnp->nick) > 60)) {
        chanservstdmessage(sender, QM_WHOIS_USERS, buf);
        nbpos=0;
       }
 
-      if (!nlp)
+      if (!tnp)
        break;
 
-      nbpos+=sprintf(buf+nbpos,"%s ",nlp->np->nick);
+      nbpos+=sprintf(buf+nbpos,"%s ",tnp->nick);
     }
   }
 
-  if (target->created) {
-    tmp=gmtime(&(target->created));
-    strftime(buf,15,"%d/%m/%y %H:%M",tmp);
-    
-    chanservstdmessage(sender, QM_WHOIS_CREATED, buf);
-  }
-
-  tmp=gmtime(&(target->lastauth));
-  strftime(buf,15,"%d/%m/%y %H:%M",tmp);
+  if (target->created)
+    chanservstdmessage(sender, QM_WHOIS_CREATED, target->created);
 
+  if (target->lastauth == 0) {
+    snprintf(buf,sizeof(buf),"(never)");
+  } else {
+    q9strftime(buf,sizeof(buf),target->lastauth);
+  }
   chanservstdmessage(sender, QM_WHOIS_LASTAUTH, buf);
   
-  if (target->lastuserhost && (rup==target || cs_privcheck(QPRIV_VIEWFULLWHOIS, sender))) {
+  /* The third clause of this hides user@host of opers from non-opered staff. */
+  if (target->lastuserhost && (rup==target || cs_privcheck(QPRIV_VIEWFULLWHOIS, sender)) &&
+      (!UHasOperPriv(target) || UHasOperPriv(rup)) ) {
+/* Commenting out language until we implement some - splidge 
     chanservstdmessage(sender, QM_WHOIS_USERLANG, cslanguages[target->languageid] ?
-                      cslanguages[target->languageid]->name->content : "(unknown)");
-    chanservstdmessage(sender, QM_WHOIS_LASTUSERHOST, target->lastuserhost->content);
+                      cslanguages[target->languageid]->name->content : "(unknown)");  */
+    if(rup==target || cs_privcheck(QPRIV_VIEWREALHOST, sender)) {
+      chanservstdmessage(sender, QM_WHOIS_LASTUSERHOST, target->lastuserhost->content);
+    }
   }
 
   if (target->email && (rup==target || cs_privcheck(QPRIV_VIEWEMAIL, sender))) {
     chanservstdmessage(sender, QM_WHOIS_EMAIL, target->email->content);
 
-    tmp=gmtime(&(target->lastemailchange));
-    strftime(buf,15,"%d/%m/%y %H:%M",tmp);
-    
-    chanservstdmessage(sender, QM_WHOIS_EMAILSET, buf);    
+    if (target->lastemailchange)
+      chanservstdmessage(sender, QM_WHOIS_EMAILSET, target->lastemailchange);
+    if (target->lastpasschange)
+      chanservstdmessage(sender, QM_WHOIS_PASSSET, target->lastpasschange);
   }
 
-  if (target->info) {
+  if (target->info && *target->info->content) {
     chanservstdmessage(sender, QM_WHOIS_INFO, target->info->content);
   }
 
@@ -129,18 +195,21 @@ int csu_dowhois(void *source, int cargc, char **cargv) {
   }
   
   for (rcup=target->knownon;rcup;rcup=rcup->nextbyuser) {
-    if (!UHasHelperPriv(rup)) {
+    if (!UHasHelperPriv(rup) || (UHasOperPriv(target) && UHasHelperPriv(rup) && !UHasOperPriv(rup))) {
       if (!(rcup2=findreguseronchannel(rcup->chan,rup)))
        continue;
       
-      if (!CUHasVoicePriv(rcup2))
+      if (!CUKnown(rcup2))
        continue;
       
       flagmask = (QCUFLAG_OWNER | QCUFLAG_MASTER | QCUFLAG_OP | QCUFLAG_VOICE | QCUFLAG_AUTOVOICE | 
-                 QCUFLAG_AUTOOP | QCUFLAG_TOPIC);
+                 QCUFLAG_AUTOOP | QCUFLAG_TOPIC | QCUFLAG_KNOWN | QCUFLAG_PROTECT );
       
       if (CUHasMasterPriv(rcup2))
-       flagmask |= (QCUFLAG_DENY | QCUFLAG_QUIET | QCUFLAG_BANNED);
+       flagmask |= QCUFLAGS_PUNISH;
+      
+      if (rcup2==rcup)
+        flagmask |= QCUFLAGS_PERSONAL;
     } else {
       flagmask=QCUFLAG_ALL;
     }
@@ -158,5 +227,11 @@ int csu_dowhois(void *source, int cargc, char **cargv) {
 
   chanservstdmessage(sender, QM_ENDOFLIST);
 
+  if (rup==target) {
+    triggerhook(HOOK_CHANSERV_WHOAMI, sender);
+  } else {
+    triggerhook(HOOK_CHANSERV_WHOIS, sender);
+  }
+
   return CMD_OK;
 }