On 7 August 2017 at 19:04, Nicolas Morey-Chaisemartin <nicolas@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > > Le 07/08/2017 à 18:30, Martin Ågren a écrit : >> On 7 August 2017 at 16:03, Nicolas Morey-Chaisemartin >> <nicolas@xxxxxxxxxxxxxxxxxxxxxx> wrote: >>> Signed-off-by: Nicolas Morey-Chaisemartin <nicolas@xxxxxxxxxxxxxxxxxxxxxx> >>> --- >>> imap-send.c | 38 ++++++++++++++++++++++++-------------- >>> 1 file changed, 24 insertions(+), 14 deletions(-) >>> >>> diff --git a/imap-send.c b/imap-send.c >>> index b2d0b849b..38b3c817e 100644 >>> --- a/imap-send.c >>> +++ b/imap-send.c >>> @@ -926,6 +926,29 @@ static int auth_cram_md5(struct imap_store *ctx, struct imap_cmd *cmd, const cha >>> return 0; >>> } >>> >>> +static void server_fill_credential(struct imap_server_conf *srvc) >>> +{ >>> + struct credential cred = CREDENTIAL_INIT; >>> + >>> + if (srvc->user && srvc->pass) >>> + return; >>> + >>> + cred.protocol = xstrdup(srvc->use_ssl ? "imaps" : "imap"); >>> + cred.host = xstrdup(srvc->host); >>> + >>> + cred.username = xstrdup_or_null(srvc->user); >>> + cred.password = xstrdup_or_null(srvc->pass); >>> + >>> + credential_fill(&cred); >>> + >>> + if (!srvc->user) >>> + srvc->user = xstrdup(cred.username); >>> + if (!srvc->pass) >>> + srvc->pass = xstrdup(cred.password); >>> + >>> + credential_clear(&cred); >>> +} >>> + >>> static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *folder) >>> { >>> struct credential cred = CREDENTIAL_INIT; >>> @@ -1078,20 +1101,7 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *f >>> } >>> #endif >>> imap_info("Logging in...\n"); >>> - if (!srvc->user || !srvc->pass) { >>> - cred.protocol = xstrdup(srvc->use_ssl ? "imaps" : "imap"); >>> - cred.host = xstrdup(srvc->host); >>> - >>> - cred.username = xstrdup_or_null(srvc->user); >>> - cred.password = xstrdup_or_null(srvc->pass); >>> - >>> - credential_fill(&cred); >>> - >>> - if (!srvc->user) >>> - srvc->user = xstrdup(cred.username); >>> - if (!srvc->pass) >>> - srvc->pass = xstrdup(cred.password); >>> - } >>> + server_fill_credential(srvc); >>> >>> if (srvc->auth_method) { >>> struct imap_cmd_cb cb; >> "cred.username" is checked further down, but now it will always be NULL, >> no? > > You're right I missed this. > Not sure if this is needed though. > From what I understand this means the username/password are store for the next access to credential. but in the current state, there is only one. > Maybe the credential_approved can be dropped ? I'm no credentials-expert, but api-credentials.txt says this: "Credential helpers are programs executed by Git to fetch or save credentials from and to long-term storage (where "long-term" is simply longer than a single Git process; e.g., credentials may be stored in-memory for a few minutes, or indefinitely on disk)." So the calls to approve/reject probably do matter in some scenarios. The current code is a bit non-obvious as we just discovered since it duplicates the strings (for good reasons, I believe) and then still refers to the originals (also for good reasons, I believe). I suppose your new function could be called like server_fill_credential(&cred, srvc); That should limit the impact of the change, but I'm not sure it's a brilliant interface. Just my 2c. Martin