]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Merge shroudcloak.
authorGunnar Beutner <redacted>
Sat, 20 Jul 2013 20:11:08 +0000 (22:11 +0200)
committerGunnar Beutner <redacted>
Sat, 20 Jul 2013 20:11:08 +0000 (22:11 +0200)
localuser/localuser.c
localuser/localuser.h
localuser/localuserchannel.c
miscreply/whois.c
nick/nick.c
nick/nick.h
nick/nickhandlers.c

index 3bd797d477ab1da803465c2b5bc9877e938b84c1..35c13ebe840cfcc57131a794f942df9969006ac1 100644 (file)
@@ -148,6 +148,9 @@ nick *registerlocaluserflags(char *nickname, char *ident, char *host, char *real
     }
   }
 
+  newuser->cloak_count = 0;
+  newuser->cloak_extra = NULL;
+
   if (connected) {
     /* Check for nick collision */
     if ((np=getnickbynick(nickname))!=NULL) {
@@ -643,3 +646,20 @@ void localusersetaccountflags(authname *anp, u_int64_t accountflags) {
 
   triggerhook(HOOK_AUTH_FLAGSUPDATED, arg);
 }
+
+void localuseraddcloaktarget(nick *np, nick *target) {
+  char snumeric[10], tnumeric[10];
+
+  strcpy(snumeric, longtonumeric(np->numeric,5));
+  strcpy(tnumeric, longtonumeric(target->numeric,5));
+
+  irc_send("%s CA %s", snumeric, tnumeric);
+
+  addcloaktarget(np, target);
+}
+
+void localuserclearcloaktargets(nick *np) {
+  irc_send("%s CU", longtonumeric(np->numeric,5));
+  clearcloaktargets(np);
+}
+
index 4d39f0f79f168eeb3aa2fe759fcaf25e14a64a92..7787b349d9fec2bfa2dd26e8e190b28a2ba02b73 100644 (file)
@@ -41,5 +41,7 @@ void localusersetaccount(nick *np, char *accname, unsigned long accid, u_int64_t
 void localusersetumodes(nick *np, flag_t newmodes);
 void sethostuser(nick *target, char *ident, char *host);
 void localusersetaccountflags(authname *anp, u_int64_t accountflags);
+void localuseraddcloaktarget(nick *np, nick *target);
+void localuserclearcloaktargets(nick *np);
 
 #endif
index 67d0b1b629331d37790f7c073cd933a936481bed..d770f877a22a22075eb4df957ab6d723f77e9cea 100644 (file)
@@ -709,6 +709,11 @@ void localdosetmode_nick (modechanges *changes, nick *target, short modes) {
     return;
   }
 
+  if (IsCloaked(target)) {
+    /* Target is cloaked, never set channel modes for cloaked users */
+    return;
+  }
+
   if ((modes & MC_DEOP) && (*lp & CUMODE_OP)) {
     (*lp) &= ~CUMODE_OP;
     if (changes->changecount >= MAXMODEARGS)
index d3c211568c129fffbed5ece7d1951835bada679d..6eb6af3d6a97f4ee32d6cc24fcc5ce161f732a3e 100644 (file)
@@ -44,7 +44,7 @@ static void do_whois(char *sourcenum, nick *snick, nick *tnick) {
    *      target user is not hidechan (usermode +n)
    *      OR user WHOIS'ing himself
    */
-  if ((!IsService(tnick) && !IsHideChan(tnick)) || snick == tnick) {
+  if ((!IsService(tnick) && !IsHideChan(tnick) && canseeuser(snick, tnick)) || snick == tnick) {
     nicks[0] = (char *)snick;
     nicks[1] = (char *)tnick;
     nicks[2] = sourcenum;
index 10203dc64fbb3fe40d973e93fe5e4422c98c319b..edd557cb9fd0aa81fe36b53ed2372260188eabff 100644 (file)
@@ -35,6 +35,7 @@ const flag umodeflags[] = {
    { 'R', UMODE_REGPRIV },
    { 'I', UMODE_HIDEIDLE },
    { 'P', UMODE_PARANOID },
+   { 'C', UMODE_CLOAKED },
    { '\0', 0 } };
 
 const flag accountflags[] = {
@@ -90,6 +91,8 @@ void _init() {
   registerserverhandler("AC",&handleaccountmsg,4);
   registerserverhandler("P",&handleprivmsg,2);
   registerserverhandler("A",&handleawaymsg,1);
+  registerserverhandler("CA",&handleaddcloak,1);
+  registerserverhandler("CU",&handleclearcloak,0);
   
   /* Fake the addition of our own server */
   handleserverchange(HOOK_SERVER_NEWSERVER,(void *)numerictolong(mynumeric->content,2));
@@ -126,6 +129,8 @@ void _fini() {
   deregisterserverhandler("AC",&handleaccountmsg); 
   deregisterserverhandler("P",&handleprivmsg);
   deregisterserverhandler("A",&handleawaymsg);
+  deregisterserverhandler("CA",&handleaddcloak);
+  deregisterserverhandler("CU",&handleclearcloak);
 }
 
 /*
@@ -215,6 +220,10 @@ void deletenick(nick *np) {
   
   /* TODO: figure out how to cleanly remove nodes without affecting other modules */
 
+  /* Remove cloak entries for the user */
+  removecloaktarget(np);
+  clearcloaktargets(np);
+
   /* Delete the nick from the servernick table */  
   *(gethandlebynumericunsafe(np->numeric))=NULL;
   
@@ -425,3 +434,39 @@ nick *getnickbynumericstr(char *numericstr) {
 
 #endif
 
+int canseeuser(nick *np, nick *cloaked)
+{
+  return (np == cloaked ||
+          !IsCloaked(cloaked) ||
+          np->cloak_extra == cloaked);
+}
+
+void addcloaktarget(nick *cloaked, nick *target)
+{
+  removecloaktarget(target);
+
+  target->cloak_extra = cloaked;
+  cloaked->cloak_count++;
+}
+
+void removecloaktarget(nick *target)
+{
+  if (target->cloak_extra) {
+    target->cloak_extra->cloak_count--;
+    target->cloak_extra = NULL;
+  }
+}
+
+void clearcloaktargets(nick *cloaked)
+{
+  nick *tnp;
+  int j;
+
+  for(j=0;j<NICKHASHSIZE;j++)
+    for(tnp=nicktable[j];tnp;tnp=tnp->next)
+      if (tnp->cloak_extra == cloaked)
+        tnp->cloak_extra = NULL;
+
+  cloaked->cloak_count = 0;
+}
+
index 4c9acaa4d3a89b767f8950ab41df383abf09a2fa..2212531819b54df54ff111987976ab9cf1be8a8d 100644 (file)
@@ -34,8 +34,9 @@
 #define UMODE_REGPRIV   0x0800
 #define UMODE_HIDEIDLE  0x1000
 #define UMODE_PARANOID  0x2000
+#define UMODE_CLOAKED   0x4000
 
-#define UMODE_ALL       0x3FFF
+#define UMODE_ALL       0x7FFF
 
 #define AFLAG_STAFF     0x0001
 #define AFLAG_SUPPORT   0x0002
@@ -59,6 +60,7 @@
 #define IsRegPriv(x)      ((x)->umodes & UMODE_REGPRIV)
 #define IsHideIdle(x)     ((x)->umodes & UMODE_HIDEIDLE)
 #define IsParanoid(x)     ((x)->umodes & UMODE_PARANOID)
+#define IsCloaked(x)      ((x)->umodes & UMODE_CLOAKED)
 
 #define SetInvisible(x)    ((x)->umodes |= UMODE_INV)
 #define SetWallops(x)      ((x)->umodes |= UMODE_WALLOPS)
@@ -74,6 +76,7 @@
 #define SetRegPriv(x)      ((x)->umodes |= UMODE_REGPRIV)
 #define SetHideIdle(x)     ((x)->umodes |= UMODE_HIDEIDLE)
 #define SetParanoid(x)     ((x)->umodes |= UMODE_PARANOID)
+#define SetCloaked(x)      ((x)->umodes |= UMODE_CLOAKED)
 
 #define ClearInvisible(x)    ((x)->umodes &= ~UMODE_INV)
 #define ClearWallops(x)      ((x)->umodes &= ~UMODE_WALLOPS)
@@ -89,6 +92,7 @@
 #define ClearRegPriv(x)      ((x)->umodes &= ~UMODE_REGPRIV)
 #define ClearHideIdle(x)     ((x)->umodes &= ~UMODE_HIDEIDLE)
 #define ClearParanoid(x)     ((x)->umodes &= ~UMODE_PARANOID)
+#define ClearCloaked(x)      ((x)->umodes &= ~UMODE_CLOAKED)
 
 #define IsStaff(x)           ((x)->flags & AFLAG_STAFF)
 #define IsDeveloper(x)       ((x)->flags & AFLAG_DEVELOPER)
@@ -142,6 +146,8 @@ typedef struct nick {
   time_t accountts;
   sstring *away;
   patricia_node_t *ipnode;
+  unsigned int cloak_count;
+  struct nick *cloak_extra;
   unsigned int marker;
   struct nick *next;
   struct nick *nextbyhost;
@@ -198,6 +204,10 @@ int findnickext(const char *name);
 void releasenickext(int index);
 char *visiblehostmask(nick *np, char *buf);
 char *visibleuserhost(nick *np, char *buf);
+int canseeuser(nick *np, nick *cloaked);
+void addcloaktarget(nick *cloaked, nick *target);
+void removecloaktarget(nick *target);
+void clearcloaktargets(nick *cloaked);
 
 /* nickhandlers.c functions */
 int handlenickmsg(void *source, int cargc, char **cargv);
@@ -207,6 +217,8 @@ int handleusermodemsg(void *source, int cargc, char **cargv);
 int handleaccountmsg(void *source, int cargc, char **cargv);
 int handleprivmsg(void *source, int cargc, char **cargv);
 int handleawaymsg(void *source, int cargc, char **cargv);
+int handleaddcloak(void *source, int cargc, char **cargv);
+int handleclearcloak(void *source, int cargc, char **cargv);
 
 /* These functions have been replaced by macros 
 nick **gethandlebynumeric(long numeric);
index d85aa62ee4f7321efce3e5ba38b1845c0c9712ee..db4963194074f41d43a21f170dea40695b71411a 100644 (file)
@@ -158,6 +158,8 @@ 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;
     if(cargc>=9) {
       int sethostarg = 6, opernamearg = 6, accountarg = 6;
 
@@ -444,3 +446,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;
+}
+