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

Diff of /imapfilter/account.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.5 by lefcha, Fri Aug 8 12:29:43 2003 UTC revision 1.11 by lefcha, Fri Feb 13 23:44:50 2004 UTC
# Line 3  Line 3 
3  #include <string.h>  #include <string.h>
4  #include <ctype.h>  #include <ctype.h>
5  #include <limits.h>  #include <limits.h>
6  #include <sys/types.h>          /* IEEE Std 1003.1-2001 non-conformance. */  #include <sys/types.h>          /* For POSIX.1-2001 non-conformant systems. */
7  #include <regex.h>  #include <regex.h>
8    
9  #include "config.h"  #include "config.h"
# Line 12  Line 12 
12  #include "struct.h"  #include "struct.h"
13    
14    
15    extern options_t opts;
16  extern unsigned int flags;  extern unsigned int flags;
17    
18  account_t *accounts = NULL;     /* First node of accounts linked list. */  account_t *accounts = NULL;     /* First node of accounts linked list. */
19  mboxgrp_t *mboxgrps = NULL;     /* First node of mailbox-groups tree. */  mboxgrp_t *mboxgrps = NULL;     /* First node of mailbox-groups tree. */
20    
21  account_t *cur_acct = NULL;     /* Current account. */  account_t *curacct = NULL;      /* Current account. */
22    
23    
24  void init_account(account_t * node);  void init_account(account_t * a);
25    
26  void init_mboxgrp(mboxgrp_t * node);  void init_mboxgrp(mboxgrp_t * g);
27  void process_mboxgrp(mboxgrp_t * node, char *mboxs);  void process_mboxgrp(mboxgrp_t * g, char *mboxs);
28    
29  void init_mbox(mbox_t * node);  void init_mbox(mbox_t * m);
30  mbox_t *set_mbox(char *name);  mbox_t *set_mbox(char *name);
31    
32  int string_decode(char *str);  int string_decode(char *str);
# Line 35  int string_decode(char *str); Line 36  int string_decode(char *str);
36   * Set new account's variables to safe values.   * Set new account's variables to safe values.
37   */   */
38  void  void
39  init_account(account_t * node)  init_account(account_t * a)
40  {  {
41          node->next = NULL;  
42          node->key[0] = node->server[0] = '\0';          a->next = NULL;
43          node->username[0] = node->password[0] = '\0';          a->key[0] = '\0';
44          node->passwdattr = PASSWORD_NONE;          a->server[0] = '\0';
45          node->port = 143;          a->user[0] = '\0';
46          node->ssl = SSL_DISABLED;          a->pass[0] = '\0';
47          node->mboxes = NULL;          a->pass_attr = PASS_ATTR_NONE;
48            a->port = 143;
49            a->ssl = SSL_DISABLED;
50            a->mboxes = NULL;
51  }  }
52    
53    
# Line 56  set_account(char *line, regmatch_t * m) Line 60  set_account(char *line, regmatch_t * m)
60  {  {
61          int n;          int n;
62          char p[6];          char p[6];
63          account_t *node;          account_t *a;
64    
65          node = (account_t *) xmalloc(sizeof(account_t));          a = (account_t *) xmalloc(sizeof(account_t));
66          node->password = (char *)smalloc(PASSWORD_LEN);          a->pass = (char *)smalloc(PASS_LEN);
67    
68          init_account(node);          init_account(a);
69    
70          strncat(node->key, line + m[1].rm_so,          strncat(a->key, line + m[1].rm_so, min(m[1].rm_eo - m[1].rm_so,
71              min(m[1].rm_eo - m[1].rm_so, KEY_LEN - 1));                  KEY_LEN - 1));
72    
73  #ifdef DEBUG          debug("account: '%s'\n", a->key);
         fprintf(stderr, "debug: ACCOUNT: '%s'\n", node->key);  
 #endif  
74    
75          if (m[3].rm_so != -1) {          if (m[3].rm_so != -1)
76                  strncat(node->username, line + m[3].rm_so,                  strncat(a->user, line + m[3].rm_so,
77                      min(m[3].rm_eo - m[3].rm_so, USERNAME_LEN - 1));                      min(m[3].rm_eo - m[3].rm_so, USER_LEN - 1));
78          } else {          else
79                  strncat(node->username, line + m[5].rm_so,                  strncat(a->user, line + m[5].rm_so,
80                      min(m[5].rm_eo - m[5].rm_so, USERNAME_LEN - 1));                      min(m[5].rm_eo - m[5].rm_so, USER_LEN - 1));
         }  
         if (strchr(node->username, '%'))  
                 if (string_decode(node->username))  
                         return ERROR_CONFIG_PARSE;  
81    
82  #ifdef DEBUG          if (strchr(a->user, '%'))
83          fprintf(stderr, "debug: USERNAME: '%s'\n", node->username);                  if (string_decode(a->user))
84  #endif                          return ERROR_PARSER;
85    
86            debug("username: '%s'\n", a->user);
87    
88          if (m[4].rm_so != -1) {          if (m[4].rm_so != -1) {
89                  strncat(node->password, line + m[4].rm_so,                  strncat(a->pass, line + m[4].rm_so,
90                      min(m[4].rm_eo - m[4].rm_so, PASSWORD_LEN - 1));                      min(m[4].rm_eo - m[4].rm_so, PASS_LEN - 1));
91                  if (strchr(node->password, '%'))                  if (strchr(a->pass, '%'))
92                          if (string_decode(node->password))                          if (string_decode(a->pass))
93                                  return ERROR_CONFIG_PARSE;                                  return ERROR_PARSER;
94                  node->passwdattr = PASSWORD_PLAIN;                  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          } else
100                  flags |= FLAG_BLANK_PASSWORD;                  flags |= FLAG_BLANKPASS;
   
 #ifdef DEBUG  
         fprintf(stderr, "debug: PASSWORD: '%s'\n", node->password);  
 #endif  
101    
102          strncat(node->server, line + m[6].rm_so,          strncat(a->server, line + m[6].rm_so,
103              min(m[6].rm_eo - m[6].rm_so, SERVER_LEN - 1));              min(m[6].rm_eo - m[6].rm_so, SERVER_LEN - 1));
104    
105  #ifdef DEBUG          debug("server: '%s'\n", a->server);
         fprintf(stderr, "debug: SERVER: '%s'\n", node->server);  
 #endif  
106    
107          if (m[7].rm_so != -1) {          if (m[7].rm_so != -1) {
108                  n = min(m[7].rm_eo - m[7].rm_so - 1, 5);                  n = min(m[7].rm_eo - m[7].rm_so - 1, 5);
109                  xstrncpy(p, line + m[7].rm_so + 1, n);                  xstrncpy(p, line + m[7].rm_so + 1, n);
110                  p[n] = '\0';                  p[n] = '\0';
111                  node->port = strtoul(p, NULL, 10);                  a->port = strtoul(p, NULL, 10);
112  #ifdef DEBUG                  debug("port: %d\n", a->port);
                 fprintf(stderr, "debug: PORT: %d\n", node->port);  
 #endif  
113          }          }
114          if (m[8].rm_so != -1) {          if (m[8].rm_so != -1) {
115                  if (m[7].rm_so == -1)                  if (m[7].rm_so == -1)
116                          node->port = 993;                          a->port = 993;
117    
118                  if (strcasestr(line + m[8].rm_so, "SSL2"))                  if (strcasestr(line + m[8].rm_so, "SSL2"))
119                          node->ssl = SSL_SSL_V2;                          a->ssl = SSL_SSL_V2;
120                  else if (strcasestr(line + m[8].rm_so, "SSL3"))                  else if (strcasestr(line + m[8].rm_so, "SSL3"))
121                          node->ssl = SSL_SSL_V3;                          a->ssl = SSL_SSL_V3;
122                  else                  else
123                          node->ssl = SSL_TLS_V1;                          a->ssl = SSL_TLS_V1;
124          }          }
125          APPEND_LINKED_LIST(accounts, node, account);          APPEND_LINKED_LIST(accounts, a, account);
126          cur_acct = node;          curacct = a;
127    
128          return 0;          return 0;
129  }  }
# Line 143  find_password(char *user, char *serv) Line 139  find_password(char *user, char *serv)
139          account_t *a;          account_t *a;
140    
141          for (a = accounts; a != NULL; a = a->next)          for (a = accounts; a != NULL; a = a->next)
142                  if (a->passwdattr == PASSWORD_NONE &&                  if (a->pass_attr == PASS_ATTR_NONE &&
143                      !strcmp(a->server, serv) && !strcmp(a->username, user)) {                      !strcmp(a->server, serv) &&
144                          a->passwdattr = PASSWORD_ENCRYPTED;                      !strcmp(a->user, user)) {
145                          return a->password;                          a->pass_attr = PASS_ATTR_CRYPT;
146                            return a->pass;
147                  }                  }
148          return NULL;          return NULL;
149  }  }
# Line 157  find_password(char *user, char *serv) Line 154  find_password(char *user, char *serv)
154   * Set new mailbox-group's variables to safe values.   * Set new mailbox-group's variables to safe values.
155   */   */
156  void  void
157  init_mboxgrp(mboxgrp_t * node)  init_mboxgrp(mboxgrp_t * g)
158  {  {
159          node->left = node->right = NULL;  
160          node->key[0] = '\0';          g->left = g->right = NULL;
161          node->mboxes[0] = NULL;          g->key[0] = '\0';
162            g->mboxes[0] = NULL;
163  }  }
164    
165    
# Line 172  init_mboxgrp(mboxgrp_t * node) Line 170  init_mboxgrp(mboxgrp_t * node)
170  int  int
171  set_mboxgrp(char *line, regmatch_t * m)  set_mboxgrp(char *line, regmatch_t * m)
172  {  {
173          mboxgrp_t *node;          mboxgrp_t *g;
174          char mboxs[LINE_MAX];          char mboxs[LINE_MAX];
175    
176          mboxs[0] = '\0';          mboxs[0] = '\0';
177    
178          if (accounts == NULL)          if (accounts == NULL)
179                  return ERROR_CONFIG_PARSE;                  return ERROR_PARSER;
180    
181          node = (mboxgrp_t *) xmalloc(sizeof(mboxgrp_t));          g = (mboxgrp_t *) xmalloc(sizeof(mboxgrp_t));
182    
183          init_mboxgrp(node);          init_mboxgrp(g);
184    
185          strncat(node->key, line + m[1].rm_so,          strncat(g->key, line + m[1].rm_so, min(m[1].rm_eo - m[1].rm_so,
186              min(m[1].rm_eo - m[1].rm_so, KEY_LEN - 1));                  KEY_LEN - 1));
187    
188  #ifdef DEBUG          debug("folder: '%s'\n", g->key);
         fprintf(stderr, "debug: FOLDER: '%s'\n", node->key);  
 #endif  
189    
190          strncat(mboxs, line + m[2].rm_so,          strncat(mboxs, line + m[2].rm_so, min(m[2].rm_eo - m[2].rm_so,
191              min(m[2].rm_eo - m[2].rm_so, LINE_MAX - 1));                  LINE_MAX - 1));
192    
193          process_mboxgrp(node, mboxs);          process_mboxgrp(g, mboxs);
194    
195          INSERT_TREE(mboxgrps, node, mboxgrp);          INSERT_TREE(mboxgrps, g, mboxgrp);
196    
197          return 0;          return 0;
198  }  }
# Line 207  set_mboxgrp(char *line, regmatch_t * m) Line 203  set_mboxgrp(char *line, regmatch_t * m)
203   * the mailbox-group.   * the mailbox-group.
204   */   */
205  void  void
206  process_mboxgrp(mboxgrp_t * node, char *mboxs)  process_mboxgrp(mboxgrp_t * g, char *mboxs)
207  {  {
208          unsigned int i;          unsigned int i;
209          char *tok;          char *tok;
# Line 216  process_mboxgrp(mboxgrp_t * node, char * Line 212  process_mboxgrp(mboxgrp_t * node, char *
212    
213          tok = strtok_r(mboxs, ",", &mboxs);          tok = strtok_r(mboxs, ",", &mboxs);
214          while (i < MBOXGRP_MBOXES_MAX - 1 && tok != NULL) {          while (i < MBOXGRP_MBOXES_MAX - 1 && tok != NULL) {
215                  node->mboxes[i] = (mbox_t *) set_mbox(tok);                  g->mboxes[i] = (mbox_t *) set_mbox(tok);
216                  node->mboxes[++i] = NULL;                  g->mboxes[++i] = NULL;
217    
218                  tok = strtok_r(NULL, ",", &mboxs);                  tok = strtok_r(NULL, ",", &mboxs);
219          }          }
# Line 228  process_mboxgrp(mboxgrp_t * node, char * Line 224  process_mboxgrp(mboxgrp_t * node, char *
224   * Set new mailbox's variables to safe values.   * Set new mailbox's variables to safe values.
225   */   */
226  void  void
227  init_mbox(mbox_t * node)  init_mbox(mbox_t * m)
228  {  {
229          node->next = NULL;  
230          node->name[0] = '\0';          m->next = NULL;
231          node->filters[0] = NULL;          m->name[0] = '\0';
232            m->filters[0] = NULL;
233  }  }
234    
235    
# Line 242  init_mbox(mbox_t * node) Line 239  init_mbox(mbox_t * node)
239  mbox_t *  mbox_t *
240  set_mbox(char *name)  set_mbox(char *name)
241  {  {
242          char s[MBOX_NAME_LEN];          char s[MBOX_LEN];
243          mbox_t *node, *m;          mbox_t *m, *am;
244    
245          *s = '\0';          *s = '\0';
246    
247          if (*name == '"' && *(name + strlen(name) - 1) == '"')          if (*name == '"' && *(name + strlen(name) - 1) == '"')
248                  strncat(s, name + 1, min(strlen(name) - 2, MBOX_NAME_LEN - 1));                  strncat(s, name + 1, min(strlen(name) - 2, MBOX_LEN - 1));
249          else          else
250                  strncat(s, name, min(strlen(name), MBOX_NAME_LEN - 1));                  strncat(s, name, min(strlen(name), MBOX_LEN - 1));
251    
252          for (m = cur_acct->mboxes; m != NULL; m = m->next)          for (am = curacct->mboxes; am != NULL; am = am->next)
253                  if (!strcmp(m->name, s))                  if (!strcmp(am->name, s))
254                          return m;                          return am;
255    
256          node = (mbox_t *) xmalloc(sizeof(mbox_t));          m = (mbox_t *) xmalloc(sizeof(mbox_t));
257    
258          init_mbox(node);          init_mbox(m);
259    
260          strncat(node->name, s, MBOX_NAME_LEN - 1);          strncat(m->name, s, MBOX_LEN - 1);
261    
262  #ifdef DEBUG          debug("mbox: '%s'\n", m->name);
         fprintf(stderr, "debug: MBOX: '%s'\n", node->name);  
 #endif  
263    
264          APPEND_LINKED_LIST(cur_acct->mboxes, node, mbox);          APPEND_LINKED_LIST(curacct->mboxes, m, mbox);
265    
266          return node;          return m;
267  }  }
268    
269    
# Line 289  string_decode(char *str) Line 284  string_decode(char *str)
284                  if (*c == '%') {                  if (*c == '%') {
285                          if (!isxdigit((unsigned char)(*(c + 1))) ||                          if (!isxdigit((unsigned char)(*(c + 1))) ||
286                              !isxdigit((unsigned char)(*(c + 2))))                              !isxdigit((unsigned char)(*(c + 2))))
287                                  return ERROR_CONFIG_PARSE;                                  return ERROR_PARSER;
288    
289                          xstrncpy(hex, ++c, 2);                          xstrncpy(hex, ++c, 2);
290                          hex[2] = '\0';                          hex[2] = '\0';
291    
292                          if (!isprint((unsigned char)(*str = (char)strtoul(hex,                          if (!isprint((unsigned char)(*str = (char)strtoul(hex,
293                                          NULL, 16))))                                          NULL, 16))))
294                                  return ERROR_CONFIG_PARSE;                                  return ERROR_PARSER;
295    
296                          str++;                          str++;
297                          c += 2;                          c += 2;
# Line 316  string_decode(char *str) Line 311  string_decode(char *str)
311  char *  char *
312  apply_namespace(char *mbox, char *prefix, char delim)  apply_namespace(char *mbox, char *prefix, char delim)
313  {  {
314          static char m[MBOX_NAME_LEN];          static char m[MBOX_LEN];
315          char *c;          char *c;
316    
317          if ((prefix[0] == '\0' && delim == '\0') ||          if ((prefix[0] == '\0' && delim == '\0') ||
# Line 325  apply_namespace(char *mbox, char *prefix Line 320  apply_namespace(char *mbox, char *prefix
320                  return mbox;                  return mbox;
321    
322          m[0] = '\0';          m[0] = '\0';
323          strncat(m, prefix, MBOX_NAME_LEN - 1);          strncat(m, prefix, NAMESPACE_PREFIX_LEN - 1);
324          strncat(m, mbox, MBOX_NAME_LEN - strlen(m) - 1);          strncat(m, mbox, MBOX_LEN - strlen(m) - 1);
325    
326          c = m;          c = m;
327          while ((c = strchr(c, '/')))          while ((c = strchr(c, '/')))
328                  *(c++) = delim;                  *(c++) = delim;
329    
330  #ifdef DEBUG          debug("mailbox: '%s'\n", m);
         fprintf(stderr, "debug: MAILBOX: '%s'\n", m);  
 #endif  
331    
332          return m;          return m;
333  }  }

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.11

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26