diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/imap.c | 286 | 
1 files changed, 143 insertions, 143 deletions
| diff --git a/lib/imap.c b/lib/imap.c index 65997b976..401779916 100644 --- a/lib/imap.c +++ b/lib/imap.c @@ -86,8 +86,6 @@  #include "memdebug.h"  /* Local API functions */ -static CURLcode imap_parse_url_path(struct connectdata *conn); -static CURLcode imap_parse_custom_request(struct connectdata *conn);  static CURLcode imap_regular_transfer(struct connectdata *conn, bool *done);  static CURLcode imap_do(struct connectdata *conn, bool *done);  static CURLcode imap_done(struct connectdata *conn, CURLcode status, @@ -101,6 +99,8 @@ static CURLcode imap_doing(struct connectdata *conn, bool *dophase_done);  static CURLcode imap_setup_connection(struct connectdata *conn);  static char *imap_atom(const char *str);  static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...); +static CURLcode imap_parse_url_path(struct connectdata *conn); +static CURLcode imap_parse_custom_request(struct connectdata *conn);  /*   * IMAP protocol handler. @@ -1973,147 +1973,6 @@ static bool imap_is_bchar(char ch)    }  } -/*********************************************************************** - * - * imap_parse_url_path() - * - * Parse the URL path into separate path components. - * - */ -static CURLcode imap_parse_url_path(struct connectdata *conn) -{ -  /* The imap struct is already initialised in imap_connect() */ -  CURLcode result = CURLE_OK; -  struct SessionHandle *data = conn->data; -  struct IMAP *imap = data->state.proto.imap; -  const char *begin = data->state.path; -  const char *ptr = begin; - -  /* See how much of the URL is a valid path and decode it */ -  while(imap_is_bchar(*ptr)) -    ptr++; - -  if(ptr != begin) { -    /* Remove the trailing slash if present */ -    const char *end = ptr; -    if(end > begin && end[-1] == '/') -      end--; - -    result = Curl_urldecode(data, begin, end - begin, &imap->mailbox, NULL, -                            TRUE); -    if(result) -      return result; -  } -  else -    imap->mailbox = NULL; - -  /* There can be any number of parameters in the form ";NAME=VALUE" */ -  while(*ptr == ';') { -    char *name; -    char *value; -    size_t valuelen; - -    /* Find the length of the name parameter */ -    begin = ++ptr; -    while(*ptr && *ptr != '=') -      ptr++; - -    if(!*ptr) -      return CURLE_URL_MALFORMAT; - -    /* Decode the name parameter */ -    result = Curl_urldecode(data, begin, ptr - begin, &name, NULL, TRUE); -    if(result) -      return result; - -    /* Find the length of the value parameter */ -    begin = ++ptr; -    while(imap_is_bchar(*ptr)) -      ptr++; - -    /* Decode the value parameter */ -    result = Curl_urldecode(data, begin, ptr - begin, &value, &valuelen, TRUE); -    if(result) { -      Curl_safefree(name); -      return result; -    } - -    DEBUGF(infof(conn->data, "IMAP URL parameter '%s' = '%s'\n", name, value)); - -    /* Process the known hierarchical parameters (UIDVALIDITY, UID and SECTION) -       stripping of the trailing slash character if it is present. - -       Note: Unknown parameters trigger a URL_MALFORMAT error. */ -    if(Curl_raw_equal(name, "UIDVALIDITY") && !imap->uidvalidity) { -      if(valuelen > 0 && value[valuelen - 1] == '/') -        value[valuelen - 1] = '\0'; - -      imap->uidvalidity = value; -      value = NULL; -    } -    else if(Curl_raw_equal(name, "UID") && !imap->uid) { -      if(valuelen > 0 && value[valuelen - 1] == '/') -        value[valuelen - 1] = '\0'; - -      imap->uid = value; -      value = NULL; -    } -    else if(Curl_raw_equal(name, "SECTION") && !imap->section) { -      if(valuelen > 0 && value[valuelen - 1] == '/') -        value[valuelen - 1] = '\0'; - -      imap->section = value; -      value = NULL; -    } -    else { -      Curl_safefree(name); -      Curl_safefree(value); - -      return CURLE_URL_MALFORMAT; -    } - -    Curl_safefree(name); -    Curl_safefree(value); -  } - -  /* Any extra stuff at the end of the URL is an error */ -  if(*ptr) -    return CURLE_URL_MALFORMAT; - -  return CURLE_OK; -} - -static CURLcode imap_parse_custom_request(struct connectdata *conn) -{ -  CURLcode result = CURLE_OK; -  struct SessionHandle *data = conn->data; -  struct IMAP *imap = data->state.proto.imap; -  const char *custom = data->set.str[STRING_CUSTOMREQUEST]; - -  if(custom) { -    /* URL decode the custom request */ -    result = Curl_urldecode(data, custom, 0, &imap->custom, NULL, TRUE); - -    /* Extract the parameters if specified */ -    if(!result) { -      const char *params = imap->custom; - -      while(*params && *params != ' ') -        params++; - -      if(*params) { -        imap->custom_params = strdup(params); -        imap->custom[params - imap->custom] = '\0'; - -        if(!imap->custom_params) -          result = CURLE_OUT_OF_MEMORY; -      } -    } -  } - -  return result; -} -  /* Call this when the DO phase has completed */  static CURLcode imap_dophase_done(struct connectdata *conn, bool connected)  { @@ -2326,4 +2185,145 @@ static char *imap_atom(const char *str)    return newstr;  } +/*********************************************************************** + * + * imap_parse_url_path() + * + * Parse the URL path into separate path components. + * + */ +static CURLcode imap_parse_url_path(struct connectdata *conn) +{ +  /* The imap struct is already initialised in imap_connect() */ +  CURLcode result = CURLE_OK; +  struct SessionHandle *data = conn->data; +  struct IMAP *imap = data->state.proto.imap; +  const char *begin = data->state.path; +  const char *ptr = begin; + +  /* See how much of the URL is a valid path and decode it */ +  while(imap_is_bchar(*ptr)) +    ptr++; + +  if(ptr != begin) { +    /* Remove the trailing slash if present */ +    const char *end = ptr; +    if(end > begin && end[-1] == '/') +      end--; + +    result = Curl_urldecode(data, begin, end - begin, &imap->mailbox, NULL, +                            TRUE); +    if(result) +      return result; +  } +  else +    imap->mailbox = NULL; + +  /* There can be any number of parameters in the form ";NAME=VALUE" */ +  while(*ptr == ';') { +    char *name; +    char *value; +    size_t valuelen; + +    /* Find the length of the name parameter */ +    begin = ++ptr; +    while(*ptr && *ptr != '=') +      ptr++; + +    if(!*ptr) +      return CURLE_URL_MALFORMAT; + +    /* Decode the name parameter */ +    result = Curl_urldecode(data, begin, ptr - begin, &name, NULL, TRUE); +    if(result) +      return result; + +    /* Find the length of the value parameter */ +    begin = ++ptr; +    while(imap_is_bchar(*ptr)) +      ptr++; + +    /* Decode the value parameter */ +    result = Curl_urldecode(data, begin, ptr - begin, &value, &valuelen, TRUE); +    if(result) { +      Curl_safefree(name); +      return result; +    } + +    DEBUGF(infof(conn->data, "IMAP URL parameter '%s' = '%s'\n", name, value)); + +    /* Process the known hierarchical parameters (UIDVALIDITY, UID and SECTION) +       stripping of the trailing slash character if it is present. + +       Note: Unknown parameters trigger a URL_MALFORMAT error. */ +    if(Curl_raw_equal(name, "UIDVALIDITY") && !imap->uidvalidity) { +      if(valuelen > 0 && value[valuelen - 1] == '/') +        value[valuelen - 1] = '\0'; + +      imap->uidvalidity = value; +      value = NULL; +    } +    else if(Curl_raw_equal(name, "UID") && !imap->uid) { +      if(valuelen > 0 && value[valuelen - 1] == '/') +        value[valuelen - 1] = '\0'; + +      imap->uid = value; +      value = NULL; +    } +    else if(Curl_raw_equal(name, "SECTION") && !imap->section) { +      if(valuelen > 0 && value[valuelen - 1] == '/') +        value[valuelen - 1] = '\0'; + +      imap->section = value; +      value = NULL; +    } +    else { +      Curl_safefree(name); +      Curl_safefree(value); + +      return CURLE_URL_MALFORMAT; +    } + +    Curl_safefree(name); +    Curl_safefree(value); +  } + +  /* Any extra stuff at the end of the URL is an error */ +  if(*ptr) +    return CURLE_URL_MALFORMAT; + +  return CURLE_OK; +} + +static CURLcode imap_parse_custom_request(struct connectdata *conn) +{ +  CURLcode result = CURLE_OK; +  struct SessionHandle *data = conn->data; +  struct IMAP *imap = data->state.proto.imap; +  const char *custom = data->set.str[STRING_CUSTOMREQUEST]; + +  if(custom) { +    /* URL decode the custom request */ +    result = Curl_urldecode(data, custom, 0, &imap->custom, NULL, TRUE); + +    /* Extract the parameters if specified */ +    if(!result) { +      const char *params = imap->custom; + +      while(*params && *params != ' ') +        params++; + +      if(*params) { +        imap->custom_params = strdup(params); +        imap->custom[params - imap->custom] = '\0'; + +        if(!imap->custom_params) +          result = CURLE_OUT_OF_MEMORY; +      } +    } +  } + +  return result; +} +  #endif /* CURL_DISABLE_IMAP */ | 
