ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_oper.c
Revision: 9335
Committed: Sat Apr 18 16:19:10 2020 UTC (5 years, 4 months ago) by michael
Content type: text/x-csrc
File size: 6934 byte(s)
Log Message:
- Fixed style inconsistencies in various places

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 9101 * Copyright (c) 1997-2020 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 michael 8484 #include "client_svstag.h"
31 adx 30 #include "irc_string.h"
32     #include "ircd.h"
33     #include "numeric.h"
34 michael 1309 #include "conf.h"
35     #include "log.h"
36 michael 3347 #include "user.h"
37 adx 30 #include "send.h"
38     #include "parse.h"
39     #include "modules.h"
40     #include "packet.h"
41    
42    
43 michael 6694 /*! \brief Blindly opers up given source_p, using conf info.
44     * All checks on passwords have already been done.
45     * \param source_p Pointer to given client to oper
46 michael 8689 * \param conf operator {} configuration record
47 michael 6694 */
48     static void
49 michael 8689 oper_up(struct Client *source_p, const struct MaskItem *conf)
50 michael 6694 {
51     const unsigned int old = source_p->umodes;
52    
53     ++Count.oper;
54     SetOper(source_p);
55    
56     if (conf->modes)
57     AddUMode(source_p, conf->modes);
58     else if (ConfigGeneral.oper_umodes)
59     AddUMode(source_p, ConfigGeneral.oper_umodes);
60    
61     if (!(old & UMODE_INVISIBLE) && HasUMode(source_p, UMODE_INVISIBLE))
62     ++Count.invisi;
63 michael 6701 else if ((old & UMODE_INVISIBLE) && !HasUMode(source_p, UMODE_INVISIBLE))
64 michael 6694 --Count.invisi;
65    
66     assert(dlinkFind(&oper_list, source_p) == NULL);
67     dlinkAdd(source_p, make_dlink_node(), &oper_list);
68    
69     AddOFlag(source_p, conf->port);
70    
71     if (HasOFlag(source_p, OPER_FLAG_ADMIN))
72     AddUMode(source_p, UMODE_ADMIN);
73    
74     if (!EmptyString(conf->whois))
75     {
76 michael 8484 svstag_attach(&source_p->svstags, RPL_WHOISOPERATOR, "+", conf->whois);
77 michael 8516 sendto_server(NULL, 0, 0, ":%s SVSTAG %s %ju %u + :%s",
78 michael 6782 me.id, source_p->id, source_p->tsinfo,
79 michael 6694 RPL_WHOISOPERATOR, conf->whois);
80     }
81    
82 michael 7898 ilog(LOG_TYPE_OPER, "OPER %s by %s!%s@%s", conf->name, source_p->name,
83     source_p->username, source_p->host);
84 michael 6694 sendto_realops_flags(UMODE_SERVNOTICE, L_ALL, SEND_NOTICE, "%s is now an operator",
85     get_oper_name(source_p));
86     sendto_server(NULL, 0, 0, ":%s GLOBOPS :%s is now an operator",
87     me.id, get_oper_name(source_p));
88 michael 8431
89 michael 6694 send_umode_out(source_p, old);
90     sendto_one_numeric(source_p, &me, RPL_YOUREOPER);
91     }
92    
93 michael 3336 /*! \brief Notices all opers of the failed oper attempt if enabled
94 michael 1230 *
95 michael 3336 * \param source_p Client doing /oper ...
96     * \param name The nick they tried to oper as
97     * \param reason The reason why they have failed
98 michael 1230 */
99     static void
100     failed_oper_notice(struct Client *source_p, const char *name,
101     const char *reason)
102 adx 30 {
103 michael 4340 if (ConfigGeneral.failed_oper_notice)
104 michael 6318 sendto_realops_flags(UMODE_SERVNOTICE, L_ALL, SEND_NOTICE,
105 michael 1618 "Failed OPER attempt as %s by %s (%s@%s) - %s",
106     name, source_p->name, source_p->username,
107     source_p->host, reason);
108 michael 1247
109 michael 1618 ilog(LOG_TYPE_OPER, "Failed OPER attempt as %s by %s (%s@%s) - %s",
110     name, source_p->name, source_p->username,
111     source_p->host, reason);
112 adx 30 }
113    
114 michael 3266 /*! \brief OPER command handler
115     *
116     * \param source_p Pointer to allocated Client struct from which the message
117     * originally comes from. This can be a local or remote client.
118     * \param parc Integer holding the number of supplied arguments.
119     * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
120     * pointers.
121     * \note Valid arguments for this command are:
122     * - parv[0] = command
123     * - parv[1] = oper name
124     * - parv[2] = oper password
125     */
126 michael 9077 static void
127 michael 3156 m_oper(struct Client *source_p, int parc, char *parv[])
128 adx 30 {
129 michael 4832 const char *const opername = parv[1];
130     const char *const password = parv[2];
131 adx 30
132     if (EmptyString(password))
133     {
134 michael 3109 sendto_one_numeric(source_p, &me, ERR_NEEDMOREPARAMS, "OPER");
135 michael 9077 return;
136 adx 30 }
137    
138 michael 9335 struct MaskItem *conf = operator_find(source_p, opername);
139     if (conf == NULL)
140 adx 30 {
141 michael 3109 sendto_one_numeric(source_p, &me, ERR_NOOPERHOST);
142 michael 8431
143 michael 7403 conf = operator_find(NULL, opername);
144 michael 8431 failed_oper_notice(source_p, opername, conf ? "host mismatch" : "no operator {} block");
145 michael 9077 return;
146 adx 30 }
147    
148 michael 9157 if (IsConfTLS(conf) && !HasUMode(source_p, UMODE_SECURE))
149 michael 2248 {
150 michael 3109 sendto_one_numeric(source_p, &me, ERR_NOOPERHOST);
151 michael 9157 failed_oper_notice(source_p, opername, "requires TLS");
152 michael 9077 return;
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 9077 return;
162 michael 2228 }
163     }
164    
165 michael 8660 if (match_conf_password(password, conf) == true)
166 adx 30 {
167 michael 8395 if (conf_attach(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 9077 return;
172 adx 30 }
173    
174 michael 8689 oper_up(source_p, conf);
175 adx 30 }
176     else
177     {
178 michael 3109 sendto_one_numeric(source_p, &me, ERR_PASSWDMISMATCH);
179 michael 4829 failed_oper_notice(source_p, opername, "password mismatch");
180 adx 30 }
181     }
182    
183 michael 3266 /*! \brief OPER command handler
184     *
185     * \param source_p Pointer to allocated Client struct from which the message
186     * originally comes from. This can be a local or remote client.
187     * \param parc Integer holding the number of supplied arguments.
188     * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
189     * pointers.
190     * \note Valid arguments for this command are:
191     * - parv[0] = command
192     * - parv[1] = oper name
193     * - parv[2] = oper password
194     */
195 michael 9077 static void
196 michael 3156 mo_oper(struct Client *source_p, int parc, char *parv[])
197 adx 30 {
198 michael 3109 sendto_one_numeric(source_p, &me, RPL_YOUREOPER);
199 adx 30 }
200    
201 michael 2820 static struct Message oper_msgtab =
202     {
203 michael 5881 .cmd = "OPER",
204     .args_min = 3,
205     .args_max = MAXPARA,
206 michael 8715 .flags = MFLG_ENDGRACE,
207 michael 5881 .handlers[UNREGISTERED_HANDLER] = m_unregistered,
208     .handlers[CLIENT_HANDLER] = m_oper,
209     .handlers[SERVER_HANDLER] = m_ignore,
210     .handlers[ENCAP_HANDLER] = m_ignore,
211     .handlers[OPER_HANDLER] = mo_oper
212 michael 1230 };
213    
214     static void
215     module_init(void)
216 adx 30 {
217 michael 1230 mod_add_cmd(&oper_msgtab);
218 adx 30 }
219    
220     static void
221 michael 1230 module_exit(void)
222 adx 30 {
223 michael 1230 mod_del_cmd(&oper_msgtab);
224 adx 30 }
225 michael 1230
226 michael 2820 struct module module_entry =
227     {
228 michael 1230 .version = "$Revision$",
229     .modinit = module_init,
230     .modexit = module_exit,
231     };

Properties

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