/*---------------------------------------------------------------------- Make sure the alpine folders directory exists, with proper folders Args: ps -- alpine structure to get mail directory and contexts from Result: returns 0 if it exists or it is created and all is well 1 if it is missing and can't be created. ----*/ int init_mail_dir(struct pine *ps) { /* MAIL_LIST: can we use imap4 CREATE? */ /* * We don't really care if mail_dir exists if it isn't * part of the first folder collection specified. If this * is the case, it must have been created external to us, so * just move one... */ if(ps->VAR_FOLDER_SPEC && ps->VAR_FOLDER_SPEC[0]){ char *p = context_string(ps->VAR_FOLDER_SPEC[0]); int rv = strncmp(p, ps->VAR_MAIL_DIRECTORY, strlen(ps->VAR_MAIL_DIRECTORY)); fs_give((void **)&p); if(rv) return(0); } switch(is_writable_dir(ps->folders_dir)){ case 0: /* --- all is well --- */ return(0); case 1: snprintf(tmp_20k_buf, SIZEOF_20KBUF, init_md_exists, ps->folders_dir); display_init_err(tmp_20k_buf, 1); return(-1); case 2: snprintf(tmp_20k_buf, SIZEOF_20KBUF, init_md_file, ps->folders_dir); display_init_err(tmp_20k_buf, 1); return(-1); case 3: snprintf(tmp_20k_buf, SIZEOF_20KBUF, init_md_create, ps->folders_dir); display_init_err(tmp_20k_buf, 0); #ifndef _WINDOWS sleep(4); #endif if(create_mail_dir(ps->folders_dir) < 0){ snprintf(tmp_20k_buf, SIZEOF_20KBUF, "Error creating subdirectory \"%s\" : %s", ps->folders_dir, error_description(errno)); display_init_err(tmp_20k_buf, 1); return(-1); } } return(0); }
/* * Add all the entries from this file onto the Mailcap list. */ void mc_process_file(char *file) { char filebuf[MAXPATH+1], *file_data; dprint((5, "mailcap: process_file: %s\n", file ? file : "?")); (void)strncpy(filebuf, file, MAXPATH); filebuf[MAXPATH] = '\0'; file = fnexpand(filebuf, sizeof(filebuf)); dprint((7, "mailcap: processing file: %s\n", file ? file : "?")); switch(is_writable_dir(file)){ case 0: case 1: /* is a directory */ dprint((1, "mailcap: %s is a directory, should be a file\n", file ? file : "?")); return; case 2: /* ok */ break; case 3: /* doesn't exist */ dprint((5, "mailcap: %s doesn't exist\n", file ? file : "?")); return; default: panic("Programmer botch in mc_process_file"); /*NOTREACHED*/ } if((file_data = read_file(file, READ_FROM_LOCALE)) != NULL){ STRINGLIST *newsl, **sl; /* Create a new container */ newsl = mail_newstringlist(); newsl->text.data = (unsigned char *) file_data; /* figure out where in the list it should go */ for(sl = &MailcapData.raw; *sl; sl = &((*sl)->next)) ; *sl = newsl; /* Add it to the list */ mc_parse_file(file_data); /* the process mailcap data */ } else dprint((5, "mailcap: %s can't be read\n", file ? file : "?")); }
/*---------------------------------------------------------------------- Filter file names for strange characters Args: file -- the file name to check Result: Returns NULL if file name is OK Returns formatted error message if it is not ----*/ char * filter_filename(char *file, int *fatal, int strict) { #define ERRORLEN 100 #define ALLOW_WEIRD 1 #ifdef ALLOW_WEIRD static char illegal[] = {'\177', '\0'}; #else #ifdef _WINDOWS static char illegal[] = {'"', '#', '$', '%', '&', /*'/',*/ '(', ')','*', ',', ';', '<', '=', '>', '?', '[', ']', '^', '|', '\177', '\0'}; #else /* UNIX */ static char illegal[] = {'"', '#', '$', '%', '&', '\'','(', ')','*', ',', ':', ';', '<', '=', '>', '?', '[', ']', '\\', '^', '|', '\177', '\0'}; #endif /* UNIX */ #endif static char error[ERRORLEN]; char ill_file[MAXPATH+1], *ill_char, *ptr, e2[20]; int i; for(ptr = file; *ptr == ' '; ptr++) ; /* leading spaces gone */ while(*ptr && (unsigned char)(*ptr) >= ' ' && strchr(illegal, *ptr) == 0) ptr++; *fatal = TRUE; if(*ptr != '\0') { if(*ptr == '\n') { ill_char = "<newline>"; } else if(*ptr == '\r') { ill_char = "<carriage return>"; } else if(*ptr == '\t') { ill_char = "<tab>"; *fatal = FALSE; /* just whitespace */ } else if(*ptr < ' ') { snprintf(e2, sizeof(e2), "control-%c", *ptr + '@'); ill_char = e2; } else if (*ptr == '\177') { ill_char = "<del>"; } else { e2[0] = *ptr; e2[1] = '\0'; ill_char = e2; *fatal = FALSE; /* less offensive? */ } if(!*fatal){ strncpy(error, ill_char, sizeof(error)-1); error[sizeof(error)-1] = '\0'; } else if(ptr != file) { strncpy(ill_file, file, MIN(ptr-file,sizeof(ill_file)-1)); ill_file[MIN(ptr-file,sizeof(ill_file)-1)] = '\0'; snprintf(error, sizeof(error), "Character \"%s\" after \"%.*s\" not allowed in file name", ill_char, ERRORLEN-50, ill_file); } else { snprintf(error, sizeof(error), "First character, \"%s\", not allowed in file name", ill_char); } return(error); } if((i=is_writable_dir(file)) == 0 || i == 1){ snprintf(error, sizeof(error), "\"%.*s\" is a directory", ERRORLEN-50, file); return(error); } if(strict){ for(ptr = file; *ptr == ' '; ptr++) ; /* leading spaces gone */ if((ptr[0] == '.' && ptr[1] == '.') || filename_parent_ref(ptr)){ snprintf(error, sizeof(error), "\"..\" not allowed in filename"); return(error); } } return((char *)NULL); }