]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Implement authext/user support for NOperserv.
authorGunnar Beutner <redacted>
Mon, 29 Jul 2013 17:56:41 +0000 (19:56 +0200)
committerGunnar Beutner <redacted>
Mon, 29 Jul 2013 17:56:41 +0000 (19:56 +0200)
--HG--
branch : shroudnoperserv

noperserv/noperserv.c
noperserv/noperserv.h
noperserv/noperserv_db.c
noperserv/noperserv_db.h
noperserv/noperserv_hooks.c

index 63e05ba175b80ac276637a02652ec12922f45605..c1b81503e94eea0142bab0d5eeb134901da27803 100644 (file)
@@ -82,7 +82,7 @@ void _init() {
   if(!noperserv_load_db())
     return;
 
-  noperserv_ext = registernickext("noperserv");
+  noperserv_ext = registerauthnameext("noperserv", 1);
 
   noperserv_setup_hooks();
 
@@ -151,18 +151,17 @@ void _fini() {
 
   noperserv_cleanup_db();
 
-  releasenickext(noperserv_ext);
+  releaseauthnameext(noperserv_ext);
 }
 
 /* @test */
 int noperserv_hello(void *sender, int cargc, char **cargv) {
-  char *newaccount = NULL;
+  authname *newaccount = NULL;
   no_autheduser *au;
-  int i;
   nick *np = (nick *)sender, *np2, *target = NULL;
 
   if(cargc == 0) {
-    newaccount = np->authname;
+    newaccount = np->auth;
   } else {
     if(cargv[0][0] == '#') {
       authname *a = getauthbyname(cargv[0] + 1);
@@ -170,27 +169,27 @@ int noperserv_hello(void *sender, int cargc, char **cargv) {
         controlreply(np, "Cannot find anyone with that authname on the network.");
         return CMD_ERROR;
       }
-      newaccount = a->name;
+      newaccount = a;
     } else {
       target = getnickbynick(cargv[0]);
       if(!target) {
         controlreply(np, "Supplied nickname is not on the network.");
         return CMD_ERROR;
       }
-      if(!IsAccount(target)) {
-        controlreply(np, "Supplied user is not authed with the network.");
-        return CMD_ERROR;
-      }
-      newaccount = target->authname;
+      newaccount = target->auth;
     }
   }
+  if(!newaccount) {
+    controlreply(np, "Supplied user is not authed with the network.");
+    return CMD_ERROR;
+  }
   au = noperserv_get_autheduser(newaccount);
   if(au) {
     controlreply(np, "Authname already registered.");  
     return CMD_ERROR;
   }
 
-  au = noperserv_new_autheduser(newaccount);
+  au = noperserv_new_autheduser(newaccount->userid, newaccount->name);
   if(!au) {
     controlreply(np, "Memory allocation error.");
     return CMD_ERROR;
@@ -204,53 +203,55 @@ int noperserv_hello(void *sender, int cargc, char **cargv) {
     au->noticelevel = NO_DEFAULT_NOTICELEVEL;
   }
 
-  au->id = noperserv_next_autheduser_id();
   noperserv_update_autheduser(au);
 
-  for(i=0;i<NICKHASHSIZE;i++)
-    for(np2=nicktable[i];np2;np2=np2->next)
-      if(IsAccount(np2) && !ircd_strcmp(newaccount, np2->authname)) {
-        noperserv_add_to_autheduser(np2, au);
-        controlreply(np2, "An account has been created for you (auth %s).", au->authname->content);
-        if(NOGetAuthLevel(au))
-          controlreply(np2, "User flags: %s", printflags(NOGetAuthLevel(au), no_userflags));
-        controlreply(np2, "Notice flags: %s", printflags(NOGetNoticeLevel(au), no_noticeflags));
-      }
+  for(np2=newaccount->nicks;np2;np2=np2->nextbyauthname) {
+    controlreply(np2, "An account has been created for you (auth %s).", au->authname->name);
+    if(NOGetAuthLevel(au))
+      controlreply(np2, "User flags: %s", printflags(NOGetAuthLevel(au), no_userflags));
+    controlreply(np2, "Notice flags: %s", printflags(NOGetNoticeLevel(au), no_noticeflags));
+  }
 
-  if(ircd_strcmp(np->authname, newaccount)) { /* send a message to the person who HELLO'ed if we haven't already been told */
-    controlreply(np, "Account created for auth %s.", au->authname->content);
+  if(np->auth==newaccount) { /* send a message to the person who HELLO'ed if we haven't already been told */
+    controlreply(np, "Account created for auth %s.", au->authname->name);
     if(NOGetAuthLevel(au))
       controlreply(np, "User flags: %s", printflags(NOGetAuthLevel(au), no_userflags));
     controlreply(np, "Notice flags: %s", printflags(NOGetNoticeLevel(au), no_noticeflags));
     controlreply(np, "Instructions sent to all authed users.");
-  } else if(au->nick && au->nick->next) { /* if we have already been told, tell the user it was sent to more than themselves */
+  } else if(newaccount->nicks && newaccount->nicks->next) { /* if we have already been told, tell the user it was sent to more than themselves */
     controlreply(np, "Instructions sent to all authed users.");
   }
 
-  controlwall(NO_OPERED, NL_MANAGEMENT, "%s/%s just HELLO'ed: %s", np->nick, np->authname, au->authname->content);
+  controlwall(NO_OPERED, NL_MANAGEMENT, "%s/%s just HELLO'ed: %s", np->nick, np->authname, au->authname->name);
   return CMD_OK;
 }
 
 no_autheduser *noperserv_autheduser_from_command(nick *np, char *command, int *typefound, char **returned) {
   no_autheduser *au;
+  authname *anp;
   if(command[0] == '#') {
-    au = noperserv_get_autheduser(command + 1);
+    anp = findauthnamebyname(command + 1);
+    if(!anp) {
+      controlreply(np, "Authname not found.");
+      return NULL;
+    }
+    au = noperserv_get_autheduser(anp);
     if(!au) {
       controlreply(np, "Authname not found.");
     } else {
       *typefound = NO_FOUND_AUTHNAME;
-      *returned = au->authname->content;
+      *returned = au->authname->name;
       return au;
     }
   } else {
     nick *np2 = getnickbynick(command);
     if(!np2) {
       controlreply(np, "Nickname not on the network.");
-      return CMD_OK;
+      return NULL;
     }
     if(!IsAccount(np2)) {
       controlreply(np, "User is not authed with the network.");
-      return CMD_OK;
+      return NULL;
     }
     au = NOGetAuthedUser(np2);
     if(!au) {
@@ -266,7 +267,7 @@ no_autheduser *noperserv_autheduser_from_command(nick *np, char *command, int *t
 }
 
 int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
-  nick *np = (nick *)sender;
+  nick *np2, *np = (nick *)sender;
   no_autheduser *au;
 
   if(cargc == 1) {
@@ -296,7 +297,6 @@ int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
             controlreply(np, "No changes made to existing flags.");
           } else {
             char ourflags[FLAGBUFLEN], ournoticeflags[FLAGBUFLEN], diff[FLAGBUFLEN * 2 + 1], finalflags[FLAGBUFLEN];
-            no_nicklist *nl = au->nick;
             noperserv_update_autheduser(au);
             controlreply(np, "Flag alterations complete.");
 
@@ -306,10 +306,10 @@ int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
             controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used NOTICEFLAGS (%s): %s", np->nick, np->authname, ourflags, ournoticeflags, diff);
 
             strlcpy(finalflags, printflags(NOGetNoticeLevel(au), no_noticeflags), sizeof(finalflags));
-            for(;nl;nl=nl->next)
-              if(nl->nick != np) {
-                controlreply(nl->nick, "!!! %s just used NOTICEFLAGS (%s): %s", np->nick, ournoticeflags, diff);
-                controlreply(nl->nick, "Your notice flags are %s", finalflags);
+            for(np2=au->authname->nicks;np2;np2=np2->nextbyauthname)
+              if(np2 != np) {
+                controlreply(np2, "!!! %s just used NOTICEFLAGS (%s): %s", np->nick, ournoticeflags, diff);
+                controlreply(np2, "Your notice flags are %s", finalflags);
               }
           }
         }
@@ -343,11 +343,10 @@ int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
 
 /* @test */
 int noperserv_deluser(void *sender, int cargc, char **cargv) {
-  nick *np = (nick *)sender;
+  nick *np2, *np = (nick *)sender;
   no_autheduser *target /* target user */, *au = NOGetAuthedUser(np); /* user executing command */
   char *userreturned = NULL; /* nickname or authname of the target, pulled from the db */
   int typefound; /* whether it was an authname or a username */
-  no_nicklist *nl;
   char targetflags[FLAGBUFLEN], ourflags[FLAGBUFLEN], deleteduser[NOMax(ACCOUNTLEN, NICKLEN) + 1];
 
   if(cargc != 1)
@@ -367,18 +366,18 @@ int noperserv_deluser(void *sender, int cargc, char **cargv) {
      to modify, if we have no flags we won't be able to delete ourselves */
   if((target != au) && !noperserv_policy_permitted_modifications(au, target)) {
     controlreply(np, "Deletion denied."); 
-    controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) attempted to DELUSER %s (%s)", np->nick, np->authname, ourflags, target->authname->content, targetflags);
+    controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) attempted to DELUSER %s (%s)", np->nick, np->authname, ourflags, target->authname->name, targetflags);
 
     return CMD_ERROR;
   }
 
-  for(nl=target->nick;nl;nl=nl->next)
-    if(nl->nick != np)
-      controlreply(nl->nick, "!!! %s/%s (%s) just DELUSERed you.", np->nick, np->authname, ourflags);
+  for(np2=target->authname->nicks;np2;np2=np2->nextbyauthname)
+    if(np2 != np)
+      controlreply(np2, "!!! %s/%s (%s) just DELUSERed you.", np->nick, np->authname, ourflags);
 
   noperserv_delete_autheduser(target);
 
-  controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used DELUSER on %s (%s)", np->nick, np->authname, ourflags, target->authname->content, targetflags);
+  controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used DELUSER on %s (%s)", np->nick, np->authname, ourflags, deleteduser, targetflags);
 
   if(target == au) {
     controlreply(np, "You have been deleted.");
@@ -392,7 +391,7 @@ int noperserv_deluser(void *sender, int cargc, char **cargv) {
 /* @test */
 /* this command needs LOTS of checking */
 int noperserv_userflags(void *sender, int cargc, char **cargv) {
-  nick *np = (nick *)sender;
+  nick *np2, *np = (nick *)sender;
   no_autheduser *au = NOGetAuthedUser(np), *target = NULL;
   char *flags = NULL, *nicktarget = NULL;
   int typefound;
@@ -437,7 +436,7 @@ int noperserv_userflags(void *sender, int cargc, char **cargv) {
           strlcpy(targetflags, printflags(fwas, no_userflags), sizeof(targetflags));
           strlcpy(ourflags, printflags(fours, no_userflags), sizeof(ourflags));
 
-          controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) attempted to use USERFLAGS on %s (%s): %s", np->nick, np->authname, ourflags, target->authname->content, targetflags, printflagdiff(fwas, fnow, no_userflags));
+          controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) attempted to use USERFLAGS on %s (%s): %s", np->nick, np->authname, ourflags, target->authname->name, targetflags, printflagdiff(fwas, fnow, no_userflags));
           return CMD_ERROR;
         }
       } else if(ret == REJECT_NONE) {
@@ -445,7 +444,6 @@ int noperserv_userflags(void *sender, int cargc, char **cargv) {
           controlreply(np, "No changes made to existing flags.");
         } else {
           char targetflags[FLAGBUFLEN], ourflags[FLAGBUFLEN], finalflags[FLAGBUFLEN];
-          no_nicklist *nl = target->nick;
 
           noperserv_policy_update_noticeflags(fwas, target);          
           noperserv_update_autheduser(target);
@@ -455,14 +453,14 @@ int noperserv_userflags(void *sender, int cargc, char **cargv) {
           strlcpy(targetflags, printflags(fwas, no_userflags), sizeof(targetflags));
           strlcpy(ourflags, printflags(fours, no_userflags), sizeof(ourflags));
 
-          controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used USERFLAGS on %s (%s): %s", np->nick, np->authname, ourflags, target->authname->content, targetflags, printflagdiff(fwas, NOGetAuthLevel(target), no_userflags));
+          controlwall(NO_OPER, NL_MANAGEMENT, "%s/%s (%s) successfully used USERFLAGS on %s (%s): %s", np->nick, np->authname, ourflags, target->authname->name, targetflags, printflagdiff(fwas, NOGetAuthLevel(target), no_userflags));
 
           strlcpy(finalflags, printflags(NOGetAuthLevel(target), no_userflags), sizeof(finalflags));
-          for(;nl;nl=nl->next)
-            if(nl->nick != np) {
-              controlreply(nl->nick, "!!! %s/%s (%s) just used USERFLAGS on you (%s): %s", np->nick, np->authname, ourflags, targetflags, printflagdiff(fwas, NOGetAuthLevel(target), no_userflags));
-              controlreply(nl->nick, "Your user flags are now: %s", finalflags);
-              controlreply(nl->nick, "Your notice flags are now: %s", printflags(target->noticelevel, no_noticeflags));
+          for(np2=target->authname->nicks;np2;np2=np2->nextbyauthname)
+            if(np2 != np) {
+              controlreply(np2, "!!! %s/%s (%s) just used USERFLAGS on you (%s): %s", np->nick, np->authname, ourflags, targetflags, printflagdiff(fwas, NOGetAuthLevel(target), no_userflags));
+              controlreply(np2, "Your user flags are now: %s", finalflags);
+              controlreply(np2, "Your notice flags are now: %s", printflags(target->noticelevel, no_noticeflags));
             }
         }
       }
index 1297db91d21310006bb489e2a036922e92a26a60..1fae9bd3826ac8657a906f5b782ef417f5114157 100644 (file)
@@ -13,7 +13,7 @@ extern const flag no_commandflags[];
 
 #define NO_NICKS_PER_WHOIS_LINE 3
 
-#define NOGetAuthedUser(user)  (no_autheduser *)(user->exts[noperserv_ext])
+#define NOGetAuthedUser(user)  (no_autheduser *)(user->auth ? user->auth->exts[noperserv_ext] : NULL)
 #define NOGetAuthLevel(user)   user->authlevel
 #define NOGetNoticeLevel(user) user->noticelevel
 #define NOMax(a, b) (a>b?a:b)
index 17e77c4d841f97eef864992733cd3b33b4e8ec15..24fbbc075ad25a5df83318b8d3f6bbd51204b679 100644 (file)
 int db_loaded = 0;
 unsigned long loadedusers = 0;
 
-unsigned long lastuserid;
-
-no_autheduser *authedusers = NULL;
-
 void noperserv_create_tables(void);
 
 void noperserv_free_user(no_autheduser *au);
 void noperserv_load_users(const DBAPIResult *res, void *arg);
 
-void noperserv_check_nick(nick *np);
-void noperserv_nick_account(int hooknum, void *arg);
-void noperserv_quit_account(int hooknum, void *arg);
-
-void nopserserv_delete_from_autheduser(nick *np, no_autheduser *au);
-
 static DBAPIConn *nodb;
 
 int noperserv_load_db(void) {
@@ -49,20 +39,16 @@ int noperserv_load_db(void) {
 
   db_loaded = 1;
 
-  authedusers = NULL;
-
   noperserv_create_tables();
 
   nodb->query(nodb, noperserv_load_users, NULL,
-    "SELECT ID, authname, flags, noticelevel FROM ?", "T", "users");
+    "SELECT userid, authname, flags, noticelevel FROM ?", "T", "users");
 
   return 1;
 }
 
 void noperserv_load_users(const DBAPIResult *res, void *arg) {
   no_autheduser *nu;
-  nick *np;
-  int i;
 
   if(!res)
     return;
@@ -73,199 +59,105 @@ void noperserv_load_users(const DBAPIResult *res, void *arg) {
     return;
   }
 
-  lastuserid = 0;
-
   while(res->next(res)) {
-    nu = noperserv_new_autheduser(res->get(res, 1));
+    nu = noperserv_new_autheduser(strtoul(res->get(res, 0), NULL, 10), res->get(res, 1));
     if(!nu)
       continue;
 
-    nu->id = strtoul(res->get(res, 0), NULL, 10);
     nu->authlevel = strtoul(res->get(res, 2), NULL, 10);
     nu->noticelevel = strtoul(res->get(res, 3), NULL, 10);
     nu->newuser = 0;
-    if(nu->id > lastuserid)
-      lastuserid = nu->id;
   }
 
   Error("noperserv", ERR_INFO, "Loaded %lu users", loadedusers);
   
-  for(i=0;i<NICKHASHSIZE;i++)
-    for(np=nicktable[i];np;np=np->next)
-      if(IsAccount(np))
-        noperserv_check_nick(np);
-
-  registerhook(HOOK_NICK_ACCOUNT, &noperserv_nick_account);
-  registerhook(HOOK_NICK_NEWNICK, &noperserv_nick_account);
-  registerhook(HOOK_NICK_LOSTNICK, &noperserv_quit_account);
-
   res->clear(res);
 }
 
 void noperserv_create_tables(void) {
   nodb->createtable(nodb, NULL, NULL,
     "CREATE TABLE ? ("
-      "ID            INT               NOT NULL,"
-      "authname      VARCHAR(?)       NOT NULL,"
+      "userid        INT               NOT NULL,"
+      "authname      VARCHAR(?)        NOT NULL,"
       "flags         INT               NOT NULL,"
       "noticelevel   INT               NOT NULL,"
-      "PRIMARY KEY (ID))", "Td", "users", ACCOUNTLEN);
+      "PRIMARY KEY (userid))", "Td", "users", ACCOUNTLEN);
 }
 
 void noperserv_cleanup_db(void) {
-  no_autheduser *ap, *np;
+  int i;
+  authname *anp, *next;
+  no_autheduser *au;
+
+  for (i=0;i<AUTHNAMEHASHSIZE;i++) {
+    for (anp=authnametable[i];anp;) {
+      next = anp->next;
 
-  deregisterhook(HOOK_NICK_LOSTNICK, &noperserv_quit_account);
-  deregisterhook(HOOK_NICK_NEWNICK, &noperserv_nick_account);
-  deregisterhook(HOOK_NICK_ACCOUNT, &noperserv_nick_account);
+      au = anp->exts[noperserv_ext];
+      if(au)
+        noperserv_free_user(au);
 
-  ap = authedusers;
-  while(ap) {
-    np = ap->next;
-    noperserv_free_user(ap);
-    ap = np;
+      anp = next;
+    }
   }
 
   nodb->close(nodb);
   nodb = NULL;
 }
 
-no_autheduser *noperserv_new_autheduser(char *authname) {
-  no_autheduser *au = (no_autheduser *)malloc(sizeof(no_autheduser));
-  if(!au)
+no_autheduser *noperserv_new_autheduser(unsigned long userid, char *name) {
+  authname *anp;
+  no_autheduser *au;
+
+  anp = findorcreateauthname(userid, name);
+  if(!anp)
     return NULL;
 
-  au->authname = getsstring(authname, ACCOUNTLEN);
-  if(!au->authname) {
-    free(au);
+  au = malloc(sizeof(no_autheduser));
+  if(!au)
     return NULL;
-  }
+
+  au->authname = anp;
 
   loadedusers++;
   au->newuser = 1;
-  au->nick = NULL;
 
-  au->next = authedusers;
-  authedusers = au;
+  anp->exts[noperserv_ext] = au;
 
   return au;
 }
 
 void noperserv_delete_autheduser(no_autheduser *au) {
-  no_autheduser *ap = authedusers, *lp = NULL;
-
   if(!au->newuser)
-    nodb->squery(nodb, "DELETE FROM ? WHERE id = ?", "Tu", "users", au->id);
-
-  for(;ap;lp=ap,ap=ap->next) {
-    if(ap == au) {
-      if(lp) {
-        lp->next = ap->next;
-      } else {
-        authedusers = ap->next;
-      }
-      noperserv_free_user(ap);
-      return;
-    }
-  }
+    nodb->squery(nodb, "DELETE FROM ? WHERE userid = ?", "Tu", "users", au->authname->userid);
+
+  noperserv_free_user(au);
 }
 
 void noperserv_update_autheduser(no_autheduser *au) {
   if(au->newuser) {
-    nodb->squery(nodb, "INSERT INTO ? (id, authname, flags, noticelevel) VALUES (?,?,?,?)", "Tusuu", "users", au->id, au->authname->content, NOGetAuthLevel(au), NOGetNoticeLevel(au));
+    nodb->squery(nodb, "INSERT INTO ? (userid, authname, flags, noticelevel) VALUES (?,?,?,?)", "Tusuu", "users", au->authname->userid, au->authname->name, NOGetAuthLevel(au), NOGetNoticeLevel(au));
     au->newuser = 0;
   } else {
-    nodb->squery(nodb, "UPDATE ? SET flags = ?, noticelevel = ? WHERE id = ?", "Tuuu", "users", NOGetAuthLevel(au), NOGetNoticeLevel(au), au->id);
+    nodb->squery(nodb, "UPDATE ? SET flags = ?, noticelevel = ? WHERE userid = ?", "Tuuu", "users", NOGetAuthLevel(au), NOGetNoticeLevel(au), au->authname->userid);
   }
 }
 
 void noperserv_free_user(no_autheduser *au) {
-  no_nicklist *cp = au->nick, *np;
-
-  while(cp) {
-    cp->nick->exts[noperserv_ext] = NULL;
-    np = cp->next;
-    free(cp);
-    cp = np;
-  }
-
-  freesstring(au->authname);
+  au->authname->exts[noperserv_ext] = NULL;
   free(au);
 
   loadedusers--;
 }
 
-void noperserv_check_nick(nick *np) {
-  no_autheduser *au = noperserv_get_autheduser(np->authname);
-  if(au)
-    noperserv_add_to_autheduser(np, au);
-}
-
-void noperserv_nick_account(int hooknum, void *arg) {
-  noperserv_check_nick((nick *)arg);
-}
-
-void noperserv_quit_account(int hooknum, void *arg) {
-  nick *np = (void *)arg;
-  no_autheduser *au = NOGetAuthedUser(np);
-  no_nicklist *nl, *ln = NULL;
-  if(!au)
-    return;
-
-  for(nl=au->nick;nl;ln=nl,nl=nl->next)
-    if(nl->nick == np) {
-      if(ln) {
-        ln->next = nl->next;
-      } else {
-        au->nick = nl->next;
-      }
-      free(nl);
-      break;
-    }
-}
-
-no_autheduser *noperserv_get_autheduser(char *authname) {
-  no_autheduser *au = authedusers;
-
-  for(;au;au=au->next)
-    if(!ircd_strcmp(authname, au->authname->content))
-      return au;
+no_autheduser *noperserv_get_autheduser(authname *an) {
+  if (!an)
+    return NULL;
 
-  return NULL;
+  return an->exts[noperserv_ext];
 }
 
 unsigned long noperserv_get_autheduser_count(void) {
   return loadedusers;
 }
 
-unsigned long noperserv_next_autheduser_id(void) {
-  return ++lastuserid;
-}
-
-void noperserv_add_to_autheduser(nick *np, no_autheduser *au) {
-  no_nicklist *nl = (no_nicklist *)malloc(sizeof(no_nicklist));
-  if(!nl)
-    return;
-
-  np->exts[noperserv_ext] = au;
-
-  nl->nick = np;
-
-  nl->next = au->nick;
-  au->nick = nl;
-}
-
-void nopserserv_delete_from_autheduser(nick *np, no_autheduser *au) {
-  no_nicklist *cp = au->nick, *lp = NULL;
-
-  for(;cp;lp=cp,cp=cp->next)
-    if(cp->nick == np) {
-      if(lp) {
-        lp->next = cp->next;
-      } else {
-        au->nick = cp->next;
-      }
-      free(cp);
-      break;
-    }
-}
index 16814b020d7d4b3a9451c9223b33fb0d719ab55e..36486af0825c97fb80e123f2f0c9a801d0f01e9d 100644 (file)
@@ -3,33 +3,21 @@
 
 typedef unsigned long no_tableid;
 
-typedef struct no_nicklist {
-  nick *nick;
-  struct no_nicklist *next;
-} no_nicklist;
-
 typedef struct no_autheduser {
   unsigned newuser: 1;
-  sstring *authname;
+  authname *authname;
   flag_t authlevel;
   flag_t noticelevel;
-  no_tableid id;
-  struct no_autheduser *next;
-  no_nicklist *nick;
 } no_autheduser;
 
 int noperserv_load_db(void);
 void noperserv_cleanup_db(void);
 
-extern no_autheduser *authedusers;
-
 void noperserv_delete_autheduser(no_autheduser *au);
-no_autheduser *noperserv_new_autheduser(char *authname);
-no_autheduser *noperserv_get_autheduser(char *authname);
+no_autheduser *noperserv_new_autheduser(unsigned long userid, char *ame);
+no_autheduser *noperserv_get_autheduser(authname *an);
 void noperserv_update_autheduser(no_autheduser *au);
-void noperserv_add_to_autheduser(nick *np, no_autheduser *au);
 
 unsigned long noperserv_get_autheduser_count(void);
-unsigned long noperserv_next_autheduser_id(void);
 
 #endif
index 3df5e8739c1a57a0f7226f4db160cfd95add499c..189c03d2a01aac5a76cc91f65f59b9334a6e4883 100644 (file)
@@ -243,6 +243,7 @@ void noperserv_whois_hook(int hooknum, void *arg) {
 }
 
 int noperserv_whois(void *sender, int cargc, char **cargv) {
+  authname *an;
   no_autheduser *au;
   nick *np = (nick *)sender;
   CommandHandler oldwhois = noperserv_find_hook("whois");
@@ -260,14 +261,20 @@ int noperserv_whois(void *sender, int cargc, char **cargv) {
       return oldwhois(sender, cargc, cargv);
     return CMD_ERROR;
   }
-  
-  au = noperserv_get_autheduser(cargv[0] + 1);
-  if(!au) {
+
+  an = findauthnamebyname(cargv[0] + 1);
+  if(!an) {
     controlreply(np, "Account not registered.");
     return CMD_OK;
+  }  
+
+  au = noperserv_get_autheduser(an);
+  if(!au) {
+    controlreply(np, "User does not have a NOperserv account.");
+    return CMD_OK;
   }
 
-  controlreply(np, "Account   : %s", au->authname->content);
+  controlreply(np, "Account   : %s", au->authname->name);
 
   replynick = np;
 
@@ -323,18 +330,18 @@ void noperserv_whois_account_handler(int hooknum, void *arg) {
   char nickbuffer[(NICKLEN + 2) * NO_NICKS_PER_WHOIS_LINE - 1]; /* since we don't need space or comma for the first item we're fine NULL wise */
   char accountspace[NICKLEN + 3]; /* space, comma, null */
   char message[1024];
+  nick *np;
   
   nickbuffer[0] = '\0';
   if(hooknum == HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER) {
     /* we can just read out the authed user linked list */
     no_autheduser *au = (void *)arg;
-    no_nicklist *nl = au->nick;
     
-    if(nl)
+    if(au->authname->nicks)
       found = 1;
 
-    for(;nl;nl=nl->next) {
-      snprintf(accountspace, sizeof(accountspace), "%s%s", count++?", ":"", nl->nick->nick);
+    for(np=au->authname->nicks;np;np=np->nextbyauthname) {
+      snprintf(accountspace, sizeof(accountspace), "%s%s", count++?", ":"", np->nick);
       strlcat(nickbuffer, accountspace, sizeof(nickbuffer));
 
       if(count >= NO_NICKS_PER_WHOIS_LINE) {
@@ -464,9 +471,11 @@ int noperserv_help(void *sender, int cargc, char **cargv) {
 void noperserv_wall(flag_t permissionlevel, flag_t noticelevel, char *format, ...) {
   char buf[512];
   va_list va;
-  no_autheduser *au = authedusers;
-  no_nicklist *nl;
   char *flags = printflags(noticelevel, no_noticeflags) + 1;
+  int i;
+  authname *anp;
+  no_autheduser *au;
+  nick *np;
 
   va_start(va, format);
   vsnprintf(buf, sizeof(buf), format, va);
@@ -474,11 +483,16 @@ void noperserv_wall(flag_t permissionlevel, flag_t noticelevel, char *format, ..
 
   Error("noperserv", ERR_INFO, "$%s$ %s", flags, buf);
 
-  for(;au;au=au->next) {
-    if((NOGetNoticeLevel(au) & noticelevel) && !(NOGetAuthLevel(au) & __NO_RELAY)) {
-      for(nl=au->nick;nl;nl=nl->next)
-        if(noperserv_policy_command_permitted(permissionlevel, nl->nick))
-          controlreply(nl->nick, "$%s$ %s", flags, buf);
+  for (i=0;i<AUTHNAMEHASHSIZE;i++) {
+    for (anp=authnametable[i];anp;anp=anp->next) {
+      au = noperserv_get_autheduser(anp);
+      if(!au)
+        continue;
+      if((NOGetNoticeLevel(au) & noticelevel) && !(NOGetAuthLevel(au) & __NO_RELAY)) {
+        for(np=anp->nicks;np;np=np->nextbyauthname)
+          if(noperserv_policy_command_permitted(permissionlevel, np))
+            controlreply(np, "$%s$ %s", flags, buf);
+      }
     }
   }
 }