ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_oper.c
Revision: 7403
Committed: Sun Mar 6 16:33:12 2016 UTC (10 years, 4 months ago) by michael
Content type: text/x-csrc
File size: 7036 byte(s)
Log Message:
- Remove useless parameters from operator_find()

File Contents

# User Rev Content
1 adx 30 /*
2 michael 2820 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3 adx 30 *
4 michael 7006 * Copyright (c) 1997-2016 ircd-hybrid development team
5 adx 30 *
6     * This program is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18 michael 4565 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
19 adx 30 * USA
20     */
21    
22 michael 2820 /*! \file m_oper.c
23     * \brief Includes required functions for processing the OPER command.
24     * \version $Id$
25     */
26    
27 adx 30 #include "stdinc.h"
28 michael 1011 #include "list.h"
29 adx 30 #include "client.h"
30     #include "irc_string.h"
31     #include "ircd.h"
32     #include "numeric.h"
33 michael 1309 #include "conf.h"
34     #include "log.h"
35 michael 3347 #include "user.h"
36 adx 30 #include "send.h"
37     #include "parse.h"
38     #include "modules.h"
39     #include "packet.h"
40    
41    
42 michael 6694 /*! \brief Blindly opers up given source_p, using conf info.
43     * All checks on passwords have already been done.
44     * \param source_p Pointer to given client to oper
45     */
46     static void
47     oper_up(struct Client *source_p)
48     {
49     const unsigned int old = source_p->umodes;
50     const struct MaskItem *const conf = source_p->connection->confs.head->data;
51    
52     ++Count.oper;
53     SetOper(source_p);
54    
55     if (conf->modes)
56     AddUMode(source_p, conf->modes);
57     else if (ConfigGeneral.oper_umodes)
58     AddUMode(source_p, ConfigGeneral.oper_umodes);
59    
60     if (!(old & UMODE_INVISIBLE) && HasUMode(source_p, UMODE_INVISIBLE))
61     ++Count.invisi;
62 michael 6701 else if ((old & UMODE_INVISIBLE) && !HasUMode(source_p, UMODE_INVISIBLE))
63 michael 6694 --Count.invisi;
64    
65     assert(dlinkFind(&oper_list, source_p) == NULL);
66     dlinkAdd(source_p, make_dlink_node(), &oper_list);
67    
68     AddOFlag(source_p, conf->port);
69    
70     if (HasOFlag(source_p, OPER_FLAG_ADMIN))
71     AddUMode(source_p, UMODE_ADMIN);
72    
73     if (!EmptyString(conf->whois))
74     {
75     client_attach_svstag(source_p, RPL_WHOISOPERATOR, "+", conf->whois);
76 michael 6782 sendto_server(source_p, 0, 0, ":%s SVSTAG %s %ju %u + :%s",
77     me.id, source_p->id, source_p->tsinfo,
78 michael 6694 RPL_WHOISOPERATOR, conf->whois);
79     }
80    
81     sendto_realops_flags(UMODE_SERVNOTICE, L_ALL, SEND_NOTICE, "%s is now an operator",
82     get_oper_name(source_p));
83     sendto_server(NULL, 0, 0, ":%s GLOBOPS :%s is now an operator",
84     me.id, get_oper_name(source_p));
85     send_umode_out(source_p, old);
86     sendto_one_numeric(source_p, &me, RPL_YOUREOPER);
87     }
88    
89 michael 3336 /*! \brief Notices all opers of the failed oper attempt if enabled
90 michael 1230 *
91 michael 3336 * \param source_p Client doing /oper ...
92     * \param name The nick they tried to oper as
93     * \param reason The reason why they have failed
94 michael 1230 */
95     static void
96     failed_oper_notice(struct Client *source_p, const char *name,
97     const char *reason)
98 adx 30 {
99 michael 4340 if (ConfigGeneral.failed_oper_notice)
100 michael 6318 sendto_realops_flags(UMODE_SERVNOTICE, L_ALL, SEND_NOTICE,
101 michael 1618 "Failed OPER attempt as %s by %s (%s@%s) - %s",
102     name, source_p->name, source_p->username,
103     source_p->host, reason);
104 michael 1247
105 michael 1618 ilog(LOG_TYPE_OPER, "Failed OPER attempt as %s by %s (%s@%s) - %s",
106     name, source_p->name, source_p->username,
107     source_p->host, reason);
108 adx 30 }
109    
110 michael 3266 /*! \brief OPER command handler
111     *
112     * \param source_p Pointer to allocated Client struct from which the message
113     * originally comes from. This can be a local or remote client.
114     * \param parc Integer holding the number of supplied arguments.
115     * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
116     * pointers.
117     * \note Valid arguments for this command are:
118     * - parv[0] = command
119     * - parv[1] = oper name
120     * - parv[2] = oper password
121     */
122 michael 2820 static int
123 michael 3156 m_oper(struct Client *source_p, int parc, char *parv[])
124 adx 30 {
125 michael 1632 struct MaskItem *conf = NULL;
126 michael 4832 const char *const opername = parv[1];
127     const char *const password = parv[2];
128 adx 30
129     if (EmptyString(password))
130     {
131 michael 3109 sendto_one_numeric(source_p, &me, ERR_NEEDMOREPARAMS, "OPER");
132 michael 2820 return 0;
133 adx 30 }
134    
135     /* end the grace period */
136     if (!IsFloodDone(source_p))
137     flood_endgrace(source_p);
138    
139 michael 7403 if ((conf = operator_find(source_p, opername)) == NULL)
140 adx 30 {
141 michael 3109 sendto_one_numeric(source_p, &me, ERR_NOOPERHOST);
142 michael 7403 conf = operator_find(NULL, opername);
143 michael 4829 failed_oper_notice(source_p, opername, (conf != NULL) ?
144 michael 4284 "host mismatch" : "no operator {} block");
145 michael 2820 return 0;
146 adx 30 }
147    
148 michael 2248 if (IsConfSSL(conf) && !HasUMode(source_p, UMODE_SSL))
149     {
150 michael 3109 sendto_one_numeric(source_p, &me, ERR_NOOPERHOST);
151 michael 4829 failed_oper_notice(source_p, opername, "requires SSL/TLS");
152 michael 2820 return 0;
153 michael 2248 }
154    
155 michael 2228 if (!EmptyString(conf->certfp))
156     {
157 michael 2229 if (EmptyString(source_p->certfp) || strcasecmp(source_p->certfp, conf->certfp))
158 michael 2228 {
159 michael 3109 sendto_one_numeric(source_p, &me, ERR_NOOPERHOST);
160 michael 4829 failed_oper_notice(source_p, opername, "client certificate fingerprint mismatch");
161 michael 2820 return 0;
162 michael 2228 }
163     }
164    
165 michael 1632 if (match_conf_password(password, conf))
166 adx 30 {
167 michael 3915 if (attach_conf(source_p, conf))
168 adx 30 {
169 michael 3110 sendto_one_notice(source_p, &me, ":Can't attach conf!");
170 michael 4829 failed_oper_notice(source_p, opername, "can't attach conf!");
171 michael 2820 return 0;
172 adx 30 }
173    
174 michael 6694 oper_up(source_p);
175 adx 30
176 michael 4829 ilog(LOG_TYPE_OPER, "OPER %s by %s!%s@%s", opername, source_p->name,
177     source_p->username, source_p->host);
178 adx 30 }
179     else
180     {
181 michael 3109 sendto_one_numeric(source_p, &me, ERR_PASSWDMISMATCH);
182 michael 4829 failed_oper_notice(source_p, opername, "password mismatch");
183 adx 30 }
184 michael 2820
185     return 0;
186 adx 30 }
187    
188 michael 3266 /*! \brief OPER command handler
189     *
190     * \param source_p Pointer to allocated Client struct from which the message
191     * originally comes from. This can be a local or remote client.
192     * \param parc Integer holding the number of supplied arguments.
193     * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
194     * pointers.
195     * \note Valid arguments for this command are:
196     * - parv[0] = command
197     * - parv[1] = oper name
198     * - parv[2] = oper password
199     */
200 michael 2820 static int
201 michael 3156 mo_oper(struct Client *source_p, int parc, char *parv[])
202 adx 30 {
203 michael 3109 sendto_one_numeric(source_p, &me, RPL_YOUREOPER);
204 michael 2820 return 0;
205 adx 30 }
206    
207 michael 2820 static struct Message oper_msgtab =
208     {
209 michael 5881 .cmd = "OPER",
210     .args_min = 3,
211     .args_max = MAXPARA,
212     .handlers[UNREGISTERED_HANDLER] = m_unregistered,
213     .handlers[CLIENT_HANDLER] = m_oper,
214     .handlers[SERVER_HANDLER] = m_ignore,
215     .handlers[ENCAP_HANDLER] = m_ignore,
216     .handlers[OPER_HANDLER] = mo_oper
217 michael 1230 };
218    
219     static void
220     module_init(void)
221 adx 30 {
222 michael 1230 mod_add_cmd(&oper_msgtab);
223 adx 30 }
224    
225     static void
226 michael 1230 module_exit(void)
227 adx 30 {
228 michael 1230 mod_del_cmd(&oper_msgtab);
229 adx 30 }
230 michael 1230
231 michael 2820 struct module module_entry =
232     {
233 michael 1230 .version = "$Revision$",
234     .modinit = module_init,
235     .modexit = module_exit,
236     };

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision