ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_oper.c
Revision: 9384
Committed: Sun May 10 09:00:11 2020 UTC (5 years, 3 months ago) by michael
Content type: text/x-csrc
File size: 6909 byte(s)
Log Message:
- Refactor Message flags

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 michael 9335 struct MaskItem *conf = operator_find(source_p, opername);
133     if (conf == NULL)
134 adx 30 {
135 michael 3109 sendto_one_numeric(source_p, &me, ERR_NOOPERHOST);
136 michael 8431
137 michael 7403 conf = operator_find(NULL, opername);
138 michael 8431 failed_oper_notice(source_p, opername, conf ? "host mismatch" : "no operator {} block");
139 michael 9077 return;
140 adx 30 }
141    
142 michael 9157 if (IsConfTLS(conf) && !HasUMode(source_p, UMODE_SECURE))
143 michael 2248 {
144 michael 3109 sendto_one_numeric(source_p, &me, ERR_NOOPERHOST);
145 michael 9157 failed_oper_notice(source_p, opername, "requires TLS");
146 michael 9077 return;
147 michael 2248 }
148    
149 michael 2228 if (!EmptyString(conf->certfp))
150     {
151 michael 2229 if (EmptyString(source_p->certfp) || strcasecmp(source_p->certfp, conf->certfp))
152 michael 2228 {
153 michael 3109 sendto_one_numeric(source_p, &me, ERR_NOOPERHOST);
154 michael 4829 failed_oper_notice(source_p, opername, "client certificate fingerprint mismatch");
155 michael 9077 return;
156 michael 2228 }
157     }
158    
159 michael 8660 if (match_conf_password(password, conf) == true)
160 adx 30 {
161 michael 8395 if (conf_attach(source_p, conf))
162 adx 30 {
163 michael 3110 sendto_one_notice(source_p, &me, ":Can't attach conf!");
164 michael 4829 failed_oper_notice(source_p, opername, "can't attach conf!");
165 michael 9077 return;
166 adx 30 }
167    
168 michael 8689 oper_up(source_p, conf);
169 adx 30 }
170     else
171     {
172 michael 3109 sendto_one_numeric(source_p, &me, ERR_PASSWDMISMATCH);
173 michael 4829 failed_oper_notice(source_p, opername, "password mismatch");
174 adx 30 }
175     }
176    
177 michael 3266 /*! \brief OPER command handler
178     *
179     * \param source_p Pointer to allocated Client struct from which the message
180     * originally comes from. This can be a local or remote client.
181     * \param parc Integer holding the number of supplied arguments.
182     * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
183     * pointers.
184     * \note Valid arguments for this command are:
185     * - parv[0] = command
186     * - parv[1] = oper name
187     * - parv[2] = oper password
188     */
189 michael 9077 static void
190 michael 3156 mo_oper(struct Client *source_p, int parc, char *parv[])
191 adx 30 {
192 michael 3109 sendto_one_numeric(source_p, &me, RPL_YOUREOPER);
193 adx 30 }
194    
195 michael 2820 static struct Message oper_msgtab =
196     {
197 michael 5881 .cmd = "OPER",
198 michael 9374 .handlers[UNREGISTERED_HANDLER] = { .handler = m_unregistered },
199 michael 9384 .handlers[CLIENT_HANDLER] = { .handler = m_oper, .args_min = 3, .end_grace_period = true },
200 michael 9374 .handlers[SERVER_HANDLER] = { .handler = m_ignore },
201     .handlers[ENCAP_HANDLER] = { .handler = m_ignore },
202 michael 9384 .handlers[OPER_HANDLER] = { .handler = mo_oper, .args_min = 3, .end_grace_period = true },
203 michael 1230 };
204    
205     static void
206     module_init(void)
207 adx 30 {
208 michael 1230 mod_add_cmd(&oper_msgtab);
209 adx 30 }
210    
211     static void
212 michael 1230 module_exit(void)
213 adx 30 {
214 michael 1230 mod_del_cmd(&oper_msgtab);
215 adx 30 }
216 michael 1230
217 michael 2820 struct module module_entry =
218     {
219 michael 1230 .version = "$Revision$",
220     .modinit = module_init,
221     .modexit = module_exit,
222     };

Properties

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