if(!noperserv_load_db())
return;
- noperserv_ext = registernickext("noperserv");
+ noperserv_ext = registerauthnameext("noperserv", 1);
noperserv_setup_hooks();
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);
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;
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) {
}
int noperserv_noticeflags(void *sender, int cargc, char **cargv) {
- nick *np = (nick *)sender;
+ nick *np2, *np = (nick *)sender;
no_autheduser *au;
if(cargc == 1) {
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.");
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);
}
}
}
/* @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)
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.");
/* @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;
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) {
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);
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));
}
}
}
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) {
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;
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;
- }
-}
}
int noperserv_whois(void *sender, int cargc, char **cargv) {
+ authname *an;
no_autheduser *au;
nick *np = (nick *)sender;
CommandHandler oldwhois = noperserv_find_hook("whois");
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;
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) {
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);
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);
+ }
}
}
}