]> jfr.im git - irc/evilnet/x3.git/blame - src/mail-common.c
testing commit diffs
[irc/evilnet/x3.git] / src / mail-common.c
CommitLineData
1136f709 1/* mail-common.c - mail sending utilities
2 * Copyright 2002-2004, 2007 srvx Development Team
3 *
4 * This file is part of srvx.
5 *
6 * srvx is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
be2c97a5 8 * the Free Software Foundation; either version 3 of the License, or
1136f709 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 srvx; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
19 */
20
21#include "conf.h"
22#include "modcmd.h"
23#include "nickserv.h"
24#include "saxdb.h"
25
26#ifdef HAVE_SYS_WAIT_H
27#include <sys/wait.h>
28#endif
29
30#define KEY_PROHIBITED "prohibited"
31
32static const struct message_entry msgtab[] = {
33 { "MAILMSG_EMAIL_ALREADY_BANNED", "%s is already banned (%s)." },
34 { "MAILMSG_EMAIL_BANNED", "Email to %s has been forbidden." },
35 { "MAILMSG_EMAIL_NOT_BANNED", "Email to %s was not forbidden." },
36 { "MAILMSG_EMAIL_UNBANNED", "Email to %s is now allowed." },
37 { "MAILMSG_PROHIBITED_EMAIL", "%s: %s" },
38 { "MAILMSG_NO_PROHIBITED_EMAIL", "All email addresses are accepted." },
39 { NULL, NULL }
40};
41
42static dict_t prohibited_addrs, prohibited_masks;
43struct module *mail_module;
44
45const char *
46mail_prohibited_address(const char *addr)
47{
48 dict_iterator_t it;
49 const char *data;
50
51 if (prohibited_addrs && (data = dict_find(prohibited_addrs, addr, NULL)))
52 return data;
53 if (prohibited_masks)
54 for (it = dict_first(prohibited_masks); it; it = iter_next(it))
55 if (match_ircglob(addr, iter_key(it)))
56 return iter_data(it);
57 return NULL;
58}
59
60static int
61mail_ban_address(struct userNode *user, struct userNode *bot, const char *addr, const char *reason) {
62 dict_t target;
63 const char *str;
64
65 target = strpbrk(addr, "*?") ? prohibited_masks : prohibited_addrs;
66 if ((str = dict_find(target, addr, NULL))) {
67 if (user)
68 send_message(user, bot, "MAILMSG_EMAIL_ALREADY_BANNED", addr, str);
69 return 0;
70 }
71 dict_insert(target, strdup(addr), strdup(reason));
72 if (user) send_message(user, bot, "MAILMSG_EMAIL_BANNED", addr);
73 return 1;
74}
75
76static MODCMD_FUNC(cmd_banemail) {
77 char *reason = unsplit_string(argv+2, argc-2, NULL);
78 return mail_ban_address(user, cmd->parent->bot, argv[1], reason);
79}
80
81static MODCMD_FUNC(cmd_unbanemail) {
82 dict_t target;
83 const char *addr;
84
85 addr = argv[1];
86 target = strpbrk(addr, "*?") ? prohibited_masks : prohibited_addrs;
87 if (dict_remove(target, addr))
88 reply("MAILMSG_EMAIL_UNBANNED", addr);
89 else
90 reply("MAILMSG_EMAIL_NOT_BANNED", addr);
91 return 1;
92}
93
94static MODCMD_FUNC(cmd_stats_email) {
95 dict_iterator_t it;
96 int found = 0;
97
98 for (it=dict_first(prohibited_addrs); it; it=iter_next(it)) {
99 reply("MAILMSG_PROHIBITED_EMAIL", iter_key(it), (const char*)iter_data(it));
100 found = 1;
101 }
102 for (it=dict_first(prohibited_masks); it; it=iter_next(it)) {
103 reply("MAILMSG_PROHIBITED_EMAIL", iter_key(it), (const char*)iter_data(it));
104 found = 1;
105 }
106 if (!found)
107 reply("MAILMSG_NO_PROHIBITED_EMAIL");
108 return 0;
109}
110
111static int
112mail_saxdb_read(struct dict *db) {
113 struct dict *subdb;
114 struct record_data *rd;
115 dict_iterator_t it;
116
117 if ((subdb = database_get_data(db, KEY_PROHIBITED, RECDB_OBJECT))) {
118 for (it = dict_first(subdb); it; it = iter_next(it)) {
119 rd = iter_data(it);
120 if (rd->type == RECDB_QSTRING)
121 mail_ban_address(NULL, NULL, iter_key(it), rd->d.qstring);
122 }
123 }
124 return 0;
125}
126
127static int
128mail_saxdb_write(struct saxdb_context *ctx) {
129 dict_iterator_t it;
130
131 saxdb_start_record(ctx, KEY_PROHIBITED, 0);
132 for (it = dict_first(prohibited_masks); it; it = iter_next(it))
133 saxdb_write_string(ctx, iter_key(it), iter_data(it));
134 for (it = dict_first(prohibited_addrs); it; it = iter_next(it))
135 saxdb_write_string(ctx, iter_key(it), iter_data(it));
136 saxdb_end_record(ctx);
137 return 0;
138}
139
140static void
30874d66 141mail_common_cleanup(UNUSED_ARG(void *extra))
1136f709 142{
143 dict_delete(prohibited_addrs);
144 dict_delete(prohibited_masks);
145}
146
147static void
148mail_common_init(void)
149{
150 prohibited_addrs = dict_new();
151 dict_set_free_keys(prohibited_addrs, free);
152 dict_set_free_data(prohibited_addrs, free);
153 prohibited_masks = dict_new();
154 dict_set_free_keys(prohibited_masks, free);
155 dict_set_free_data(prohibited_masks, free);
30874d66 156 reg_exit_func(mail_common_cleanup, NULL);
1136f709 157 saxdb_register("sendmail", mail_saxdb_read, mail_saxdb_write);
158 mail_module = module_register("sendmail", MAIN_LOG, "mail.help", NULL);
159 modcmd_register(mail_module, "banemail", cmd_banemail, 3, 0, "level", "601", NULL);
160 modcmd_register(mail_module, "stats email", cmd_stats_email, 0, 0, "flags", "+oper", NULL);
161 modcmd_register(mail_module, "unbanemail", cmd_unbanemail, 2, 0, "level", "601", NULL);
162 message_register_table(msgtab);
163}