Commit 195b63f9 authored by Steve Holme's avatar Steve Holme
Browse files

email: Extended the login options to support multiple auth mechanisms

parent 1deac31e
Loading
Loading
Loading
Loading
+33 −21
Original line number Diff line number Diff line
@@ -2312,52 +2312,64 @@ static CURLcode imap_parse_url_options(struct connectdata *conn)
  struct imap_conn *imapc = &conn->proto.imapc;
  const char *options = conn->options;
  const char *ptr = options;
  bool reset = TRUE;

  if(options) {
  while(*ptr) {
    const char *key = ptr;

    while(*ptr && *ptr != '=')
        ptr++;

    if(strnequal(key, "AUTH", 4)) {
      const char *value = ptr + 1;
      size_t len = 0;
      const char *value = ++ptr;

      if(reset) {
        reset = FALSE;
        imapc->preftype = IMAP_TYPE_NONE;
        imapc->prefmech = SASL_AUTH_NONE;
      }

      while(*ptr && *ptr != ';') {
          ptr++;
          len++;
      }

      if(strequal(value, "*")) {
      if(strnequal(value, "*", len)) {
        imapc->preftype = IMAP_TYPE_ANY;
        imapc->prefmech = SASL_AUTH_ANY;
      }
      else if(strequal(value, SASL_MECH_STRING_LOGIN)) {
      else if(strnequal(value, SASL_MECH_STRING_LOGIN, len)) {
        imapc->preftype = IMAP_TYPE_SASL;
        imapc->prefmech = SASL_MECH_LOGIN;
        imapc->prefmech |= SASL_MECH_LOGIN;
      }
      else if(strequal(value, SASL_MECH_STRING_PLAIN)) {
      else if(strnequal(value, SASL_MECH_STRING_PLAIN, len)) {
        imapc->preftype = IMAP_TYPE_SASL;
        imapc->prefmech = SASL_MECH_PLAIN;
        imapc->prefmech |= SASL_MECH_PLAIN;
      }
      else if(strequal(value, SASL_MECH_STRING_CRAM_MD5)) {
      else if(strnequal(value, SASL_MECH_STRING_CRAM_MD5, len)) {
        imapc->preftype = IMAP_TYPE_SASL;
        imapc->prefmech = SASL_MECH_CRAM_MD5;
        imapc->prefmech |= SASL_MECH_CRAM_MD5;
      }
      else if(strequal(value, SASL_MECH_STRING_DIGEST_MD5)) {
      else if(strnequal(value, SASL_MECH_STRING_DIGEST_MD5, len)) {
        imapc->preftype = IMAP_TYPE_SASL;
        imapc->prefmech = SASL_MECH_DIGEST_MD5;
        imapc->prefmech |= SASL_MECH_DIGEST_MD5;
      }
      else if(strequal(value, SASL_MECH_STRING_GSSAPI)) {
      else if(strnequal(value, SASL_MECH_STRING_GSSAPI, len)) {
        imapc->preftype = IMAP_TYPE_SASL;
        imapc->prefmech = SASL_MECH_GSSAPI;
        imapc->prefmech |= SASL_MECH_GSSAPI;
      }
      else if(strequal(value, SASL_MECH_STRING_NTLM)) {
      else if(strnequal(value, SASL_MECH_STRING_NTLM, len)) {
        imapc->preftype = IMAP_TYPE_SASL;
        imapc->prefmech = SASL_MECH_NTLM;
        imapc->prefmech |= SASL_MECH_NTLM;
      }
      else if(strequal(value, SASL_MECH_STRING_XOAUTH2)) {
      else if(strnequal(value, SASL_MECH_STRING_XOAUTH2, len)) {
        imapc->preftype = IMAP_TYPE_SASL;
        imapc->prefmech = SASL_MECH_XOAUTH2;
      }
      else {
        imapc->preftype = IMAP_TYPE_NONE;
        imapc->prefmech = SASL_AUTH_NONE;
        imapc->prefmech |= SASL_MECH_XOAUTH2;
      }

      if(*ptr == ';')
        ptr++;
    }
    else
      result = CURLE_URL_MALFORMAT;
+34 −22
Original line number Diff line number Diff line
@@ -1832,56 +1832,68 @@ static CURLcode pop3_parse_url_options(struct connectdata *conn)
  struct pop3_conn *pop3c = &conn->proto.pop3c;
  const char *options = conn->options;
  const char *ptr = options;
  bool reset = TRUE;

  if(options) {
  while(*ptr) {
    const char *key = ptr;

    while(*ptr && *ptr != '=')
        ptr++;

    if(strnequal(key, "AUTH", 4)) {
      const char *value = ptr + 1;
      size_t len = 0;
      const char *value = ++ptr;

      if(reset) {
        reset = FALSE;
        pop3c->preftype = POP3_TYPE_NONE;
        pop3c->prefmech = SASL_AUTH_NONE;
      }

      while(*ptr && *ptr != ';') {
          ptr++;
          len++;
      }

      if(strequal(value, "*")) {
      if(strnequal(value, "*", len)) {
        pop3c->preftype = POP3_TYPE_ANY;
        pop3c->prefmech = SASL_AUTH_ANY;
      }
      else if(strequal(value, "+APOP")) {
      else if(strnequal(value, "+APOP", len)) {
        pop3c->preftype = POP3_TYPE_APOP;
        pop3c->prefmech = SASL_AUTH_NONE;
      }
      else if(strequal(value, SASL_MECH_STRING_LOGIN)) {
      else if(strnequal(value, SASL_MECH_STRING_LOGIN, len)) {
        pop3c->preftype = POP3_TYPE_SASL;
        pop3c->prefmech = SASL_MECH_LOGIN;
        pop3c->prefmech |= SASL_MECH_LOGIN;
      }
      else if(strequal(value, SASL_MECH_STRING_PLAIN)) {
      else if(strnequal(value, SASL_MECH_STRING_PLAIN, len)) {
        pop3c->preftype = POP3_TYPE_SASL;
        pop3c->prefmech = SASL_MECH_PLAIN;
        pop3c->prefmech |= SASL_MECH_PLAIN;
      }
      else if(strequal(value, SASL_MECH_STRING_CRAM_MD5)) {
      else if(strnequal(value, SASL_MECH_STRING_CRAM_MD5, len)) {
        pop3c->preftype = POP3_TYPE_SASL;
        pop3c->prefmech = SASL_MECH_CRAM_MD5;
        pop3c->prefmech |= SASL_MECH_CRAM_MD5;
      }
      else if(strequal(value, SASL_MECH_STRING_DIGEST_MD5)) {
      else if(strnequal(value, SASL_MECH_STRING_DIGEST_MD5, len)) {
        pop3c->preftype = POP3_TYPE_SASL;
        pop3c->prefmech = SASL_MECH_DIGEST_MD5;
        pop3c->prefmech |= SASL_MECH_DIGEST_MD5;
      }
      else if(strequal(value, SASL_MECH_STRING_GSSAPI)) {
      else if(strnequal(value, SASL_MECH_STRING_GSSAPI, len)) {
        pop3c->preftype = POP3_TYPE_SASL;
        pop3c->prefmech = SASL_MECH_GSSAPI;
        pop3c->prefmech |= SASL_MECH_GSSAPI;
      }
      else if(strequal(value, SASL_MECH_STRING_NTLM)) {
      else if(strnequal(value, SASL_MECH_STRING_NTLM, len)) {
        pop3c->preftype = POP3_TYPE_SASL;
        pop3c->prefmech = SASL_MECH_NTLM;
        pop3c->prefmech |= SASL_MECH_NTLM;
      }
      else if(strequal(value, SASL_MECH_STRING_XOAUTH2)) {
      else if(strnequal(value, SASL_MECH_STRING_XOAUTH2, len)) {
        pop3c->preftype = POP3_TYPE_SASL;
        pop3c->prefmech = SASL_MECH_XOAUTH2;
      }
      else {
        pop3c->preftype = POP3_TYPE_NONE;
        pop3c->prefmech = SASL_AUTH_NONE;
        pop3c->prefmech |= SASL_MECH_XOAUTH2;
      }

      if(*ptr == ';')
        ptr++;
    }
    else
      result = CURLE_URL_MALFORMAT;
+32 −19
Original line number Diff line number Diff line
@@ -1927,35 +1927,48 @@ static CURLcode smtp_parse_url_options(struct connectdata *conn)
  struct smtp_conn *smtpc = &conn->proto.smtpc;
  const char *options = conn->options;
  const char *ptr = options;
  bool reset = TRUE;

  if(options) {
  while(*ptr) {
    const char *key = ptr;

    while(*ptr && *ptr != '=')
        ptr++;

    if(strnequal(key, "AUTH", 4)) {
      const char *value = ptr + 1;
      size_t len = 0;
      const char *value = ++ptr;

      if(strequal(value, "*"))
        smtpc->prefmech = SASL_AUTH_ANY;
      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
      if(reset) {
        reset = FALSE;
        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
      result = CURLE_URL_MALFORMAT;
  }