/[imapfilter]/imapfilter/account.c
ViewVC logotype

Contents of /imapfilter/account.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.12 - (show annotations)
Sat Feb 14 19:14:43 2004 UTC (16 years, 8 months ago) by lefcha
Branch: MAIN
CVS Tags: HEAD
Changes since 1.11: +9 -10 lines
File MIME type: text/plain
Indentation.

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
5 #include <limits.h>
6 #include <sys/types.h> /* For POSIX.1-2001 non-conformant systems. */
7 #include <regex.h>
8
9 #include "config.h"
10 #include "imapfilter.h"
11 #include "account.h"
12 #include "struct.h"
13
14
15 extern options_t opts;
16 extern unsigned int flags;
17
18 account_t *accounts = NULL; /* First node of accounts linked list. */
19 mboxgrp_t *mboxgrps = NULL; /* First node of mailbox-groups tree. */
20
21 account_t *curacct = NULL; /* Current account. */
22
23
24 void init_account(account_t * a);
25
26 void init_mboxgrp(mboxgrp_t * g);
27 void process_mboxgrp(mboxgrp_t * g, char *mboxs);
28
29 void init_mbox(mbox_t * m);
30 mbox_t *set_mbox(char *name);
31
32 int string_decode(char *str);
33
34
35 /*
36 * Set new account's variables to safe values.
37 */
38 void
39 init_account(account_t * a)
40 {
41
42 a->next = NULL;
43 a->key[0] = '\0';
44 a->server[0] = '\0';
45 a->user[0] = '\0';
46 a->pass[0] = '\0';
47 a->pass_attr = PASS_ATTR_NONE;
48 a->port = 143;
49 a->ssl = SSL_DISABLED;
50 a->mboxes = NULL;
51 }
52
53
54 /*
55 * A new account entry was declared. Create it and set it's variables
56 * accordingly.
57 */
58 int
59 set_account(char *line, regmatch_t * m)
60 {
61 int n;
62 char p[6];
63 account_t *a;
64
65 a = (account_t *) xmalloc(sizeof(account_t));
66 a->pass = (char *)smalloc(PASS_LEN);
67
68 init_account(a);
69
70 strncat(a->key, line + m[1].rm_so, min(m[1].rm_eo - m[1].rm_so,
71 KEY_LEN - 1));
72
73 debug("account: '%s'\n", a->key);
74
75 if (m[3].rm_so != -1)
76 strncat(a->user, line + m[3].rm_so,
77 min(m[3].rm_eo - m[3].rm_so, USER_LEN - 1));
78 else
79 strncat(a->user, line + m[5].rm_so,
80 min(m[5].rm_eo - m[5].rm_so, USER_LEN - 1));
81
82 if (strchr(a->user, '%'))
83 if (string_decode(a->user))
84 return ERROR_PARSER;
85
86 debug("username: '%s'\n", a->user);
87
88 if (m[4].rm_so != -1) {
89 strncat(a->pass, line + m[4].rm_so,
90 min(m[4].rm_eo - m[4].rm_so, PASS_LEN - 1));
91 if (strchr(a->pass, '%'))
92 if (string_decode(a->pass))
93 return ERROR_PARSER;
94 a->pass_attr = PASS_ATTR_PLAIN;
95 if (opts.debug == 1)
96 debug("password: *\n");
97 else
98 debug("password: '%s'\n", a->pass);
99 } else
100 flags |= FLAG_BLANKPASS;
101
102 strncat(a->server, line + m[6].rm_so, min(m[6].rm_eo - m[6].rm_so,
103 SERVER_LEN - 1));
104
105 debug("server: '%s'\n", a->server);
106
107 if (m[7].rm_so != -1) {
108 n = min(m[7].rm_eo - m[7].rm_so - 1, 5);
109 xstrncpy(p, line + m[7].rm_so + 1, n);
110 p[n] = '\0';
111 a->port = strtoul(p, NULL, 10);
112 debug("port: %d\n", a->port);
113 }
114 if (m[8].rm_so != -1) {
115 if (m[7].rm_so == -1)
116 a->port = 993;
117
118 if (strcasestr(line + m[8].rm_so, "SSL2"))
119 a->ssl = SSL_SSL_V2;
120 else if (strcasestr(line + m[8].rm_so, "SSL3"))
121 a->ssl = SSL_SSL_V3;
122 else
123 a->ssl = SSL_TLS_V1;
124 }
125 APPEND_LINKED_LIST(accounts, a, account);
126 curacct = a;
127
128 return 0;
129 }
130
131
132 #ifdef ENCRYPTED_PASSWORDS
133 /*
134 * Find accounts without a password (candicates for password encryption).
135 */
136 char *
137 find_password(char *user, char *serv)
138 {
139 account_t *a;
140
141 for (a = accounts; a != NULL; a = a->next)
142 if (a->pass_attr == PASS_ATTR_NONE &&
143 !strcmp(a->server, serv) && !strcmp(a->user, user)) {
144 a->pass_attr = PASS_ATTR_CRYPT;
145 return a->pass;
146 }
147 return NULL;
148 }
149 #endif
150
151
152 /*
153 * Set new mailbox-group's variables to safe values.
154 */
155 void
156 init_mboxgrp(mboxgrp_t * g)
157 {
158
159 g->left = g->right = NULL;
160 g->key[0] = '\0';
161 g->mboxes[0] = NULL;
162 }
163
164
165 /*
166 * A new mailbox-group entry was declared. Create it and set it's variables
167 * accordingly.
168 */
169 int
170 set_mboxgrp(char *line, regmatch_t * m)
171 {
172 mboxgrp_t *g;
173 char mboxs[LINE_MAX];
174
175 mboxs[0] = '\0';
176
177 if (accounts == NULL)
178 return ERROR_PARSER;
179
180 g = (mboxgrp_t *) xmalloc(sizeof(mboxgrp_t));
181
182 init_mboxgrp(g);
183
184 strncat(g->key, line + m[1].rm_so, min(m[1].rm_eo - m[1].rm_so,
185 KEY_LEN - 1));
186
187 debug("folder: '%s'\n", g->key);
188
189 strncat(mboxs, line + m[2].rm_so, min(m[2].rm_eo - m[2].rm_so,
190 LINE_MAX - 1));
191
192 process_mboxgrp(g, mboxs);
193
194 INSERT_TREE(mboxgrps, g, mboxgrp);
195
196 return 0;
197 }
198
199
200 /*
201 * Calls set_mbox() in order to create mailboxes that are part of the
202 * mailbox-group.
203 */
204 void
205 process_mboxgrp(mboxgrp_t * g, char *mboxs)
206 {
207 unsigned int i;
208 char *tok;
209
210 i = 0;
211
212 tok = strtok_r(mboxs, ",", &mboxs);
213 while (i < MBOXGRP_MBOXES_MAX - 1 && tok != NULL) {
214 g->mboxes[i] = (mbox_t *) set_mbox(tok);
215 g->mboxes[++i] = NULL;
216
217 tok = strtok_r(NULL, ",", &mboxs);
218 }
219 }
220
221
222 /*
223 * Set new mailbox's variables to safe values.
224 */
225 void
226 init_mbox(mbox_t * m)
227 {
228
229 m->next = NULL;
230 m->name[0] = '\0';
231 m->filters[0] = NULL;
232 }
233
234
235 /*
236 * A new mailbox was declared, create it and set it's variables accordingly.
237 */
238 mbox_t *
239 set_mbox(char *name)
240 {
241 char s[MBOX_LEN];
242 mbox_t *m, *am;
243
244 *s = '\0';
245
246 if (*name == '"' && *(name + strlen(name) - 1) == '"')
247 strncat(s, name + 1, min(strlen(name) - 2, MBOX_LEN - 1));
248 else
249 strncat(s, name, min(strlen(name), MBOX_LEN - 1));
250
251 for (am = curacct->mboxes; am != NULL; am = am->next)
252 if (!strcmp(am->name, s))
253 return am;
254
255 m = (mbox_t *) xmalloc(sizeof(mbox_t));
256
257 init_mbox(m);
258
259 strncat(m->name, s, MBOX_LEN - 1);
260
261 debug("mbox: '%s'\n", m->name);
262
263 APPEND_LINKED_LIST(curacct->mboxes, m, mbox);
264
265 return m;
266 }
267
268
269 /*
270 * Decode the character triplet, consisting of the character '%'
271 * followed by two hexadecimal digits to its corresponding ASCII
272 * character (described in Section 2.2 of RFC 1738).
273 */
274 int
275 string_decode(char *str)
276 {
277 char *c;
278 char hex[3];
279
280 c = str;
281
282 while (*c != '\0') {
283 if (*c == '%') {
284 if (!isxdigit((unsigned char)(*(c + 1))) ||
285 !isxdigit((unsigned char)(*(c + 2))))
286 return ERROR_PARSER;
287
288 xstrncpy(hex, ++c, 2);
289 hex[2] = '\0';
290
291 if (!isprint((unsigned char)(*str = (char)strtoul(hex,
292 NULL, 16))))
293 return ERROR_PARSER;
294
295 str++;
296 c += 2;
297 } else
298 *(str++) = *(c++);
299 }
300 *str = '\0';
301
302 return 0;
303 }
304
305
306 /*
307 * Convert the names of personal mailboxes using the namespace specified
308 * by the mail server.
309 */
310 char *
311 apply_namespace(char *mbox, char *prefix, char delim)
312 {
313 static char m[MBOX_LEN];
314 char *c;
315
316 if ((prefix[0] == '\0' && delim == '\0') ||
317 (prefix[0] == '\0' && delim == '/') ||
318 !strcasecmp(mbox, "INBOX"))
319 return mbox;
320
321 m[0] = '\0';
322 strncat(m, prefix, NAMESPACE_PREFIX_LEN - 1);
323 strncat(m, mbox, MBOX_LEN - strlen(m) - 1);
324
325 c = m;
326 while ((c = strchr(c, '/')))
327 *(c++) = delim;
328
329 debug("mailbox: '%s'\n", m);
330
331 return m;
332 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26