ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/nickserv/register.C
Revision: 1.10
Committed: Sun Sep 16 18:54:43 2007 UTC (19 years ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.9: +10 -5 lines
Log Message:
#defines to enum

File Contents

# User Rev Content
1 pippijn 1.10 /**
2     * register.C: This file contains code for the NickServ REGISTER function.
3     *
4     * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team
5     * Rights to this code are as documented in COPYING.
6     *
7     *
8     * Portions of this file were derived from sources bearing the following license:
9 pippijn 1.4 * Copyright © 2005 William Pitcock, et al.
10 pippijn 1.2 * Rights to this code are as documented in doc/pod/license.pod.
11 pippijn 1.1 *
12 pippijn 1.10 * $Id: register.C,v 1.9 2007-09-09 20:05:52 pippijn Exp $
13 pippijn 1.1 */
14    
15     #include "atheme.h"
16 pippijn 1.4 #include <ermyth/module.h>
17 pippijn 1.1 #include <account/mynick.h>
18     #include <account/myuser.h>
19 pippijn 1.4 #include <boost/foreach.hpp>
20 pippijn 1.1
21 pippijn 1.10 static char const rcsid[] = "$Id: register.C,v 1.9 2007-09-09 20:05:52 pippijn Exp $";
22 pippijn 1.1
23 pippijn 1.4 REGISTER_MODULE ("nickserv/register", false, "The Ermyth Team <http://ermyth.schmorp.de>");
24 pippijn 1.1
25     static void ns_cmd_register (sourceinfo_t *si, int parc, char *parv[]);
26    
27 pippijn 1.4 command_t const ns_register = { "REGISTER", N_("Registers a nickname."), AC_NONE, 3, ns_cmd_register };
28 pippijn 1.1
29 pippijn 1.4 E cmdvec ns_cmdtree;
30     E helpvec ns_helptree;
31 pippijn 1.1
32 pippijn 1.4 static unsigned tcnt = 0;
33 pippijn 1.1
34     static void
35     ns_cmd_register (sourceinfo_t *si, int parc, char *parv[])
36     {
37     myuser_t *mu;
38 pippijn 1.4 myuser_t *tmu;
39 pippijn 1.1 mynick_t *mn;
40     char *account;
41     char *pass = parv[0];
42     char *email = parv[1];
43     char lau[BUFSIZE], lao[BUFSIZE];
44    
45     if (si->smu)
46     {
47 pippijn 1.7 command_fail (si, fault::already_authed, _("You are already logged in."));
48 pippijn 1.1 return;
49     }
50    
51     if (nicksvs.no_nick_ownership || si->su == NULL)
52     account = parv[0], pass = parv[1], email = parv[2];
53     else
54     account = si->su->nick, pass = parv[0], email = parv[1];
55    
56     if (!account || !pass || !email)
57     {
58 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "REGISTER");
59 pippijn 1.1 if (nicksvs.no_nick_ownership || si->su == NULL)
60 pippijn 1.7 command_fail (si, fault::needmoreparams, _("Syntax: REGISTER <account> <password> <email>"));
61 pippijn 1.1 else
62 pippijn 1.7 command_fail (si, fault::needmoreparams, _("Syntax: REGISTER <password> <email>"));
63 pippijn 1.1 return;
64     }
65    
66     if ((strlen (pass) > 32) || (strlen (email) >= EMAILLEN))
67     {
68 pippijn 1.7 command_fail (si, fault::badparams, STR_INVALID_PARAMS, "REGISTER");
69 pippijn 1.1 return;
70     }
71    
72     if (!nicksvs.no_nick_ownership && si->su == NULL && user_find_named (account))
73     {
74 pippijn 1.7 command_fail (si, fault::noprivs, _("A user matching this account is already on IRC."));
75 pippijn 1.1 return;
76     }
77    
78     if (!nicksvs.no_nick_ownership && IsDigit (*account))
79     {
80 pippijn 1.7 command_fail (si, fault::badparams, _("For security reasons, you can't register your UID."));
81     command_fail (si, fault::badparams, _("Please change to a real nickname, and try again."));
82 pippijn 1.1 return;
83     }
84    
85     if (nicksvs.no_nick_ownership || si->su == NULL)
86     {
87     if (strchr (account, ' ') || strchr (account, '\n') || strchr (account, '\r') || account[0] == '=' || account[0] == '#' || account[0] == '@' || account[0] == '+' || account[0] == '%' || account[0] == '!' || strchr (account, ','))
88     {
89 pippijn 1.7 command_fail (si, fault::badparams, _("The account name \2%s\2 is invalid."), account);
90 pippijn 1.1 return;
91     }
92     }
93    
94     if ((si->su != NULL && !strcasecmp (pass, si->su->nick)) || !strcasecmp (pass, account))
95     {
96 pippijn 1.7 command_fail (si, fault::badparams, _("You cannot use your nickname as a password."));
97 pippijn 1.1 if (nicksvs.no_nick_ownership || si->su == NULL)
98 pippijn 1.7 command_fail (si, fault::needmoreparams, _("Syntax: REGISTER <account> <password> <email>"));
99 pippijn 1.1 else
100 pippijn 1.7 command_fail (si, fault::needmoreparams, _("Syntax: REGISTER <password> <email>"));
101 pippijn 1.1 return;
102     }
103    
104     if (!validemail (email))
105     {
106 pippijn 1.7 command_fail (si, fault::badparams, _("\2%s\2 is not a valid email address."), email);
107 pippijn 1.1 return;
108     }
109    
110     /* make sure it isn't registered already */
111 pippijn 1.9 if (nicksvs.no_nick_ownership ? myuser_t::find (account) != NULL : mynick_t::find (account) != NULL)
112 pippijn 1.1 {
113 pippijn 1.7 command_fail (si, fault::alreadyexists, _("\2%s\2 is already registered."), account);
114 pippijn 1.1 return;
115     }
116    
117 pippijn 1.4 if (!user_t::callback.can_register (si, account, email))
118 pippijn 1.1 return;
119    
120     /* make sure they're within limits */
121     tcnt = 0;
122 pippijn 1.8 foreach (myuser_t::pair_type &mupair, myuser_t::map)
123 pippijn 1.4 {
124     tmu = mupair.second;
125    
126     if (!strcasecmp (email, tmu->email))
127     tcnt++;
128    
129     /* optimization: if tcnt >= me.maxusers, quit iterating. -nenolod */
130     if (tcnt >= me.maxusers)
131     break;
132     }
133    
134 pippijn 1.1 if (tcnt >= me.maxusers)
135     {
136 pippijn 1.7 command_fail (si, fault::toomany, _("\2%s\2 has too many nicknames registered."), email);
137 pippijn 1.1 return;
138     }
139    
140 pippijn 1.6 mu = myuser_t::create (account, pass, email, config_options.defuflags | MU_NOBURSTLOGIN);
141 pippijn 1.1 mu->registered = NOW;
142     mu->lastlogin = NOW;
143     if (!nicksvs.no_nick_ownership)
144     {
145 pippijn 1.9 mn = mynick_t::create (mu, mu->name);
146 pippijn 1.1 mn->registered = NOW;
147     mn->lastseen = NOW;
148     }
149    
150     if (me.auth == AUTH_EMAIL)
151     {
152     char *key = gen_pw (12);
153     mu->flags |= MU_WAITAUTH;
154    
155     mu->add_metadata ("private:verify:register:key", key);
156 pippijn 1.4 mu->add_metadata ("private:verify:register:timestamp", itoa (NOW));
157 pippijn 1.1
158     if (!sendemail (si->su != NULL ? si->su : si->service->me, EMAIL_REGISTER, mu, key))
159     {
160 pippijn 1.7 command_fail (si, fault::emailfail, _("Sending email failed, sorry! Registration aborted."));
161 pippijn 1.6 mu->refcnt_dec ();
162 pippijn 1.4 sfree (key);
163 pippijn 1.1 return;
164     }
165    
166     command_success_nodata (si, _("An email containing nickname activation instructions has been sent to \2%s\2."), mu->email);
167     command_success_nodata (si, _("If you do not complete registration within one day, your nickname will expire."));
168    
169 pippijn 1.4 sfree (key);
170 pippijn 1.1 }
171    
172     if (si->su != NULL)
173     {
174     si->su->myuser = mu;
175     mu->logins.insert (si->su);
176    
177     if (!(mu->flags & MU_WAITAUTH))
178     /* only grant ircd registered status if it's verified */
179 pippijn 1.4 phandler->ircd_on_login (si->su->nick, mu->name, NULL);
180 pippijn 1.1 }
181    
182     if (!nicksvs.no_nick_ownership && si->su != NULL)
183     snoop ("REGISTER: \2%s\2 to \2%s\2", account, email);
184     else
185     snoop ("REGISTER: \2%s\2 to \2%s\2 by \2%s\2", account, email, si->su != NULL ? si->su->nick : get_source_name (si));
186     logcommand (si, CMDLOG_REGISTER, "REGISTER to %s", email);
187     if (is_soper (mu))
188     {
189     wallops ("%s registered the nick \2%s\2 and gained services operator privileges.", get_oper_name (si), mu->name);
190     snoop ("SOPER: \2%s\2 as \2%s\2", get_oper_name (si), mu->name);
191     }
192    
193     command_success_nodata (si, _("\2%s\2 is now registered to \2%s\2."), mu->name, mu->email);
194     command_success_nodata (si, _("The password is \2%s\2. Please write this down for future reference."), pass);
195 pippijn 1.4 mu->callback.registered (mu);
196 pippijn 1.1
197     if (si->su != NULL)
198     {
199     snprintf (lau, BUFSIZE, "%s@%s", si->su->user, si->su->vhost);
200     mu->add_metadata ("private:host:vhost", lau);
201    
202     snprintf (lao, BUFSIZE, "%s@%s", si->su->user, si->su->host);
203     mu->add_metadata ("private:host:actual", lao);
204     }
205     }
206 pippijn 1.4
207     bool
208     _modinit (module *m)
209     {
210     ns_cmdtree << ns_register;
211     help_addentry (ns_helptree, "REGISTER", "help/nickserv/register", NULL);
212    
213     return true;
214     }
215    
216     void
217     _moddeinit ()
218     {
219     ns_cmdtree >> ns_register;
220     help_delentry (ns_helptree, "REGISTER");
221     }