]> jfr.im git - irc/quakenet/snircd-patchqueue.git/blob - privs.patch
rename patch files
[irc/quakenet/snircd-patchqueue.git] / privs.patch
1 # HG changeset patch
2 # Parent 49deac8a9792a5f312d2ebead245bcaa5f20f60c
3
4 diff -r 49deac8a9792 include/client.h
5 --- a/include/client.h Fri Jul 19 22:50:34 2013 +0100
6 +++ b/include/client.h Fri Jul 19 22:51:32 2013 +0100
7 @@ -129,6 +129,19 @@
8 PRIV_FORCE_OPMODE, /**< can hack modes on quarantined channels */
9 PRIV_FORCE_LOCAL_OPMODE, /**< can hack modes on quarantined local channels */
10 PRIV_APASS_OPMODE, /**< can hack modes +A/-A/+U/-U */
11 + PRIV_CHANSERV, /* oper can set usermode +k */
12 + PRIV_XTRA_OPER, /* oper can set usermode +X */
13 + PRIV_NOIDLE, /* oper can set usermode +I */
14 + PRIV_FREEFORM, /* oper can use freeform sethost */
15 + PRIV_PARANOID, /* oper can set paranoid */
16 + PRIV_CHECK, /* oper can use /check */
17 + PRIV_WALL, /* oper can use /wallusers, /wallops */
18 + PRIV_CLOSE, /* oper can use /close */
19 + PRIV_ROUTE, /* oper can use /connect/squit NOTE: you need serverinfo priv to do remote connect */
20 + PRIV_ROUTEINFO, /* oper can use /map, /trace, /asll, /links and view jupe list */
21 + PRIV_USER_PRIVACY, /* oper can bypass user privacy +x etc gives i.e. see real ip's */
22 + PRIV_CHANNEL_PRIVACY, /* oper can bypass channel privacy i.e. can see modes on channels they are not on and channel keys */
23 + PRIV_SERVERINFO, /* oper can use /get, /stats, /hash, retrieve remote information */
24 PRIV_LAST_PRIV /**< number of privileges */
25 };
26
27 diff -r 49deac8a9792 ircd/channel.c
28 --- a/ircd/channel.c Fri Jul 19 22:50:34 2013 +0100
29 +++ b/ircd/channel.c Fri Jul 19 22:51:32 2013 +0100
30 @@ -863,7 +863,7 @@
31 *mbuf++ = 'k';
32 if (previous_parameter)
33 strcat(pbuf, " ");
34 - if (is_chan_op(cptr, chptr) || IsServer(cptr) || IsOper(cptr)) {
35 + if (is_chan_op(cptr, chptr) || IsServer(cptr) || (IsOper(cptr) && HasPriv(cptr, PRIV_CHANNEL_PRIVACY))) {
36 strcat(pbuf, chptr->mode.key);
37 } else
38 strcat(pbuf, "*");
39 diff -r 49deac8a9792 ircd/client.c
40 --- a/ircd/client.c Fri Jul 19 22:50:34 2013 +0100
41 +++ b/ircd/client.c Fri Jul 19 22:51:32 2013 +0100
42 @@ -158,6 +158,11 @@
43 FlagClr(&privs_global, PRIV_BADCHAN);
44 FlagClr(&privs_global, PRIV_LOCAL_BADCHAN);
45 FlagClr(&privs_global, PRIV_APASS_OPMODE);
46 + FlagClr(&privs_global, PRIV_GLINE);
47 + FlagClr(&privs_global, PRIV_REHASH);
48 + FlagClr(&privs_global, PRIV_DIE);
49 + FlagClr(&privs_global, PRIV_RESTART);
50 + FlagClr(&privs_global, PRIV_JUPE);
51
52 memset(&privs_local, 0, sizeof(privs_local));
53 FlagSet(&privs_local, PRIV_CHAN_LIMIT);
54 @@ -236,6 +241,10 @@
55 P(BADCHAN), P(LOCAL_BADCHAN), P(SEE_CHAN), P(PROPAGATE),
56 P(DISPLAY), P(SEE_OPERS), P(WIDE_GLINE), P(LIST_CHAN),
57 P(FORCE_OPMODE), P(FORCE_LOCAL_OPMODE), P(APASS_OPMODE),
58 + P(CHANSERV), P(XTRA_OPER), P(NOIDLE), P(FREEFORM),
59 + P(PARANOID), P(CHECK), P(WALL), P(CLOSE),
60 + P(ROUTE), P(ROUTEINFO), P(SERVERINFO), P(CHANNEL_PRIVACY),
61 + P(USER_PRIVACY),
62 #undef P
63 { 0, 0 }
64 };
65 diff -r 49deac8a9792 ircd/gline.c
66 --- a/ircd/gline.c Fri Jul 19 22:50:34 2013 +0100
67 +++ b/ircd/gline.c Fri Jul 19 22:51:32 2013 +0100
68 @@ -282,9 +282,7 @@
69 get_client_name(acptr, SHOW_IP));
70
71 /* and get rid of him */
72 - /* Asuka - Reimplement HEAD_IN_SAND_GLINE from Lain */
73 - if ((tval = exit_client_msg(cptr, acptr, &me,
74 - feature_bool(FEAT_HIS_GLINE) ? "G-lined" : "G-lined (%s)", gline->gl_reason)))
75 + if ((tval = exit_client_msg(cptr, acptr, &me, "G-lined (%s)", gline->gl_reason)))
76 retval = tval; /* retain killed status */
77 }
78 }
79 diff -r 49deac8a9792 ircd/hash.c
80 --- a/ircd/hash.c Fri Jul 19 22:50:34 2013 +0100
81 +++ b/ircd/hash.c Fri Jul 19 22:51:32 2013 +0100
82 @@ -284,6 +284,9 @@
83 struct Client* cl;
84 struct Channel* ch;
85 int i;
86 +
87 + if (!HasPriv(sptr, PRIV_SERVERINFO))
88 + return send_reply(sptr, ERR_NOPRIVILEGES);
89
90 sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :Hash Table Statistics", sptr);
91
92 diff -r 49deac8a9792 ircd/ircd_lexer.l
93 --- a/ircd/ircd_lexer.l Fri Jul 19 22:50:34 2013 +0100
94 +++ b/ircd/ircd_lexer.l Fri Jul 19 22:51:32 2013 +0100
95 @@ -153,6 +153,19 @@
96 { "walk_lchan", TPRIV_WALK_LCHAN },
97 { "wide_gline", TPRIV_WIDE_GLINE },
98 { "whox", TPRIV_WHOX },
99 + { "chanserv", TPRIV_CHANSERV },
100 + { "xtraoper", TPRIV_XTRA_OPER },
101 + { "noidle", TPRIV_NOIDLE },
102 + { "freeform", TPRIV_FREEFORM },
103 + { "paranoid", TPRIV_PARANOID },
104 + { "check", TPRIV_CHECK },
105 + { "wall", TPRIV_WALL },
106 + { "close", TPRIV_CLOSE },
107 + { "route", TPRIV_ROUTE },
108 + { "routeinfo", TPRIV_ROUTEINFO },
109 + { "serverinfo", TPRIV_SERVERINFO },
110 + { "user_privacy", TPRIV_USER_PRIVACY },
111 + { "channel_privacy", TPRIV_CHANNEL_PRIVACY },
112 { NULL, 0 }
113 };
114 static int ntokens;
115 diff -r 49deac8a9792 ircd/ircd_parser.y
116 --- a/ircd/ircd_parser.y Fri Jul 19 22:50:34 2013 +0100
117 +++ b/ircd/ircd_parser.y Fri Jul 19 22:51:32 2013 +0100
118 @@ -186,7 +186,9 @@
119 %token TPRIV_SEE_CHAN TPRIV_SHOW_INVIS TPRIV_SHOW_ALL_INVIS TPRIV_PROPAGATE
120 %token TPRIV_UNLIMIT_QUERY TPRIV_DISPLAY TPRIV_SEE_OPERS TPRIV_WIDE_GLINE
121 %token TPRIV_FORCE_OPMODE TPRIV_FORCE_LOCAL_OPMODE TPRIV_APASS_OPMODE
122 -%token TPRIV_LIST_CHAN
123 +%token TPRIV_CHANSERV TPRIV_XTRA_OPER TPRIV_NOIDLE TPRIV_FREEFORM TPRIV_PARANOID
124 +%token TPRIV_CHECK TPRIV_WALL TPRIV_CLOSE TPRIV_ROUTE TPRIV_ROUTEINFO TPRIV_SERVERINFO
125 +%token TPRIV_CHANNEL_PRIVACY TPRIV_USER_PRIVACY TPRIV_LIST_CHAN
126 /* and some types... */
127 %type <num> sizespec
128 %type <num> timespec timefactor factoredtimes factoredtime
129 @@ -688,7 +690,20 @@
130 LOCAL { $$ = PRIV_PROPAGATE; invert = 1; } |
131 TPRIV_FORCE_OPMODE { $$ = PRIV_FORCE_OPMODE; } |
132 TPRIV_FORCE_LOCAL_OPMODE { $$ = PRIV_FORCE_LOCAL_OPMODE; } |
133 - TPRIV_APASS_OPMODE { $$ = PRIV_APASS_OPMODE; } ;
134 + TPRIV_APASS_OPMODE { $$ = PRIV_APASS_OPMODE; } |
135 + TPRIV_CHANSERV { $$ = PRIV_CHANSERV; } |
136 + TPRIV_XTRA_OPER { $$ = PRIV_XTRA_OPER; } |
137 + TPRIV_NOIDLE { $$ = PRIV_NOIDLE; } |
138 + TPRIV_FREEFORM { $$ = PRIV_FREEFORM; } |
139 + TPRIV_CHECK { $$ = PRIV_CHECK; } |
140 + TPRIV_WALL { $$ = PRIV_WALL; } |
141 + TPRIV_CLOSE { $$ = PRIV_CLOSE ; } |
142 + TPRIV_ROUTE { $$ = PRIV_ROUTE ; } |
143 + TPRIV_ROUTEINFO { $$ = PRIV_ROUTEINFO ; } |
144 + TPRIV_SERVERINFO { $$ = PRIV_SERVERINFO ; } |
145 + TPRIV_CHANNEL_PRIVACY { $$ = PRIV_CHANNEL_PRIVACY ; } |
146 + TPRIV_USER_PRIVACY { $$ = PRIV_USER_PRIVACY ; } |
147 + TPRIV_PARANOID { $$ = PRIV_PARANOID; } ;
148
149 yesorno: YES { $$ = 1; } | NO { $$ = 0; };
150
151 diff -r 49deac8a9792 ircd/m_asll.c
152 --- a/ircd/m_asll.c Fri Jul 19 22:50:34 2013 +0100
153 +++ b/ircd/m_asll.c Fri Jul 19 22:51:32 2013 +0100
154 @@ -159,6 +159,9 @@
155 int hits;
156 int i;
157
158 + if (!HasPriv(sptr, PRIV_ROUTEINFO))
159 + return send_reply(sptr, ERR_NOPRIVILEGES);
160 +
161 if (parc < 2)
162 return need_more_params(sptr, "ASLL");
163
164 diff -r 49deac8a9792 ircd/m_check.c
165 --- a/ircd/m_check.c Fri Jul 19 22:50:34 2013 +0100
166 +++ b/ircd/m_check.c Fri Jul 19 22:51:32 2013 +0100
167 @@ -94,6 +94,9 @@
168 struct Client *acptr;
169 int flags = CHECK_SHOWUSERS, i;
170
171 + if (!HasPriv(sptr, PRIV_CHECK))
172 + return send_reply(sptr, ERR_NOPRIVILEGES);
173 +
174 if (parc < 2) {
175 send_reply(sptr, ERR_NEEDMOREPARAMS, "CHECK");
176 return 0;
177 diff -r 49deac8a9792 ircd/m_close.c
178 --- a/ircd/m_close.c Fri Jul 19 22:50:34 2013 +0100
179 +++ b/ircd/m_close.c Fri Jul 19 22:51:32 2013 +0100
180 @@ -101,6 +101,9 @@
181 assert(cptr == sptr);
182 assert(IsAnOper(sptr));
183
184 + if (!HasPriv(sptr, PRIV_CLOSE))
185 + return send_reply(sptr, ERR_NOPRIVILEGES);
186 +
187 return send_reply(sptr, RPL_CLOSEEND,
188 net_close_unregistered_connections(sptr));
189 }
190 diff -r 49deac8a9792 ircd/m_connect.c
191 --- a/ircd/m_connect.c Fri Jul 19 22:50:34 2013 +0100
192 +++ b/ircd/m_connect.c Fri Jul 19 22:51:32 2013 +0100
193 @@ -235,6 +235,9 @@
194 assert(cptr == sptr);
195 assert(IsAnOper(sptr));
196
197 + if (!HasPriv(sptr, PRIV_ROUTE))
198 + return send_reply(sptr, ERR_NOPRIVILEGES);
199 +
200 if (parc < 2)
201 return need_more_params(sptr, "CONNECT");
202
203 diff -r 49deac8a9792 ircd/m_get.c
204 --- a/ircd/m_get.c Fri Jul 19 22:50:34 2013 +0100
205 +++ b/ircd/m_get.c Fri Jul 19 22:51:32 2013 +0100
206 @@ -99,5 +99,8 @@
207 */
208 int mo_get(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
209 {
210 + if (!HasPriv(sptr, PRIV_SERVERINFO))
211 + return send_reply(sptr, ERR_NOPRIVILEGES);
212 +
213 return feature_get(sptr, (const char* const*)parv + 1, parc - 1);
214 }
215 diff -r 49deac8a9792 ircd/m_gline.c
216 --- a/ircd/m_gline.c Fri Jul 19 22:50:34 2013 +0100
217 +++ b/ircd/m_gline.c Fri Jul 19 22:51:32 2013 +0100
218 @@ -382,8 +382,12 @@
219 time_t expire = 0;
220 char *mask = parv[1], *target = 0, *reason = 0, *end;
221
222 - if (parc < 2)
223 - return gline_list(sptr, 0);
224 + if (parc < 2) {
225 + if (!HasPriv(sptr, PRIV_SERVERINFO))
226 + return send_reply(sptr, ERR_NOPRIVILEGES);
227 + else
228 + return gline_list(sptr, 0);
229 + }
230
231 if (*mask == '!') {
232 mask++;
233 diff -r 49deac8a9792 ircd/m_jupe.c
234 --- a/ircd/m_jupe.c Fri Jul 19 22:50:34 2013 +0100
235 +++ b/ircd/m_jupe.c Fri Jul 19 22:51:32 2013 +0100
236 @@ -195,8 +195,11 @@
237 time_t expire_off;
238 char *server = parv[1], *target = 0, *reason;
239
240 - if (parc < 2)
241 + if (parc < 2) {
242 + if (!HasPriv(sptr, PRIV_ROUTEINFO))
243 + return send_reply(sptr, ERR_NOPRIVILEGES);
244 return jupe_list(sptr, 0);
245 + }
246
247 if (*server == '+') {
248 flags |= JUPE_ACTIVE;
249 diff -r 49deac8a9792 ircd/m_links.c
250 --- a/ircd/m_links.c Fri Jul 19 22:50:34 2013 +0100
251 +++ b/ircd/m_links.c Fri Jul 19 22:51:32 2013 +0100
252 @@ -115,7 +115,7 @@
253 char *mask;
254 struct Client *acptr;
255
256 - if (feature_bool(FEAT_HIS_LINKS) && !IsAnOper(sptr))
257 + if (feature_bool(FEAT_HIS_LINKS) && (!IsAnOper(sptr) || (IsAnOper(sptr) && !HasPriv(sptr, PRIV_ROUTEINFO))))
258 {
259 send_reply(sptr, RPL_ENDOFLINKS, parc < 2 ? "*" : parv[1]);
260 sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :%s %s", sptr,
261 diff -r 49deac8a9792 ircd/m_map.c
262 --- a/ircd/m_map.c Fri Jul 19 22:50:34 2013 +0100
263 +++ b/ircd/m_map.c Fri Jul 19 22:51:32 2013 +0100
264 @@ -189,7 +189,7 @@
265 int m_map(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
266 {
267 void *args[1];
268 - if (feature_bool(FEAT_HIS_MAP) && !IsAnOper(sptr))
269 + if (feature_bool(FEAT_HIS_MAP) && (!IsAnOper(sptr) || (IsAnOper(sptr) && !HasPriv(sptr, PRIV_ROUTEINFO))))
270 {
271 sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :%s %s", sptr,
272 "/MAP has been disabled, from CFV-165. "
273 @@ -205,14 +205,3 @@
274
275 return 0;
276 }
277 -
278 -int mo_map(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
279 -{
280 - if (parc < 2)
281 - parv[1] = "*";
282 -
283 - dump_map(sptr, &me, parv[1], 0);
284 - send_reply(sptr, RPL_MAPEND);
285 -
286 - return 0;
287 -}
288 diff -r 49deac8a9792 ircd/m_mode.c
289 --- a/ircd/m_mode.c Fri Jul 19 22:50:34 2013 +0100
290 +++ b/ircd/m_mode.c Fri Jul 19 22:51:32 2013 +0100
291 @@ -146,6 +146,14 @@
292 return 0;
293 }
294
295 + /* We don't want mode requests from non-members, prolly to counter ban evasion. Allow channel-privacy opers and opers overriding a local chan */
296 + /* if the aim is to hide the banlist from outsiders, but not the modes and creation time
297 + thus only block the request when 3 or more parameters are given -> move check here - wiebe */
298 + if (! (member || HasPriv(sptr, PRIV_CHANNEL_PRIVACY) || (IsLocalChannel(chptr->chname) && HasPriv(sptr, PRIV_MODE_LCHAN)))) {
299 + send_reply(sptr, ERR_NOTONCHANNEL, chptr->chname);
300 + return 0;
301 + }
302 +
303 if (!member || !IsChanOp(member)) {
304 if (IsLocalChannel(chptr->chname) && HasPriv(sptr, PRIV_MODE_LCHAN)) {
305 modebuf_init(&mbuf, sptr, cptr, chptr,
306 diff -r 49deac8a9792 ircd/m_privs.c
307 --- a/ircd/m_privs.c Fri Jul 19 22:50:34 2013 +0100
308 +++ b/ircd/m_privs.c Fri Jul 19 22:51:32 2013 +0100
309 @@ -55,6 +55,9 @@
310 if (parc < 2)
311 return client_report_privs(sptr, sptr);
312
313 + if (!HasPriv(sptr, PRIV_SERVERINFO))
314 + return send_reply(sptr, ERR_NOPRIVILEGES);
315 +
316 for (i = 1; i < parc; i++) {
317 for (name = ircd_strtok(&p, parv[i], " "); name;
318 name = ircd_strtok(&p, 0, " ")) {
319 diff -r 49deac8a9792 ircd/m_rping.c
320 --- a/ircd/m_rping.c Fri Jul 19 22:50:34 2013 +0100
321 +++ b/ircd/m_rping.c Fri Jul 19 22:51:32 2013 +0100
322 @@ -206,6 +206,9 @@
323 assert(cptr == sptr);
324 assert(IsAnOper(sptr));
325
326 + if (!HasPriv(sptr, PRIV_ROUTEINFO))
327 + return send_reply(sptr, ERR_NOPRIVILEGES);
328 +
329 if (parc < 2)
330 return need_more_params(sptr, "RPING");
331
332 diff -r 49deac8a9792 ircd/m_settime.c
333 --- a/ircd/m_settime.c Fri Jul 19 22:50:34 2013 +0100
334 +++ b/ircd/m_settime.c Fri Jul 19 22:51:32 2013 +0100
335 @@ -207,7 +207,7 @@
336 static char tbuf[11];
337
338 /* Must be a global oper */
339 - if (!IsOper(sptr))
340 + if (!IsOper(sptr) || !HasPriv(sptr, PRIV_ROUTE))
341 return send_reply(sptr, ERR_NOPRIVILEGES);
342
343 if (parc < 2) /* verify argument count */
344 diff -r 49deac8a9792 ircd/m_squit.c
345 --- a/ircd/m_squit.c Fri Jul 19 22:50:34 2013 +0100
346 +++ b/ircd/m_squit.c Fri Jul 19 22:51:32 2013 +0100
347 @@ -117,6 +117,9 @@
348 struct Client *acptr;
349 struct Client *acptr2;
350 char *comment;
351 +
352 + if (!HasPriv(sptr, PRIV_ROUTE))
353 + return send_reply(sptr, ERR_NOPRIVILEGES);
354
355 if (parc < 2)
356 return need_more_params(sptr, "SQUIT");
357 diff -r 49deac8a9792 ircd/m_stats.c
358 --- a/ircd/m_stats.c Fri Jul 19 22:50:34 2013 +0100
359 +++ b/ircd/m_stats.c Fri Jul 19 22:51:32 2013 +0100
360 @@ -135,9 +135,9 @@
361 * This checks cptr rather than sptr so that a local oper may send
362 * /stats queries to other servers.
363 */
364 - if (!IsPrivileged(cptr) &&
365 + if (!(IsPrivileged(cptr) && HasPriv(cptr, PRIV_SERVERINFO)) &&
366 ((sd->sd_flags & STAT_FLAG_OPERONLY) ||
367 - ((sd->sd_flags & STAT_FLAG_OPERFEAT) && feature_bool(sd->sd_control))))
368 + ((sd->sd_flags & STAT_FLAG_OPERFEAT) && feature_bool(sd->sd_control))))
369 return send_reply(sptr, ERR_NOPRIVILEGES);
370
371 /* Check for extra parameter */
372 diff -r 49deac8a9792 ircd/m_trace.c
373 --- a/ircd/m_trace.c Fri Jul 19 22:50:34 2013 +0100
374 +++ b/ircd/m_trace.c Fri Jul 19 22:51:32 2013 +0100
375 @@ -337,8 +337,8 @@
376 */
377 int mo_trace(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
378 {
379 - if (feature_bool(FEAT_HIS_TRACE) && !IsAnOper(sptr))
380 - return send_reply(cptr, ERR_NOPRIVILEGES);
381 + if (!HasPriv(sptr, PRIV_ROUTEINFO))
382 + return send_reply(sptr, ERR_NOPRIVILEGES);
383 do_trace(cptr, sptr, parc, parv);
384 return 0;
385 }
386 diff -r 49deac8a9792 ircd/m_uping.c
387 --- a/ircd/m_uping.c Fri Jul 19 22:50:34 2013 +0100
388 +++ b/ircd/m_uping.c Fri Jul 19 22:51:32 2013 +0100
389 @@ -181,6 +181,9 @@
390
391 assert(IsAnOper(sptr));
392
393 + if (!HasPriv(sptr, PRIV_ROUTEINFO))
394 + return send_reply(sptr, ERR_NOPRIVILEGES);
395 +
396 if (parc < 2) {
397 send_reply(sptr, ERR_NEEDMOREPARAMS, "UPING");
398 return 0;
399 diff -r 49deac8a9792 ircd/m_userhost.c
400 --- a/ircd/m_userhost.c Fri Jul 19 22:50:34 2013 +0100
401 +++ b/ircd/m_userhost.c Fri Jul 19 22:51:32 2013 +0100
402 @@ -104,7 +104,7 @@
403 * of +x. If an oper wants the real host, he should go to
404 * /whois to get it.
405 */
406 - !IsAnOper(sptr) ?
407 + (HasHiddenHost(cptr) || HasSetHost(cptr)) && (sptr != cptr) ?
408 cli_user(cptr)->host : cli_user(cptr)->realhost);
409 }
410
411 diff -r 49deac8a9792 ircd/m_userip.c
412 --- a/ircd/m_userip.c Fri Jul 19 22:50:34 2013 +0100
413 +++ b/ircd/m_userip.c Fri Jul 19 22:51:32 2013 +0100
414 @@ -106,7 +106,7 @@
415 * of +x. If an oper wants the real IP, he should go to
416 * /whois to get it.
417 */
418 - (HasHiddenHost(cptr) || HasSetHost(cptr)) && !IsAnOper(sptr) ?
419 + ((HasHiddenHost(cptr) || HasSetHost(cptr) || feature_bool(FEAT_HIS_USERIP)) && (sptr != cptr)) ?
420 feature_str(FEAT_HIDDEN_IP) :
421 ircd_ntoa(&cli_ip(cptr)));
422 }
423 diff -r 49deac8a9792 ircd/m_wallchops.c
424 --- a/ircd/m_wallchops.c Fri Jul 19 22:50:34 2013 +0100
425 +++ b/ircd/m_wallchops.c Fri Jul 19 22:51:32 2013 +0100
426 @@ -103,6 +103,7 @@
427 {
428 struct Channel *chptr;
429 struct Membership* member;
430 + const char *ch;
431
432 assert(0 != cptr);
433 assert(cptr == sptr);
434 diff -r 49deac8a9792 ircd/m_wallops.c
435 --- a/ircd/m_wallops.c Fri Jul 19 22:50:34 2013 +0100
436 +++ b/ircd/m_wallops.c Fri Jul 19 22:51:32 2013 +0100
437 @@ -115,6 +115,9 @@
438 {
439 char *message;
440
441 + if (!HasPriv(sptr, PRIV_WALL))
442 + return send_reply(sptr, ERR_NOPRIVILEGES);
443 +
444 message = parc > 1 ? parv[1] : 0;
445
446 if (EmptyString(message))
447 diff -r 49deac8a9792 ircd/m_wallusers.c
448 --- a/ircd/m_wallusers.c Fri Jul 19 22:50:34 2013 +0100
449 +++ b/ircd/m_wallusers.c Fri Jul 19 22:51:32 2013 +0100
450 @@ -119,6 +119,9 @@
451 {
452 char *message;
453
454 + if (!HasPriv(sptr, PRIV_WALL))
455 + return send_reply(sptr, ERR_NOPRIVILEGES);
456 +
457 message = parc > 1 ? parv[1] : 0;
458
459 if (EmptyString(message))
460 diff -r 49deac8a9792 ircd/m_wallvoices.c
461 --- a/ircd/m_wallvoices.c Fri Jul 19 22:50:34 2013 +0100
462 +++ b/ircd/m_wallvoices.c Fri Jul 19 22:51:32 2013 +0100
463 @@ -102,6 +102,7 @@
464 {
465 struct Channel *chptr;
466 struct Membership* member;
467 + const char *ch;
468
469 assert(0 != cptr);
470 assert(cptr == sptr);
471 diff -r 49deac8a9792 ircd/m_who.c
472 --- a/ircd/m_who.c Fri Jul 19 22:50:34 2013 +0100
473 +++ b/ircd/m_who.c Fri Jul 19 22:51:32 2013 +0100
474 @@ -269,10 +269,10 @@
475 if (!fields)
476 counter = 7;
477
478 - if (feature_bool(FEAT_HIS_WHO_SERVERNAME) && !IsAnOper(sptr))
479 + if (feature_bool(FEAT_HIS_WHO_SERVERNAME) && !HasPriv(sptr, PRIV_ROUTEINFO))
480 matchsel &= ~WHO_FIELD_SER;
481
482 - if (feature_bool(FEAT_HIS_WHO_FILTERIP) && !IsAnOper(sptr))
483 + if (feature_bool(FEAT_HIS_WHO_FILTERIP) && !HasPriv(sptr, PRIV_USER_PRIVACY))
484 matchsel &= ~WHO_FIELD_NIP;
485
486 if (qrt && (fields & WHO_FIELD_QTY))
487 @@ -323,7 +323,9 @@
488 continue;
489 if (!Process(acptr)) /* This can't be moved before other checks */
490 continue;
491 - if (!(isthere || (SHOW_MORE(sptr, counter))))
492 + if (!(isthere ||
493 + (IsOper(sptr) && (bitsel & WHOSELECT_EXTRA) && HasPriv(sptr, PRIV_SEE_CHAN)) ||
494 + (SHOW_MORE(sptr, counter))))
495 break;
496 do_who(sptr, acptr, chptr, fields, qrt);
497 }
498 diff -r 49deac8a9792 ircd/m_whois.c
499 --- a/ircd/m_whois.c Fri Jul 19 22:50:34 2013 +0100
500 +++ b/ircd/m_whois.c Fri Jul 19 22:51:32 2013 +0100
501 @@ -137,7 +137,7 @@
502
503 const struct User* user = cli_user(acptr);
504 const char* name = (!*(cli_name(acptr))) ? "?" : cli_name(acptr);
505 - a2cptr = feature_bool(FEAT_HIS_WHOIS_SERVERNAME) && !IsAnOper(sptr)
506 + a2cptr = feature_bool(FEAT_HIS_WHOIS_SERVERNAME) && (!IsAnOper(sptr) || (IsAnOper(sptr) && !HasPriv(sptr, PRIV_ROUTEINFO)))
507 && sptr != acptr ? &his : user->server;
508 assert(user);
509 send_reply(sptr, RPL_WHOISUSER, name, user->username, user->host,
510 @@ -214,7 +214,7 @@
511 if (IsAccount(acptr))
512 send_reply(sptr, RPL_WHOISACCOUNT, name, user->account);
513
514 - if ((HasHiddenHost(acptr) || HasSetHost(acptr)) && (IsAnOper(sptr) || acptr == sptr))
515 + if ((HasHiddenHost(acptr) || HasSetHost(acptr)) && ((IsAnOper(sptr) && HasPriv(sptr, PRIV_USER_PRIVACY)) || acptr == sptr))
516 send_reply(sptr, RPL_WHOISACTUALLY, name, user->realusername,
517 user->realhost, ircd_ntoa(&cli_ip(acptr)));
518
519 @@ -226,7 +226,7 @@
520 */
521
522 if (MyConnect(acptr) &&
523 - (IsAnOper(sptr) ||
524 + ((IsAnOper(sptr) && HasPriv(sptr, PRIV_USER_PRIVACY)) ||
525 (!IsNoIdle(acptr) && (!feature_bool(FEAT_HIS_WHOIS_IDLETIME) ||
526 sptr == acptr || parc >= 3))))
527 send_reply(sptr, RPL_WHOISIDLE, name, CurrentTime - user->last,
528 diff -r 49deac8a9792 ircd/m_whowas.c
529 --- a/ircd/m_whowas.c Fri Jul 19 22:50:34 2013 +0100
530 +++ b/ircd/m_whowas.c Fri Jul 19 22:51:32 2013 +0100
531 @@ -138,10 +138,10 @@
532 {
533 send_reply(sptr, RPL_WHOWASUSER, temp->name, temp->username,
534 temp->hostname, temp->realname);
535 - if (IsAnOper(sptr) && temp->realhost)
536 + if ((IsAnOper(sptr) && HasPriv(sptr, PRIV_USER_PRIVACY)) && temp->realhost)
537 send_reply(sptr, RPL_WHOISACTUALLY, temp->name, temp->username, temp->realhost, "<untracked>");
538 send_reply(sptr, RPL_WHOISSERVER, temp->name,
539 - (feature_bool(FEAT_HIS_WHOIS_SERVERNAME) && !IsOper(sptr)) ?
540 + (feature_bool(FEAT_HIS_WHOIS_SERVERNAME) && (!IsAnOper(sptr) || (IsAnOper(sptr) && !HasPriv(sptr, PRIV_ROUTEINFO)))) ?
541 feature_str(FEAT_HIS_SERVERNAME) :
542 temp->servername,
543 myctime(temp->logoff));
544 diff -r 49deac8a9792 ircd/parse.c
545 --- a/ircd/parse.c Fri Jul 19 22:50:34 2013 +0100
546 +++ b/ircd/parse.c Fri Jul 19 22:51:32 2013 +0100
547 @@ -552,7 +552,7 @@
548 TOK_HASH,
549 0, MAXPARA, MFLG_SLOW, 0, NULL,
550 /* UNREG, CLIENT, SERVER, OPER, SERVICE */
551 - { m_unregistered, m_hash, m_hash, m_hash, m_ignore }
552 + { m_unregistered, m_not_oper, m_hash, m_hash, m_ignore }
553 },
554 {
555 MSG_REHASH,
556 diff -r 49deac8a9792 ircd/s_misc.c
557 --- a/ircd/s_misc.c Fri Jul 19 22:50:34 2013 +0100
558 +++ b/ircd/s_misc.c Fri Jul 19 22:51:32 2013 +0100
559 @@ -502,7 +502,11 @@
560 /* Then remove the client structures */
561 if (IsServer(victim))
562 exit_downlinks(victim, killer, comment1);
563 - exit_one_client(victim, comment);
564 +
565 + if (strncmp(comment, "G-lined", 7))
566 + exit_one_client(victim, comment);
567 + else
568 + exit_one_client(victim, "G-lined");
569
570 /*
571 * cptr can only have been killed if it was cptr itself that got killed here,
572 diff -r 49deac8a9792 ircd/s_stats.c
573 --- a/ircd/s_stats.c Fri Jul 19 22:50:34 2013 +0100
574 +++ b/ircd/s_stats.c Fri Jul 19 22:51:32 2013 +0100
575 @@ -562,8 +562,9 @@
576 if (MyUser(to))
577 for (asd = statsinfo; asd->sd_name; asd++)
578 if (asd != sd) /* don't send the help for us */
579 - sendcmdto_one(&me, CMD_NOTICE, to, "%C :%c (%s) - %s", to, asd->sd_c,
580 - asd->sd_name, asd->sd_desc);
581 + if (((asd->sd_flags & STAT_FLAG_OPERFEAT) && !feature_bool(asd->sd_control)) || IsServer(to) || (IsAnOper(to) && HasPriv(to, PRIV_SERVERINFO)))
582 + sendcmdto_one(&me, CMD_NOTICE, to, "%C :%c (%s) - %s", to, asd->sd_c,
583 + asd->sd_name, asd->sd_desc);
584 }
585
586 /** Contains information about all statistics. */
587 diff -r 49deac8a9792 ircd/s_user.c
588 --- a/ircd/s_user.c Fri Jul 19 22:50:34 2013 +0100
589 +++ b/ircd/s_user.c Fri Jul 19 22:51:32 2013 +0100
590 @@ -197,7 +197,7 @@
591 if (parc <= server || EmptyString((to = parv[server])) || IsUnknown(from))
592 return (HUNTED_ISME);
593
594 - if (MustBeOper && !IsPrivileged(from))
595 + if (MustBeOper && (!IsPrivileged(from) || (IsAnOper(from) && !HasPriv(from, PRIV_SERVERINFO))))
596 {
597 send_reply(from, ERR_NOPRIVILEGES);
598 return HUNTED_NOSUCH;
599 @@ -1428,15 +1428,15 @@
600 * new umode; servers can set it, local users cannot;
601 * prevents users from /kick'ing or /mode -o'ing
602 */
603 - if (!FlagHas(&setflags, FLAG_CHSERV) && !IsOper(sptr))
604 + if (!FlagHas(&setflags, FLAG_CHSERV) && !(IsOper(sptr) && HasPriv(sptr, PRIV_CHANSERV)))
605 ClearChannelService(sptr);
606 - if (!FlagHas(&setflags, FLAG_XTRAOP) && !IsOper(sptr))
607 + if (!FlagHas(&setflags, FLAG_XTRAOP) && !(IsOper(sptr) && HasPriv(sptr, PRIV_XTRA_OPER)))
608 ClearXtraOp(sptr);
609 if (!FlagHas(&setflags, FLAG_NOCHAN) && !(IsOper(sptr) || feature_bool(FEAT_USER_HIDECHANS)))
610 ClearNoChan(sptr);
611 - if (!FlagHas(&setflags, FLAG_NOIDLE) && !(IsOper(sptr) || feature_bool(FEAT_USER_HIDEIDLETIME)))
612 + if (!FlagHas(&setflags, FLAG_NOIDLE) && !((IsOper(sptr) && HasPriv(sptr, PRIV_NOIDLE)) || feature_bool(FEAT_USER_HIDEIDLETIME)))
613 ClearNoIdle(sptr);
614 - if (!FlagHas(&setflags, FLAG_PARANOID) && !IsOper(sptr))
615 + if (!FlagHas(&setflags, FLAG_PARANOID) && !(IsOper(sptr) && HasPriv(sptr, PRIV_PARANOID)))
616 ClearParanoid(sptr);
617
618 /*
619 diff -r 49deac8a9792 ircd/whocmds.c
620 --- a/ircd/whocmds.c Fri Jul 19 22:50:34 2013 +0100
621 +++ b/ircd/whocmds.c Fri Jul 19 22:51:32 2013 +0100
622 @@ -134,7 +134,7 @@
623
624 if (fields & WHO_FIELD_NIP)
625 {
626 - const char* p2 = (HasHiddenHost(acptr) || HasSetHost(acptr)) && !IsAnOper(sptr) ?
627 + const char* p2 = (HasHiddenHost(acptr) || HasSetHost(acptr) || feature_bool(FEAT_HIS_USERIP)) && (!IsAnOper(sptr) || (IsAnOper(sptr) && !HasPriv(sptr, PRIV_USER_PRIVACY))) ?
628 feature_str(FEAT_HIDDEN_IP) :
629 ircd_ntoa(&cli_ip(acptr));
630 *(p1++) = ' ';
631 @@ -150,7 +150,7 @@
632
633 if (!fields || (fields & WHO_FIELD_SER))
634 {
635 - const char *p2 = (feature_bool(FEAT_HIS_WHO_SERVERNAME) && !IsAnOper(sptr)) ?
636 + const char *p2 = (feature_bool(FEAT_HIS_WHO_SERVERNAME) && (!IsAnOper(sptr) || (IsAnOper(sptr) && !HasPriv(sptr, PRIV_ROUTEINFO)))) ?
637 feature_str(FEAT_HIS_SERVERNAME) :
638 cli_name(cli_user(acptr)->server);
639 *(p1++) = ' ';
640 @@ -202,7 +202,7 @@
641 }
642 if (IsDeaf(acptr))
643 *(p1++) = 'd';
644 - if (IsAnOper(sptr))
645 + if (IsAnOper(sptr) && HasPriv(sptr, PRIV_USER_PRIVACY))
646 {
647 if (IsInvisible(acptr))
648 *(p1++) = 'i';
649 @@ -222,7 +222,7 @@
650 *p1++ = ' ';
651 if (!fields)
652 *p1++ = ':'; /* Place colon here for default reply */
653 - if (feature_bool(FEAT_HIS_WHO_HOPCOUNT) && !IsAnOper(sptr))
654 + if (feature_bool(FEAT_HIS_WHO_HOPCOUNT) && (!IsAnOper(sptr) || (IsAnOper(sptr) && !HasPriv(sptr, PRIV_ROUTEINFO))))
655 *p1++ = (sptr == acptr) ? '0' : '3';
656 else
657 /* three digit hopcount maximum */
658 @@ -233,7 +233,7 @@
659 {
660 *p1++ = ' ';
661 if (MyUser(acptr) &&
662 - (IsAnOper(sptr) || !feature_bool(FEAT_HIS_WHO_SERVERNAME) ||
663 + ((IsAnOper(sptr) && HasPriv(sptr, PRIV_ROUTEINFO)) || !feature_bool(FEAT_HIS_WHO_SERVERNAME) ||
664 acptr == sptr))
665 p1 += ircd_snprintf(0, p1, 11, "%d",
666 CurrentTime - cli_user(acptr)->last);