email: Extended the login options to support multiple auth mechanisms
This commit is contained in:
Родитель
1deac31eba
Коммит
195b63f99c
82
lib/imap.c
82
lib/imap.c
|
@ -2312,52 +2312,64 @@ static CURLcode imap_parse_url_options(struct connectdata *conn)
|
||||||
struct imap_conn *imapc = &conn->proto.imapc;
|
struct imap_conn *imapc = &conn->proto.imapc;
|
||||||
const char *options = conn->options;
|
const char *options = conn->options;
|
||||||
const char *ptr = options;
|
const char *ptr = options;
|
||||||
|
bool reset = TRUE;
|
||||||
|
|
||||||
if(options) {
|
while(*ptr) {
|
||||||
const char *key = ptr;
|
const char *key = ptr;
|
||||||
|
|
||||||
while(*ptr && *ptr != '=')
|
while(*ptr && *ptr != '=')
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
if(strnequal(key, "AUTH", 4)) {
|
if(strnequal(key, "AUTH", 4)) {
|
||||||
const char *value = ptr + 1;
|
size_t len = 0;
|
||||||
|
const char *value = ++ptr;
|
||||||
|
|
||||||
if(strequal(value, "*")) {
|
if(reset) {
|
||||||
imapc->preftype = IMAP_TYPE_ANY;
|
reset = FALSE;
|
||||||
imapc->prefmech = SASL_AUTH_ANY;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_LOGIN)) {
|
|
||||||
imapc->preftype = IMAP_TYPE_SASL;
|
|
||||||
imapc->prefmech = SASL_MECH_LOGIN;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_PLAIN)) {
|
|
||||||
imapc->preftype = IMAP_TYPE_SASL;
|
|
||||||
imapc->prefmech = SASL_MECH_PLAIN;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_CRAM_MD5)) {
|
|
||||||
imapc->preftype = IMAP_TYPE_SASL;
|
|
||||||
imapc->prefmech = SASL_MECH_CRAM_MD5;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_DIGEST_MD5)) {
|
|
||||||
imapc->preftype = IMAP_TYPE_SASL;
|
|
||||||
imapc->prefmech = SASL_MECH_DIGEST_MD5;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_GSSAPI)) {
|
|
||||||
imapc->preftype = IMAP_TYPE_SASL;
|
|
||||||
imapc->prefmech = SASL_MECH_GSSAPI;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_NTLM)) {
|
|
||||||
imapc->preftype = IMAP_TYPE_SASL;
|
|
||||||
imapc->prefmech = SASL_MECH_NTLM;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_XOAUTH2)) {
|
|
||||||
imapc->preftype = IMAP_TYPE_SASL;
|
|
||||||
imapc->prefmech = SASL_MECH_XOAUTH2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
imapc->preftype = IMAP_TYPE_NONE;
|
imapc->preftype = IMAP_TYPE_NONE;
|
||||||
imapc->prefmech = SASL_AUTH_NONE;
|
imapc->prefmech = SASL_AUTH_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while(*ptr && *ptr != ';') {
|
||||||
|
ptr++;
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strnequal(value, "*", len)) {
|
||||||
|
imapc->preftype = IMAP_TYPE_ANY;
|
||||||
|
imapc->prefmech = SASL_AUTH_ANY;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_LOGIN, len)) {
|
||||||
|
imapc->preftype = IMAP_TYPE_SASL;
|
||||||
|
imapc->prefmech |= SASL_MECH_LOGIN;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_PLAIN, len)) {
|
||||||
|
imapc->preftype = IMAP_TYPE_SASL;
|
||||||
|
imapc->prefmech |= SASL_MECH_PLAIN;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_CRAM_MD5, len)) {
|
||||||
|
imapc->preftype = IMAP_TYPE_SASL;
|
||||||
|
imapc->prefmech |= SASL_MECH_CRAM_MD5;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_DIGEST_MD5, len)) {
|
||||||
|
imapc->preftype = IMAP_TYPE_SASL;
|
||||||
|
imapc->prefmech |= SASL_MECH_DIGEST_MD5;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_GSSAPI, len)) {
|
||||||
|
imapc->preftype = IMAP_TYPE_SASL;
|
||||||
|
imapc->prefmech |= SASL_MECH_GSSAPI;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_NTLM, len)) {
|
||||||
|
imapc->preftype = IMAP_TYPE_SASL;
|
||||||
|
imapc->prefmech |= SASL_MECH_NTLM;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_XOAUTH2, len)) {
|
||||||
|
imapc->preftype = IMAP_TYPE_SASL;
|
||||||
|
imapc->prefmech |= SASL_MECH_XOAUTH2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*ptr == ';')
|
||||||
|
ptr++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
result = CURLE_URL_MALFORMAT;
|
result = CURLE_URL_MALFORMAT;
|
||||||
|
|
90
lib/pop3.c
90
lib/pop3.c
|
@ -1832,56 +1832,68 @@ static CURLcode pop3_parse_url_options(struct connectdata *conn)
|
||||||
struct pop3_conn *pop3c = &conn->proto.pop3c;
|
struct pop3_conn *pop3c = &conn->proto.pop3c;
|
||||||
const char *options = conn->options;
|
const char *options = conn->options;
|
||||||
const char *ptr = options;
|
const char *ptr = options;
|
||||||
|
bool reset = TRUE;
|
||||||
|
|
||||||
if(options) {
|
while(*ptr) {
|
||||||
const char *key = ptr;
|
const char *key = ptr;
|
||||||
|
|
||||||
while(*ptr && *ptr != '=')
|
while(*ptr && *ptr != '=')
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
if(strnequal(key, "AUTH", 4)) {
|
if(strnequal(key, "AUTH", 4)) {
|
||||||
const char *value = ptr + 1;
|
size_t len = 0;
|
||||||
|
const char *value = ++ptr;
|
||||||
|
|
||||||
if(strequal(value, "*")) {
|
if(reset) {
|
||||||
pop3c->preftype = POP3_TYPE_ANY;
|
reset = FALSE;
|
||||||
pop3c->prefmech = SASL_AUTH_ANY;
|
|
||||||
}
|
|
||||||
else if(strequal(value, "+APOP")) {
|
|
||||||
pop3c->preftype = POP3_TYPE_APOP;
|
|
||||||
pop3c->prefmech = SASL_AUTH_NONE;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_LOGIN)) {
|
|
||||||
pop3c->preftype = POP3_TYPE_SASL;
|
|
||||||
pop3c->prefmech = SASL_MECH_LOGIN;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_PLAIN)) {
|
|
||||||
pop3c->preftype = POP3_TYPE_SASL;
|
|
||||||
pop3c->prefmech = SASL_MECH_PLAIN;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_CRAM_MD5)) {
|
|
||||||
pop3c->preftype = POP3_TYPE_SASL;
|
|
||||||
pop3c->prefmech = SASL_MECH_CRAM_MD5;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_DIGEST_MD5)) {
|
|
||||||
pop3c->preftype = POP3_TYPE_SASL;
|
|
||||||
pop3c->prefmech = SASL_MECH_DIGEST_MD5;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_GSSAPI)) {
|
|
||||||
pop3c->preftype = POP3_TYPE_SASL;
|
|
||||||
pop3c->prefmech = SASL_MECH_GSSAPI;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_NTLM)) {
|
|
||||||
pop3c->preftype = POP3_TYPE_SASL;
|
|
||||||
pop3c->prefmech = SASL_MECH_NTLM;
|
|
||||||
}
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_XOAUTH2)) {
|
|
||||||
pop3c->preftype = POP3_TYPE_SASL;
|
|
||||||
pop3c->prefmech = SASL_MECH_XOAUTH2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pop3c->preftype = POP3_TYPE_NONE;
|
pop3c->preftype = POP3_TYPE_NONE;
|
||||||
pop3c->prefmech = SASL_AUTH_NONE;
|
pop3c->prefmech = SASL_AUTH_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while(*ptr && *ptr != ';') {
|
||||||
|
ptr++;
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strnequal(value, "*", len)) {
|
||||||
|
pop3c->preftype = POP3_TYPE_ANY;
|
||||||
|
pop3c->prefmech = SASL_AUTH_ANY;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, "+APOP", len)) {
|
||||||
|
pop3c->preftype = POP3_TYPE_APOP;
|
||||||
|
pop3c->prefmech = SASL_AUTH_NONE;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_LOGIN, len)) {
|
||||||
|
pop3c->preftype = POP3_TYPE_SASL;
|
||||||
|
pop3c->prefmech |= SASL_MECH_LOGIN;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_PLAIN, len)) {
|
||||||
|
pop3c->preftype = POP3_TYPE_SASL;
|
||||||
|
pop3c->prefmech |= SASL_MECH_PLAIN;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_CRAM_MD5, len)) {
|
||||||
|
pop3c->preftype = POP3_TYPE_SASL;
|
||||||
|
pop3c->prefmech |= SASL_MECH_CRAM_MD5;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_DIGEST_MD5, len)) {
|
||||||
|
pop3c->preftype = POP3_TYPE_SASL;
|
||||||
|
pop3c->prefmech |= SASL_MECH_DIGEST_MD5;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_GSSAPI, len)) {
|
||||||
|
pop3c->preftype = POP3_TYPE_SASL;
|
||||||
|
pop3c->prefmech |= SASL_MECH_GSSAPI;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_NTLM, len)) {
|
||||||
|
pop3c->preftype = POP3_TYPE_SASL;
|
||||||
|
pop3c->prefmech |= SASL_MECH_NTLM;
|
||||||
|
}
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_XOAUTH2, len)) {
|
||||||
|
pop3c->preftype = POP3_TYPE_SASL;
|
||||||
|
pop3c->prefmech |= SASL_MECH_XOAUTH2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*ptr == ';')
|
||||||
|
ptr++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
result = CURLE_URL_MALFORMAT;
|
result = CURLE_URL_MALFORMAT;
|
||||||
|
|
51
lib/smtp.c
51
lib/smtp.c
|
@ -1927,34 +1927,47 @@ static CURLcode smtp_parse_url_options(struct connectdata *conn)
|
||||||
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
||||||
const char *options = conn->options;
|
const char *options = conn->options;
|
||||||
const char *ptr = options;
|
const char *ptr = options;
|
||||||
|
bool reset = TRUE;
|
||||||
|
|
||||||
if(options) {
|
while(*ptr) {
|
||||||
const char *key = ptr;
|
const char *key = ptr;
|
||||||
|
|
||||||
while(*ptr && *ptr != '=')
|
while(*ptr && *ptr != '=')
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
if(strnequal(key, "AUTH", 4)) {
|
if(strnequal(key, "AUTH", 4)) {
|
||||||
const char *value = ptr + 1;
|
size_t len = 0;
|
||||||
|
const char *value = ++ptr;
|
||||||
|
|
||||||
if(strequal(value, "*"))
|
if(reset) {
|
||||||
smtpc->prefmech = SASL_AUTH_ANY;
|
reset = FALSE;
|
||||||
else if(strequal(value, SASL_MECH_STRING_LOGIN))
|
|
||||||
smtpc->prefmech = SASL_MECH_LOGIN;
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_PLAIN))
|
|
||||||
smtpc->prefmech = SASL_MECH_PLAIN;
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_CRAM_MD5))
|
|
||||||
smtpc->prefmech = SASL_MECH_CRAM_MD5;
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_DIGEST_MD5))
|
|
||||||
smtpc->prefmech = SASL_MECH_DIGEST_MD5;
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_GSSAPI))
|
|
||||||
smtpc->prefmech = SASL_MECH_GSSAPI;
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_NTLM))
|
|
||||||
smtpc->prefmech = SASL_MECH_NTLM;
|
|
||||||
else if(strequal(value, SASL_MECH_STRING_XOAUTH2))
|
|
||||||
smtpc->prefmech = SASL_MECH_XOAUTH2;
|
|
||||||
else
|
|
||||||
smtpc->prefmech = SASL_AUTH_NONE;
|
smtpc->prefmech = SASL_AUTH_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(*ptr && *ptr != ';') {
|
||||||
|
ptr++;
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strnequal(value, "*", len))
|
||||||
|
smtpc->prefmech = SASL_AUTH_ANY;
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_LOGIN, len))
|
||||||
|
smtpc->prefmech |= SASL_MECH_LOGIN;
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_PLAIN, len))
|
||||||
|
smtpc->prefmech |= SASL_MECH_PLAIN;
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_CRAM_MD5, len))
|
||||||
|
smtpc->prefmech |= SASL_MECH_CRAM_MD5;
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_DIGEST_MD5, len))
|
||||||
|
smtpc->prefmech |= SASL_MECH_DIGEST_MD5;
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_GSSAPI, len))
|
||||||
|
smtpc->prefmech |= SASL_MECH_GSSAPI;
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_NTLM, len))
|
||||||
|
smtpc->prefmech |= SASL_MECH_NTLM;
|
||||||
|
else if(strnequal(value, SASL_MECH_STRING_XOAUTH2, len))
|
||||||
|
smtpc->prefmech |= SASL_MECH_XOAUTH2;
|
||||||
|
|
||||||
|
if(*ptr == ';')
|
||||||
|
ptr++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
result = CURLE_URL_MALFORMAT;
|
result = CURLE_URL_MALFORMAT;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче