]>
Commit | Line | Data |
---|---|---|
edb26b39 | 1 | # HG changeset patch |
6fe1b135 | 2 | # Parent 82274ef17f3290bcfbea13c35461fc5544a90cdf |
edb26b39 | 3 | |
6fe1b135 P |
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 | |
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 |
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 | |
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 |
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 | |
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 |
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 | |
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 |
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 | |
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 |
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 | |
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 |
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 | |
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 |
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 | |
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 |
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 | |
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 |
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 | |
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 |
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 | |
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 |
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 | |
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) && |