X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/57eb978d7db98d91e69654268b88dfc33c923de3..40814391c7b017da05d4daa2895093e5099801c7:/fakeusers/fakeusers.c diff --git a/fakeusers/fakeusers.c b/fakeusers/fakeusers.c index 26955894..0e92560a 100644 --- a/fakeusers/fakeusers.c +++ b/fakeusers/fakeusers.c @@ -34,246 +34,222 @@ typedef struct fakeuser { struct fakeuser *next; } fakeuser; -fakeuser *fakeuserlist = NULL; - -void fakeuser_cleanup(); -int fakeuser_loaddb(); -void fakeusers_load(const DBAPIResult *res, void *arg); -void fakeuser_handler(nick *user, int command, void **params); -int fakeadd(void *sender, int cargc, char **cargv); -int fakelist(void *sender, int cargc, char **cargv); -int fakekill(void *sender, int cargc, char **cargv); -void schedulefakeuser(void *arg); -fakeuser* findfakeuserbynick(char *nick); -void fake_remove(char *nickname); -fakeuser *fake_add(fakeuser *details); - +static fakeuser *fakeuserlist; static DBAPIConn *nofudb; -void _init() { - if (!fakeuser_loaddb()) - { - Error("fakeuser", ERR_FATAL, "Cannot load database"); - return; - } - registercontrolhelpcmd("fakeuser", NO_OPER, 4, &fakeadd, "Usage: FAKEUSER nick \nCreates a fake user."); - registercontrolhelpcmd("fakelist", NO_OPER, 0, &fakelist, "Usage: FAKELIST\nLists all fake users."); - registercontrolhelpcmd("fakekill", NO_OPER, 2, &fakekill, "Usage: FAKEKILL nick \nRemoves a fake user"); +static void reconnectfakeuser(void *arg); -} +static fakeuser *findfakeuserbynick(char *nick) { + fakeuser *fake; -void _fini() { - fakeuser_cleanup(); - deleteallschedules(schedulefakeuser); - deregistercontrolcmd("fakeuser", &fakeadd); - deregistercontrolcmd("fakelist", &fakelist); - deregistercontrolcmd("fakekill", &fakekill); + for (fake = fakeuserlist; fake; fake = fake->next) + if (!ircd_strcmp(nick, fake->nick)) + return fake; + + return NULL; } -void fakeuser_cleanup() -{ - fakeuser *fake; - void *next; - for (fake = fakeuserlist; fake; fake = next) - { +static void fake_free(fakeuser *fake) { + fakeuser **pnext; + + if (fake->user) deregisterlocaluser(fake->user, "Signing off"); - next = fake->next; - free(fake); + + deleteschedule(NULL, &reconnectfakeuser, fake); + + for (pnext = &fakeuserlist; *pnext; pnext = &((*pnext)->next)) { + if (*pnext == fake) { + *pnext = fake->next; + break; + } } - fakeuserlist = NULL; + + free(fake); } -int fakeuser_loaddb() -{ - if (!nofudb) { - nofudb = dbapi2open(DBAPI2_DEFAULT, "fakeusers"); - if(!nofudb) { - Error("fakeuser", ERR_STOP, "Could not connect to database."); - return 0; +static void fake_remove(fakeuser *fake) { + nofudb->squery(nofudb, "DELETE FROM ? WHERE nick = ?", "Ts", "fakeusers", fake->nick); + + fake_free(fake); +} + +static void fakeuser_handler(nick *user, int command, void **params) { + if (command == LU_KILLED) { + fakeuser *fake; + time_t timenow = time(NULL); + + fake = findfakeuserbynick(user->nick); + + if (!fake) { + controlwall(NO_OPER, NL_FAKEUSERS, "Error: A fakeuser was killed, but wasn't found in the list"); + Error("fakeuser", ERR_ERROR, "A fakeuser was killed, but wasn't found in the list"); + return; } - } - nofudb->createtable(nofudb, NULL, NULL, - "CREATE TABLE ? (" - "nick VARCHAR(?) NOT NULL," - "ident VARCHAR(?) NOT NULL," - "host VARCHAR(?) NOT NULL," - "realname VARCHAR(?) NOT NULL," - "PRIMARY KEY (nick))", "Tdddd", "fakeusers", NICKLEN, USERLEN, HOSTLEN, REALLEN); + fake->user = NULL; - nofudb->query(nofudb, fakeusers_load, NULL, - "SELECT nick, ident, host, realname FROM ?", "T", "fakeusers"); + if (timenow - fake->lastkill < KILL_TIME) { + controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) KILL'ed twice under in %d seconds. Removing.", + fake->nick, fake->ident, fake->host, fake->realname, KILL_TIME); + fake_remove(fake); + return; + } - return 1; -} + fake->lastkill = timenow; -void fakeusers_load(const DBAPIResult *res, void *arg) { - fakeuser fakeuser; + scheduleoneshot(time(NULL) + KILL_WAIT, &reconnectfakeuser, fake); + } +} - if(!res) +static void reconnectfakeuser(void *arg) { + fakeuser *fake = arg; + nick *user; + + if (fake->user) return; - if(!res->success) { - Error("fakeuser", ERR_ERROR, "Error loading fakeuser list."); - res->clear(res); + if ((user = getnickbynick(fake->nick)) && (IsOper(user) || IsService(user) || IsXOper(user))) { + fake_remove(fake); return; } - while(res->next(res)) { - strlcpy(fakeuser.nick, res->get(res, 0), NICKLEN + 1); - strlcpy(fakeuser.ident, res->get(res, 1), USERLEN + 1); - strlcpy(fakeuser.host, res->get(res, 2), HOSTLEN + 1); - strlcpy(fakeuser.realname, res->get(res, 3), REALLEN + 1); - fake_add(&fakeuser); - } - - scheduleoneshot(time(NULL)+1, schedulefakeuser, NULL); - res->clear(res); + fake->user = registerlocaluser(fake->nick, fake->ident, fake->host, fake->realname, + NULL, UMODE_INV | UMODE_DEAF, &fakeuser_handler); } -fakeuser *getdetails(nick *user) -{ - fakeuser *details; - details = malloc(sizeof(fakeuser)); - if (!details) - return NULL; - strlcpy(details->nick, user->nick, NICKLEN + 1); - strlcpy(details->ident, user->ident, USERLEN + 1); - strlcpy(details->host, user->host->name->content, HOSTLEN + 1); - strlcpy(details->realname, user->realname->name->content, REALLEN + 1); - details->lastkill = 0; - return details; -} +static fakeuser *fake_add(const char *nick, const char *ident, const char *host, const char *realname) { + fakeuser *fake; -nick *register_fakeuseronnet(fakeuser *details) -{ - nick *user; - - if ((user = getnickbynick(details->nick)) && (IsOper(user) || IsService(user) || IsXOper(user))) { + fake = malloc(sizeof(fakeuser)); + + if (!fake) return NULL; - } - return registerlocaluser(details->nick, details->ident, details->host, details->realname, - NULL, UMODE_INV | UMODE_DEAF, &fakeuser_handler); -} + strlcpy(fake->nick, nick, NICKLEN + 1); + strlcpy(fake->ident, ident, USERLEN + 1); + strlcpy(fake->host, host, HOSTLEN + 1); + strlcpy(fake->realname, realname, REALLEN + 1); -fakeuser *fake_add(fakeuser *details) { - fakeuser *newfake; + fake->user = NULL; + fake->lastkill = 0; - newfake = malloc(sizeof(fakeuser)); - if (!newfake) - { - return NULL; - } + fake->next = fakeuserlist; + fakeuserlist = fake; + + scheduleoneshot(time(NULL) + 1, reconnectfakeuser, fake); + + return fake; +} - memcpy(newfake, details, sizeof(fakeuser)); +static fakeuser *fake_create(const char *nick, const char *ident, const char *host, const char *realname) { + fakeuser *fake; + + fake = fake_add(nick, ident, host, realname); - newfake->user = NULL; - newfake->lastkill = 0; + if (!fake) + return NULL; + + nofudb->squery(nofudb, "INSERT INTO ? (nick, ident, host, realname) VALUES (?,?,?,?)", "Tssss", "fakeusers", + fake->nick, fake->ident, fake->host, fake->realname); - newfake->next = fakeuserlist; - fakeuserlist = newfake; - return newfake; + return fake; } -void fake_remove(char *nickname) { - fakeuser *fake, *prev; +static void fakeusers_load(const DBAPIResult *res, void *arg) { + if (!res) + return; - for (fake=fakeuserlist;fake;fake=fake->next) { - if(!ircd_strcmp(nickname, fake->nick)) { - if(fake==fakeuserlist) - fakeuserlist=fake->next; - else - prev->next=fake->next; - free(fake); - return; - } - prev=fake; + if (!res->success) { + Error("fakeuser", ERR_ERROR, "Error loading fakeuser list."); + res->clear(res); + return; } + + while (res->next(res)) + fake_add(res->get(res, 0), res->get(res, 1), res->get(res, 2), res->get(res, 3)); + + res->clear(res); } -void fakeuser_handler(nick *user, int command, void **params) -{ - if (command == LU_KILLED) - { - fakeuser *item; - time_t timenow = time(NULL); +static int fakeuser_loaddb() { + if (!nofudb) { + nofudb = dbapi2open(DBAPI2_DEFAULT, "fakeusers"); - item = findfakeuserbynick(user->nick); - if (!item) - { - controlwall(NO_OPER, NL_FAKEUSERS, "Error: A fakeuser was killed, but wasn't found in the list"); - Error("fakeuser", ERR_ERROR, "A fakeuser was killed, but wasn't found in the list"); - return; + if (!nofudb) { + Error("fakeuser", ERR_STOP, "Could not connect to database."); + return 0; } + } - item->user = NULL; + nofudb->createtable(nofudb, NULL, NULL, + "CREATE TABLE ? (" + "nick VARCHAR(?) NOT NULL," + "ident VARCHAR(?) NOT NULL," + "host VARCHAR(?) NOT NULL," + "realname VARCHAR(?) NOT NULL," + "PRIMARY KEY (nick))", "Tdddd", "fakeusers", NICKLEN, USERLEN, HOSTLEN, REALLEN); - if (timenow - item->lastkill < KILL_TIME) { - controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) KILL'ed twice under in %d seconds. Removing.", item->nick, item->ident, item->host, item->realname, KILL_TIME); - nofudb->squery(nofudb, "DELETE FROM ? WHERE nick = ?", "Ts", "fakeusers", item->nick); - fake_remove(item->nick); - return; - } - item->lastkill = timenow; + nofudb->query(nofudb, fakeusers_load, NULL, + "SELECT nick, ident, host, realname FROM ?", "T", "fakeusers"); - scheduleoneshot(time(NULL) + KILL_WAIT, schedulefakeuser, item); - } + return 1; } -int fakeadd(void *sender, int cargc, char **cargv) -{ - fakeuser newfake; +static int fakeadd(void *source, int cargc, char **cargv) { + nick *sender = source; fakeuser *fake; + char *nick, *ident, *realname; + char host[HOSTLEN + 1]; if (cargc == 0) return CMD_USAGE; fake = findfakeuserbynick(cargv[0]); - if(fake) { + + if (fake) { controlreply(sender, "Fake User with nick %s already found", cargv[0]); return CMD_ERROR; } - strlcpy(newfake.nick, cargv[0], NICKLEN + 1); + nick = cargv[0]; + if (cargc < 4) - strlcpy(newfake.realname, cargv[0], REALLEN + 1); - else - strlcpy(newfake.realname, cargv[3], REALLEN + 1); - if (cargc < 3) - { - strlcpy(newfake.host, cargv[0], NICKLEN + 1); - strlcat(newfake.host, ".fakeusers.quakenet.org", HOSTLEN + 1); - } + realname = cargv[0]; else - strlcpy(newfake.host, cargv[2], HOSTLEN + 1); + realname = cargv[3]; + + if (cargc < 3) { + strlcpy(host, cargv[0], NICKLEN + 1); + strlcat(host, ".fakeusers.quakenet.org", HOSTLEN + 1); + } else + strlcpy(host, cargv[2], HOSTLEN + 1); + if (cargc < 2) - strlcpy(newfake.ident, cargv[0], USERLEN + 1); + ident = cargv[0]; else - strlcpy(newfake.ident, cargv[1], USERLEN + 1); + ident = cargv[1]; + + fake = fake_create(nick, ident, host, realname); - fake = fake_add(&newfake); if (!fake) - { return CMD_ERROR; - } - nofudb->squery(nofudb, "INSERT INTO ? (nick, ident, host, realname) VALUES (?,?,?,?)", "Tssss", "fakeusers", fake->nick, fake->ident, fake->host, fake->realname); controlreply(sender, "Added fake user %s", fake->nick); - controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) added by %s/%s", fake->nick, fake->ident, - fake->host, fake->realname, ((nick*)sender)->nick, ((nick*)sender)->authname); + controlwall(NO_OPER, NL_FAKEUSERS, "%s added fake user: %s!%s@%s (%s)", controlid(sender), + fake->nick, fake->ident, fake->host, fake->realname); + + scheduleoneshot(time(NULL) + 1, &reconnectfakeuser, fake); - scheduleoneshot(time(NULL) + 1, schedulefakeuser, fake); return CMD_OK; } -int fakelist(void *sender, int cargc, char **cargv) -{ +static int fakelist(void *sender, int cargc, char **cargv) { fakeuser *fake; - int fakeusercount=0; - for(fake=fakeuserlist;fake;fake=fake->next) { - if(!fake->user) - controlreply(sender, "%s!%s@%s (%s) %s - RECONNECTING", fake->nick, fake->ident, + int fakeusercount = 0; + + for (fake = fakeuserlist; fake; fake = fake->next) { + if (!fake->user) + controlreply(sender, "%s!%s@%s (%s) - RECONNECTING", fake->nick, fake->ident, fake->host, fake->realname); else controlreply(sender, "%s!%s@%s (%s)", fake->nick, fake->ident, @@ -281,53 +257,54 @@ int fakelist(void *sender, int cargc, char **cargv) fakeusercount++; } + controlreply(sender, "%d fakeusers are currently connected", fakeusercount); + return CMD_OK; } -int fakekill(void *sender, int cargc, char **cargv) -{ +static int fakekill(void *sender, int cargc, char **cargv) { fakeuser *fake; + if (cargc == 0) return CMD_USAGE; fake = findfakeuserbynick(cargv[0]); - if(!fake) { + + if (!fake) { controlreply(sender, "No Fake User with nick %s found", cargv[0]); return CMD_ERROR; } - nofudb->squery(nofudb, "DELETE FROM ? WHERE nick = ?", "Ts", "fakeusers", fake->nick); controlreply(sender, "Killed fake user %s", fake->nick); controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) removed by %s/%s", fake->nick, fake->ident, - fake->host, fake->realname, ((nick*)sender)->nick, ((nick*)sender)->authname); + fake->host, fake->realname, ((nick *)sender)->nick, ((nick *)sender)->authname); - if( fake->user) { - if (cargc > 1) - deregisterlocaluser(fake->user, cargv[1]); - else - deregisterlocaluser(fake->user, "Signing off"); - } + fake_remove(fake); - fake_remove(cargv[0]); return CMD_OK; } -void schedulefakeuser(void *arg) { - fakeuser *fake; - for(fake = fakeuserlist; fake; fake = fake->next) { - if(!fake->user) { - fake->user=register_fakeuseronnet(fake); - } +void _init() { + if (!fakeuser_loaddb()) { + Error("fakeuser", ERR_FATAL, "Cannot load database"); + return; } + + registercontrolhelpcmd("fakeuser", NO_OPER, 4, &fakeadd, "Usage: FAKEUSER nick \nCreates a fake user."); + registercontrolhelpcmd("fakelist", NO_OPER, 0, &fakelist, "Usage: FAKELIST\nLists all fake users."); + registercontrolhelpcmd("fakekill", NO_OPER, 2, &fakekill, "Usage: FAKEKILL nick\nRemoves a fake user"); } -fakeuser* findfakeuserbynick(char *nick) { - fakeuser *fake; - for(fake=fakeuserlist;fake;fake=fake->next) { - if(!ircd_strcmp(nick, fake->nick)){ - return fake; - } +void _fini() { + fakeuser *fake, *next; + + for (fake = fakeuserlist; fake; fake = next) { + next = fake->next; + fake_free(fake); } - return NULL; + + deregistercontrolcmd("fakeuser", &fakeadd); + deregistercontrolcmd("fakelist", &fakelist); + deregistercontrolcmd("fakekill", &fakekill); }