X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=init.c;h=a00f1f781d40e6c74748b49283232a149a4f5159;hp=0a0d9abe68e8581ff37b635d97ee556130d36387;hb=dba814e28104a395ffb52e16beccaecf09be8cde;hpb=ba5e3af4ea19e1d20c80941c077039871ec84258 diff --git a/init.c b/init.c index 0a0d9ab..a00f1f7 100644 --- a/init.c +++ b/init.c @@ -12,6 +12,8 @@ #endif #include "mutt.h" +#include "buffer.h" +#include "ascii.h" #include "mapping.h" #include "mutt_curses.h" #include "history.h" @@ -25,6 +27,10 @@ #include "mutt_ssl.h" #endif +#if defined (USE_LIBESMTP) && (defined (USE_SSL) || defined (USE_GNUTLS)) +#include "mutt_libesmtp.h" +#endif + #include "mx.h" #include "init.h" @@ -58,6 +64,23 @@ char* CurRCFile = NULL; /* for synonym warning reports: current rc line */ int CurRCLine = 0; +/* prototypes for checking for special vars */ +static int check_dsn_return (const char*); +static int check_dsn_notify (const char*); + +static struct { + const char* name; + int (*check) (const char*); +} SpecialVars[] = { + { "dsn_notify", check_dsn_notify }, + { "dsn_return", check_dsn_return }, +#if defined (USE_LIBESMTP) && (defined (USE_SSL) || defined (USE_GNUTLS)) + { "smtp_use_tls", mutt_libesmtp_check_usetls }, +#endif + /* last */ + { NULL, NULL } +}; + /* for synonym warning reports: adds synonym to end of list */ static void syn_add (int n, int o) { syn_t* tmp = mem_malloc (sizeof (syn_t)); @@ -133,176 +156,6 @@ int mutt_option_index (char *s) return (-1); } -int mutt_extract_token (BUFFER * dest, BUFFER * tok, int flags) -{ - char ch; - char qc = 0; /* quote char */ - char *pc; - - /* reset the destination pointer to the beginning of the buffer */ - dest->dptr = dest->data; - - SKIPWS (tok->dptr); - while ((ch = *tok->dptr)) { - if (!qc) { - if ((ISSPACE (ch) && !(flags & M_TOKEN_SPACE)) || - (ch == '#' && !(flags & M_TOKEN_COMMENT)) || - (ch == '=' && (flags & M_TOKEN_EQUAL)) || - (ch == ';' && !(flags & M_TOKEN_SEMICOLON)) || - ((flags & M_TOKEN_PATTERN) && strchr ("~!|", ch))) - break; - } - - tok->dptr++; - - if (ch == qc) - qc = 0; /* end of quote */ - else if (!qc && (ch == '\'' || ch == '"') && !(flags & M_TOKEN_QUOTE)) - qc = ch; - else if (ch == '\\' && qc != '\'') { - if (!*tok->dptr) - return -1; /* premature end of token */ - switch (ch = *tok->dptr++) { - case 'c': - case 'C': - if (!*tok->dptr) - return -1; /* premature end of token */ - mutt_buffer_addch (dest, (toupper ((unsigned char) *tok->dptr) - - '@') & 0x7f); - tok->dptr++; - break; - case 'r': - mutt_buffer_addch (dest, '\r'); - break; - case 'n': - mutt_buffer_addch (dest, '\n'); - break; - case 't': - mutt_buffer_addch (dest, '\t'); - break; - case 'f': - mutt_buffer_addch (dest, '\f'); - break; - case 'e': - mutt_buffer_addch (dest, '\033'); - break; - default: - if (isdigit ((unsigned char) ch) && - isdigit ((unsigned char) *tok->dptr) && - isdigit ((unsigned char) *(tok->dptr + 1))) { - - mutt_buffer_addch (dest, - (ch << 6) + (*tok->dptr << 3) + *(tok->dptr + - 1) - 3504); - tok->dptr += 2; - } - else - mutt_buffer_addch (dest, ch); - } - } - else if (ch == '^' && (flags & M_TOKEN_CONDENSE)) { - if (!*tok->dptr) - return -1; /* premature end of token */ - ch = *tok->dptr++; - if (ch == '^') - mutt_buffer_addch (dest, ch); - else if (ch == '[') - mutt_buffer_addch (dest, '\033'); - else if (isalpha ((unsigned char) ch)) - mutt_buffer_addch (dest, toupper ((unsigned char) ch) - '@'); - else { - mutt_buffer_addch (dest, '^'); - mutt_buffer_addch (dest, ch); - } - } - else if (ch == '`' && (!qc || qc == '"')) { - FILE *fp; - pid_t pid; - char *cmd, *ptr; - size_t expnlen; - BUFFER expn; - int line = 0; - - pc = tok->dptr; - do { - if ((pc = strpbrk (pc, "\\`"))) { - /* skip any quoted chars */ - if (*pc == '\\') - pc += 2; - } - } while (pc && *pc != '`'); - if (!pc) { - debug_print (1, ("mismatched backtics\n")); - return (-1); - } - cmd = str_substrdup (tok->dptr, pc); - if ((pid = mutt_create_filter (cmd, NULL, &fp, NULL)) < 0) { - debug_print (1, ("unable to fork command: %s\n", cmd)); - mem_free (&cmd); - return (-1); - } - mem_free (&cmd); - - tok->dptr = pc + 1; - - /* read line */ - memset (&expn, 0, sizeof (expn)); - expn.data = mutt_read_line (NULL, &expn.dsize, fp, &line); - fclose (fp); - mutt_wait_filter (pid); - - /* if we got output, make a new string consiting of the shell ouptput - plus whatever else was left on the original line */ - /* BUT: If this is inside a quoted string, directly add output to - * the token */ - if (expn.data && qc) { - mutt_buffer_addstr (dest, expn.data); - mem_free (&expn.data); - } - else if (expn.data) { - expnlen = str_len (expn.data); - tok->dsize = expnlen + str_len (tok->dptr) + 1; - ptr = mem_malloc (tok->dsize); - memcpy (ptr, expn.data, expnlen); - strcpy (ptr + expnlen, tok->dptr); /* __STRCPY_CHECKED__ */ - if (tok->destroy) - mem_free (&tok->data); - tok->data = ptr; - tok->dptr = ptr; - tok->destroy = 1; /* mark that the caller should destroy this data */ - ptr = NULL; - mem_free (&expn.data); - } - } - else if (ch == '$' && (!qc || qc == '"') - && (*tok->dptr == '{' || isalpha ((unsigned char) *tok->dptr))) { - char *env = NULL, *var = NULL; - - if (*tok->dptr == '{') { - tok->dptr++; - if ((pc = strchr (tok->dptr, '}'))) { - var = str_substrdup (tok->dptr, pc); - tok->dptr = pc + 1; - } - } - else { - for (pc = tok->dptr; isalnum ((unsigned char) *pc) || *pc == '_'; - pc++); - var = str_substrdup (tok->dptr, pc); - tok->dptr = pc; - } - if (var && (env = getenv (var))) - mutt_buffer_addstr (dest, env); - mem_free (&var); - } - else - mutt_buffer_addch (dest, ch); - } - mutt_buffer_addch (dest, 0); /* terminate the string */ - SKIPWS (tok->dptr); - return 0; -} - static void add_to_list (LIST ** list, const char *str) { LIST *t, *last = NULL; @@ -1144,6 +997,47 @@ static void mutt_restore_default (struct option_t *p) set_option (OPTREDRAWTREE); } +/* check whether value for $dsn_return would be valid */ +static int check_dsn_return (const char* val) { + if (val && *val && str_ncmp (val, "hdrs", 4) != 0 && + str_ncmp (val, "full", 4) != 0) + return (0); + return (1); +} + +/* check whether value for $dsn_notify would be valid */ +static int check_dsn_notify (const char* val) { + list2_t* list = NULL; + int i = 0, rc = 1; + + if (!val || !*val) + return (1); + list = list_from_str (val, ","); + if (list_empty (list)) + return (1); + + for (i = 0; i < list->length; i++) + if (str_ncmp (list->data[i], "never", 5) != 0 && + str_ncmp (list->data[i], "failure", 7) != 0 && + str_ncmp (list->data[i], "delay", 5) != 0 && + str_ncmp (list->data[i], "success", 7) != 0) { + rc = 0; + break; + } + list_del (&list, (list_del_t*) _mem_free); + return (rc); +} + +static int check_special (const char* name, const char* val) { + int i = 0; + + for (i = 0; SpecialVars[i].name; i++) { + if (str_cmp (SpecialVars[i].name, name) == 0) + return (SpecialVars[i].check (val)); + } + return (1); +} + static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data, BUFFER * err) { @@ -1278,9 +1172,17 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data, *((char **) MuttVars[idx].data) = str_dup (scratch); } else if (DTYPE (MuttVars[idx].type) == DT_STR) { - *((char **) MuttVars[idx].data) = str_dup (tmp->data); - if (str_cmp (MuttVars[idx].option, "charset") == 0) - mutt_set_charset (Charset); + /* see if the value may only be a certain value... */ + if (check_special (MuttVars[idx].option, tmp->data)) { + *((char **) MuttVars[idx].data) = str_dup (tmp->data); + if (str_cmp (MuttVars[idx].option, "charset") == 0) + mutt_set_charset (Charset); + } else { + /* ... and abort if it fails */ + snprintf (err->data, err->dsize, "'%s' is invalid for $%s", + tmp->data, MuttVars[idx].option); + return (-1); + } } else { *((ADDRESS **) MuttVars[idx].data) =