]> jfr.im git - irc/quakenet/snircd-patchqueue.git/blame - kXmode.patch
rename patch files
[irc/quakenet/snircd-patchqueue.git] / kXmode.patch
CommitLineData
edb26b39 1# HG changeset patch
6fe1b135 2# Parent 82274ef17f3290bcfbea13c35461fc5544a90cdf
edb26b39 3
6fe1b135
P
4diff -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
edb26b39
P
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. */
6fe1b135
P
11-#define infousermodes "diOoswkgxR"
12+#define infousermodes "diOoswkgxRXIn"
edb26b39
P
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 */
6fe1b135 27@@ -583,6 +587,12 @@
edb26b39
P
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
6fe1b135 40@@ -632,6 +642,12 @@
edb26b39
P
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). */
6fe1b135 53@@ -667,6 +683,12 @@
edb26b39
P
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. */
6fe1b135
P
66diff -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
edb26b39
P
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,
6fe1b135
P
77diff -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
edb26b39
P
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 */
6fe1b135
P
88diff -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
edb26b39
P
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 }
6fe1b135
P
135diff -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
edb26b39
P
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),
6fe1b135
P
146diff -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
edb26b39
P
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
6fe1b135
P
164diff -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
edb26b39
P
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- */
6fe1b135
P
184diff -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
edb26b39
P
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
6fe1b135
P
204diff -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
edb26b39
P
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 }
6fe1b135
P
229diff -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
edb26b39
P
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 */
6fe1b135
P
244diff -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
edb26b39
P
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 */
6fe1b135
P
310diff -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
edb26b39
P
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) &&