ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/nickserv/set.C
Revision: 1.1
Committed: Thu Jul 19 08:24:54 2007 UTC (19 years, 3 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Log Message:
initial import. the most important changes since Atheme are:
- fixed many memory leaks
- fixed many bugs
- converted to C++ and use more STL containers
- added a (not very enhanced yet) perl module
- greatly improved XML-RPC speed
- added a JSON-RPC module with code from json-cpp
- added a valgrind memcheck module to operserv
- added a more object oriented base64 implementation
- added a specialised unit test framework
- improved stability
- use gettimeofday() if available
- reworked adding/removing commands
- MemoServ IGNORE DEL can now remove indices

File Contents

# User Rev Content
1 pippijn 1.1 /*
2     * Copyright © 2006 William Pitcock, et al.
3     * Rights to this code are documented in doc/LICENSE.
4     *
5     * This file contains routines to handle the CService SET command.
6     *
7     * $Id: set.c 7907 2007-03-06 23:10:26Z pippijn $
8     */
9    
10     #include "atheme.h"
11     #include <account/myuser.h>
12    
13     static char const rcsid[] = "$Id";
14    
15     struct ns_set_listeners : callback::has_listeners
16     {
17     };
18    
19     ns_set_listeners listeners;
20    
21     DECLARE_MODULE_V1 ("nickserv/set", false, _modinit, _moddeinit, rcsid, "The Ermyth Team <http://ermyth.schmorp.de>");
22    
23     static void ns_cmd_set (sourceinfo_t *si, int parc, char *parv[]);
24    
25     cmdvec *ns_cmdtree;
26     helpvec *ns_helptree;
27    
28     command_t ns_set = { "SET", N_("Sets various control flags."), AC_NONE, 2, ns_cmd_set };
29    
30     cmdvec ns_set_cmdtree;
31    
32     /* HELP SET */
33     static void
34     ns_help_set (sourceinfo_t *si)
35     {
36     command_success_nodata (si, _("Help for \2SET\2:"));
37     command_success_nodata (si, " ");
38     command_success_nodata (si, _("SET allows you to set various control flags"));
39     if (nicksvs.no_nick_ownership)
40     command_success_nodata (si, _("for accounts that change the way certain operations"));
41     else
42     command_success_nodata (si, _("for nicknames that change the way certain operations"));
43     command_success_nodata (si, _("are performed on them."));
44     command_success_nodata (si, " ");
45     command_help (si, &ns_set_cmdtree);
46     command_success_nodata (si, " ");
47     command_success_nodata (si, _("For more information, use \2/msg %s HELP SET \37command\37\2."), nicksvs.nick);
48     }
49    
50     /* SET <setting> <parameters> */
51     static void
52     ns_cmd_set (sourceinfo_t *si, int parc, char *parv[])
53     {
54     char *setting = parv[0];
55     command_t const *c;
56    
57     if (si->smu == NULL)
58     {
59     command_fail (si, fault_noprivs, _("You are not logged in."));
60     return;
61     }
62    
63     if (setting == NULL)
64     {
65     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "SET");
66     command_fail (si, fault_needmoreparams, _("Syntax: SET <setting> <parameters>"));
67     return;
68     }
69    
70     /* take the command through the hash table */
71     if ((c = ns_set_cmdtree.find (setting)))
72     c->exec (si->service, si, parc - 1, parv + 1);
73     else
74     command_fail (si, fault_badparams, _("Invalid set command. Use \2/%s%s HELP SET\2 for a command listing."), (ircd->uses_rcommand == false) ? "msg " : "", nicksvs.nick);
75     }
76    
77     /* SET EMAIL <new address> */
78     static void
79     _ns_setemail (sourceinfo_t *si, int parc, char *parv[])
80     {
81     char *email = parv[0];
82    
83     if (si->smu == NULL)
84     return;
85    
86     if (email == NULL)
87     {
88     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "EMAIL");
89     command_fail (si, fault_needmoreparams, _("Syntax: SET EMAIL <new e-mail>"));
90     return;
91     }
92    
93     if (strlen (email) >= EMAILLEN)
94     {
95     command_fail (si, fault_badparams, STR_INVALID_PARAMS, "EMAIL");
96     return;
97     }
98    
99     if (si->smu->flags & MU_WAITAUTH)
100     {
101     command_fail (si, fault_noprivs, _("Please verify your original registration before changing your e-mail address."));
102     return;
103     }
104    
105     if (!validemail (email))
106     {
107     command_fail (si, fault_badparams, _("\2%s\2 is not a valid email address."), email);
108     return;
109     }
110    
111     if (!strcasecmp (si->smu->email, email))
112     {
113     command_fail (si, fault_badparams, _("The email address for \2%s\2 is already set to \2%s\2."), si->smu->name, si->smu->email);
114     return;
115     }
116    
117     snoop ("SET:EMAIL: \2%s\2 (\2%s\2 -> \2%s\2)", si->smu->name, si->smu->email, email);
118    
119     if (me.auth == AUTH_EMAIL)
120     {
121     unsigned long key = makekey ();
122    
123     si->smu->add_metadata ("private:verify:emailchg:key", itoa (key));
124     si->smu->add_metadata ("private:verify:emailchg:newemail", email);
125     si->smu->add_metadata ("private:verify:emailchg:timestamp", itoa (time (NULL)));
126    
127     if (!sendemail (si->su != NULL ? si->su : si->service->me, EMAIL_SETEMAIL, si->smu, itoa (key)))
128     {
129     command_fail (si, fault_emailfail, _("Sending email failed, sorry! Your email address is unchanged."));
130     si->smu->del_metadata ("private:verify:emailchg:key");
131     si->smu->del_metadata ("private:verify:emailchg:newemail");
132     si->smu->del_metadata ("private:verify:emailchg:timestamp");
133     return;
134     }
135    
136     logcommand (si, CMDLOG_SET, "SET EMAIL %s (awaiting verification)", email);
137     command_success_nodata (si, _("An email containing email changing instructions has been sent to \2%s\2."), email);
138     command_success_nodata (si, _("Your email address will not be changed until you follow these instructions."));
139    
140     return;
141     }
142    
143     strlcpy (si->smu->email, email, EMAILLEN);
144    
145     logcommand (si, CMDLOG_SET, "SET EMAIL %s", email);
146     command_success_nodata (si, _("The email address for \2%s\2 has been changed to \2%s\2."), si->smu->name, si->smu->email);
147     }
148    
149     command_t ns_set_email = { "EMAIL", N_("Changes your e-mail address."), AC_NONE, 1, _ns_setemail };
150    
151     /* SET HIDEMAIL [ON|OFF] */
152     static void
153     _ns_sethidemail (sourceinfo_t *si, int parc, char *parv[])
154     {
155     char *params = strtok (parv[0], " ");
156    
157     if (si->smu == NULL)
158     return;
159    
160     if (params == NULL)
161     {
162     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "HIDEMAIL");
163     return;
164     }
165    
166     if (!strcasecmp ("ON", params))
167     {
168     if (MU_HIDEMAIL & si->smu->flags)
169     {
170     command_fail (si, fault_nochange, _("The \2%s\2 flag is already set for \2%s\2."), "HIDEMAIL", si->smu->name);
171     return;
172     }
173    
174     logcommand (si, CMDLOG_SET, "SET HIDEMAIL ON");
175    
176     si->smu->flags |= MU_HIDEMAIL;
177    
178     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "HIDEMAIL", si->smu->name);
179    
180     return;
181     }
182     else if (!strcasecmp ("OFF", params))
183     {
184     if (!(MU_HIDEMAIL & si->smu->flags))
185     {
186     command_fail (si, fault_nochange, _("The \2%s\2 flag is not set for \2%s\2."), "HIDEMAIL", si->smu->name);
187     return;
188     }
189    
190     logcommand (si, CMDLOG_SET, "SET HIDEMAIL OFF");
191    
192     si->smu->flags &= ~MU_HIDEMAIL;
193    
194     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "HIDEMAIL", si->smu->name);
195    
196     return;
197     }
198     else
199     {
200     command_fail (si, fault_badparams, STR_INVALID_PARAMS, "HIDEMAIL");
201     return;
202     }
203     }
204    
205     command_t ns_set_hidemail = { "HIDEMAIL", N_("Hides your e-mail address."), AC_NONE, 1, _ns_sethidemail };
206    
207     static void
208     _ns_setemailmemos (sourceinfo_t *si, int parc, char *parv[])
209     {
210     char *params = strtok (parv[0], " ");
211    
212     if (si->smu == NULL)
213     return;
214    
215     if (si->smu->flags & MU_WAITAUTH)
216     {
217     command_fail (si, fault_noprivs, _("You have to verify your email address before you can enable emailing memos."));
218     return;
219     }
220    
221     if (params == NULL)
222     {
223     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "EMAILMEMOS");
224     return;
225     }
226    
227     if (!strcasecmp ("ON", params))
228     {
229     if (me.mta == NULL)
230     {
231     command_fail (si, fault_emailfail, _("Sending email is administratively disabled."));
232     return;
233     }
234     if (MU_EMAILMEMOS & si->smu->flags)
235     {
236     command_fail (si, fault_nochange, _("The \2%s\2 flag is already set for \2%s\2."), "EMAILMEMOS", si->smu->name);
237     return;
238     }
239    
240     logcommand (si, CMDLOG_SET, "SET EMAILMEMOS ON");
241     si->smu->flags |= MU_EMAILMEMOS;
242     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "EMAILMEMOS", si->smu->name);
243     return;
244     }
245    
246     else if (!strcasecmp ("OFF", params))
247     {
248     if (!(MU_EMAILMEMOS & si->smu->flags))
249     {
250     command_fail (si, fault_nochange, _("The \2%s\2 flag is not set for \2%s\2."), "EMAILMEMOS", si->smu->name);
251     return;
252     }
253    
254     logcommand (si, CMDLOG_SET, "SET EMAILMEMOS OFF");
255     si->smu->flags &= ~MU_EMAILMEMOS;
256     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "EMAILMEMOS", si->smu->name);
257     return;
258     }
259     else
260     {
261     command_fail (si, fault_badparams, STR_INVALID_PARAMS, "EMAILMEMOS");
262     return;
263     }
264     }
265    
266     command_t ns_set_emailmemos = { "EMAILMEMOS", N_("Forwards incoming memos to your e-mail address."), AC_NONE, 1, _ns_setemailmemos };
267    
268     static void
269     _ns_setnomemo (sourceinfo_t *si, int parc, char *parv[])
270     {
271     char *params = strtok (parv[0], " ");
272    
273     if (si->smu == NULL)
274     return;
275    
276     if (params == NULL)
277     {
278     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "NOMEMO");
279     return;
280     }
281    
282     if (!strcasecmp ("ON", params))
283     {
284     if (MU_NOMEMO & si->smu->flags)
285     {
286     command_fail (si, fault_nochange, _("The \2%s\2 flag is already set for \2%s\2."), "NOMEMO", si->smu->name);
287     return;
288     }
289    
290     logcommand (si, CMDLOG_SET, "SET NOMEMO ON");
291     si->smu->flags |= MU_NOMEMO;
292     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "NOMEMO", si->smu->name);
293     return;
294     }
295    
296     else if (!strcasecmp ("OFF", params))
297     {
298     if (!(MU_NOMEMO & si->smu->flags))
299     {
300     command_fail (si, fault_nochange, _("The \2%s\2 flag is not set for \2%s\2."), "NOMEMO", si->smu->name);
301     return;
302     }
303    
304     logcommand (si, CMDLOG_SET, "SET NOMEMO OFF");
305     si->smu->flags &= ~MU_NOMEMO;
306     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "NOMEMO", si->smu->name);
307     return;
308     }
309     else
310     {
311     command_fail (si, fault_badparams, STR_INVALID_PARAMS, "NOMEMO");
312     return;
313     }
314     }
315    
316     command_t ns_set_nomemo = { "NOMEMO", N_("Disables the ability to recieve memos."), AC_NONE, 1, _ns_setnomemo };
317    
318     static void
319     _ns_setneverop (sourceinfo_t *si, int parc, char *parv[])
320     {
321     char *params = strtok (parv[0], " ");
322    
323     if (si->smu == NULL)
324     return;
325    
326     if (params == NULL)
327     {
328     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "NEVEROP");
329     return;
330     }
331    
332     if (!strcasecmp ("ON", params))
333     {
334     if (MU_NEVEROP & si->smu->flags)
335     {
336     command_fail (si, fault_nochange, _("The \2%s\2 flag is already set for \2%s\2."), "NEVEROP", si->smu->name);
337     return;
338     }
339    
340     logcommand (si, CMDLOG_SET, "SET NEVEROP ON");
341    
342     si->smu->flags |= MU_NEVEROP;
343    
344     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "NEVEROP", si->smu->name);
345    
346     return;
347     }
348    
349     else if (!strcasecmp ("OFF", params))
350     {
351     if (!(MU_NEVEROP & si->smu->flags))
352     {
353     command_fail (si, fault_nochange, _("The \2%s\2 flag is not set for \2%s\2."), "NEVEROP", si->smu->name);
354     return;
355     }
356    
357     logcommand (si, CMDLOG_SET, "SET NEVEROP OFF");
358    
359     si->smu->flags &= ~MU_NEVEROP;
360    
361     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "NEVEROP", si->smu->name);
362    
363     return;
364     }
365    
366     else
367     {
368     command_fail (si, fault_badparams, STR_INVALID_PARAMS, "NEVEROP");
369     return;
370     }
371     }
372    
373     command_t ns_set_neverop = { "NEVEROP", N_("Prevents you from being added to access lists."), AC_NONE, 1, _ns_setneverop };
374    
375     static void
376     _ns_setnoop (sourceinfo_t *si, int parc, char *parv[])
377     {
378     char *params = strtok (parv[0], " ");
379    
380     if (si->smu == NULL)
381     return;
382    
383     if (params == NULL)
384     {
385     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "NOOP");
386     return;
387     }
388    
389     if (!strcasecmp ("ON", params))
390     {
391     if (MU_NOOP & si->smu->flags)
392     {
393     command_fail (si, fault_nochange, _("The \2%s\2 flag is already set for \2%s\2."), "NOOP", si->smu->name);
394     return;
395     }
396    
397     logcommand (si, CMDLOG_SET, "SET NOOP ON");
398    
399     si->smu->flags |= MU_NOOP;
400    
401     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "NOOP", si->smu->name);
402    
403     return;
404     }
405     else if (!strcasecmp ("OFF", params))
406     {
407     if (!(MU_NOOP & si->smu->flags))
408     {
409     command_fail (si, fault_nochange, _("The \2%s\2 flag is not set for \2%s\2."), "NOOP", si->smu->name);
410     return;
411     }
412    
413     logcommand (si, CMDLOG_SET, "SET NOOP OFF");
414    
415     si->smu->flags &= ~MU_NOOP;
416    
417     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "NOOP", si->smu->name);
418    
419     return;
420     }
421    
422     else
423     {
424     command_fail (si, fault_badparams, STR_INVALID_PARAMS, "NOOP");
425     return;
426     }
427     }
428    
429     command_t ns_set_noop = { "NOOP", N_("Prevents services from setting modes upon you automatically."), AC_NONE, 1, _ns_setnoop };
430    
431     static void
432     _ns_setproperty (sourceinfo_t *si, int parc, char *parv[])
433     {
434     char *property = strtok (parv[0], " ");
435     char *value = strtok (NULL, "");
436    
437     if (si->smu == NULL)
438     return;
439    
440     if (!property)
441     {
442     command_fail (si, fault_needmoreparams, _("Syntax: SET PROPERTY <property> [value]"));
443     return;
444     }
445    
446     if (strchr (property, ':') && !has_priv (si, PRIV_METADATA))
447     {
448     command_fail (si, fault_badparams, _("Invalid property name."));
449     return;
450     }
451    
452     if (strchr (property, ':'))
453     snoop ("SET:PROPERTY: \2%s\2: \2%s\2/\2%s\2", si->smu->name, property, value);
454    
455     if (si->smu->mdmap.size () >= me.mdlimit)
456     {
457     command_fail (si, fault_toomany, _("Cannot add \2%s\2 to \2%s\2 metadata table, it is full."), property, si->smu->name);
458     return;
459     }
460    
461     if (!value)
462     {
463     metadata *md = si->smu->find_metadata (property);
464    
465     if (!md)
466     {
467     command_fail (si, fault_nosuch_target, _("Metadata entry \2%s\2 was not set."), property);
468     return;
469     }
470    
471     si->smu->del_metadata (property);
472     logcommand (si, CMDLOG_SET, "SET PROPERTY %s (deleted)", property);
473     command_success_nodata (si, _("Metadata entry \2%s\2 has been deleted."), property);
474     return;
475     }
476    
477     if (strlen (property) > 32 || strlen (value) > 300)
478     {
479     command_fail (si, fault_badparams, _("Parameters are too long. Aborting."));
480     return;
481     }
482    
483     si->smu->add_metadata (property, value);
484     logcommand (si, CMDLOG_SET, "SET PROPERTY %s to %s", property, value);
485     command_success_nodata (si, _("Metadata entry \2%s\2 added."), property);
486     }
487    
488     command_t ns_set_property = { "PROPERTY", N_("Manipulates metadata entries associated with a nickname."), AC_NONE, 2, _ns_setproperty };
489    
490     static void
491     _ns_setqproperty (sourceinfo_t *si, int parc, char *parv[])
492     {
493     char *property = strtok (parv[0], " ");
494     char *value = strtok (NULL, "");
495    
496     if (si->smu == NULL)
497     return;
498    
499     if (!property)
500     {
501     command_fail (si, fault_needmoreparams, _("Syntax: SET PROPERTY <property> [value]"));
502     return;
503     }
504    
505     if (strchr (property, ':') && !has_priv (si, PRIV_METADATA))
506     {
507     command_fail (si, fault_badparams, _("Invalid property name."));
508     return;
509     }
510    
511     if (strchr (property, ':'))
512     snoop ("SET:PROPERTY: \2%s\2: \2%s\2/\2%s\2", si->smu->name, property, value);
513    
514     if (si->smu->mdmap.size () >= me.mdlimit)
515     {
516     command_fail (si, fault_toomany, _("Cannot add \2%s\2 to \2%s\2 metadata table, it is full."), property, si->smu->name);
517     return;
518     }
519    
520     if (!value)
521     {
522     metadata *md = si->smu->find_metadata (property);
523    
524     if (!md)
525     {
526     command_fail (si, fault_nosuch_target, _("Metadata entry \2%s\2 was not set."), property);
527     return;
528     }
529    
530     si->smu->del_metadata (property);
531     logcommand (si, CMDLOG_SET, "SET PROPERTY %s (deleted)", property);
532     return;
533     }
534    
535     if (strlen (property) > 32 || strlen (value) > 300)
536     return;
537    
538     si->smu->add_metadata (property, value);
539     logcommand (si, CMDLOG_SET, "SET QPROPERTY %s to %s", property, value);
540     }
541    
542     command_t ns_set_qproperty = { "QPROPERTY", N_("Quietly manipulates metadata entries associated with a nickname."), AC_NONE, 2, _ns_setqproperty };
543    
544     static void
545     _ns_setpassword (sourceinfo_t *si, int parc, char *parv[])
546     {
547     char *password = strtok (parv[0], " ");
548    
549     if (si->smu == NULL)
550     return;
551    
552     if (password == NULL)
553     {
554     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "PASSWORD");
555     return;
556     }
557    
558     if (strlen (password) > 32)
559     {
560     command_fail (si, fault_badparams, STR_INVALID_PARAMS, "PASSWORD");
561     return;
562     }
563    
564     if (!strcasecmp (password, si->smu->name))
565     {
566     command_fail (si, fault_badparams, _("You cannot use your nickname as a password."));
567     command_fail (si, fault_badparams, _("Syntax: SET PASSWORD <new password>"));
568     return;
569     }
570    
571     /*snoop("SET:PASSWORD: \2%s\2 as \2%s\2 for \2%s\2", si->su->user, si->smu->name, si->smu->name); */
572     logcommand (si, CMDLOG_SET, "SET PASSWORD");
573    
574     set_password (si->smu, password);
575    
576     command_success_nodata (si, _("The password for \2%s\2 has been changed to \2%s\2. Please write this down for future reference."), si->smu->name, password);
577    
578     return;
579     }
580    
581     command_t ns_set_password = { "PASSWORD", N_("Changes the password associated with your nickname."), AC_NONE, 1, _ns_setpassword };
582    
583     command_t const *ns_set_commands[] = {
584     &ns_set_email,
585     &ns_set_emailmemos,
586     &ns_set_hidemail,
587     &ns_set_nomemo,
588     &ns_set_noop,
589     &ns_set_neverop,
590     &ns_set_password,
591     &ns_set_property,
592     &ns_set_qproperty,
593     NULL
594     };
595    
596     void
597     _modinit (module_t *m)
598     {
599     MODULE_USE_SYMBOL_T (ns_cmdtree, cmdvec, "nickserv/main", "ns_cmdtree");
600     MODULE_USE_SYMBOL_T (ns_helptree, helpvec, "nickserv/main", "ns_helptree");
601     ns_cmdtree << ns_set;
602    
603     help_addentry (ns_helptree, "SET", NULL, ns_help_set);
604     help_addentry (ns_helptree, "SET EMAIL", "help/nickserv/set_email", NULL);
605     help_addentry (ns_helptree, "SET EMAILMEMOS", "help/nickserv/set_emailmemos", NULL);
606     help_addentry (ns_helptree, "SET HIDEMAIL", "help/nickserv/set_hidemail", NULL);
607     help_addentry (ns_helptree, "SET NOMEMO", "help/nickserv/set_nomemo", NULL);
608     help_addentry (ns_helptree, "SET NEVEROP", "help/nickserv/set_neverop", NULL);
609     help_addentry (ns_helptree, "SET NOOP", "help/nickserv/set_noop", NULL);
610     help_addentry (ns_helptree, "SET PASSWORD", "help/nickserv/set_password", NULL);
611     help_addentry (ns_helptree, "SET PROPERTY", "help/nickserv/set_property", NULL);
612    
613     /* populate ns_set_cmdtree */
614     ns_set_cmdtree << ns_set_commands;
615     }
616    
617     void
618     _moddeinit ()
619     {
620     ns_cmdtree >> ns_set;
621     help_delentry (ns_helptree, "SET");
622     help_delentry (ns_helptree, "SET EMAIL");
623     help_delentry (ns_helptree, "SET EMAILMEMOS");
624     help_delentry (ns_helptree, "SET HIDEMAIL");
625     help_delentry (ns_helptree, "SET NOMEMO");
626     help_delentry (ns_helptree, "SET NEVEROP");
627     help_delentry (ns_helptree, "SET NOOP");
628     help_delentry (ns_helptree, "SET PASSWORD");
629     help_delentry (ns_helptree, "SET PROPERTY");
630    
631     /* clear ns_set_cmdtree */
632     ns_set_cmdtree >> ns_set_commands;
633     }