diff options
Diffstat (limited to 'lib/openldap.c')
| -rw-r--r-- | lib/openldap.c | 138 | 
1 files changed, 73 insertions, 65 deletions
| diff --git a/lib/openldap.c b/lib/openldap.c index 3cb796380..80dc284ac 100644 --- a/lib/openldap.c +++ b/lib/openldap.c @@ -55,7 +55,8 @@  #ifndef _LDAP_PVT_H  extern int ldap_pvt_url_scheme2proto(const char *); -extern int ldap_init_fd(ber_socket_t fd, int proto, const char *url, LDAP **ld); +extern int ldap_init_fd(ber_socket_t fd, int proto, const char *url, +                        LDAP **ld);  #endif  static CURLcode ldap_setup(struct connectdata *conn); @@ -63,7 +64,7 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done);  static CURLcode ldap_done(struct connectdata *conn, CURLcode, bool);  static CURLcode ldap_connect(struct connectdata *conn, bool *done);  static CURLcode ldap_connecting(struct connectdata *conn, bool *done); -static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection); +static CURLcode ldap_disconnect(struct connectdata *conn, bool dead);  static Curl_recv ldap_recv; @@ -152,11 +153,11 @@ static CURLcode ldap_setup(struct connectdata *conn)    CURLcode status;    rc = ldap_url_parse(data->change.url, &lud); -  if (rc != LDAP_URL_SUCCESS) { +  if(rc != LDAP_URL_SUCCESS) {      const char *msg = "url parsing problem";      status = CURLE_URL_MALFORMAT; -    if (rc > LDAP_URL_SUCCESS && rc <= LDAP_URL_ERR_BADEXTS) { -      if (rc == LDAP_URL_ERR_MEM) +    if(rc > LDAP_URL_SUCCESS && rc <= LDAP_URL_ERR_BADEXTS) { +      if(rc == LDAP_URL_ERR_MEM)          status = CURLE_OUT_OF_MEMORY;        msg = url_errs[rc];      } @@ -189,13 +190,13 @@ static CURLcode ldap_connect(struct connectdata *conn, bool *done)    strcpy(hosturl, "ldap");    ptr = hosturl+4; -  if (conn->handler->flags & PROTOPT_SSL) +  if(conn->handler->flags & PROTOPT_SSL)      *ptr++ = 's';    snprintf(ptr, sizeof(hosturl)-(ptr-hosturl), "://%s:%d",      conn->host.name, conn->remote_port);    rc = ldap_init_fd(conn->sock[FIRSTSOCKET], li->proto, hosturl, &li->ld); -  if (rc) { +  if(rc) {      failf(data, "LDAP local: Cannot connect to %s, %s",            hosturl, ldap_err2string(rc));      return CURLE_COULDNT_CONNECT; @@ -231,22 +232,23 @@ static CURLcode ldap_connect(struct connectdata *conn, bool *done)    }  #ifdef USE_SSL -  if (conn->handler->flags & PROTOPT_SSL) { +  if(conn->handler->flags & PROTOPT_SSL) {      CURLcode res; -    if (data->state.used_interface == Curl_if_easy) { +    if(data->state.used_interface == Curl_if_easy) {        res = Curl_ssl_connect(conn, FIRSTSOCKET); -      if (res) +      if(res)          return res;        li->ssldone = TRUE; -    } else { +    } +    else {        res = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &li->ssldone); -      if (res) +      if(res)          return res;      }    }  #endif -  if (data->state.used_interface == Curl_if_easy) +  if(data->state.used_interface == Curl_if_easy)      return ldap_connecting(conn, done);    return CURLE_OK; @@ -262,15 +264,16 @@ static CURLcode ldap_connecting(struct connectdata *conn, bool *done)    char *info = NULL;  #ifdef USE_SSL -  if (conn->handler->flags & PROTOPT_SSL) { +  if(conn->handler->flags & PROTOPT_SSL) {      /* Is the SSL handshake complete yet? */ -    if (!li->ssldone) { -      CURLcode res = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &li->ssldone); -      if (res || !li->ssldone) +    if(!li->ssldone) { +      CURLcode res = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, +                                                  &li->ssldone); +      if(res || !li->ssldone)          return res;      }      /* Have we installed the libcurl SSL handlers into the sockbuf yet? */ -    if (!li->sslinst) { +    if(!li->sslinst) {        Sockbuf *sb;        ldap_get_option(li->ld, LDAP_OPT_SOCKBUF, &sb);        ber_sockbuf_add_io(sb, &ldapsb_tls, LBER_SBIOD_LEVEL_TRANSPORT, conn); @@ -281,53 +284,54 @@ static CURLcode ldap_connecting(struct connectdata *conn, bool *done)    }  #endif -  if (data->state.used_interface == Curl_if_easy) +  if(data->state.used_interface == Curl_if_easy)      tvp = NULL;    /* let ldap_result block indefinitely */    else      tvp = &tv;  retry: -  if (!li->didbind) { +  if(!li->didbind) {      char *binddn;      struct berval passwd; -    if (conn->bits.user_passwd) { +    if(conn->bits.user_passwd) {        binddn = conn->user;        passwd.bv_val = conn->passwd;        passwd.bv_len = strlen(passwd.bv_val); -    } else { +    } +    else {        binddn = NULL;        passwd.bv_val = NULL;        passwd.bv_len = 0;      }      rc = ldap_sasl_bind(li->ld, binddn, LDAP_SASL_SIMPLE, &passwd,                          NULL, NULL, &li->msgid); -    if (rc) +    if(rc)        return CURLE_LDAP_CANNOT_BIND;      li->didbind = TRUE; -    if (tvp) +    if(tvp)        return CURLE_OK;    }    rc = ldap_result(li->ld, li->msgid, LDAP_MSG_ONE, tvp, &result); -  if (rc < 0) { +  if(rc < 0) {      failf(data, "LDAP local: bind ldap_result %s", ldap_err2string(rc));      return CURLE_LDAP_CANNOT_BIND;    } -  if (rc == 0) { +  if(rc == 0) {      /* timed out */      return CURLE_OK;    }    rc = ldap_parse_result(li->ld, result, &err, NULL, &info, NULL, NULL, 1); -  if (rc) { +  if(rc) {      failf(data, "LDAP local: bind ldap_parse_result %s", ldap_err2string(rc));      return CURLE_LDAP_CANNOT_BIND;    }    /* Try to fallback to LDAPv2? */ -  if (err == LDAP_PROTOCOL_ERROR) { +  if(err == LDAP_PROTOCOL_ERROR) {      int proto;      ldap_get_option(li->ld, LDAP_OPT_PROTOCOL_VERSION, &proto); -    if (proto == LDAP_VERSION3) { +    if(proto == LDAP_VERSION3) {        ldap_memfree(info);        proto = LDAP_VERSION2;        ldap_set_option(li->ld, LDAP_OPT_PROTOCOL_VERSION, &proto); @@ -336,7 +340,7 @@ retry:      }    } -  if (err) { +  if(err) {      failf(data, "LDAP remote: bind failed %s %s", ldap_err2string(rc),            info ? info : "");      return CURLE_LOGIN_DENIED; @@ -351,8 +355,8 @@ static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)    ldapconninfo *li = conn->proto.generic;    (void) dead_connection; -  if (li) { -    if (li->ld) { +  if(li) { +    if(li->ld) {        ldap_unbind_ext(li->ld, NULL, NULL);        li->ld = NULL;      } @@ -377,11 +381,11 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done)    infof(data, "LDAP local: %s\n", data->change.url);    rc = ldap_url_parse(data->change.url, &ludp); -  if (rc != LDAP_URL_SUCCESS) { +  if(rc != LDAP_URL_SUCCESS) {      const char *msg = "url parsing problem";      status = CURLE_URL_MALFORMAT; -    if (rc > LDAP_URL_SUCCESS && rc <= LDAP_URL_ERR_BADEXTS) { -      if (rc == LDAP_URL_ERR_MEM) +    if(rc > LDAP_URL_SUCCESS && rc <= LDAP_URL_ERR_BADEXTS) { +      if(rc == LDAP_URL_ERR_MEM)          status = CURLE_OUT_OF_MEMORY;        msg = url_errs[rc];      } @@ -393,7 +397,7 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done)                         ludp->lud_filter, ludp->lud_attrs, 0,                         NULL, NULL, NULL, 0, &msgid);    ldap_free_urldesc(ludp); -  if (rc != LDAP_SUCCESS) { +  if(rc != LDAP_SUCCESS) {      failf(data, "LDAP local: ldap_search_ext %s", ldap_err2string(rc));      return CURLE_LDAP_SEARCH_FAILED;    } @@ -412,9 +416,9 @@ static CURLcode ldap_done(struct connectdata *conn, CURLcode res,    (void)res;    (void)premature; -  if (lr) { +  if(lr) {      /* if there was a search in progress, abandon it */ -    if (lr->msgid) { +    if(lr->msgid) {        ldapconninfo *li = conn->proto.generic;        ldap_abandon_ext(li->ld, lr->msgid, NULL, NULL);        lr->msgid = 0; @@ -441,7 +445,7 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,    (void)sockindex;    rc = ldap_result(li->ld, lr->msgid, LDAP_MSG_RECEIVED, &tv, &result); -  if (rc < 0) { +  if(rc < 0) {      failf(data, "LDAP local: search ldap_result %s", ldap_err2string(rc));      *err = CURLE_RECV_ERROR;      return -1; @@ -451,30 +455,32 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,    ret = -1;    /* timed out */ -  if (result == NULL) +  if(result == NULL)      return ret; -  for (ent = ldap_first_message(li->ld, result); ent; +  for(ent = ldap_first_message(li->ld, result); ent;      ent = ldap_next_message(li->ld, ent)) {      struct berval bv, *bvals, **bvp = &bvals;      int binary = 0, msgtype;      msgtype = ldap_msgtype(ent); -    if (msgtype == LDAP_RES_SEARCH_RESULT) { +    if(msgtype == LDAP_RES_SEARCH_RESULT) {        int code;        char *info = NULL;        rc = ldap_parse_result(li->ld, ent, &code, NULL, &info, NULL, NULL, 0); -      if (rc) { +      if(rc) {          failf(data, "LDAP local: search ldap_parse_result %s",                ldap_err2string(rc));          *err = CURLE_LDAP_SEARCH_FAILED; -      } else if (code && code != LDAP_SIZELIMIT_EXCEEDED) { +      } +      else if(code && code != LDAP_SIZELIMIT_EXCEEDED) {          failf(data, "LDAP remote: search failed %s %s", ldap_err2string(rc), -          info ? info : ""); +              info ? info : "");          *err = CURLE_LDAP_SEARCH_FAILED; -      } else { +      } +      else {          /* successful */ -        if (code == LDAP_SIZELIMIT_EXCEEDED) +        if(code == LDAP_SIZELIMIT_EXCEEDED)            infof(data, "There are more than %d entries\n", lr->nument);          data->req.size = data->req.bytecount;          *err = CURLE_OK; @@ -483,9 +489,9 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,        lr->msgid = 0;        ldap_memfree(info);        break; -    } else if (msgtype != LDAP_RES_SEARCH_ENTRY) { -      continue;      } +    else if(msgtype != LDAP_RES_SEARCH_ENTRY) +      continue;      lr->nument++;      rc = ldap_get_dn_ber(li->ld, ent, &ber, &bv); @@ -500,41 +506,42 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,      Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);      data->req.bytecount += bv.bv_len + 5; -    for (rc = ldap_get_attribute_ber(li->ld, ent, ber, &bv, bvp); +    for(rc = ldap_get_attribute_ber(li->ld, ent, ber, &bv, bvp);        rc == LDAP_SUCCESS;        rc = ldap_get_attribute_ber(li->ld, ent, ber, &bv, bvp)) {        int i; -      if (bv.bv_val == NULL) break; +      if(bv.bv_val == NULL) break; -      if (bv.bv_len > 7 && !strncmp(bv.bv_val + bv.bv_len - 7, ";binary", 7)) +      if(bv.bv_len > 7 && !strncmp(bv.bv_val + bv.bv_len - 7, ";binary", 7))          binary = 1;        else          binary = 0; -      for (i=0; bvals[i].bv_val != NULL; i++) { +      for(i=0; bvals[i].bv_val != NULL; i++) {          int binval = 0;          Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1); -        Curl_client_write(conn, CLIENTWRITE_BODY, (char *)bv.bv_val, bv.bv_len); +        Curl_client_write(conn, CLIENTWRITE_BODY, (char *)bv.bv_val, +                          bv.bv_len);          Curl_client_write(conn, CLIENTWRITE_BODY, (char *)":", 1);          data->req.bytecount += bv.bv_len + 2; -        if (!binary) { +        if(!binary) {            /* check for leading or trailing whitespace */ -          if (ISSPACE(bvals[i].bv_val[0]) || -              ISSPACE(bvals[i].bv_val[bvals[i].bv_len-1])) { +          if(ISSPACE(bvals[i].bv_val[0]) || +              ISSPACE(bvals[i].bv_val[bvals[i].bv_len-1]))              binval = 1; -          } else { +          else {              /* check for unprintable characters */              unsigned int j; -            for (j=0; j<bvals[i].bv_len; j++) -              if (!ISPRINT(bvals[i].bv_val[j])) { +            for(j=0; j<bvals[i].bv_len; j++) +              if(!ISPRINT(bvals[i].bv_val[j])) {                  binval = 1;                  break;                }            }          } -        if (binary || binval) { +        if(binary || binval) {            char *val_b64;            /* Binary value, encode to base64. */            size_t val_b64_sz = Curl_base64_encode(data, @@ -548,7 +555,8 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,              free(val_b64);              data->req.bytecount += val_b64_sz;            } -        } else { +        } +        else {            Curl_client_write(conn, CLIENTWRITE_BODY, (char *)" ", 1);            Curl_client_write(conn, CLIENTWRITE_BODY, bvals[i].bv_val,                              bvals[i].bv_len); @@ -596,7 +604,7 @@ static int  ldapsb_tls_ctrl(Sockbuf_IO_Desc *sbiod, int opt, void *arg)  {    (void)arg; -  if (opt == LBER_SB_OPT_DATA_READY) { +  if(opt == LBER_SB_OPT_DATA_READY) {      struct connectdata *conn = sbiod->sbiod_pvt;      return Curl_ssl_data_pending(conn, FIRSTSOCKET);    } @@ -612,7 +620,7 @@ ldapsb_tls_read(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)    CURLcode err = CURLE_RECV_ERROR;    ret = li->recv(conn, FIRSTSOCKET, buf, len, &err); -  if (ret < 0 && err == CURLE_AGAIN) { +  if(ret < 0 && err == CURLE_AGAIN) {      SET_SOCKERRNO(EWOULDBLOCK);    }    return ret; @@ -627,7 +635,7 @@ ldapsb_tls_write(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)    CURLcode err = CURLE_SEND_ERROR;    ret = li->send(conn, FIRSTSOCKET, buf, len, &err); -  if (ret < 0 && err == CURLE_AGAIN) { +  if(ret < 0 && err == CURLE_AGAIN) {      SET_SOCKERRNO(EWOULDBLOCK);    }    return ret; | 
