]> jfr.im git - irc/quakenet/newserv.git/blame - gline/gline_handler.c
trusts changes
[irc/quakenet/newserv.git] / gline / gline_handler.c
CommitLineData
1151d736
P
1#include <string.h>
2
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"
14#include "gline.h"
15
16/*
17 <prefix> GL <target> [!][+|-|>|<]<mask> [<expiration>] [<lastmod>]
18 [<lifetime>] [:<reason>]
19*/
20
21int handleglinemsg(void* source, int cargc, char** cargv) {
22 char* sender = (char*)source;
23 char* target;
24 char* mask;
25 char* reason;
26 sstring *creator;
27 time_t lifetime = 0, expires = 0, lastmod = 0;
28 unsigned int flags = 0;
29 int numlen;
30 long creatornum;
31 gline *agline;
32
33 nick* np;
34
35 int i;
36 for (i = 0; i <cargc; i++) {
37 Error("debuggline", ERR_WARNING, "Token %d is - %s", i, cargv[i]);
38 }
39
40 /* valid GL tokens have X params */
41 switch ( cargc ) {
42 case 5:
43 /* 1.3.x GL Token */
44 break;
45 case 6:
46 /* 1.4.0 and above GL token */
47 break;
48 default:
49 Error("gline", ERR_WARNING, "Invalid number of arguments in GL token (%d)", cargc);
50 return CMD_ERROR;
51 }
52
53 /* gline creator can be either a nick or a server */
54 numlen = strlen(source);
55 switch (numlen) {
56 case 2:
57 creatornum = numerictolong(sender, 2);
58 if (creatornum < 0) {
59 Error("gline", ERR_WARNING, "Failed to resolve numeric to server (%s) when adding G-Line!", sender);
60 creator = getsstring("unknown", HOSTLEN);
61 } else
62 creator = getsstring(serverlist[(int)creatornum].name->content, HOSTLEN);
63 break;
64 case 5:
65 creatornum = numerictolong(sender, 5);
66 if (!(np = getnickbynumeric(creatornum))) {
67 Error("gline", ERR_WARNING, "Failed to resolve numeric to nick when adding G-Line!", sender);
68 creator = getsstring("unknown", HOSTLEN);
69 } else
70 creator = getsstring( np->nick, NICKLEN);
71 break;
72 default:
73 Error("gline", ERR_WARNING, "Invalid numeric '%s' in G-Line message.", sender);
74 }
75
76 /* 1st param is target */
77 target = cargv[0];
78
79 /* 2nd param is mask */
80 mask = cargv[1];
81
82 if (*mask == '!') {
83 Error("gline", ERR_DEBUG, " forced flag ");
84 mask++;
85 }
86
87 switch (*mask) {
88 case '+':
89 flags |= GLINE_ACTIVATE;
90 mask++;
91 break;
92 case '-':
93 flags |= GLINE_DEACTIVATE;
94 mask++;
95 break;
96 case '>':
97 case '<':
98 Error("gline", ERR_WARNING, "Received local modification from %s.", sender);
99 return CMD_ERROR;
100 }
101
102 /* anything other than a global G-Line is irrelevant */
103 if (strcmp(target, "*")) {
104 Error("gline", ERR_WARNING, "Received local g-line from %s - do they realise we're a service?", sender);
105 return CMD_ERROR;
106 }
107
108 if (flags & GLINE_ACTIVATE) {
109 /* activate gline */
110 expires = abs_expire(atoi(cargv[2]));
111 switch (cargc) {
112 case 4:
113 /* asuka U:d, no lastmod */
114 reason = cargv[3];
115 break;
116 case 5:
117 /*asuka lastmod */
118 lastmod = atoi(cargv[3]);
119 lifetime = gline_max(lastmod,expires); /* set lifetime = lastmod */
120 reason = cargv[4];
121 break;
122 case 6:
123 /* snircd */
124 lastmod = atoi(cargv[3]);
125 lifetime = atoi(cargv[4]);
126 reason = cargv[5];
127 break;
128 default:
129 Error("gline", ERR_WARNING, "Gline Activate with invalid number (%d) of arguments", cargc);
130 return CMD_ERROR;
131 }
132
133 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);
134 if ( (agline=gline_find(mask)) ) {
135 if (agline->flags & GLINE_ACTIVE ) {
136 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 );
137 } else {
138 /* we're reactivating a gline - check lastmod then assume the new gline is authoritive */
139 if ( lastmod > agline->lastmod ) {
140 agline->lastmod = lastmod;
141 agline->expires = expires;
142 agline->lifetime = lifetime;
143 agline->creator = creator;
144 freesstring(agline->reason);
145 agline->reason = getsstring(reason, 255);
146 agline->flags |= GLINE_ACTIVE;
147 } else {
148 Error("debuggline", ERR_WARNING, "received a gline with a lower lastmod");
149 /* @@@TODO resend our gline ? */
150 }
151 }
152 /* TODO */
153 return CMD_ERROR;
154 } else {
155 gline_add( creatornum, creator, mask, reason, expires, lastmod, lifetime);
156 }
157 } else if (flags & GLINE_DEACTIVATE) {
158 /* deactivate gline */
159 if ((agline = gline_find(mask))) {
160 switch (cargc) {
161 case 2:
162 /* asuka U:d, no last mod */
163 removegline(agline);
164 break;
165 case 5:
166 /* asuka last mod */
167 lastmod = atoi(cargv[3]);
168 gline_deactivate(agline, lastmod, 0);
169 break;
170 case 6:
171 /* snircd */
172 lastmod = atoi(cargv[3]);
173 gline_deactivate(agline, lastmod, 0);
174 break;
175 default:
176 Error("gline", ERR_WARNING, "Gline Deactivate with invalid number (%d) of arguments", cargc);
177 return CMD_ERROR;
178 }
179 return CMD_OK;
180 } else {
181 Error("gline", ERR_WARNING, "Gline addition - adding deactivated gline - mask not found (%s)", mask);
182 expires = abs_expire(atoi(cargv[2]));
183 switch (cargc) {
184 case 4:
185 /* asuka U:d, no lastmod */
186 reason = cargv[3];
187 break;
188 case 5:
189 /*asuka lastmod */
190 lastmod = atoi(cargv[3]);
191 lifetime = gline_max(lastmod,expires); /* set lifetime = lastmod */
192 reason = cargv[4];
193 break;
194 case 6:
195 /* snircd */
196 lastmod = atoi(cargv[3]);
197 lifetime = atoi(cargv[4]);
198 reason = cargv[5];
199 break;
200 default:
201 Error("gline", ERR_WARNING, "Gline DeActivate with invalid number (%d) of arguments", cargc);
202 return CMD_ERROR;
203 }
204
205 agline = gline_add( creatornum, creator, mask, reason, expires, lastmod, lifetime);
206 gline_deactivate(agline, lastmod, 0);
207 return CMD_ERROR;
208 }
209 } else {
210 /* modification - only snircd 1.4.x */
211 Error("gline", ERR_WARNING, "Not Implemented");
212 }
213
214 Error("debuggline", ERR_WARNING, "Creator %s", creator->content);
215 return CMD_OK;
216}
217
218
219int gline_deactivate(gline *agline, time_t lastmod, int propagate) {
220 agline->flags &= ~GLINE_ACTIVE;
221 agline->lastmod = lastmod;
222}