]> jfr.im git - irc/evilnet/x3.git/blob - patches/asuka-sethost.diff
Fix for crash on BURST (B) message for a channel with +L, at least one ban or except...
[irc/evilnet/x3.git] / patches / asuka-sethost.diff
1 diff -urN srvx_original2/hash.h apples_backup/hash.h
2 --- srvx_original2/hash.h Mon Jun 2 22:05:38 2003
3 +++ apples_backup/hash.h Mon Jun 2 21:53:53 2003
4 @@ -48,7 +48,11 @@
5 #define FLAGS_DEAF 0x0020 /* deaf +d */
6 #define FLAGS_SERVICE 0x0040 /* cannot be kicked, killed or deoped +k */
7 #define FLAGS_GLOBAL 0x0080 /* receives global messages +g */
8 -#define FLAGS_HELPER 0x0100 /* (network?) helper +h */
9 +
10 +// apples - sethost
11 +// #define FLAGS_HELPER 0x0100 /* (network?) helper +h */
12 +#define FLAGS_SETHOST 0x0100 /* for +h */
13 +
14 #define FLAGS_PERSISTENT 0x0200 /* for reserved nicks, this isn't just one-shot */
15 #define FLAGS_GAGGED 0x0400 /* for gagged users */
16 #define FLAGS_AWAY 0x0800 /* for away users */
17 @@ -63,7 +67,11 @@
18 #define IsGlobal(x) ((x)->modes & FLAGS_GLOBAL)
19 #define IsWallOp(x) ((x)->modes & FLAGS_WALLOP)
20 #define IsServNotice(x) ((x)->modes & FLAGS_SERVNOTICE)
21 -#define IsHelperIrcu(x) ((x)->modes & FLAGS_HELPER)
22 +
23 +// apples - sethost
24 +// #define IsHelperIrcu(x) ((x)->modes & FLAGS_HELPER)
25 +#define IsSetHost(x) ((x)->modes & FLAGS_SETHOST)
26 +
27 #define IsGagged(x) ((x)->modes & FLAGS_GAGGED)
28 #define IsAway(x) ((x)->modes & FLAGS_AWAY)
29 #define IsStamped(x) ((x)->modes & FLAGS_STAMPED)
30 @@ -103,6 +111,9 @@
31 unsigned int dead : 1;
32 unsigned long ip;
33 long modes; /* user flags +isw etc... */
34 +
35 + // apples - sethost
36 + char sethost[USERLEN + HOSTLEN + 2]; /* 1 for '\0' and 1 for @ = 2 */
37
38 time_t timestamp;
39 struct server *uplink;
40 diff -urN srvx_original2/opserv.c apples_backup/opserv.c
41 --- srvx_original2/opserv.c Mon Jun 2 22:05:20 2003
42 +++ apples_backup/opserv.c Mon Jun 2 21:54:03 2003
43 @@ -1229,7 +1229,11 @@
44 if (IsOper(target)) buffer[bpos++] = 'o';
45 if (IsGlobal(target)) buffer[bpos++] = 'g';
46 if (IsServNotice(target)) buffer[bpos++] = 's';
47 - if (IsHelperIrcu(target)) buffer[bpos++] = 'h';
48 +
49 + // apples - sethost
50 + // if (IsHelperIrcu(target)) buffer[bpos++] = 'h';
51 + if (IsSetHost(target)) buffer[bpos++] = 'h';
52 +
53 if (IsService(target)) buffer[bpos++] = 'k';
54 if (IsDeaf(target)) buffer[bpos++] = 'd';
55 if (IsHiddenHost(target)) buffer[bpos++] = 'x';
56 diff -urN srvx_original2/proto-common.c apples_backup/proto-common.c
57 --- srvx_original2/proto-common.c Mon Jun 2 22:05:06 2003
58 +++ apples_backup/proto-common.c Mon Jun 2 21:53:46 2003
59 @@ -537,13 +537,26 @@
60 nickname = "*";
61 }
62 if (options & GENMASK_STRICT_IDENT) {
63 - ident = user->ident;
64 + // apples - sethost
65 + if (IsSetHost(user)) {
66 + ident = alloca(strcspn(user->sethost, "@")+2);
67 + safestrncpy(ident, user->sethost, strcspn(user->sethost, "@")+1);
68 + }
69 + else
70 + ident = user->ident;
71 } else if (options & GENMASK_ANY_IDENT) {
72 ident = "*";
73 } else {
74 - ident = alloca(strlen(user->ident)+2);
75 - ident[0] = '*';
76 - strcpy(ident+1, user->ident + ((*user->ident == '~')?1:0));
77 + // apples - sethost
78 + if (IsSetHost(user)) {
79 + ident = alloca(strcspn(user->sethost, "@")+3);
80 + ident[0] = '*';
81 + safestrncpy(ident+1, user->sethost, strcspn(user->sethost, "@")+1);
82 + } else {
83 + ident = alloca(strlen(user->ident)+2);
84 + ident[0] = '*';
85 + strcpy(ident+1, user->ident + ((*user->ident == '~')?1:0));
86 + }
87 }
88 hostname = user->hostname;
89 if (IsHiddenHost(user) && user->handle_info && hidden_host_suffix && !(options & GENMASK_NO_HIDING)) {
90 @@ -604,15 +617,20 @@
91 sprintf(hostname, "*.%s", user->hostname+ii+2);
92 }
93 }
94 - /* Emit hostmask */
95 - len = strlen(ident) + strlen(hostname) + 2;
96 - if (nickname) {
97 - len += strlen(nickname) + 1;
98 - mask = malloc(len);
99 - sprintf(mask, "%s!%s@%s", nickname, ident, hostname);
100 - } else {
101 - mask = malloc(len);
102 - sprintf(mask, "%s@%s", ident, hostname);
103 - }
104 + // apples - sethost
105 + if (IsSetHost(user))
106 + hostname = strchr(user->sethost, '@') + 1;
107 +
108 + /* Emit hostmask */
109 + len = strlen(ident) + strlen(hostname) + 2;
110 + if (nickname) {
111 + len += strlen(nickname) + 1;
112 + mask = malloc(len);
113 + sprintf(mask, "%s!%s@%s", nickname, ident, hostname);
114 + } else {
115 + mask = malloc(len);
116 + sprintf(mask, "%s@%s", ident, hostname);
117 + }
118 +
119 return mask;
120 }
121 diff -urN srvx_original2/proto-p10.c apples_backup/proto-p10.c
122 --- srvx_original2/proto-p10.c Mon Jun 2 22:04:54 2003
123 +++ apples_backup/proto-p10.c Mon Jun 2 21:53:32 2003
124 @@ -293,7 +293,8 @@
125 static unsigned int num_notice_funcs;
126 static struct dict *unbursted_channels;
127
128 -static struct userNode *AddUser(struct server* uplink, const char *nick, const char *ident, const char *hostname, const char *modes, const char *account, const char *numeric, const char *userinfo, time_t timestamp, const char *realip);
129 +// apples - sethost
130 +static struct userNode *AddUser(struct server* uplink, const char *nick, const char *ident, const char *hostname, const char *modes, const char *account, const char *numeric, const char *userinfo, time_t timestamp, const char *realip, const char *sethost);
131
132 /* Numerics can be XYY, XYYY, or XXYYY; with X's identifying the
133 * server and Y's indentifying the client on that server. */
134 @@ -397,7 +398,11 @@
135 if (IsServNotice(user)) modes[modelen++] = 's';
136 if (IsDeaf(user)) modes[modelen++] = 'd';
137 if (IsGlobal(user)) modes[modelen++] = 'g';
138 - if (IsHelperIrcu(user)) modes[modelen++] = 'h';
139 +
140 + // apples - set host
141 + // if (IsHelperIrcu(user)) modes[modelen++] = 'h';
142 + if (IsSetHost(user)) modes[modelen++] = 'h';
143 +
144 if (IsHiddenHost(user)) modes[modelen++] = 'x';
145 modes[modelen] = 0;
146
147 @@ -948,6 +953,8 @@
148 static CMD_FUNC(cmd_nick)
149 {
150 struct userNode *user;
151 + int i; // apples - sethost
152 +
153 if ((user = GetUserH(origin))) {
154 /* nick change (since the source is a user numeric) */
155 if (argc < 2) return 0;
156 @@ -959,14 +966,26 @@
157 serv = GetServerH(origin);
158 if (argv[6][0] == '+') {
159 if (argc < 10) return 0;
160 - if (argc > 10) {
161 - /* The user is +r and has an ACCOUNT stamp in argv[7]. */
162 - AddUser(serv, argv[1], argv[4], argv[5], argv[6], argv[7], argv[9], argv[argc-1], atoi(argv[3]), argv[8]);
163 - } else {
164 - AddUser(serv, argv[1], argv[4], argv[5], argv[6], NULL, argv[8], argv[argc-1], atoi(argv[3]), argv[7]);
165 +
166 + // apples - sethost
167 + if ((strchr(argv[6],'h')) && (strchr(argv[6],'r'))) { // +rh
168 + i = 0;
169 + while ((argv[6][i] != 'r') && (argv[6][i] != 'h')) i++;
170 + if (argv[6][i] == 'r') // +r came before +h
171 + AddUser(serv, argv[1], argv[4], argv[5], argv[6], argv[7], argv[10], argv[argc-1], atoi(argv[3]), argv[9], argv[8]);
172 + else // +h came before +r
173 + AddUser(serv, argv[1], argv[4], argv[5], argv[6], argv[8], argv[10], argv[argc-1], atoi(argv[3]), argv[9], argv[7]);
174 + }
175 + else {
176 + if (strchr(argv[6],'h')) // +h-r
177 + AddUser(serv, argv[1], argv[4], argv[5], argv[6], NULL, argv[9], argv[argc-1], atoi(argv[3]), argv[8], argv[7]);
178 + else if (strchr(argv[6],'r')) // +r-h
179 + AddUser(serv, argv[1], argv[4], argv[5], argv[6], argv[7], argv[9], argv[argc-1], atoi(argv[3]), argv[8], NULL);
180 + else // -rh
181 + AddUser(serv, argv[1], argv[4], argv[5], argv[6], NULL, argv[8], argv[argc-1], atoi(argv[3]), argv[7], NULL);
182 }
183 } else {
184 - AddUser(serv, argv[1], argv[4], argv[5], "+", NULL, argv[7], argv[argc-1], atoi(argv[3]), argv[6]);
185 + AddUser(serv, argv[1], argv[4], argv[5], "+", NULL, argv[7], argv[argc-1], atoi(argv[3]), argv[6], NULL);
186 }
187 }
188 return 1;
189 @@ -1057,6 +1076,8 @@
190 struct chanNode *cn;
191 struct userNode *un;
192 const char *modes;
193 + char *sethost; // apples - sethost
194 + int i; // apples - sethost
195
196 if (argc < 3) {
197 return 0;
198 @@ -1067,7 +1088,19 @@
199 log(MAIN_LOG, LOG_ERROR, "Unable to find user %s whose mode is changing\n", argv[1]);
200 return 0;
201 }
202 - mod_usermode(un, argv[2]);
203 + // apples - sethost
204 + if (argc == 3)
205 + mod_usermode(un, argv[2]);
206 + else {
207 + sethost = malloc(strlen(argv[2]) + 1 + strlen(argv[3]) + 1);
208 + i = 0;
209 + while((sethost[i++] = *argv[2]++));
210 + i--;
211 + sethost[i++] = ' ';
212 + while((sethost[i++] = *argv[3]++));
213 + mod_usermode(un, sethost); // apples - sethost
214 + }
215 +
216 return 1;
217 }
218
219 @@ -1733,7 +1766,7 @@
220 }
221 make_numeric(self, local_num, numeric);
222 if (old_user) timestamp = old_user->timestamp - 1;
223 - return AddUser(self, nick, nick, self->name, "+oik", NULL, numeric, desc, now, "AAAAAA");
224 + return AddUser(self, nick, nick, self->name, "+oik", NULL, numeric, desc, now, "AAAAAA", NULL); // apples - sethost
225 }
226
227 struct userNode *
228 @@ -1750,7 +1783,7 @@
229 }
230 make_numeric(self, local_num, numeric);
231 if (old_user) timestamp = old_user->timestamp - 1;
232 - return AddUser(self, nick, ident, hostname, "+i", NULL, numeric, desc, timestamp, "AAAAAA");
233 + return AddUser(self, nick, ident, hostname, "+i", NULL, numeric, desc, timestamp, "AAAAAA", NULL); // apples - sethost
234 }
235
236 int
237 @@ -1765,12 +1798,14 @@
238 return 1;
239 }
240
241 +// apples - sethost
242 static struct userNode*
243 -AddUser(struct server* uplink, const char *nick, const char *ident, const char *hostname, const char *modes, const char *account, const char *numeric, const char *userinfo, time_t timestamp, const char *realip)
244 +AddUser(struct server* uplink, const char *nick, const char *ident, const char *hostname, const char *modes, const char *account, const char *numeric, const char *userinfo, time_t timestamp, const char *realip, const char *sethost)
245 {
246 struct userNode *oldUser, *uNode;
247 struct policer_params *pol_params;
248 unsigned int n, ignore_user;
249 + char *newmodes; // apples - sethost
250
251 if ((strlen(numeric) < 3) || (strlen(numeric) > 5)) {
252 log(MAIN_LOG, LOG_WARNING, "AddUser(%p, %s, ...): numeric %s wrong length!\n", uplink, nick, numeric);
253 @@ -1829,7 +1864,22 @@
254 uNode->num_local = base64toint(numeric+strlen(uNode->uplink->numeric), 3) & uNode->uplink->num_mask;
255 uNode->uplink->users[uNode->num_local] = uNode;
256 if (account) call_account_func(uNode, account);
257 - mod_usermode(uNode, modes);
258 +
259 + // apples - sethost
260 + if (sethost) {
261 + newmodes = malloc(strlen(modes) + 1 + strlen(sethost) + 1);
262 + n = 0;
263 + while ((newmodes[n] = modes[n])) n++;
264 + newmodes[n++] = ' ';
265 + while ((newmodes[n] = *sethost)) {
266 + n++;
267 + sethost++;
268 + }
269 + mod_usermode(uNode, newmodes);
270 + }
271 + else
272 + mod_usermode(uNode, modes);
273 +
274 if (ignore_user) return uNode;
275
276 dict_insert(clients, uNode->nick, uNode);
277 @@ -1899,8 +1949,10 @@
278 extern struct policer_params *oper_policer_params, *luser_policer_params;
279 static void call_oper_funcs(struct userNode *user);
280 int add = 1;
281 + int i = 0;
282
283 if (!user || !mode_change) return;
284 +
285 while (1) {
286 #define do_user_mode(FLAG) do { if (add) user->modes |= FLAG; else user->modes &= ~FLAG; } while (0)
287 switch (*mode_change++) {
288 @@ -1931,7 +1983,18 @@
289 case 'd': do_user_mode(FLAGS_DEAF); break;
290 case 'k': do_user_mode(FLAGS_SERVICE); break;
291 case 'g': do_user_mode(FLAGS_GLOBAL); break;
292 - case 'h': do_user_mode(FLAGS_HELPER); break;
293 +
294 + // apples - sethosti
295 + // don't need this anymore vvvvvv
296 + // case 'h': do_user_mode(FLAGS_HELPER); break;
297 + // so basically, +h is the only mode that requires a parameter for the time
298 + // being, so i check if there's an 'h' in the first part, and if there is
299 + // then everything after the space becomes their new host
300 + case 'h': do_user_mode(FLAGS_SETHOST); break;
301 + case ' ': if (IsSetHost(user))
302 + while ((user->sethost[i++] = *mode_change++));
303 + break;
304 +
305 case 'x': do_user_mode(FLAGS_HIDDEN_HOST); break;
306 }
307 #undef do_user_mode
308 diff -urN srvx_original2/tools.c apples_backup/tools.c
309 --- srvx_original2/tools.c Mon Jun 2 22:05:28 2003
310 +++ apples_backup/tools.c Mon Jun 2 21:53:21 2003
311 @@ -291,6 +291,9 @@
312 user_matches_glob(struct userNode *user, const char *orig_glob, int include_nick)
313 {
314 char *glob, *marker;
315 + int usingreal = 0; // apples - sethost
316 + int usingset = 0; // apples - sethost
317 + char *setident, *sethostname; // apples - sethost
318
319 /* Make a writable copy of the glob */
320 glob = alloca(strlen(orig_glob)+1);
321 @@ -311,22 +314,37 @@
322 return 0;
323 }
324 *marker = 0;
325 - if (!match_ircglob(user->ident, glob)) return 0;
326 +
327 + // apples - sethost
328 + if (match_ircglob(user->ident, glob)) usingreal = 1;
329 + if (IsSetHost(user)) {
330 + setident = alloca(strcspn(user->sethost, "@")+2);
331 + safestrncpy(setident, user->sethost, strcspn(user->sethost, "@")+1);
332 + if (match_ircglob(setident, glob)) usingset = 1;
333 + }
334 +
335 glob = marker + 1;
336 /* Now check the host part */
337 +
338 + // apples - sethost
339 + if (IsSetHost(user)) {
340 + sethostname = strchr(user->sethost, '@') + 1;
341 + if (match_ircglob(sethostname, glob) && usingset) return 1;
342 + }
343 +
344 if (isdigit(*glob) && !glob[strspn(glob, "0123456789./*?")]) {
345 /* Looks like an IP-based mask */
346 unsigned char userip[20];
347 sprintf(userip, "%ld.%ld.%ld.%ld", (user->ip >> 24) & 255, (user->ip >> 16) & 255, (user->ip >> 8) & 255, user->ip & 255);
348 - return match_ircglob(userip, glob);
349 + return match_ircglob(userip, glob) && usingreal;
350 } else {
351 if (hidden_host_suffix && user->handle_info) {
352 char hidden_host[HOSTLEN+1];
353 snprintf(hidden_host, sizeof(hidden_host), "%s.%s", user->handle_info->handle, hidden_host_suffix);
354 - if (match_ircglob(hidden_host, glob)) return 1;
355 + if (match_ircglob(hidden_host, glob) && usingreal) return 1;
356 }
357 /* The host part of the mask isn't IP-based */
358 - return match_ircglob(user->hostname, glob);
359 + return match_ircglob(user->hostname, glob) && usingreal;
360 }
361 }
362