844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi#ifndef LDAP_PRIVATE_H
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi#define LDAP_PRIVATE_H
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi#include "iostream-ssl.h"
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi#include "ldap-client.h"
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi#include <ldap.h>
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi#define DOVE_LDAP_CONTINUE 0
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi#define DOVE_LDAP_COMPLETE 1
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi#define DOVE_LDAP_REQUEUE 2
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomistruct ldap_connection;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomistruct ldap_result;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomistruct ldap_op_queue_entry;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi/* Handle an LDAP response. Returns 0 on success, otherwise the OpenLDAP error
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi number. */
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomitypedef int ldap_response_callback_t(struct ldap_connection *conn,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_op_queue_entry *entry,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi LDAPMessage *msg, bool *finished_r);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi/* Send the request. Returns 0 on success, otherwise the OpenLDAP error number
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi and sets error_r string. */
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomitypedef int ldap_send_request_t(struct ldap_connection *conn,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_op_queue_entry *entry,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi const char **error_r);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomistruct ldap_op_queue_entry {
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi pool_t pool;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_connection *conn;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi ldap_response_callback_t *internal_response_cb;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi void *ctx;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi int msgid;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi unsigned int timeout_secs;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct timeout *to_abort;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi ldap_send_request_t *send_request_cb;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi ldap_result_callback_t *result_callback;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi void *result_callback_ctx;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct {
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_search_input search;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_compare_input compare;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi } input;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi};
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomistruct ldap_connection {
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi pool_t pool;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_client *client;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi LDAP *conn;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi enum {
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi LDAP_STATE_DISCONNECT,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi LDAP_STATE_TLS,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi LDAP_STATE_AUTH,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi LDAP_STATE_CONNECT
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi } state;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi BerValue cred; /* needed for SASL */
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi BerVarray scred;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_client_settings set;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ssl_iostream_settings ssl_set;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct aqueue *request_queue;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi ARRAY(struct ldap_op_queue_entry *) request_array;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi unsigned int sent;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi unsigned int pending;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct io *io;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct timeout *to_disconnect;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct timeout *to_reconnect;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi};
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomistruct ldap_attribute {
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi const char *name;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi ARRAY_TYPE(const_string) values;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi};
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomistruct ldap_entry {
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_result *result;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi char *dn;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi ARRAY(struct ldap_attribute) attributes;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi const char *const *attr_names;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi};
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomistruct ldap_result {
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi pool_t pool;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_connection *conn;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi ARRAY(struct ldap_entry) entries;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi int openldap_ret;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi bool compare_true;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi const char *error_string;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi};
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomistruct ldap_search_iterator {
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi unsigned int idx;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_result *result;
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi};
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomiint ldap_connection_init(struct ldap_client *client,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi const struct ldap_client_settings *set,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi struct ldap_connection **conn_r, const char **error_r);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomivoid ldap_connection_deinit(struct ldap_connection **_conn);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomivoid ldap_connection_switch_ioloop(struct ldap_connection *conn);
9e6c76cae59ece71f72e33d8fac9025ee12eaf05Timo Sirainenbool ldap_connection_have_settings(struct ldap_connection *conn,
9e6c76cae59ece71f72e33d8fac9025ee12eaf05Timo Sirainen const struct ldap_client_settings *set);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomivoid ldap_connection_search_start(struct ldap_connection *conn,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi const struct ldap_search_input *input,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi ldap_result_callback_t *callback,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi void *context);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomivoid ldap_connection_compare_start(struct ldap_connection *conn,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi const struct ldap_compare_input *input,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi ldap_result_callback_t *callback,
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi void *context);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomivoid ldap_connection_kill(struct ldap_connection *conn);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomiint ldap_connection_check(struct ldap_connection *conn);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomivoid ldap_connection_queue_request(struct ldap_connection *conn, struct ldap_op_queue_entry *req);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomiint ldap_entry_init(struct ldap_entry *obj, struct ldap_result *result, LDAPMessage *message);
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi
844129da33797fba15314372a0dfab4cfe8162e8Aki Tuomi#endif