]>
jfr.im git - irc/quakenet/newserv.git/blob - glines/glines_handler.c
3 #include "../localuser/localuserchannel.h"
9 #define Debug(...) Error("debuggline", ERR_DEBUG, ##__VA_ARGS__)
15 <prefix> GL <target> [!][+|-|>|<]<mask> [<expiration>] [<lastmod>] [<lifetime>] [:<reason>]
18 int handleglinemsg(void *source
, int cargc
, char **cargv
) {
19 char *sender
= (char *)source
;
23 time_t lifetime
= 0, expire
= 0, lastmod
= 0;
24 unsigned int flags
= 0;
31 * Valid GL tokens have X params:
32 * 2: Local modification to a local gline - ignored by services
35 * 6: 1.4.x GL Token - adds lifetime parameter
39 /* local modification which we reject later */
48 /* 1.4.0 and above GL token */
51 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 * 2 long numeric = server
58 * 5 long number = client
60 switch (strlen(source
)) {
62 creatornum
= numerictolong(sender
, 2);
64 Error("gline", ERR_WARNING
, "Failed to resolve numeric (%s) to server when adding G-Line from network!", sender
);
67 if (serverlist
[(int)creatornum
].name
== NULL
) {
68 Error("gline", ERR_WARNING
, "Received gline from non-existant server");
71 creator
= serverlist
[(int)creatornum
].name
->content
;
75 creatornum
= numerictolong(sender
, 5);
76 np
= getnickbynumeric(creatornum
);
78 Error("gline", ERR_WARNING
, "Failed to resolve numeric (%s) to nick when adding G-Line from network!", sender
);
84 Error("gline", ERR_WARNING
, "Invalid numeric '%s' in G-Line message.", sender
);
88 /* 2nd param is mask */
92 flags
|= GLINE_DESTROY
;
98 flags
|= GLINE_ACTIVATE
;
102 flags
|= GLINE_DEACTIVATE
;
107 Error("gline", ERR_WARNING
, "Received local modification from %s - do they realise we're a service?", sender
);
110 Error("gline", ERR_WARNING
, "Received 'forced gline' token from %s", sender
);
114 if (flags
& GLINE_ACTIVATE
) {
116 expire
= abs_expire(atoi(cargv
[2]));
119 /* asuka U:d, no lastmod */
126 lastmod
= atoi(cargv
[3]);
127 lifetime
= gline_max(lastmod
, expire
); /* set lifetime = lastmod */
132 lastmod
= atoi(cargv
[3]);
133 lifetime
= atoi(cargv
[4]);
137 Error("gline", ERR_WARNING
, "Gline Activate with invalid number (%d) of arguments", cargc
);
141 Debug("GL Received: Creator %s, Mask %s, Reason %s, Expire %lu, Lastmod %lu, Lifetime %lu", creator
, mask
, reason
, expire
, lastmod
, lifetime
);
143 agline
= findgline(mask
);
146 Debug("Update for existing gline received for %s - old lastmod %lu, expire %lu, lifetime %lu, reason %s, creator %s", mask
, agline
->lastmod
, agline
->expire
, agline
->lifetime
, agline
->reason
? agline
->reason
->content
: "", agline
->creator
->content
);
148 agline
->flags
|= GLINE_ACTIVE
;
150 /* check lastmod then assume the new gline is authoritive */
151 if (lastmod
> agline
->lastmod
) {
152 agline
->lastmod
= lastmod
;
153 agline
->expire
= expire
;
154 agline
->lifetime
= lifetime
;
155 freesstring(agline
->creator
);
156 agline
->creator
= getsstring(creator
, 255);
157 freesstring(agline
->reason
);
158 agline
->reason
= getsstring(reason
, 255);
160 Debug("received a gline with a lower lastmod");
161 /* Don't send our gline as that might cause loops in case we don't understand the gline properly. */
166 glinebufinit(&gbuf
, 0);
167 glinebufadd(&gbuf
, mask
, creator
, reason
, expire
, lastmod
, lifetime
);
168 glinebufcommit(&gbuf
, 0);
170 } else if (flags
& GLINE_DEACTIVATE
) {
171 /* deactivate gline */
172 agline
= findgline(mask
);
177 /* asuka U:d, no last mod */
182 lastmod
= atoi(cargv
[3]);
184 if (flags
& GLINE_DESTROY
)
185 gline_destroy(agline
, lastmod
, 0);
187 gline_deactivate(agline
, lastmod
, 0);
192 lastmod
= atoi(cargv
[3]);
194 if (flags
& GLINE_DESTROY
)
195 gline_destroy(agline
, lastmod
, 0);
197 gline_deactivate(agline
, lastmod
, 0);
201 Error("gline", ERR_WARNING
, "Gline Deactivate with invalid number (%d) of arguments", cargc
);
208 return; /* U:lined gline, we're done */
209 Error("gline", ERR_WARNING
, "Gline addition - adding deactivated gline - mask not found (%s)", mask
);
210 expire
= abs_expire(atoi(cargv
[2]));
214 lastmod
= atoi(cargv
[3]);
215 lifetime
= gline_max(lastmod
, expire
); /* set lifetime = lastmod */
220 lastmod
= atoi(cargv
[3]);
221 lifetime
= atoi(cargv
[4]);
225 Error("gline", ERR_WARNING
, "Gline DeActivate with invalid number (%d) of arguments", cargc
);
229 glinebufinit(&gbuf
, 0);
230 agline
= glinebufadd(&gbuf
, mask
, creator
, reason
, expire
, lastmod
, lifetime
);
233 glinebufabort(&gbuf
);
234 Error("gline", ERR_WARNING
, "gline_add failed");
238 gline_deactivate(agline
, lastmod
, 0);
239 glinebufcommit(&gbuf
, 0);
244 /* modification - only snircd 1.4.x */
245 agline
= findgline(mask
);
248 expire
= abs_expire(atoi(cargv
[2]));
249 lastmod
= atoi(cargv
[3]);
250 lifetime
= atoi(cargv
[4]);
253 if (lastmod
> agline
->lastmod
) {
254 agline
->lastmod
= lastmod
;
255 agline
->expire
= expire
;
256 agline
->lifetime
= lifetime
;
257 agline
->creator
= getsstring(creator
, 255);
258 freesstring(agline
->reason
);
259 agline
->reason
= getsstring(reason
, 255);
261 Debug("received a gline modification with a lower lastmod");
266 Debug("Received modification for G-Line that does not exist for mask %s", mask
);
274 void handleglinestats(int hooknum
, void *arg
) {
275 if ((long)arg
> 10) {
280 for(gl
= glinelist
; gl
; gl
= gl
->next
)
283 snprintf(message
, sizeof(message
), "G-Lines :%7d glines", glcount
);
284 triggerhook(HOOK_CORE_STATSREPLY
, message
);