From 262b2b63b9936f6d7d71ee6ced62e857a64a9606 Mon Sep 17 00:00:00 2001 From: Brendan Cully Date: Fri, 2 Mar 2007 21:12:33 -0800 Subject: [PATCH] Add $umask for mailboxes and attachments. init.c could really use some refactoring. --- attach.c | 19 ++++++++++++++----- globals.h | 1 + init.c | 10 ++++++++-- init.h | 6 ++++++ lib.c | 4 ++-- mh.c | 4 ++-- mx.c | 39 ++++++++++++++++++++++++++------------- 7 files changed, 59 insertions(+), 24 deletions(-) diff --git a/attach.c b/attach.c index 8c3edf2e..609525d7 100644 --- a/attach.c +++ b/attach.c @@ -736,12 +736,21 @@ bail: static FILE * mutt_save_attachment_open (char *path, int flags) { + mode_t omask; + FILE *fp = NULL; + + omask = umask(Umask); + if (flags == M_SAVE_APPEND) - return fopen (path, "a"); - if (flags == M_SAVE_OVERWRITE) - return fopen (path, "w"); /* __FOPEN_CHECKED__ */ - - return safe_fopen (path, "w"); + fp = fopen (path, "a"); + else if (flags == M_SAVE_OVERWRITE) + fp = fopen (path, "w"); /* __FOPEN_CHECKED__ */ + else + fp = safe_fopen (path, "w"); + + umask(omask); + + return fp; } /* returns 0 on success, -1 on error */ diff --git a/globals.h b/globals.h index 0d025dfe..6c9a16c5 100644 --- a/globals.h +++ b/globals.h @@ -200,6 +200,7 @@ WHERE short SaveHist; WHERE short SendmailWait; WHERE short SleepTime INITVAL (1); WHERE short Timeout; +WHERE short Umask; WHERE short Wrap; WHERE short WriteInc; diff --git a/init.c b/init.c index 0008ab7f..26fed943 100644 --- a/init.c +++ b/init.c @@ -1980,7 +1980,10 @@ static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err) val = *ptr < 0 ? -*ptr : 0; /* user requested the value of this variable */ - snprintf (err->data, err->dsize, "%s=%d", MuttVars[idx].option, val); + if (mutt_strcmp (MuttVars[idx].option, "umask") == 0) + snprintf (err->data, err->dsize, "%s=0%o", MuttVars[idx].option, val); + else + snprintf (err->data, err->dsize, "%s=%d", MuttVars[idx].option, val); break; } @@ -2566,7 +2569,10 @@ static int var_to_string (int idx, char* val, size_t len) if (mutt_strcmp (MuttVars[idx].option, "wrapmargin") == 0) sval = sval > 0 ? 0 : -sval; - snprintf (tmp, sizeof (tmp), "%d", sval); + if (mutt_strcmp (MuttVars[idx].option, "umask") == 0) + snprintf (tmp, sizeof (tmp), "0%o", sval); + else + snprintf (tmp, sizeof (tmp), "%d", sval); } else if (DTYPE (MuttVars[idx].type) == DT_SORT) { diff --git a/init.h b/init.h index 0aab36bb..b940b32a 100644 --- a/init.h +++ b/init.h @@ -2909,6 +2909,12 @@ struct option_t MuttVars[] = { ** machine without having to enter a password. */ #endif + { "umask", DT_NUM, R_NONE, &Umask, 0077 }, + /* + ** .pp + ** Sets the umask to use when creating mailboxes or saving attachments. + */ + { "use_8bitmime", DT_BOOL, R_NONE, OPTUSE8BITMIME, 0 }, /* ** .pp diff --git a/lib.c b/lib.c index e6e80c2e..070311c7 100644 --- a/lib.c +++ b/lib.c @@ -570,7 +570,7 @@ int safe_open (const char *path, int flags) safe_dir, sizeof (safe_dir)) == -1) return -1; - if ((fd = open (safe_file, flags, 0600)) < 0) + if ((fd = open (safe_file, flags, 0666)) < 0) { rmdir (safe_dir); return fd; @@ -584,7 +584,7 @@ int safe_open (const char *path, int flags) } else { - if ((fd = open (path, flags, 0600)) < 0) + if ((fd = open (path, flags, 0666)) < 0) return fd; } diff --git a/mh.c b/mh.c index 1447d142..7a15833b 100644 --- a/mh.c +++ b/mh.c @@ -207,7 +207,7 @@ static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) { snprintf (path, _POSIX_PATH_MAX, "%s/.mutt-%s-%d-%d", dest->path, NONULL (Hostname), (int) getpid (), Counter++); - if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1) + if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1) { if (errno != EEXIST) { @@ -1145,7 +1145,7 @@ int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n", path)); - if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1) + if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1) { if (errno != EEXIST) { diff --git a/mx.c b/mx.c index 87c15b84..7e8c7a23 100644 --- a/mx.c +++ b/mx.c @@ -492,6 +492,7 @@ int mx_access (const char* path, int flags) static int mx_open_mailbox_append (CONTEXT *ctx, int flags) { struct stat sb; + mode_t omask; ctx->append = 1; @@ -502,6 +503,8 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags) #endif + omask = umask(Umask); + if(stat(ctx->path, &sb) == 0) { ctx->magic = mx_get_magic (ctx->path); @@ -523,33 +526,33 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags) { char tmp[_POSIX_PATH_MAX]; - if (mkdir (ctx->path, S_IRWXU)) + if (mkdir (ctx->path, S_IRWXU|S_IRWXG|S_IRWXO)) { mutt_perror (ctx->path); - return (-1); + goto err_umask; } if (ctx->magic == M_MAILDIR) { snprintf (tmp, sizeof (tmp), "%s/cur", ctx->path); - if (mkdir (tmp, S_IRWXU)) + if (mkdir (tmp, S_IRWXU|S_IRWXG|S_IRWXO)) { mutt_perror (tmp); rmdir (ctx->path); - return (-1); + goto err_umask; } snprintf (tmp, sizeof (tmp), "%s/new", ctx->path); - if (mkdir (tmp, S_IRWXU)) + if (mkdir (tmp, S_IRWXU|S_IRWXG|S_IRWXO)) { mutt_perror (tmp); snprintf (tmp, sizeof (tmp), "%s/cur", ctx->path); rmdir (tmp); rmdir (ctx->path); - return (-1); + goto err_umask; } snprintf (tmp, sizeof (tmp), "%s/tmp", ctx->path); - if (mkdir (tmp, S_IRWXU)) + if (mkdir (tmp, S_IRWXU|S_IRWXG|S_IRWXO)) { mutt_perror (tmp); snprintf (tmp, sizeof (tmp), "%s/cur", ctx->path); @@ -557,7 +560,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags) snprintf (tmp, sizeof (tmp), "%s/new", ctx->path); rmdir (tmp); rmdir (ctx->path); - return (-1); + goto err_umask; } } else @@ -565,11 +568,11 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags) int i; snprintf (tmp, sizeof (tmp), "%s/.mh_sequences", ctx->path); - if ((i = creat (tmp, S_IRWXU)) == -1) + if ((i = creat (tmp, S_IRWXU|S_IRWXG|S_IRWXO)) == -1) { mutt_perror (tmp); rmdir (ctx->path); - return (-1); + goto err_umask; } close (i); } @@ -578,7 +581,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags) else { mutt_perror (ctx->path); - return (-1); + goto err_umask; } switch (ctx->magic) @@ -595,7 +598,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags) mutt_error (_("Couldn't lock %s\n"), ctx->path); safe_fclose (&ctx->fp); } - return (-1); + goto err_umask; } fseek (ctx->fp, 0, 2); break; @@ -606,10 +609,15 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags) break; default: - return (-1); + goto err_umask; } + umask(omask); return 0; + + err_umask: + umask(omask); + return -1; } /* @@ -1258,6 +1266,7 @@ MESSAGE *mx_open_new_message (CONTEXT *dest, HEADER *hdr, int flags) MESSAGE *msg; int (*func) (MESSAGE *, CONTEXT *, HEADER *); ADDRESS *p = NULL; + mode_t omask; switch (dest->magic) { @@ -1296,6 +1305,8 @@ MESSAGE *mx_open_new_message (CONTEXT *dest, HEADER *hdr, int flags) if(msg->received == 0) time(&msg->received); + + omask = umask(Umask); if (func (msg, dest, hdr) == 0) { @@ -1321,6 +1332,8 @@ MESSAGE *mx_open_new_message (CONTEXT *dest, HEADER *hdr, int flags) else FREE (&msg); + umask(omask); + return msg; } -- 2.40.0