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
25 * $Id: m_omode.c 3121 2007-01-02 13:23:04Z jilles $
37 #include "s_newconf.h"
45 static int mo_omode(struct Client
*, struct Client
*, int, const char **);
47 struct Message omode_msgtab
= {
48 "OMODE", 0, 0, 0, MFLG_SLOW
,
49 {mg_unreg
, mg_not_oper
, mg_ignore
, mg_ignore
, mg_ignore
, {mo_omode
, 3}}
52 mapi_clist_av1 omode_clist
[] = { &omode_msgtab
, NULL
};
54 DECLARE_MODULE_AV1(omode
, NULL
, NULL
, omode_clist
, NULL
, NULL
, "$Revision: 3121 $");
57 * mo_omode - MODE command handler
61 mo_omode(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
63 struct Channel
*chptr
= NULL
;
64 struct membership
*msptr
;
70 if(!IsOperAdmin(source_p
))
72 sendto_one(source_p
, form_str(ERR_NOPRIVS
), me
.name
, source_p
->name
, "admin");
76 /* Now, try to find the channel in question */
77 if(!IsChanPrefix(parv
[1][0]) || !check_channel_name(parv
[1]))
79 sendto_one_numeric(source_p
, ERR_BADCHANNAME
,
80 form_str(ERR_BADCHANNAME
), parv
[1]);
84 chptr
= find_channel(parv
[1]);
88 sendto_one_numeric(source_p
, ERR_NOSUCHCHANNEL
,
89 form_str(ERR_NOSUCHCHANNEL
), parv
[1]);
93 /* Now know the channel exists */
94 msptr
= find_channel_membership(chptr
, source_p
);
95 wasonchannel
= msptr
!= NULL
;
99 sendto_one_notice(source_p
, ":Use a normal MODE you idiot");
104 for (i
= 2; i
< parc
; i
++)
107 rb_strlcat(params
, " ", sizeof params
);
108 rb_strlcat(params
, parv
[i
], sizeof params
);
111 sendto_wallops_flags(UMODE_WALLOP
, &me
,
112 "OMODE called for [%s] [%s] by %s!%s@%s",
113 parv
[1], params
, source_p
->name
, source_p
->username
, source_p
->host
);
114 ilog(L_MAIN
, "OMODE called for [%s] [%s] by %s",
115 parv
[1], params
, get_oper_name(source_p
));
117 if(*chptr
->chname
!= '&')
118 sendto_server(NULL
, NULL
, NOCAPS
, NOCAPS
,
119 ":%s WALLOPS :OMODE called for [%s] [%s] by %s!%s@%s",
120 me
.name
, parv
[1], params
, source_p
->name
, source_p
->username
,
124 set_channel_mode(client_p
, source_p
->servptr
, chptr
, msptr
,
127 if (parc
== 4 && !strcmp(parv
[2], "+o") && !irccmp(parv
[3], source_p
->name
))
129 /* Opping themselves */
132 sendto_one_numeric(source_p
, ERR_USERNOTINCHANNEL
,
133 form_str(ERR_USERNOTINCHANNEL
), parv
[3], chptr
->chname
);
136 sendto_channel_local(ALL_MEMBERS
, chptr
, ":%s MODE %s +o %s",
137 me
.name
, parv
[1], source_p
->name
);
138 sendto_server(NULL
, chptr
, CAP_TS6
, NOCAPS
,
139 ":%s TMODE %ld %s +o %s",
140 me
.id
, (long) chptr
->channelts
, parv
[1],
142 msptr
->flags
|= CHFL_CHANOP
;
146 /* Hack it so set_channel_mode() will accept */
148 msptr
->flags
|= CHFL_CHANOP
;
151 add_user_to_channel(chptr
, source_p
, CHFL_CHANOP
);
152 msptr
= find_channel_membership(chptr
, source_p
);
154 set_channel_mode(client_p
, source_p
, chptr
, msptr
,
156 /* We know they were not opped before and they can't have opped
157 * themselves as set_channel_mode() does not allow that
160 msptr
->flags
&= ~CHFL_CHANOP
;
162 remove_user_from_channel(msptr
);