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

Annotation of /imapfilter/account.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.8 - (hide annotations)
Wed Feb 11 00:03:46 2004 UTC (16 years, 8 months ago) by lefcha
Branch: MAIN
Changes since 1.7: +5 -1 lines
File MIME type: text/plain
Added debugging level 2, where passwords are not shrouded.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26