ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/nickserv/verify.C
Revision: 1.2
Committed: Sat Jul 21 01:29:09 2007 UTC (19 years, 2 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.1: +2 -2 lines
Log Message:
- moved to new documentation system
- fixed small build error

File Contents

# User Rev Content
1 pippijn 1.1 /*
2     * Copyright © 2005 Atheme Development Group
3 pippijn 1.2 * Rights to this code are as documented in doc/pod/license.pod.
4 pippijn 1.1 *
5     * This file contains code for the NickServ VERIFY function.
6     *
7 pippijn 1.2 * $Id: verify.C,v 1.1 2007-07-19 08:24:54 pippijn Exp $
8 pippijn 1.1 */
9    
10     #include "atheme.h"
11     #include <account/myuser.h>
12    
13     static char const rcsid[] = "$Id";
14    
15     struct ns_verify_listeners : callback::has_listeners
16     {
17     };
18    
19     ns_verify_listeners listeners;
20    
21     DECLARE_MODULE_V1 ("nickserv/verify", false, _modinit, _moddeinit, rcsid, "The Ermyth Team <http://ermyth.schmorp.de>");
22    
23     static void ns_cmd_verify (sourceinfo_t *si, int parc, char *parv[]);
24     static void ns_cmd_fverify (sourceinfo_t *si, int parc, char *parv[]);
25    
26     command_t ns_verify = { "VERIFY", N_("Verifies a nickname registration."), AC_NONE, 3, ns_cmd_verify };
27     command_t ns_fverify = { "FVERIFY", N_("Forcefully verifies a nickname registration."), PRIV_USER_ADMIN, 2, ns_cmd_fverify };
28    
29     cmdvec *ns_cmdtree;
30     helpvec *ns_helptree;
31    
32     void
33     _modinit (module_t *m)
34     {
35     MODULE_USE_SYMBOL_T (ns_cmdtree, cmdvec, "nickserv/main", "ns_cmdtree");
36     MODULE_USE_SYMBOL_T (ns_helptree, helpvec, "nickserv/main", "ns_helptree");
37    
38     ns_cmdtree << ns_verify;
39     help_addentry (ns_helptree, "VERIFY", "help/nickserv/verify", NULL);
40     ns_cmdtree << ns_fverify;
41     help_addentry (ns_helptree, "FVERIFY", "help/nickserv/fverify", NULL);
42     }
43    
44     void
45     _moddeinit ()
46     {
47     ns_cmdtree >> ns_verify;
48     help_delentry (ns_helptree, "VERIFY");
49     ns_cmdtree >> ns_fverify;
50     help_delentry (ns_helptree, "FVERIFY");
51     }
52    
53     static void
54     ns_cmd_verify (sourceinfo_t *si, int parc, char *parv[])
55     {
56     myuser_t *mu;
57     metadata *md;
58     char *op = parv[0];
59     char *nick = parv[1];
60     char *key = parv[2];
61     myuser_t::login_vector::iterator it, it_end;
62    
63     if (!op || !nick || !key)
64     {
65     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "VERIFY");
66     command_fail (si, fault_needmoreparams, _("Syntax: VERIFY <operation> <nickname> <key>"));
67     return;
68     }
69    
70     if (!(mu = myuser_find (nick)))
71     {
72     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), nick);
73     return;
74     }
75    
76     /* forcing users to log in before we verify
77     * prevents some information leaks
78     */
79     if (!(si->smu == mu))
80     {
81     command_fail (si, fault_badparams, _("Please log in before attempting to verify your registration."));
82     return;
83     }
84    
85     if (!strcasecmp (op, "REGISTER"))
86     {
87     if (!(mu->flags & MU_WAITAUTH) || !(md = mu->find_metadata ("private:verify:register:key")))
88     {
89     command_fail (si, fault_badparams, _("\2%s\2 is not awaiting authorization."), nick);
90     return;
91     }
92    
93     if (!strcasecmp (key, md->value))
94     {
95     mu->flags &= ~MU_WAITAUTH;
96    
97     snoop ("REGISTER:VS: \2%s\2 by \2%s\2", mu->email, get_source_name (si));
98     logcommand (si, CMDLOG_SET, "VERIFY REGISTER (email: %s)", mu->email);
99    
100     mu->del_metadata ("private:verify:register:key");
101     mu->del_metadata ("private:verify:register:timestamp");
102    
103     command_success_nodata (si, _("\2%s\2 has now been verified."), mu->name);
104     command_success_nodata (si, _("Thank you for verifying your e-mail address! You have taken steps in ensuring that your registrations are not exploited."));
105     for (it = mu->logins.begin (), it_end = mu->logins.end (); it != it_end; ++it)
106     ircd_on_login ((*it)->nick, mu->name, NULL);
107    
108     return;
109     }
110    
111     snoop ("REGISTER:VF: \2%s\2 by \2%s\2", mu->email, get_source_name (si));
112     logcommand (si, CMDLOG_SET, "failed VERIFY REGISTER (invalid key)");
113     command_fail (si, fault_badparams, _("Verification failed. Invalid key for \2%s\2."), mu->name);
114    
115     return;
116     }
117     else if (!strcasecmp (op, "EMAILCHG"))
118     {
119     if (!(md = mu->find_metadata ("private:verify:emailchg:key")))
120     {
121     command_fail (si, fault_badparams, _("\2%s\2 is not awaiting authorization."), nick);
122     return;
123     }
124    
125     if (!strcasecmp (key, md->value))
126     {
127     md = mu->find_metadata ("private:verify:emailchg:newemail");
128    
129     strlcpy (mu->email, md->value, EMAILLEN);
130    
131     snoop ("SET:EMAIL:VS: \2%s\2 by \2%s\2", mu->email, get_source_name (si));
132     logcommand (si, CMDLOG_SET, "VERIFY EMAILCHG (email: %s)", mu->email);
133    
134     mu->del_metadata ("private:verify:emailchg:key");
135     mu->del_metadata ("private:verify:emailchg:newemail");
136     mu->del_metadata ("private:verify:emailchg:timestamp");
137    
138     command_success_nodata (si, _("\2%s\2 has now been verified."), mu->email);
139    
140     return;
141     }
142    
143     snoop ("REGISTER:VF: \2%s\2 by \2%s\2", mu->email, get_source_name (si));
144     logcommand (si, CMDLOG_SET, "failed VERIFY EMAILCHG (invalid key)");
145     command_fail (si, fault_badparams, _("Verification failed. Invalid key for \2%s\2."), mu->name);
146    
147     return;
148     }
149     else
150     {
151     command_fail (si, fault_badparams, _("Invalid operation specified for \2VERIFY\2."));
152     command_fail (si, fault_badparams, _("Please double-check your verification e-mail."));
153     return;
154     }
155     }
156    
157     static void
158     ns_cmd_fverify (sourceinfo_t *si, int parc, char *parv[])
159     {
160     myuser_t *mu;
161     metadata *md;
162     char *op = parv[0];
163     char *nick = parv[1];
164     myuser_t::login_vector::iterator it, it_end;
165    
166     if (!op || !nick)
167     {
168     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "FVERIFY");
169     command_fail (si, fault_needmoreparams, _("Syntax: FVERIFY <operation> <nickname>"));
170     return;
171     }
172    
173     if (!(mu = myuser_find (nick)))
174     {
175     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), nick);
176     return;
177     }
178    
179     if (!strcasecmp (op, "REGISTER"))
180     {
181     if (!(mu->flags & MU_WAITAUTH) || !(md = mu->find_metadata ("private:verify:register:key")))
182     {
183     command_fail (si, fault_badparams, _("\2%s\2 is not awaiting authorization."), nick);
184     return;
185     }
186    
187     mu->flags &= ~MU_WAITAUTH;
188    
189     snoop ("REGISTER:VS: \2%s\2 for \2%s\2 by \2%s\2", mu->email, mu->name, get_source_name (si));
190     logcommand (si, CMDLOG_REGISTER, "FVERIFY REGISTER %s (email: %s)", mu->name, mu->email);
191    
192     mu->del_metadata ("private:verify:register:key");
193     mu->del_metadata ("private:verify:register:timestamp");
194    
195     command_success_nodata (si, _("\2%s\2 has now been verified."), mu->name);
196     for (it = mu->logins.begin (), it_end = mu->logins.end (); it != it_end; ++it)
197     ircd_on_login ((*it)->nick, mu->name, NULL);
198    
199     return;
200     }
201     else if (!strcasecmp (op, "EMAILCHG"))
202     {
203     if (!(md = mu->find_metadata ("private:verify:emailchg:key")))
204     {
205     command_fail (si, fault_badparams, _("\2%s\2 is not awaiting authorization."), nick);
206     return;
207     }
208    
209     md = mu->find_metadata ("private:verify:emailchg:newemail");
210    
211     strlcpy (mu->email, md->value, EMAILLEN);
212    
213     snoop ("SET:EMAIL:VS: \2%s\2 for \2%s\2 by \2%s\2", mu->email, mu->name, get_source_name (si));
214     logcommand (si, CMDLOG_REGISTER, "FVERIFY EMAILCHG %s (email: %s)", mu->name, mu->email);
215    
216     mu->del_metadata ("private:verify:emailchg:key");
217     mu->del_metadata ("private:verify:emailchg:newemail");
218     mu->del_metadata ("private:verify:emailchg:timestamp");
219    
220     command_success_nodata (si, _("\2%s\2 has now been verified."), mu->email);
221    
222     return;
223     }
224     else
225     {
226     command_fail (si, fault_badparams, _("Invalid operation specified for \2FVERIFY\2."));
227     command_fail (si, fault_badparams, _("Valid operations are REGISTER and EMAILCHG."));
228     return;
229     }
230     }