]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanserv_protect.c
2 * Nick protection system for the chanserv
6 #include "../core/schedule.h"
7 #include "../localuser/localuser.h"
10 #define PROTECTTIME 60 /* How long you have to renick if you encroach.. */
12 void csp_handlenick(int hooknum
, void *arg
);
13 void csp_freenick(int hooknum
, void *arg
);
14 void csp_timerfunc (void *arg
);
15 int csp_doclaimnick(void *source
, int cargc
, char **cargv
);
18 registerhook(HOOK_NICK_NEWNICK
, csp_handlenick
);
19 registerhook(HOOK_NICK_RENAME
, csp_handlenick
);
21 registerhook(HOOK_NICK_NEWNICK
, csp_freenick
);
22 registerhook(HOOK_NICK_ACCOUNT
, csp_freenick
);
24 chanservaddcommand("claimnick", QCMD_HELPER
, 0, csp_doclaimnick
,
25 "Reclaims your nickname if it has been stolen.");
32 deregisterhook(HOOK_NICK_NEWNICK
, csp_handlenick
);
33 deregisterhook(HOOK_NICK_RENAME
, csp_handlenick
);
35 deregisterhook(HOOK_NICK_NEWNICK
, csp_freenick
);
36 deregisterhook(HOOK_NICK_ACCOUNT
, csp_freenick
);
38 chanservremovecommand("claimnick", csp_doclaimnick
);
39 deleteallschedules(csp_timerfunc
);
41 /* Kill off all fakeusers too */
42 for (i
=0;i
<REGUSERHASHSIZE
;i
++)
43 for (rup
=regusernicktable
[i
];rup
;rup
=rup
->nextbyname
)
45 if (getnickbynick(rup
->username
) == rup
->fakeuser
) {
46 deregisterlocaluser(rup
->fakeuser
,NULL
);
52 void csp_handlenick(int hooknum
, void *arg
) {
56 /* Check that it's a protected nick */
57 if (!(rup
=findreguserbynick(np
->nick
)) || !UIsProtect(rup
))
60 /* If we already had a timer running, this means someone renamed off and back.
61 * Clear the old timer.
64 deleteschedule(rup
->checkshd
, csp_timerfunc
, rup
);
68 /* If they're an oper, or the legal user of the nick, it's OK */
69 /* Also, don't warn them if they are a fakeuser */
70 if (getreguserfromnick(np
)==rup
) {
75 if (IsOper(np
) || homeserver(np
->numeric
)==mylongnum
)
78 /* OK, at this stage we've established that:
79 * - This is a protected nick
80 * - The person using it isn't authed as the correct user
84 chanservstdmessage(np
, QM_PROTECTEDNICK
, rup
->username
);
86 /* Schedule checkup */
87 rup
->checkshd
=scheduleoneshot(time(NULL
)+PROTECTTIME
, csp_timerfunc
, rup
);
90 void csp_freenick(int hooknum
, void *arg
) {
92 reguser
*rup
=getreguserfromnick(np
);
94 if (!rup
|| !UIsProtect(rup
))
98 deleteschedule(rup
->checkshd
, csp_timerfunc
, rup
);
104 /* Before killing, check the user is valid */
105 if (getnickbynick(rup
->username
) == rup
->fakeuser
) {
106 /* Free up the fakeuser */
107 deregisterlocaluser(rup
->fakeuser
, NULL
);
109 chanservstdmessage(np
, QM_NICKWASFAKED
, rup
->username
);
114 void csp_timerfunc (void *arg
) {
120 /* Check that we still have a user with this name and
121 * that they're not now opered or authed.. */
122 if (!(np
=getnickbynick(rup
->username
)) || IsOper(np
) || (getreguserfromnick(np
)==rup
))
125 /* KILL! KILL! KILL! */
126 killuser(chanservnick
, np
, "Protected nick.");
130 /* If it's been stolen too much, create a fake user.. */
131 if (rup
->stealcount
>= 3) {
132 rup
->fakeuser
=registerlocaluser(rup
->username
, "reserved", "nick", "Protected nick.", NULL
, UMODE_INV
, NULL
);
136 int csp_doclaimnick(void *source
, int cargc
, char **cargv
) {
138 reguser
*rup
=getreguserfromnick(sender
);
144 if (!UIsProtect(rup
)) {
145 chanservstdmessage(sender
, QM_NOTPROTECTED
,rup
->username
);
149 if (!(target
=getnickbynick(rup
->username
))) {
150 chanservstdmessage(sender
, QM_UNKNOWNUSER
, rup
->username
);
154 if (getreguserfromnick(target
)==rup
) {
155 chanservstdmessage(sender
, QM_SAMEAUTH
, target
->nick
, rup
->username
);
159 if (rup
->fakeuser
==target
) {
160 deregisterlocaluser(rup
->fakeuser
, NULL
);
164 killuser(chanservnick
, target
, "Protected nick.");
167 chanservstdmessage(sender
, QM_DONE
);