]>
jfr.im git - irc/quakenet/newserv.git/blob - glines2/gline_handler.c
3 #include "../control/control.h"
4 #include "../nick/nick.h"
5 #include "../localuser/localuserchannel.h"
6 #include "../core/hooks.h"
7 #include "../server/server.h"
8 #include "../parser/parser.h"
9 #include "../core/schedule.h"
10 #include "../lib/array.h"
11 #include "../lib/base64.h"
12 #include "../lib/irc_string.h"
13 #include "../lib/splitline.h"
17 <prefix> GL <target> [!][+|-|>|<]<mask> [<expiration>] [<lastmod>]
18 [<lifetime>] [:<reason>]
21 int handleglinemsg(void* source
, int cargc
, char** cargv
) {
22 char* sender
= (char*)source
;
27 time_t lifetime
= 0, expires
= 0, lastmod
= 0;
28 unsigned int flags
= 0;
36 for (i
= 0; i
<cargc
; i
++) {
37 Error("debuggline", ERR_WARNING
, "Token %d is - %s", i
, cargv
[i
]);
40 /* valid GL tokens have X params */
43 /* local modification which we reject later */
49 /* 1.4.0 and above GL token */
52 Error("gline", ERR_WARNING
, "Invalid number of arguments in GL token (%d)", cargc
);
56 /* gline creator can be either a nick or a server */
57 numlen
= strlen(source
);
60 creatornum
= numerictolong(sender
, 2);
62 Error("gline", ERR_WARNING
, "Failed to resolve numeric to server (%s) when adding G-Line!", sender
);
63 creator
= getsstring("unknown", HOSTLEN
);
65 creator
= getsstring(serverlist
[(int)creatornum
].name
->content
, HOSTLEN
);
68 creatornum
= numerictolong(sender
, 5);
69 if (!(np
= getnickbynumeric(creatornum
))) {
70 Error("gline", ERR_WARNING
, "Failed to resolve numeric to nick when adding G-Line!", sender
);
71 creator
= getsstring("unknown", HOSTLEN
);
73 creator
= getsstring( np
->nick
, NICKLEN
);
76 Error("gline", ERR_WARNING
, "Invalid numeric '%s' in G-Line message.", sender
);
79 /* 1st param is target */
82 /* 2nd param is mask */
86 Error("gline", ERR_DEBUG
, " forced flag ");
92 flags
|= GLINE_ACTIVATE
;
96 flags
|= GLINE_DEACTIVATE
;
101 Error("gline", ERR_WARNING
, "Received local modification from %s - do they realise we're a service?", sender
);
105 /* anything other than a global G-Line is irrelevant */
106 if (strcmp(target
, "*")) {
107 Error("gline", ERR_WARNING
, "Received local g-line from %s - do they realise we're a service?", sender
);
111 if (flags
& GLINE_ACTIVATE
) {
113 expires
= abs_expire(atoi(cargv
[2]));
116 /* asuka U:d, no lastmod */
121 lastmod
= atoi(cargv
[3]);
122 lifetime
= gline_max(lastmod
,expires
); /* set lifetime = lastmod */
127 lastmod
= atoi(cargv
[3]);
128 lifetime
= atoi(cargv
[4]);
132 Error("gline", ERR_WARNING
, "Gline Activate with invalid number (%d) of arguments", cargc
);
136 Error("debuggline", ERR_WARNING
, "GL Received: Creator %s, Mask %s, Reason %s, Expire %lu, Lastmod %lu, Lifetime %lu", creator
->content
, mask
, reason
, expires
, lastmod
, lifetime
);
137 if ( (agline
=gline_find(mask
)) ) {
138 if (agline
->flags
& GLINE_ACTIVE
) {
139 Error("debuggline", ERR_WARNING
, "Duplicate Gline recieved for %s - old lastmod %lu, expire %lu, lifetime %lu, reason %s, creator %s", mask
, agline
->lastmod
, agline
->expires
, agline
->lifetime
, agline
->reason
->content
, agline
->creator
->content
);
141 /* we're reactivating a gline - check lastmod then assume the new gline is authoritive */
142 if ( lastmod
> agline
->lastmod
) {
143 agline
->lastmod
= lastmod
;
144 agline
->expires
= expires
;
145 agline
->lifetime
= lifetime
;
146 agline
->creator
= creator
;
147 freesstring(agline
->reason
);
148 agline
->reason
= getsstring(reason
, 255);
149 agline
->flags
|= GLINE_ACTIVE
;
151 Error("debuggline", ERR_WARNING
, "received a gline with a lower lastmod");
152 /* @@@TODO resend our gline ? */
158 gline_add( creatornum
, creator
, mask
, reason
, expires
, lastmod
, lifetime
);
160 } else if (flags
& GLINE_DEACTIVATE
) {
161 /* deactivate gline */
162 if ((agline
= gline_find(mask
))) {
165 /* asuka U:d, no last mod */
170 lastmod
= atoi(cargv
[3]);
171 gline_deactivate(agline
, lastmod
, 0);
175 lastmod
= atoi(cargv
[3]);
176 gline_deactivate(agline
, lastmod
, 0);
179 Error("gline", ERR_WARNING
, "Gline Deactivate with invalid number (%d) of arguments", cargc
);
184 Error("gline", ERR_WARNING
, "Gline addition - adding deactivated gline - mask not found (%s)", mask
);
185 expires
= abs_expire(atoi(cargv
[2]));
188 /* asuka U:d, no lastmod */
193 lastmod
= atoi(cargv
[3]);
194 lifetime
= gline_max(lastmod
,expires
); /* set lifetime = lastmod */
199 lastmod
= atoi(cargv
[3]);
200 lifetime
= atoi(cargv
[4]);
204 Error("gline", ERR_WARNING
, "Gline DeActivate with invalid number (%d) of arguments", cargc
);
208 agline
= gline_add( creatornum
, creator
, mask
, reason
, expires
, lastmod
, lifetime
);
209 gline_deactivate(agline
, lastmod
, 0);
213 /* modification - only snircd 1.4.x */
214 if ((agline
= gline_find(mask
))) {
215 expires
= abs_expire(atoi(cargv
[2]));
216 lastmod
= atoi(cargv
[3]);
217 lifetime
= atoi(cargv
[4]);
220 if ( lastmod
> agline
->lastmod
) {
221 agline
->lastmod
= lastmod
;
222 agline
->expires
= expires
;
223 agline
->lifetime
= lifetime
;
224 agline
->creator
= creator
;
225 freesstring(agline
->reason
);
226 agline
->reason
= getsstring(reason
, 255);
228 Error("debuggline", ERR_WARNING
, "received a gline modification with a lower lastmod");
229 /* @@@TODO resend our gline ? */
233 Error("gline", ERR_WARNING
, "Received modification for gline that does not exist for mask %s", mask
);
238 Error("debuggline", ERR_WARNING
, "Creator %s", creator
->content
);
243 int gline_deactivate(gline
*agline
, time_t lastmod
, int propagate
) {
244 agline
->flags
&= ~GLINE_ACTIVE
;
245 agline
->lastmod
= lastmod
;