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

Annotation of /imapfilter/account.c

Parent Directory Parent Directory | Revision Log Revision Log


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

1 lefcha 1.1 #include <stdio.h>
2 lefcha 1.3 #include <stdlib.h>
3 lefcha 1.1 #include <string.h>
4     #include <ctype.h>
5     #include <limits.h>
6 lefcha 1.11 #include <sys/types.h> /* For POSIX.1-2001 non-conformant systems. */
7 lefcha 1.4 #include <regex.h>
8 lefcha 1.1
9     #include "config.h"
10     #include "imapfilter.h"
11     #include "account.h"
12     #include "struct.h"
13    
14    
15 lefcha 1.9 extern options_t opts;
16 lefcha 1.1 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 lefcha 1.9 account_t *curacct = NULL; /* Current account. */
22 lefcha 1.1
23    
24 lefcha 1.9 void init_account(account_t * a);
25 lefcha 1.1
26 lefcha 1.9 void init_mboxgrp(mboxgrp_t * g);
27     void process_mboxgrp(mboxgrp_t * g, char *mboxs);
28 lefcha 1.1
29 lefcha 1.9 void init_mbox(mbox_t * m);
30 lefcha 1.1 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 lefcha 1.9 init_account(account_t * a)
40 lefcha 1.1 {
41 lefcha 1.10
42 lefcha 1.9 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 lefcha 1.1 }
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 lefcha 1.9 account_t *a;
64    
65     a = (account_t *) xmalloc(sizeof(account_t));
66     a->pass = (char *)smalloc(PASS_LEN);
67 lefcha 1.1
68 lefcha 1.9 init_account(a);
69 lefcha 1.1
70 lefcha 1.9 strncat(a->key, line + m[1].rm_so, min(m[1].rm_eo - m[1].rm_so,
71 lefcha 1.12 KEY_LEN - 1));
72 lefcha 1.1
73 lefcha 1.9 debug("account: '%s'\n", a->key);
74 lefcha 1.1
75 lefcha 1.9 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 lefcha 1.1
82 lefcha 1.9 if (strchr(a->user, '%'))
83     if (string_decode(a->user))
84     return ERROR_PARSER;
85 lefcha 1.1
86 lefcha 1.9 debug("username: '%s'\n", a->user);
87 lefcha 1.1
88     if (m[4].rm_so != -1) {
89 lefcha 1.9 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 lefcha 1.8 if (opts.debug == 1)
96 lefcha 1.9 debug("password: *\n");
97 lefcha 1.8 else
98 lefcha 1.9 debug("password: '%s'\n", a->pass);
99 lefcha 1.1 } else
100 lefcha 1.9 flags |= FLAG_BLANKPASS;
101 lefcha 1.1
102 lefcha 1.12 strncat(a->server, line + m[6].rm_so, min(m[6].rm_eo - m[6].rm_so,
103     SERVER_LEN - 1));
104 lefcha 1.1
105 lefcha 1.9 debug("server: '%s'\n", a->server);
106 lefcha 1.1
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 lefcha 1.9 a->port = strtoul(p, NULL, 10);
112     debug("port: %d\n", a->port);
113 lefcha 1.1 }
114     if (m[8].rm_so != -1) {
115     if (m[7].rm_so == -1)
116 lefcha 1.9 a->port = 993;
117 lefcha 1.1
118     if (strcasestr(line + m[8].rm_so, "SSL2"))
119 lefcha 1.9 a->ssl = SSL_SSL_V2;
120 lefcha 1.1 else if (strcasestr(line + m[8].rm_so, "SSL3"))
121 lefcha 1.9 a->ssl = SSL_SSL_V3;
122 lefcha 1.1 else
123 lefcha 1.9 a->ssl = SSL_TLS_V1;
124 lefcha 1.1 }
125 lefcha 1.9 APPEND_LINKED_LIST(accounts, a, account);
126     curacct = a;
127 lefcha 1.1
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 lefcha 1.9 if (a->pass_attr == PASS_ATTR_NONE &&
143 lefcha 1.12 !strcmp(a->server, serv) && !strcmp(a->user, user)) {
144 lefcha 1.9 a->pass_attr = PASS_ATTR_CRYPT;
145     return a->pass;
146 lefcha 1.1 }
147     return NULL;
148     }
149     #endif
150    
151    
152     /*
153     * Set new mailbox-group's variables to safe values.
154     */
155     void
156 lefcha 1.9 init_mboxgrp(mboxgrp_t * g)
157 lefcha 1.1 {
158 lefcha 1.10
159 lefcha 1.9 g->left = g->right = NULL;
160     g->key[0] = '\0';
161     g->mboxes[0] = NULL;
162 lefcha 1.1 }
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 lefcha 1.9 mboxgrp_t *g;
173 lefcha 1.1 char mboxs[LINE_MAX];
174    
175     mboxs[0] = '\0';
176    
177     if (accounts == NULL)
178 lefcha 1.9 return ERROR_PARSER;
179 lefcha 1.1
180 lefcha 1.9 g = (mboxgrp_t *) xmalloc(sizeof(mboxgrp_t));
181 lefcha 1.1
182 lefcha 1.9 init_mboxgrp(g);
183 lefcha 1.1
184 lefcha 1.9 strncat(g->key, line + m[1].rm_so, min(m[1].rm_eo - m[1].rm_so,
185 lefcha 1.12 KEY_LEN - 1));
186 lefcha 1.1
187 lefcha 1.9 debug("folder: '%s'\n", g->key);
188 lefcha 1.1
189 lefcha 1.9 strncat(mboxs, line + m[2].rm_so, min(m[2].rm_eo - m[2].rm_so,
190 lefcha 1.12 LINE_MAX - 1));
191 lefcha 1.1
192 lefcha 1.9 process_mboxgrp(g, mboxs);
193 lefcha 1.1
194 lefcha 1.9 INSERT_TREE(mboxgrps, g, mboxgrp);
195 lefcha 1.1
196     return 0;
197     }
198    
199    
200     /*
201 lefcha 1.12 * Calls set_mbox() in order to create mailboxes that are part of the
202     * mailbox-group.
203 lefcha 1.1 */
204     void
205 lefcha 1.9 process_mboxgrp(mboxgrp_t * g, char *mboxs)
206 lefcha 1.1 {
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 lefcha 1.9 g->mboxes[i] = (mbox_t *) set_mbox(tok);
215     g->mboxes[++i] = NULL;
216 lefcha 1.1
217     tok = strtok_r(NULL, ",", &mboxs);
218     }
219     }
220    
221    
222     /*
223     * Set new mailbox's variables to safe values.
224     */
225     void
226 lefcha 1.9 init_mbox(mbox_t * m)
227 lefcha 1.1 {
228 lefcha 1.10
229 lefcha 1.9 m->next = NULL;
230     m->name[0] = '\0';
231     m->filters[0] = NULL;
232 lefcha 1.1 }
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 lefcha 1.9 char s[MBOX_LEN];
242     mbox_t *m, *am;
243 lefcha 1.1
244     *s = '\0';
245    
246     if (*name == '"' && *(name + strlen(name) - 1) == '"')
247 lefcha 1.9 strncat(s, name + 1, min(strlen(name) - 2, MBOX_LEN - 1));
248 lefcha 1.1 else
249 lefcha 1.9 strncat(s, name, min(strlen(name), MBOX_LEN - 1));
250 lefcha 1.1
251 lefcha 1.9 for (am = curacct->mboxes; am != NULL; am = am->next)
252     if (!strcmp(am->name, s))
253     return am;
254 lefcha 1.1
255 lefcha 1.9 m = (mbox_t *) xmalloc(sizeof(mbox_t));
256 lefcha 1.1
257 lefcha 1.9 init_mbox(m);
258 lefcha 1.1
259 lefcha 1.9 strncat(m->name, s, MBOX_LEN - 1);
260 lefcha 1.1
261 lefcha 1.9 debug("mbox: '%s'\n", m->name);
262 lefcha 1.1
263 lefcha 1.9 APPEND_LINKED_LIST(curacct->mboxes, m, mbox);
264 lefcha 1.1
265 lefcha 1.9 return m;
266 lefcha 1.1 }
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 lefcha 1.9 return ERROR_PARSER;
287 lefcha 1.1
288     xstrncpy(hex, ++c, 2);
289     hex[2] = '\0';
290    
291     if (!isprint((unsigned char)(*str = (char)strtoul(hex,
292 lefcha 1.12 NULL, 16))))
293 lefcha 1.9 return ERROR_PARSER;
294 lefcha 1.1
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 lefcha 1.9 static char m[MBOX_LEN];
314 lefcha 1.1 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 lefcha 1.9 strncat(m, prefix, NAMESPACE_PREFIX_LEN - 1);
323     strncat(m, mbox, MBOX_LEN - strlen(m) - 1);
324 lefcha 1.1
325     c = m;
326     while ((c = strchr(c, '/')))
327     *(c++) = delim;
328    
329 lefcha 1.9 debug("mailbox: '%s'\n", m);
330 lefcha 1.1
331     return m;
332     }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26