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

Annotation of /imapfilter/account.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (hide annotations)
Mon Feb 9 22:03:12 2004 UTC (20 years, 1 month ago) by lefcha
Branch: MAIN
Changes since 1.6: +1 -2 lines
File MIME type: text/plain
Shroud passwords in debug messages.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26