From b3cae4deb342505d445af54093c39b0d3a7a8f28 Mon Sep 17 00:00:00 2001 From: Eduardo Chappa Date: Wed, 5 Oct 2016 19:05:24 -0600 Subject: * Add return codes to setup_pwdcert function, so that caller can know what happened and decide accordingly. Fixes the fact that Alpine will fail to create self signed certificate, when the .pwd directory does not exist. --- alpine/imap.c | 2 +- pith/pine.hlp | 2 +- pith/smime.c | 16 ++++++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/alpine/imap.c b/alpine/imap.c index 45cc860a..497801b5 100644 --- a/alpine/imap.c +++ b/alpine/imap.c @@ -2351,7 +2351,7 @@ read_passfile(pinerc, l) if(tmp2[0]){ /* not empty, UNencrypted password file */ if(ps_global->pwdcert == NULL) rv = setup_pwdcert(&ps_global->pwdcert); - if(rv == 0 && ps_global->pwdcert == NULL) + if((rv == 0 || rv == -5) && ps_global->pwdcert == NULL) ps_global->pwdcert = (void *) ALPINE_self_signed_certificate(NULL, 0, ps_global->pwdcertdir, MASTERNAME); if(ps_global->pwdcert == NULL){ q_status_message(SM_ORDER, 3, 3, diff --git a/pith/pine.hlp b/pith/pine.hlp index 0a8e2ef7..a4f67718 100644 --- a/pith/pine.hlp +++ b/pith/pine.hlp @@ -140,7 +140,7 @@ with help text for the config screen and the composer that didn't have any reasonable place to be called from. Dummy change to get revision in pine.hlp ============= h_revision ================= -Alpine Commit 173 2016-10-05 01:10:48 +Alpine Commit 174 2016-10-05 19:05:20 ============= h_news ================= diff --git a/pith/smime.c b/pith/smime.c index 9ee83340..d219ba03 100644 --- a/pith/smime.c +++ b/pith/smime.c @@ -203,9 +203,14 @@ load_key_and_cert(char *pathkeydir, char *pathcertdir, char **keyfile, * Ok, that should do it. * * return values: 0 - everything is normal - * 1 - User could not unlock key + * 1 - User could not unlock key or no key in directory. * 2 - User cancelled to create self signed certificate - * -1 - a not normal value. + * -1 - we do not know which directory to use + * -2 - "-pwdcertdir" was given by user, but directory does not exist + * -3 - "DF_PASSWORD_DIR" exists but it is not a directory!!?? + * -4 - we tried to create DF_PASSWORD_DIR but failed. + * -5 - password directory exists, but it is empty + * */ int setup_pwdcert(void **pwdcert) @@ -233,19 +238,22 @@ setup_pwdcert(void **pwdcert) strncpy(pathdir, ps_global->pwdcertdir, sizeof(pathdir)); pathdir[sizeof(pathdir)-1] = '\0'; } + else rv = -2; } else { smime_path(DF_PASSWORD_DIR, pathdir, sizeof(pathdir)); if(our_stat(pathdir, &sbuf) == 0){ if((sbuf.st_mode & S_IFMT) == S_IFDIR) setup_dir++; + else rv = -3; } else if(can_access(pathdir, ACCESS_EXISTS) != 0 && our_mkpath(pathdir, 0700) == 0) setup_dir++; + else rv = -4; } if(setup_dir == 0){ was_here = 0; - return -1; + return rv; } if(load_key_and_cert(pathdir, pathdir, &keyfile, &certfile, &pkey, &pcert) < 0){ @@ -275,7 +283,7 @@ setup_pwdcert(void **pwdcert) */ if(setup_certdir){ /* if we are here, pwdcertdir failed */ was_here = 0; - return -1; + return -5; } /* look to see if there are any certificates lying around, first -- cgit v1.2.3-54-g00ecf