Merge branch 'nm/imap-send-with-curl'
"git imap-send" has our own implementation of the protocol and also can use more recent libCurl with the imap protocol support. Update the latter so that it can use the credential subsystem, and then make it the default option to use, so that we can eventually deprecate and remove the former. * nm/imap-send-with-curl: imap-send: use curl by default when possible imap_send: setup_curl: retreive credentials if not set in config file imap-send: add wrapper to get server credentials if needed imap-send: return with error if curl failed
This commit is contained in:
commit
b67f154bf9
61
imap-send.c
61
imap-send.c
@ -35,11 +35,11 @@ typedef void *SSL;
|
||||
#include "http.h"
|
||||
#endif
|
||||
|
||||
#if defined(USE_CURL_FOR_IMAP_SEND) && defined(NO_OPENSSL)
|
||||
/* only available option */
|
||||
#if defined(USE_CURL_FOR_IMAP_SEND)
|
||||
/* Always default to curl if it's available. */
|
||||
#define USE_CURL_DEFAULT 1
|
||||
#else
|
||||
/* strictly opt in */
|
||||
/* We don't have curl, so continue to use the historical implementation */
|
||||
#define USE_CURL_DEFAULT 0
|
||||
#endif
|
||||
|
||||
@ -926,6 +926,25 @@ 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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *folder)
|
||||
{
|
||||
struct credential cred = CREDENTIAL_INIT;
|
||||
@ -1078,20 +1097,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, &cred);
|
||||
|
||||
if (srvc->auth_method) {
|
||||
struct imap_cmd_cb cb;
|
||||
@ -1392,7 +1398,7 @@ static int append_msgs_to_imap(struct imap_server_conf *server,
|
||||
}
|
||||
|
||||
#ifdef USE_CURL_FOR_IMAP_SEND
|
||||
static CURL *setup_curl(struct imap_server_conf *srvc)
|
||||
static CURL *setup_curl(struct imap_server_conf *srvc, struct credential *cred)
|
||||
{
|
||||
CURL *curl;
|
||||
struct strbuf path = STRBUF_INIT;
|
||||
@ -1405,6 +1411,7 @@ static CURL *setup_curl(struct imap_server_conf *srvc)
|
||||
if (!curl)
|
||||
die("curl_easy_init failed");
|
||||
|
||||
server_fill_credential(&server, cred);
|
||||
curl_easy_setopt(curl, CURLOPT_USERNAME, server.user);
|
||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, server.pass);
|
||||
|
||||
@ -1454,8 +1461,9 @@ static int curl_append_msgs_to_imap(struct imap_server_conf *server,
|
||||
struct buffer msgbuf = { STRBUF_INIT, 0 };
|
||||
CURL *curl;
|
||||
CURLcode res = CURLE_OK;
|
||||
struct credential cred = CREDENTIAL_INIT;
|
||||
|
||||
curl = setup_curl(server);
|
||||
curl = setup_curl(server, &cred);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &msgbuf);
|
||||
|
||||
fprintf(stderr, "sending %d message%s\n", total, (total != 1) ? "s" : "");
|
||||
@ -1490,7 +1498,20 @@ static int curl_append_msgs_to_imap(struct imap_server_conf *server,
|
||||
curl_easy_cleanup(curl);
|
||||
curl_global_cleanup();
|
||||
|
||||
return 0;
|
||||
if (cred.username) {
|
||||
if (res == CURLE_OK)
|
||||
credential_approve(&cred);
|
||||
#if LIBCURL_VERSION_NUM >= 0x070d01
|
||||
else if (res == CURLE_LOGIN_DENIED)
|
||||
#else
|
||||
else
|
||||
#endif
|
||||
credential_reject(&cred);
|
||||
}
|
||||
|
||||
credential_clear(&cred);
|
||||
|
||||
return res != CURLE_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user