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"
47 static int mo_omode(struct MsgBuf
*, struct Client
*, struct Client
*, int, const char **);
49 struct Message omode_msgtab
= {
51 {mg_unreg
, mg_not_oper
, mg_ignore
, mg_ignore
, mg_ignore
, {mo_omode
, 3}}
54 mapi_clist_av1 omode_clist
[] = { &omode_msgtab
, NULL
};
56 DECLARE_MODULE_AV1(omode
, NULL
, NULL
, omode_clist
, NULL
, NULL
, "$Revision: 3121 $");
59 * mo_omode - MODE command handler
63 mo_omode(struct MsgBuf
*msgbuf_p
, struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
65 struct Channel
*chptr
= NULL
;
66 struct membership
*msptr
;
72 if(!IsOperAdmin(source_p
))
74 sendto_one(source_p
, form_str(ERR_NOPRIVS
), me
.name
, source_p
->name
, "admin");
78 /* Now, try to find the channel in question */
79 if(!IsChanPrefix(parv
[1][0]) || !check_channel_name(parv
[1]))
81 sendto_one_numeric(source_p
, ERR_BADCHANNAME
,
82 form_str(ERR_BADCHANNAME
), parv
[1]);
86 chptr
= find_channel(parv
[1]);
90 sendto_one_numeric(source_p
, ERR_NOSUCHCHANNEL
,
91 form_str(ERR_NOSUCHCHANNEL
), parv
[1]);
95 /* Now know the channel exists */
96 msptr
= find_channel_membership(chptr
, source_p
);
97 wasonchannel
= msptr
!= NULL
;
101 sendto_one_notice(source_p
, ":Use a normal MODE you idiot");
106 for (i
= 2; i
< parc
; i
++)
109 rb_strlcat(params
, " ", sizeof params
);
110 rb_strlcat(params
, parv
[i
], sizeof params
);
113 sendto_wallops_flags(UMODE_WALLOP
, &me
,
114 "OMODE called for [%s] [%s] by %s!%s@%s",
115 parv
[1], params
, source_p
->name
, source_p
->username
, source_p
->host
);
116 ilog(L_MAIN
, "OMODE called for [%s] [%s] by %s",
117 parv
[1], params
, get_oper_name(source_p
));
119 if(*chptr
->chname
!= '&')
120 sendto_server(NULL
, NULL
, NOCAPS
, NOCAPS
,
121 ":%s WALLOPS :OMODE called for [%s] [%s] by %s!%s@%s",
122 me
.name
, parv
[1], params
, source_p
->name
, source_p
->username
,
126 set_channel_mode(client_p
, source_p
->servptr
, chptr
, msptr
,
129 if (parc
== 4 && !strcmp(parv
[2], "+o") && !irccmp(parv
[3], source_p
->name
))
131 /* Opping themselves */
134 sendto_one_numeric(source_p
, ERR_USERNOTINCHANNEL
,
135 form_str(ERR_USERNOTINCHANNEL
), parv
[3], chptr
->chname
);
138 sendto_channel_local(ALL_MEMBERS
, chptr
, ":%s MODE %s +o %s",
139 me
.name
, parv
[1], source_p
->name
);
140 sendto_server(NULL
, chptr
, CAP_TS6
, NOCAPS
,
141 ":%s TMODE %ld %s +o %s",
142 me
.id
, (long) chptr
->channelts
, parv
[1],
144 msptr
->flags
|= CHFL_CHANOP
;
148 /* Hack it so set_channel_mode() will accept */
150 msptr
->flags
|= CHFL_CHANOP
;
153 add_user_to_channel(chptr
, source_p
, CHFL_CHANOP
);
154 msptr
= find_channel_membership(chptr
, source_p
);
156 set_channel_mode(client_p
, source_p
, chptr
, msptr
,
158 /* We know they were not opped before and they can't have opped
159 * themselves as set_channel_mode() does not allow that
162 msptr
->flags
&= ~CHFL_CHANOP
;
164 remove_user_from_channel(msptr
);