]> jfr.im git - irc/quakenet/snircd-patchqueue.git/blob - kXmode.patch
rename patch files
[irc/quakenet/snircd-patchqueue.git] / kXmode.patch
1 # HG changeset patch
2 # Parent 82274ef17f3290bcfbea13c35461fc5544a90cdf
3
4 diff -r 82274ef17f32 include/client.h
5 --- a/include/client.h Sat Jul 20 14:45:57 2013 +0100
6 +++ b/include/client.h Sat Jul 20 14:46:31 2013 +0100
7 @@ -90,7 +90,7 @@
8 #define FlagClr(set,flag) ((set)->bits[FLAGSET_INDEX(flag)] &= ~FLAGSET_MASK(flag))
9
10 /** String containing valid user modes, in no particular order. */
11 -#define infousermodes "diOoswkgxR"
12 +#define infousermodes "diOoswkgxRXIn"
13
14 /** Operator privileges. */
15 enum Priv
16 @@ -168,6 +168,10 @@
17 FLAG_ACCOUNTONLY, /**< ASUKA_R: hide privmsgs/notices if
18 user is not authed or opered */
19 FLAG_HIDDENHOST, /**< user's host is hidden */
20 + FLAG_NOCHAN, /**< user's channels are hidden */
21 + FLAG_NOIDLE, /**< user's idletime is hidden */
22 + FLAG_XTRAOP, /**< oper has special powers */
23 +
24 FLAG_LAST_FLAG, /**< number of flags */
25 FLAG_LOCAL_UMODES = FLAG_LOCOP, /**< First local mode flag */
26 FLAG_GLOBAL_UMODES = FLAG_OPER /**< First global mode flag */
27 @@ -583,6 +587,12 @@
28 #define IsAccount(x) HasFlag(x, FLAG_ACCOUNT)
29 /** Return non-zero if the client has set mode +x (hidden host). */
30 #define IsHiddenHost(x) HasFlag(x, FLAG_HIDDENHOST)
31 +/** Return non-zero if the client has set mode +X (xtraop) */
32 +#define IsXtraOp(x) HasFlag(x, FLAG_XTRAOP)
33 +/** Return non-zero if the client has set mode +n (hide channels) */
34 +#define IsNoChan(x) HasFlag(x, FLAG_NOCHAN)
35 +/** Return non-zero if the client has set mode +I (hide idletime) */
36 +#define IsNoIdle(x) HasFlag(x, FLAG_NOIDLE)
37 /** Return non-zero if the client has an active PING request. */
38 #define IsPingSent(x) HasFlag(x, FLAG_PINGSENT)
39 /** Return non-zero if the client should not receive privmsgs/notices
40 @@ -632,6 +642,12 @@
41 #define SetAccount(x) SetFlag(x, FLAG_ACCOUNT)
42 /** Mark a client as having mode +x (hidden host). */
43 #define SetHiddenHost(x) SetFlag(x, FLAG_HIDDENHOST)
44 +/** Mark a client as having mode +X (xtraop). */
45 +#define SetXtraOp(x) SetFlag(x, FLAG_XTRAOP)
46 +/** Mark a client as having mode +n (hide channels). */
47 +#define SetNoChan(x) SetFlag(x, FLAG_NOCHAN)
48 +/** Mark a client as having mode +I (hide idletime). */
49 +#define SetNoIdle(x) SetFlag(x, FLAG_NOIDLE)
50 /** Mark a client as having a pending PING. */
51 #define SetPingSent(x) SetFlag(x, FLAG_PINGSENT)
52 /** Mark a client as having mode +R (account only). */
53 @@ -667,6 +683,12 @@
54 #define ClearServNotice(x) ClrFlag(x, FLAG_SERVNOTICE)
55 /** Remove mode +x (hidden host) from the client. */
56 #define ClearHiddenHost(x) ClrFlag(x, FLAG_HIDDENHOST)
57 +/** Remove mode +X (xtraop) from a client. */
58 +#define ClearXtraOp(x) ClrFlag(x, FLAG_XTRAOP)
59 +/** Remove mode +n (hide channels) from a client. */
60 +#define ClearNoChan(x) ClrFlag(x, FLAG_NOCHAN)
61 +/** Remove mode +I (hide idletime) from a client. */
62 +#define ClearNoIdle(x) ClrFlag(x, FLAG_NOIDLE)
63 /** Clear the client's pending PING flag. */
64 #define ClearPingSent(x) ClrFlag(x, FLAG_PINGSENT)
65 /** Clear the client's HUB flag. */
66 diff -r 82274ef17f32 include/ircd_features.h
67 --- a/include/ircd_features.h Sat Jul 20 14:45:57 2013 +0100
68 +++ b/include/ircd_features.h Sat Jul 20 14:46:31 2013 +0100
69 @@ -56,6 +56,7 @@
70 FEAT_HIDDEN_IP,
71 FEAT_AUTOINVISIBLE,
72 FEAT_CONNEXIT_NOTICES,
73 + FEAT_USER_HIDECHANS,
74 FEAT_OPLEVELS,
75 FEAT_ZANNELS,
76 FEAT_LOCAL_CHANNELS,
77 diff -r 82274ef17f32 include/numeric.h
78 --- a/include/numeric.h Sat Jul 20 14:45:57 2013 +0100
79 +++ b/include/numeric.h Sat Jul 20 14:46:31 2013 +0100
80 @@ -410,6 +410,7 @@
81 /* ERR_DESYNC 484 Dalnet,PTlink */
82 /* ERR_ATTACKDENY 484 unreal */
83 /* ERR_RESTRICTED 484 IRCnet extension */
84 +#define ERR_ISREALSERVICE 485 /* QuakeNet/ASUKA extension */
85 /* ERR_UNIQOPRIVSNEEDED 485 IRCnet extension */
86 /* ERR_KILLDENY 485 unreal */
87 /* ERR_CANTKICKADMIN 485 PTlink */
88 diff -r 82274ef17f32 ircd/channel.c
89 --- a/ircd/channel.c Sat Jul 20 14:45:57 2013 +0100
90 +++ b/ircd/channel.c Sat Jul 20 14:46:31 2013 +0100
91 @@ -743,7 +743,7 @@
92 /*
93 * Servers can always speak on channels.
94 */
95 - if (IsServer(cptr))
96 + if (IsServer(cptr) || IsXtraOp(cptr))
97 return 1;
98
99 member = find_channel_member(cptr, chptr);
100 @@ -3119,17 +3119,29 @@
101 if ((state->cli_change[i].flag & (MODE_DEL | MODE_CHANOP)) ==
102 (MODE_DEL | MODE_CHANOP)) {
103 /* prevent +k users from being deopped */
104 - if (IsChannelService(state->cli_change[i].client)) {
105 + /*
106 + * ASUKA_X:
107 + * Allow +X'ed users to mess with +k'ed.
108 + * --Bigfoot
109 + */
110 + if ((IsChannelService(state->cli_change[i].client) && IsService(cli_user(state->cli_change[i].client)->server)) || (IsChannelService(state->cli_change[i].client) && !IsXtraOp(state->sptr))) {
111 if (state->flags & MODE_PARSE_FORCE) /* it was forced */
112 sendto_opmask_butone(0, SNO_HACK4, "Deop of +k user on %H by %s",
113 state->chptr,
114 (IsServer(state->sptr) ? cli_name(state->sptr) :
115 cli_name((cli_user(state->sptr))->server)));
116
117 - else if (MyUser(state->sptr) && state->flags & MODE_PARSE_SET) {
118 - send_reply(state->sptr, ERR_ISCHANSERVICE,
119 - cli_name(state->cli_change[i].client),
120 - state->chptr->chname);
121 + else if (MyUser(state->sptr) && state->flags & MODE_PARSE_SET && (state->sptr != state->cli_change[i].client)) {
122 + if(IsService(cli_user(state->cli_change[i].client)->server) && IsChannelService(state->cli_change[i].client)){
123 + send_reply(state->sptr, ERR_ISREALSERVICE,
124 + cli_name(state->cli_change[i].client),
125 + state->chptr->chname);
126 + }else{
127 + send_reply(state->sptr, ERR_ISCHANSERVICE,
128 + cli_name(state->cli_change[i].client),
129 + state->chptr->chname);
130 + }
131 +
132 continue;
133 }
134 }
135 diff -r 82274ef17f32 ircd/ircd_features.c
136 --- a/ircd/ircd_features.c Sat Jul 20 14:45:57 2013 +0100
137 +++ b/ircd/ircd_features.c Sat Jul 20 14:46:31 2013 +0100
138 @@ -321,6 +321,7 @@
139 F_S(HIDDEN_IP, 0, "127.0.0.1", 0),
140 F_B(AUTOINVISIBLE, 0, 1, 0),
141 F_B(CONNEXIT_NOTICES, 0, 0, 0),
142 + F_B(USER_HIDECHANS, 0, 0, 0),
143 F_B(OPLEVELS, 0, 1, 0),
144 F_B(ZANNELS, 0, 1, 0),
145 F_B(LOCAL_CHANNELS, 0, 1, 0),
146 diff -r 82274ef17f32 ircd/m_join.c
147 --- a/ircd/m_join.c Sat Jul 20 14:45:57 2013 +0100
148 +++ b/ircd/m_join.c Sat Jul 20 14:46:31 2013 +0100
149 @@ -207,6 +207,14 @@
150 else if (*chptr->mode.key && (!key || strcmp(key, chptr->mode.key)))
151 err = ERR_BADCHANNELKEY;
152
153 + /*
154 + * ASUKA_X:
155 + * Allow XtraOpers to join all channels.
156 + * --Bigfoot
157 + */
158 + if (IsXtraOp(sptr))
159 + err = 0;
160 +
161 /* An oper with WALK_LCHAN privilege can join a local channel
162 * he otherwise could not join by using "OVERRIDE" as the key.
163 * This will generate a HACK(4) notice, but fails if the oper
164 diff -r 82274ef17f32 ircd/m_kick.c
165 --- a/ircd/m_kick.c Sat Jul 20 14:45:57 2013 +0100
166 +++ b/ircd/m_kick.c Sat Jul 20 14:46:31 2013 +0100
167 @@ -131,7 +131,15 @@
168 return 0; /* find_chasing sends the reply for us */
169
170 /* Don't allow the channel service to be kicked */
171 - if (IsChannelService(who))
172 + /*
173 + * ASUKA_X:
174 + * Allow +X'ed users to kick +k'ed, but not U-lined services.
175 + * --Bigfoot
176 + */
177 + if (IsChannelService(who) && IsService(cli_user(who)->server))
178 + return send_reply(sptr, ERR_ISREALSERVICE, cli_name(who), chptr->chname);
179 +
180 + if (IsChannelService(who) && !IsXtraOp(sptr) && (who!=sptr))
181 return send_reply(sptr, ERR_ISCHANSERVICE, cli_name(who), chptr->chname);
182
183 /* Prevent kicking opers from local channels -DM- */
184 diff -r 82274ef17f32 ircd/m_kill.c
185 --- a/ircd/m_kill.c Sat Jul 20 14:45:57 2013 +0100
186 +++ b/ircd/m_kill.c Sat Jul 20 14:46:31 2013 +0100
187 @@ -277,7 +277,15 @@
188 /*
189 * if the user is +k, prevent a kill from local user
190 */
191 - if (IsChannelService(victim))
192 + /*
193 + * ASUKA_X:
194 + * Allow +X'ed users to kill +k'ed, but not U-lined services.
195 + * --Bigfoot
196 + */
197 + if (IsChannelService(victim) && IsService(cli_user(victim)->server))
198 + return send_reply(sptr, ERR_ISREALSERVICE, "KILL", cli_name(victim));
199 +
200 + if (IsChannelService(victim) && !IsXtraOp(sptr) && !(victim==sptr))
201 return send_reply(sptr, ERR_ISCHANSERVICE, "KILL", cli_name(victim));
202
203
204 diff -r 82274ef17f32 ircd/m_whois.c
205 --- a/ircd/m_whois.c Sat Jul 20 14:45:57 2013 +0100
206 +++ b/ircd/m_whois.c Sat Jul 20 14:46:31 2013 +0100
207 @@ -144,7 +144,7 @@
208 cli_info(acptr));
209
210 /* Display the channels this user is on. */
211 - if (!IsChannelService(acptr))
212 + if ((!IsChannelService(acptr) && !IsNoChan(acptr)) || (acptr==sptr))
213 {
214 struct Membership* chan;
215 mlen = strlen(cli_name(&me)) + strlen(cli_name(sptr)) + 12 + strlen(name);
216 @@ -219,8 +219,10 @@
217 * probably a good place to add them :)
218 */
219
220 - if (MyConnect(acptr) && (!feature_bool(FEAT_HIS_WHOIS_IDLETIME) ||
221 - (sptr == acptr || IsAnOper(sptr) || parc >= 3)))
222 + if (MyConnect(acptr) &&
223 + (IsAnOper(sptr) ||
224 + (!IsNoIdle(acptr) && (!feature_bool(FEAT_HIS_WHOIS_IDLETIME) ||
225 + sptr == acptr || parc >= 3))))
226 send_reply(sptr, RPL_WHOISIDLE, name, CurrentTime - user->last,
227 cli_firsttime(acptr));
228 }
229 diff -r 82274ef17f32 ircd/s_err.c
230 --- a/ircd/s_err.c Sat Jul 20 14:45:57 2013 +0100
231 +++ b/ircd/s_err.c Sat Jul 20 14:46:31 2013 +0100
232 @@ -1000,9 +1000,9 @@
233 /* 483 */
234 { ERR_CANTKILLSERVER, ":You cant kill a server!", "483" },
235 /* 484 */
236 - { ERR_ISCHANSERVICE, "%s %s :Cannot kill, kick or deop a network service", "484" },
237 + { ERR_ISCHANSERVICE, "%s %s :Cannot kill, kick or deop an IRC operator", "484" },
238 /* 485 */
239 - { 0 },
240 + { ERR_ISREALSERVICE, "%s %s :Cannot kill, kick or deop a network service", "485" },
241 /* 486 */
242 { ERR_ACCOUNTONLY, "%s :You must be authed in order to message this user", "486" },
243 /* 487 */
244 diff -r 82274ef17f32 ircd/s_user.c
245 --- a/ircd/s_user.c Sat Jul 20 14:45:57 2013 +0100
246 +++ b/ircd/s_user.c Sat Jul 20 14:46:31 2013 +0100
247 @@ -503,7 +503,10 @@
248 { FLAG_DEBUG, 'g' },
249 { FLAG_ACCOUNT, 'r' },
250 { FLAG_HIDDENHOST, 'x' },
251 - { FLAG_ACCOUNTONLY, 'R' }
252 + { FLAG_ACCOUNTONLY, 'R' },
253 + { FLAG_XTRAOP, 'X' },
254 + { FLAG_NOCHAN, 'n' },
255 + { FLAG_NOIDLE, 'I' }
256 };
257
258 /** Length of #userModeList. */
259 @@ -580,7 +583,7 @@
260 if (MyUser(sptr)) {
261 const char* channel_name;
262 struct Membership *member;
263 - if ((channel_name = find_no_nickchange_channel(sptr))) {
264 + if ((channel_name = find_no_nickchange_channel(sptr)) && !IsXtraOp(sptr)) {
265 return send_reply(cptr, ERR_BANNICKCHANGE, channel_name);
266 }
267 /*
268 @@ -1072,6 +1075,24 @@
269 else
270 ClearChannelService(sptr);
271 break;
272 + case 'X':
273 + if (what == MODE_ADD)
274 + SetXtraOp(sptr);
275 + else
276 + ClearXtraOp(sptr);
277 + break;
278 + case 'n':
279 + if (what == MODE_ADD)
280 + SetNoChan(sptr);
281 + else
282 + ClearNoChan(sptr);
283 + break;
284 + case 'I':
285 + if (what == MODE_ADD)
286 + SetNoIdle(sptr);
287 + else
288 + ClearNoIdle(sptr);
289 + break;
290 case 'g':
291 if (what == MODE_ADD)
292 SetDebug(sptr);
293 @@ -1117,8 +1138,15 @@
294 * new umode; servers can set it, local users cannot;
295 * prevents users from /kick'ing or /mode -o'ing
296 */
297 - if (!FlagHas(&setflags, FLAG_CHSERV))
298 + if (!FlagHas(&setflags, FLAG_CHSERV) && !IsOper(sptr))
299 ClearChannelService(sptr);
300 + if (!FlagHas(&setflags, FLAG_XTRAOP) && !IsOper(sptr))
301 + ClearXtraOp(sptr);
302 + if (!FlagHas(&setflags, FLAG_NOCHAN) && !(IsOper(sptr) || feature_bool(FEAT_USER_HIDECHANS)))
303 + ClearNoChan(sptr);
304 + if (!FlagHas(&setflags, FLAG_NOIDLE) && !IsOper(sptr))
305 + ClearNoIdle(sptr);
306 +
307 /*
308 * only send wallops to opers
309 */
310 diff -r 82274ef17f32 ircd/whocmds.c
311 --- a/ircd/whocmds.c Sat Jul 20 14:45:57 2013 +0100
312 +++ b/ircd/whocmds.c Sat Jul 20 14:46:31 2013 +0100
313 @@ -90,7 +90,7 @@
314 chan = find_channel_member(acptr, repchan);
315 }
316 else if ((!fields || (fields & (WHO_FIELD_CHA | WHO_FIELD_FLA)))
317 - && !IsChannelService(acptr))
318 + && !IsChannelService(acptr) && !IsNoChan(acptr))
319 {
320 for (chan = cli_user(acptr)->channel; chan; chan = chan->next_channel)
321 if (PubChannel(chan->channel) &&