]>
jfr.im git - irc/quakenet/newserv.git/blob - fakeusers/fakeusers.c
2 * NOperserv Fakeuser module
4 * Allows fakeusers to be added so as to block nicks, for example.
6 * Copyright (c) Tim Gordon 2006.
9 #include "../core/schedule.h"
10 #include "../localuser/localuser.h"
11 #include "../localuser/localuserchannel.h"
12 #include "../irc/irc_config.h"
13 #include "../lib/irc_string.h"
14 #include "../control/control.h"
15 #include "../channel/channel.h"
16 #include "../dbapi2/dbapi2.h"
17 #include "../lib/strlfunc.h"
18 #include "../lib/version.h"
27 typedef struct fakeuser
{
28 char nick
[NICKLEN
+ 1];
29 char ident
[USERLEN
+ 1];
30 char host
[HOSTLEN
+ 1];
31 char realname
[REALLEN
+ 1];
34 struct fakeuser
*next
;
37 static fakeuser
*fakeuserlist
;
38 static DBAPIConn
*nofudb
;
40 static void reconnectfakeuser(void *arg
);
42 static fakeuser
*findfakeuserbynick(char *nick
) {
45 for (fake
= fakeuserlist
; fake
; fake
= fake
->next
)
46 if (!ircd_strcmp(nick
, fake
->nick
))
52 static void fake_free(fakeuser
*fake
) {
56 deregisterlocaluser(fake
->user
, "Signing off");
58 deleteschedule(NULL
, &reconnectfakeuser
, fake
);
60 for (pnext
= &fakeuserlist
; *pnext
; pnext
= &((*pnext
)->next
)) {
70 static void fake_remove(fakeuser
*fake
) {
71 nofudb
->squery(nofudb
, "DELETE FROM ? WHERE nick = ?", "Ts", "fakeusers", fake
->nick
);
76 static void fakeuser_handler(nick
*user
, int command
, void **params
) {
77 if (command
== LU_KILLED
) {
79 time_t timenow
= time(NULL
);
81 fake
= findfakeuserbynick(user
->nick
);
84 controlwall(NO_OPER
, NL_FAKEUSERS
, "Error: A fakeuser was killed, but wasn't found in the list");
85 Error("fakeuser", ERR_ERROR
, "A fakeuser was killed, but wasn't found in the list");
91 if (timenow
- fake
->lastkill
< KILL_TIME
) {
92 controlwall(NO_OPER
, NL_FAKEUSERS
, "Fake user %s!%s@%s (%s) KILL'ed twice under in %d seconds. Removing.",
93 fake
->nick
, fake
->ident
, fake
->host
, fake
->realname
, KILL_TIME
);
98 fake
->lastkill
= timenow
;
100 scheduleoneshot(time(NULL
) + KILL_WAIT
, &reconnectfakeuser
, fake
);
104 static void reconnectfakeuser(void *arg
) {
105 fakeuser
*fake
= arg
;
111 if ((user
= getnickbynick(fake
->nick
)) && (IsOper(user
) || IsService(user
) || IsXOper(user
)))
114 fake
->user
= registerlocaluser(fake
->nick
, fake
->ident
, fake
->host
, fake
->realname
,
115 NULL
, UMODE_INV
| UMODE_DEAF
, &fakeuser_handler
);
118 static fakeuser
*fake_add(const char *nick
, const char *ident
, const char *host
, const char *realname
) {
121 fake
= malloc(sizeof(fakeuser
));
126 strlcpy(fake
->nick
, nick
, NICKLEN
+ 1);
127 strlcpy(fake
->ident
, ident
, USERLEN
+ 1);
128 strlcpy(fake
->host
, host
, HOSTLEN
+ 1);
129 strlcpy(fake
->realname
, realname
, REALLEN
+ 1);
134 fake
->next
= fakeuserlist
;
137 scheduleoneshot(time(NULL
) + 1, reconnectfakeuser
, fake
);
142 static fakeuser
*fake_create(const char *nick
, const char *ident
, const char *host
, const char *realname
) {
145 fake
= fake_add(nick
, ident
, host
, realname
);
150 nofudb
->squery(nofudb
, "INSERT INTO ? (nick, ident, host, realname) VALUES (?,?,?,?)", "Tssss", "fakeusers",
151 fake
->nick
, fake
->ident
, fake
->host
, fake
->realname
);
156 static void fakeusers_load(const DBAPIResult
*res
, void *arg
) {
161 Error("fakeuser", ERR_ERROR
, "Error loading fakeuser list.");
166 while (res
->next(res
))
167 fake_add(res
->get(res
, 0), res
->get(res
, 1), res
->get(res
, 2), res
->get(res
, 3));
172 static int fakeuser_loaddb() {
174 nofudb
= dbapi2open(DBAPI2_DEFAULT
, "fakeusers");
177 Error("fakeuser", ERR_STOP
, "Could not connect to database.");
182 nofudb
->createtable(nofudb
, NULL
, NULL
,
184 "nick VARCHAR(?) NOT NULL,"
185 "ident VARCHAR(?) NOT NULL,"
186 "host VARCHAR(?) NOT NULL,"
187 "realname VARCHAR(?) NOT NULL,"
188 "PRIMARY KEY (nick))", "Tdddd", "fakeusers", NICKLEN
, USERLEN
, HOSTLEN
, REALLEN
);
190 nofudb
->query(nofudb
, fakeusers_load
, NULL
,
191 "SELECT nick, ident, host, realname FROM ?", "T", "fakeusers");
196 static int fakeadd(void *source
, int cargc
, char **cargv
) {
197 nick
*sender
= source
;
199 char *nick
, *ident
, *realname
;
200 char host
[HOSTLEN
+ 1];
205 fake
= findfakeuserbynick(cargv
[0]);
208 controlreply(sender
, "Fake User with nick %s already found", cargv
[0]);
220 strlcpy(host
, cargv
[0], NICKLEN
+ 1);
221 strlcat(host
, ".fakeusers.quakenet.org", HOSTLEN
+ 1);
223 strlcpy(host
, cargv
[2], HOSTLEN
+ 1);
230 fake
= fake_create(nick
, ident
, host
, realname
);
235 controlreply(sender
, "Added fake user %s", fake
->nick
);
236 controlwall(NO_OPER
, NL_FAKEUSERS
, "%s added fake user: %s!%s@%s (%s)", controlid(sender
),
237 fake
->nick
, fake
->ident
, fake
->host
, fake
->realname
);
239 scheduleoneshot(time(NULL
) + 1, &reconnectfakeuser
, fake
);
243 static int fakelist(void *sender
, int cargc
, char **cargv
) {
245 int fakeusercount
= 0;
247 for (fake
= fakeuserlist
; fake
; fake
= fake
->next
) {
249 controlreply(sender
, "%s!%s@%s (%s) - RECONNECTING", fake
->nick
, fake
->ident
,
250 fake
->host
, fake
->realname
);
252 controlreply(sender
, "%s!%s@%s (%s)", fake
->nick
, fake
->ident
,
253 fake
->host
, fake
->realname
);
258 controlreply(sender
, "%d fakeusers are currently connected", fakeusercount
);
262 static int fakekill(void *sender
, int cargc
, char **cargv
) {
268 fake
= findfakeuserbynick(cargv
[0]);
271 controlreply(sender
, "No Fake User with nick %s found", cargv
[0]);
275 nofudb
->squery(nofudb
, "DELETE FROM ? WHERE nick = ?", "Ts", "fakeusers", fake
->nick
);
276 controlreply(sender
, "Killed fake user %s", fake
->nick
);
277 controlwall(NO_OPER
, NL_FAKEUSERS
, "Fake user %s!%s@%s (%s) removed by %s/%s", fake
->nick
, fake
->ident
,
278 fake
->host
, fake
->realname
, ((nick
*)sender
)->nick
, ((nick
*)sender
)->authname
);
285 if (!fakeuser_loaddb()) {
286 Error("fakeuser", ERR_FATAL
, "Cannot load database");
290 registercontrolhelpcmd("fakeuser", NO_OPER
, 4, &fakeadd
, "Usage: FAKEUSER nick <ident> <host> <realname>\nCreates a fake user.");
291 registercontrolhelpcmd("fakelist", NO_OPER
, 0, &fakelist
, "Usage: FAKELIST\nLists all fake users.");
292 registercontrolhelpcmd("fakekill", NO_OPER
, 2, &fakekill
, "Usage: FAKEKILL nick\nRemoves a fake user");
296 fakeuser
*fake
, *next
;
298 for (fake
= fakeuserlist
; fake
; fake
= next
) {
303 deregistercontrolcmd("fakeuser", &fakeadd
);
304 deregistercontrolcmd("fakelist", &fakelist
);
305 deregistercontrolcmd("fakekill", &fakekill
);