summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Chappa <chappa@washington.edu>2021-09-12 14:13:25 -0600
committerEduardo Chappa <chappa@washington.edu>2021-09-12 14:13:25 -0600
commitae670bca7174ee35b10f7b0aa7b42dc73f1adfd6 (patch)
treef3f69e2402bb1274b2c43841be3eeef9992204ba
parent7feb75607413687c38c51197a73611cb30d39127 (diff)
downloadalpine-ae670bca7174ee35b10f7b0aa7b42dc73f1adfd6.tar.xz
* New format for saving passwords in the windows credential manager
for PC-Alpine. Upon starting this new version of Alpine the passwords saved in the credential manager are converted to the new format and they will not be recognized by old versions of Alpine, but only by this and newer versions of Alpine.
-rw-r--r--alpine/imap.c43
-rw-r--r--pith/pine.hlp8
2 files changed, 38 insertions, 13 deletions
diff --git a/alpine/imap.c b/alpine/imap.c
index 95ce4396..f4f3d125 100644
--- a/alpine/imap.c
+++ b/alpine/imap.c
@@ -3178,6 +3178,7 @@ typedef struct pwd_s {
char *sflags;
char *passwd;
char *orighost;
+ int uid;
} ALPINE_PWD_S;
#define SAME_VALUE(X, Y) ((((X) == NULL && (Y) == NULL) \
@@ -3214,7 +3215,8 @@ read_passfile(pinerc, l)
DWORD count, k;
PCREDENTIAL *pcred;
char *tmp, *blob, *target = NULL;
- ALPINE_PWD_S **pwd;
+ ALPINE_PWD_S **pwd = NULL;
+ int uid, rewrite_passfile = 0;
char *ui[5];
int i, j;
unsigned long m, n, p, loc;
@@ -3256,11 +3258,25 @@ read_passfile(pinerc, l)
if (*tmp == '.') {
tmp++;
m = strtoul(tmp, &tmp, 10);
+ if(*tmp == '.'){
+ tmp++;
+ uid = m;
+ m = strtoul(tmp, &tmp, 10);
+ }
+ else{
+ uid = 0; /* impossible value, uid >= 1, old format! */
+ rewrite_passfile++;
+ }
if (*tmp == '-') {
tmp++;
n = strtol(tmp, &tmp, 10);
if (*tmp == '_') tmp++;
}
+ else{
+ char *s;
+ for(s = tmp; *s && *s != '_'; s++);
+ if(s && *s) tmp = s;
+ }
}
else {
m = n = 1;
@@ -3281,9 +3297,10 @@ read_passfile(pinerc, l)
* can be done better.
*/
for (loc = 0; pwd[loc]
- && !(SAME_VALUE(ui[0], pwd[loc]->host)
- && SAME_VALUE(ui[1], pwd[loc]->user)
- && SAME_VALUE(ui[2], pwd[loc]->sflags)); loc++);
+ && !(uid == pwd[loc]->uid
+ && SAME_VALUE(ui[0], pwd[loc]->host)
+ && SAME_VALUE(ui[1], pwd[loc]->user)
+ && SAME_VALUE(ui[2], pwd[loc]->sflags)); loc++);
if (pwd[loc] == NULL) {
pwd[loc] = fs_get(sizeof(ALPINE_PWD_S));
@@ -3292,6 +3309,7 @@ read_passfile(pinerc, l)
memset((void *) pwd[loc]->blobarray, 0, (n + 1) * sizeof(char*));
}
+ pwd[loc]->uid = uid;
if (pwd[loc]->host == NULL)
pwd[loc]->host = ui[0] ? cpystr(ui[0]) : NULL;
if (pwd[loc]->user == NULL)
@@ -3365,6 +3383,7 @@ read_passfile(pinerc, l)
g_CredFree((PVOID)pcred);
}
fs_give((void **) &pwd);
+ if(rewrite_passfile) write_passfile(pinerc, *l);
}
return(1);
@@ -3729,7 +3748,7 @@ write_passfile(pinerc, l)
#ifdef WINCRED
# if (WINCRED > 0)
unsigned long bloblen = 0, len;
- int i, totalparts, k;
+ int i, totalparts, k, uid;
char target[MAXPWDBUFFERSIZE];
char *blob = NIL, blob2[50], *blobp;
char part[MAILTMPLEN];
@@ -3743,11 +3762,11 @@ write_passfile(pinerc, l)
erase_windows_credentials(); /* erase all passwords from credentials */
/* start writing them back to credentials manager */
- for(; l; l = l->next){
+ for(uid = 1; l; l = l->next, uid++){ /* enforce that uid >= 1 */
/* determine how many parts to create first */
len = (l->passwd ? strlen(l->passwd) : 0)
- + ((l->hosts&& l->hosts->next&& l->hosts->next->name) ? 1 : 0)
- + ((l->hosts&& l->hosts->next&& l->hosts->next->name) ? strlen(l->hosts->next->name) : 0) + 1;
+ + ((l->hosts && l->hosts->next && l->hosts->next->name) ? 1 : 0)
+ + ((l->hosts && l->hosts->next && l->hosts->next->name) ? strlen(l->hosts->next->name) : 0) + 1;
if(len > bloblen){
bloblen = len;
@@ -3756,9 +3775,9 @@ write_passfile(pinerc, l)
sprintf(blob, "%s%s%s",
l->passwd ? l->passwd : "",
- (l->hosts&& l->hosts->next&& l->hosts->next->name)
+ (l->hosts && l->hosts->next && l->hosts->next->name)
? "\t" : "",
- (l->hosts&& l->hosts->next&& l->hosts->next->name)
+ (l->hosts && l->hosts->next && l->hosts->next->name)
? l->hosts->next->name : "");
i = len - 1; /* strlen(blob) */
blobp = blob;
@@ -3775,8 +3794,8 @@ write_passfile(pinerc, l)
sprintf(blob2, "%d", l->altflag);
for (k = 1, i = len - 1, blobp = blob; k <= totalparts; k++) {
- snprintf(target, sizeof(target), "%s.%d-%d_%s\t%s\t%s",
- TNAME, k, totalparts,
+ snprintf(target, sizeof(target), "%s.%d.%d-%d_%s\t%s\t%s",
+ TNAME, uid, k, totalparts,
(l->hosts && l->hosts->name) ? l->hosts->name : "",
l->user ? l->user : "",
blob2);
diff --git a/pith/pine.hlp b/pith/pine.hlp
index 0e3f27cc..001f706e 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 588 2021-09-09 21:01:05
+Alpine Commit 589 2021-09-12 14:13:21
============= h_news =================
<HTML>
<HEAD>
@@ -240,6 +240,12 @@ New features include:
<LI> Alpine deletes, from its internal memory and external cache, passwords
that do not work, even if they were saved by the user.
+
+<LI> New format for saving passwords in the windows credential manager
+ for PC-Alpine. Upon starting this new version of Alpine the passwords
+ saved in the credential manager are converted to the new format and
+ they will not be recognized by old versions of Alpine, but only by
+ this and newer versions of Alpine.
</UL>
<P>