If this entry isn't present,
the current working directory is used.
.PP
-If the
+By default (or if the
.B \-auto
-switch is given, then
+switch is given), then
.B mhstore
will check if
the message contains information indicating the filename that should
as the attribute \*(lqname=filename\*(rq in the \*(lqContent-Type\*(rq header
for the content you are storing. For security reasons, this filename
will be ignored if it begins with the character '/', '.', '|', or '!',
-or if it contains the character '%'. For the sake of security,
-this switch is not the default, and it is recommended that you do
-NOT put the
+or if it contains the character '%'. Now that tar files are not extracted
+automatically anymore, having
.B \-auto
-switch in your
-.I \&.mmh/profile
-file.
+as the default is quite safe.
+Attachments are only stored below the current (or the storage)
+directory. In the worst case, existing files there will be overwritten.
.PP
If the
.B \-auto
.nf
.RB ` +folder "' defaults to the current folder"
.RB ` msgs "' defaults to cur"
-.RB ` \-noauto '
+.RB ` \-auto '
.SH CONTEXT
If a folder is given, it will become the current folder. The last
*/
static void pipeser(int);
-int autosw = 0;
+int autosw = 1;
/*
** Cache of current directory. This must be
static int output_content_file(CT, int);
static int output_content_folder(char *, char *);
static int parse_format_string(CT, char *, char *, int, char *);
-static void get_storeproc(CT);
static int copy_some_headers(FILE *, CT);
static void store_all_messages(CT *);
** Check for the directory in which to
** store any contents.
*/
- if (autosw)
- dir = getcpy(cwd);
if ((cp = context_find(nmhstorage)) && *cp)
dir = getcpy(cp);
else
static int
store_generic(CT ct)
{
+ char **ap, **ep, *cp;
+ CI ci = &ct->c_ctinfo;
+
/*
- ** Check if the content specifies a filename.
+ ** Check if the content specifies a filename in its MIME parameters.
** Don't bother with this for type "message"
- ** (only "message/rfc822" will use store_generic).
+ ** (only the "message" subtype "rfc822" will use store_generic).
+ ** The storeproc may already be defined, if this content
+ ** is part of a "message/external", for instance.
*/
- if (autosw && ct->c_type != CT_MESSAGE)
- get_storeproc(ct);
+ if (autosw && ct->c_type != CT_MESSAGE && !ct->c_storeproc) {
+ /*
+ ** Check the attribute/value pairs, for the attribute "name".
+ ** If found, do a few sanity checks and copy the value into
+ ** the storeproc.
+ */
+ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
+ if (mh_strcasecmp(*ap, "name")==0 &&
+ *(cp = *ep) != '/' && *cp != '.' &&
+ *cp != '|' && *cp != '!' &&
+ !strchr(cp, '%')) {
+ ct->c_storeproc = getcpy(cp);
+ break;
+ }
+ }
+ }
return store_content(ct, NULL);
}
/*
-** Check if the content specifies a filename
-** in its MIME parameters.
-*/
-
-static void
-get_storeproc(CT ct)
-{
- char **ap, **ep, *cp;
- CI ci = &ct->c_ctinfo;
-
- /*
- ** If the storeproc has already been defined,
- ** we just return (for instance, if this content
- ** is part of a "message/external".
- */
- if (ct->c_storeproc)
- return;
-
- /*
- ** Check the attribute/value pairs, for the attribute "name".
- ** If found, do a few sanity checks and copy the value into
- ** the storeproc.
- */
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
- if (!mh_strcasecmp(*ap, "name") && *(cp = *ep) != '/' &&
- *cp != '.' && *cp != '|' && *cp != '!' &&
- !strchr(cp, '%')) {
- ct->c_storeproc = getcpy(cp);
- return;
- }
- }
-}
-
-
-/*
** Copy some of the header fields of the initial message/partial
** message into the header of the reassembled message.
*/