]>
jfr.im git - irc/quakenet/newserv.git/blob - glines/glines_handler.c
3 #include "../localuser/localuserchannel.h"
7 <prefix> GL <target> [!][+|-|>|<]<mask> [<expiration>] [<lastmod>] [<lifetime>] [:<reason>]
10 int handleglinemsg(void *source
, int cargc
, char **cargv
) {
11 char *sender
= (char *)source
;
16 time_t lifetime
= 0, expire
= 0, lastmod
= 0;
17 unsigned int flags
= 0;
23 * Valid GL tokens have X params:
24 * 2: Local modification to a local gline - ignored by services
26 * 6: 1.4.x GL Token - adds lifetime parameter
30 /* local modification which we reject later */
36 /* 1.4.0 and above GL token */
39 Error("gline", ERR_WARNING
, "Invalid number of arguments in GL token (%d)", cargc
);
44 * Gline creator can be either a nick or a server
45 * 2 long numeric = server
46 * 5 long number = client
48 switch (strlen(source
)) {
50 creatornum
= numerictolong(sender
, 2);
52 Error("gline", ERR_WARNING
, "Failed to resolve numeric (%s) to server when adding G-Line from network!", sender
);
55 if (serverlist
[(int)creatornum
].name
== NULL
) {
56 Error("gline", ERR_WARNING
, "Received gline from non-existant server");
59 creator
= serverlist
[(int)creatornum
].name
->content
, HOSTLEN
;
63 creatornum
= numerictolong(sender
, 5);
64 np
= getnickbynumeric(creatornum
);
66 Error("gline", ERR_WARNING
, "Failed to resolve numeric (%s) to nick when adding G-Line from network!", sender
);
72 Error("gline", ERR_WARNING
, "Invalid numeric '%s' in G-Line message.", sender
);
76 /* 1st param is target */
79 /* anything other than a global G-Line is irrelevant */
80 if (strcmp(target
, "*") != 0) {
81 Error("gline", ERR_WARNING
, "Received local g-line from %s - do they realise we're a service?", sender
);
85 /* 2nd param is mask */
90 flags
|= GLINE_ACTIVATE
;
94 flags
|= GLINE_DEACTIVATE
;
99 Error("gline", ERR_WARNING
, "Received local modification from %s - do they realise we're a service?", sender
);
102 Error("gline", ERR_WARNING
, "Received 'forced gline' token from %s", sender
);
106 if (flags
& GLINE_ACTIVATE
) {
108 expire
= abs_expire(atoi(cargv
[2]));
111 /* asuka U:d, no lastmod */
116 lastmod
= atoi(cargv
[3]);
117 lifetime
= gline_max(lastmod
, expire
); /* set lifetime = lastmod */
122 lastmod
= atoi(cargv
[3]);
123 lifetime
= atoi(cargv
[4]);
127 Error("gline", ERR_WARNING
, "Gline Activate with invalid number (%d) of arguments", cargc
);
131 Error("debuggline", ERR_WARNING
, "GL Received: Creator %s, Mask %s, Reason %s, Expire %lu, Lastmod %lu, Lifetime %lu", creator
, mask
, reason
, expire
, lastmod
, lifetime
);
133 agline
= findgline(mask
);
136 if (agline
->flags
& GLINE_ACTIVE
) {
137 Error("debuggline", ERR_WARNING
, "Duplicate Gline recieved for %s - old lastmod %lu, expire %lu, lifetime %lu, reason %s, creator %s", mask
, agline
->lastmod
, agline
->expire
, agline
->lifetime
, agline
->reason
->content
, agline
->creator
->content
);
139 /* we're reactivating a gline - check lastmod then assume the new gline is authoritive */
140 if (lastmod
> agline
->lastmod
) {
141 agline
->lastmod
= lastmod
;
142 agline
->expire
= expire
;
143 agline
->lifetime
= lifetime
;
144 agline
->creator
= getsstring(creator
, 255);
145 freesstring(agline
->reason
);
146 agline
->reason
= getsstring(reason
, 255);
147 agline
->flags
|= GLINE_ACTIVE
;
149 Error("debuggline", ERR_WARNING
, "received a gline with a lower lastmod");
150 /* @@@TODO resend our gline ? */
156 gline_add(creator
, mask
, reason
, expire
, lastmod
, lifetime
);
158 } else if (flags
& GLINE_DEACTIVATE
) {
159 /* deactivate gline */
160 agline
= findgline(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
);
185 Error("gline", ERR_WARNING
, "Gline addition - adding deactivated gline - mask not found (%s)", mask
);
186 expire
= abs_expire(atoi(cargv
[2]));
189 /* asuka U:d, no lastmod */
194 lastmod
= atoi(cargv
[3]);
195 lifetime
= gline_max(lastmod
, expire
); /* set lifetime = lastmod */
200 lastmod
= atoi(cargv
[3]);
201 lifetime
= atoi(cargv
[4]);
205 Error("gline", ERR_WARNING
, "Gline DeActivate with invalid number (%d) of arguments", cargc
);
209 agline
= gline_add(creator
, mask
, reason
, expire
, lastmod
, lifetime
);
212 Error("gline", ERR_WARNING
, "gline_add failed");
216 gline_deactivate(agline
, lastmod
, 0);
221 /* modification - only snircd 1.4.x */
222 agline
= findgline(mask
);
225 expire
= abs_expire(atoi(cargv
[2]));
226 lastmod
= atoi(cargv
[3]);
227 lifetime
= atoi(cargv
[4]);
230 if (lastmod
> agline
->lastmod
) {
231 agline
->lastmod
= lastmod
;
232 agline
->expire
= expire
;
233 agline
->lifetime
= lifetime
;
234 agline
->creator
= getsstring(creator
, 255);
235 freesstring(agline
->reason
);
236 agline
->reason
= getsstring(reason
, 255);
238 Error("debuggline", ERR_WARNING
, "received a gline modification with a lower lastmod");
239 /* @@@TODO resend our gline ? */
244 Error("gline", ERR_WARNING
, "Received modification for G-Line that does not exist for mask %s", mask
);
252 void handleglinestats(int hooknum
, void *arg
) {
253 if ((long)arg
> 10) {
258 for(gl
= glinelist
; gl
; gl
= gl
->next
)
261 snprintf(message
, sizeof(message
), "G-Lines :%7d glines", glcount
);
262 triggerhook(HOOK_CORE_STATSREPLY
, message
);