2 * Charybdis: an advanced Internet Relay Chat Daemon(ircd).
3 * m_omode.c: allows oper mode hacking
5 * Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
6 * Copyright (C) 1996-2002 Hybrid Development Team
7 * Copyright (C) 2002-2004 ircd-ratbox development team
8 * Copyright (C) 2006 Charybdis development team
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
36 #include "s_newconf.h"
44 static int mo_omode(struct Client
*, struct Client
*, int, const char **);
46 struct Message omode_msgtab
= {
47 "OMODE", 0, 0, 0, MFLG_SLOW
,
48 {mg_unreg
, mg_not_oper
, mg_ignore
, mg_ignore
, mg_ignore
, {mo_omode
, 3}}
51 mapi_clist_av1 omode_clist
[] = { &omode_msgtab
, NULL
};
53 DECLARE_MODULE_AV1(omode
, NULL
, NULL
, omode_clist
, NULL
, NULL
, "$Revision: 3121 $");
56 * mo_omode - MODE command handler
60 mo_omode(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
62 struct Channel
*chptr
= NULL
;
63 struct membership
*msptr
;
69 if(!IsOperAdmin(source_p
))
71 sendto_one(source_p
, form_str(ERR_NOPRIVS
), me
.name
, source_p
->name
, "admin");
75 /* Now, try to find the channel in question */
76 if(!IsChanPrefix(parv
[1][0]) || !check_channel_name(parv
[1]))
78 sendto_one_numeric(source_p
, ERR_BADCHANNAME
,
79 form_str(ERR_BADCHANNAME
), parv
[1]);
83 chptr
= find_channel(parv
[1]);
87 sendto_one_numeric(source_p
, ERR_NOSUCHCHANNEL
,
88 form_str(ERR_NOSUCHCHANNEL
), parv
[1]);
92 /* Now know the channel exists */
93 msptr
= find_channel_membership(chptr
, source_p
);
94 wasonchannel
= msptr
!= NULL
;
98 sendto_one_notice(source_p
, ":Use a normal MODE you idiot");
103 for (i
= 2; i
< parc
; i
++)
106 rb_strlcat(params
, " ", sizeof params
);
107 rb_strlcat(params
, parv
[i
], sizeof params
);
110 sendto_wallops_flags(UMODE_WALLOP
, &me
,
111 "OMODE called for [%s] [%s] by %s!%s@%s",
112 parv
[1], params
, source_p
->name
, source_p
->username
, source_p
->host
);
113 ilog(L_MAIN
, "OMODE called for [%s] [%s] by %s",
114 parv
[1], params
, get_oper_name(source_p
));
116 if(*chptr
->chname
!= '&')
117 sendto_server(NULL
, NULL
, NOCAPS
, NOCAPS
,
118 ":%s WALLOPS :OMODE called for [%s] [%s] by %s!%s@%s",
119 me
.name
, parv
[1], params
, source_p
->name
, source_p
->username
,
123 set_channel_mode(client_p
, source_p
->servptr
, chptr
, msptr
,
126 if (parc
== 4 && !strcmp(parv
[2], "+a") && !irccmp(parv
[3], source_p
->name
))
128 /* Admining themselves */
131 sendto_one_numeric(source_p
, ERR_USERNOTINCHANNEL
,
132 form_str(ERR_USERNOTINCHANNEL
), parv
[3], chptr
->chname
);
135 sendto_channel_local(ALL_MEMBERS
, chptr
, ":%s MODE %s +a %s",
136 me
.name
, parv
[1], source_p
->name
);
137 sendto_server(NULL
, chptr
, CAP_TS6
, NOCAPS
,
138 ":%s TMODE %ld %s +a %s",
139 me
.id
, (long) chptr
->channelts
, parv
[1],
141 msptr
->flags
|= CHFL_ADMIN
;
143 else if (parc
== 4 && !strcmp(parv
[2], "+o") && !irccmp(parv
[3], source_p
->name
))
145 /* Opping themselves */
148 sendto_one_numeric(source_p
, ERR_USERNOTINCHANNEL
,
149 form_str(ERR_USERNOTINCHANNEL
), parv
[3], chptr
->chname
);
152 sendto_channel_local(ALL_MEMBERS
, chptr
, ":%s MODE %s +o %s",
153 me
.name
, parv
[1], source_p
->name
);
154 sendto_server(NULL
, chptr
, CAP_TS6
, NOCAPS
,
155 ":%s TMODE %ld %s +o %s",
156 me
.id
, (long) chptr
->channelts
, parv
[1],
158 msptr
->flags
|= CHFL_CHANOP
;
160 else if (parc
== 4 && !strcmp(parv
[2], "+h") && !irccmp(parv
[3], source_p
->name
))
162 /* Halfopping themselves */
165 sendto_one_numeric(source_p
, ERR_USERNOTINCHANNEL
,
166 form_str(ERR_USERNOTINCHANNEL
), parv
[3], chptr
->chname
);
169 sendto_channel_local(ALL_MEMBERS
, chptr
, ":%s MODE %s +h %s",
170 me
.name
, parv
[1], source_p
->name
);
171 sendto_server(NULL
, chptr
, CAP_TS6
, NOCAPS
,
172 ":%s TMODE %ld %s +h %s",
173 me
.id
, (long) chptr
->channelts
, parv
[1],
175 msptr
->flags
|= CHFL_HALFOP
;
177 else if (ConfigChannel
.use_admin
)
179 /* Hack it so set_channel_mode() will accept */
181 msptr
->flags
|= CHFL_ADMIN
;
184 add_user_to_channel(chptr
, source_p
, CHFL_CHANOP
);
185 msptr
= find_channel_membership(chptr
, source_p
);
187 set_channel_mode(client_p
, source_p
, chptr
, msptr
,
189 /* We know they were not opped before and they can't have opped
190 * themselves as set_channel_mode() does not allow that
193 msptr
->flags
&= ~CHFL_ADMIN
;
195 remove_user_from_channel(msptr
);
199 /* CHFL_ADMIN is only useful if admin is enabled
200 * so hack it with op if it is not. */
202 msptr
->flags
|= CHFL_CHANOP
;
205 add_user_to_channel(chptr
, source_p
, CHFL_CHANOP
);
206 msptr
= find_channel_membership(chptr
, source_p
);
208 set_channel_mode(client_p
, source_p
, chptr
, msptr
,
210 /* We know they were not opped before and they can't have opped
211 * themselves as set_channel_mode() does not allow that
214 msptr
->flags
&= ~CHFL_CHANOP
;
216 remove_user_from_channel(msptr
);