1/* 2 Unix SMB/CIFS implementation. 3 Infrastructure for async ldap client requests 4 Copyright (C) Volker Lendecke 2009 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18*/ 19 20#ifndef __TLDAP_H__ 21#define __TLDAP_H__ 22 23#include <talloc.h> 24#include <tevent.h> 25 26struct tldap_context; 27struct tldap_message; 28 29struct tldap_control { 30 const char *oid; 31 DATA_BLOB value; 32 bool critical; 33}; 34 35struct tldap_attribute { 36 char *name; 37 int num_values; 38 DATA_BLOB *values; 39}; 40 41struct tldap_mod { 42 int mod_op; 43 char *attribute; 44 int num_values; 45 DATA_BLOB *values; 46}; 47 48bool tevent_req_is_ldap_error(struct tevent_req *req, int *perr); 49 50struct tldap_context *tldap_context_create(TALLOC_CTX *mem_ctx, int fd); 51bool tldap_connection_ok(struct tldap_context *ld); 52bool tldap_context_setattr(struct tldap_context *ld, 53 const char *name, const void *pptr); 54void *tldap_context_getattr(struct tldap_context *ld, const char *name); 55 56struct tevent_req *tldap_sasl_bind_send(TALLOC_CTX *mem_ctx, 57 struct tevent_context *ev, 58 struct tldap_context *ld, 59 const char *dn, 60 const char *mechanism, 61 DATA_BLOB *creds, 62 struct tldap_control *sctrls, 63 int num_sctrls, 64 struct tldap_control *cctrls, 65 int num_cctrls); 66int tldap_sasl_bind_recv(struct tevent_req *req); 67int tldap_sasl_bind(struct tldap_context *ldap, 68 const char *dn, 69 const char *mechanism, 70 DATA_BLOB *creds, 71 struct tldap_control *sctrls, 72 int num_sctrls, 73 struct tldap_control *cctrls, 74 int num_ctrls); 75 76struct tevent_req *tldap_simple_bind_send(TALLOC_CTX *mem_ctx, 77 struct tevent_context *ev, 78 struct tldap_context *ldap, 79 const char *dn, 80 const char *passwd); 81int tldap_simple_bind_recv(struct tevent_req *req); 82int tldap_simple_bind(struct tldap_context *ldap, const char *dn, 83 const char *passwd); 84 85struct tevent_req *tldap_search_send(TALLOC_CTX *mem_ctx, 86 struct tevent_context *ev, 87 struct tldap_context *ld, 88 const char *base, int scope, 89 const char *filter, 90 const char **attrs, 91 int num_attrs, 92 int attrsonly, 93 struct tldap_control *sctrls, 94 int num_sctrls, 95 struct tldap_control *cctrls, 96 int num_cctrls, 97 int timelimit, 98 int sizelimit, 99 int deref); 100int tldap_search_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, 101 struct tldap_message **pmsg); 102int tldap_search(struct tldap_context *ld, 103 const char *base, int scope, const char *filter, 104 const char **attrs, int num_attrs, int attrsonly, 105 struct tldap_control *sctrls, int num_sctrls, 106 struct tldap_control *cctrls, int num_cctrls, 107 int timelimit, int sizelimit, int deref, 108 TALLOC_CTX *mem_ctx, struct tldap_message ***entries, 109 struct tldap_message ***refs); 110bool tldap_entry_dn(struct tldap_message *msg, char **dn); 111bool tldap_entry_attributes(struct tldap_message *msg, int *num_attributes, 112 struct tldap_attribute **attributes); 113 114struct tevent_req *tldap_add_send(TALLOC_CTX *mem_ctx, 115 struct tevent_context *ev, 116 struct tldap_context *ld, 117 const char *dn, 118 struct tldap_mod *attributes, 119 int num_attributes, 120 struct tldap_control *sctrls, 121 int num_sctrls, 122 struct tldap_control *cctrls, 123 int num_cctrls); 124int tldap_add_recv(struct tevent_req *req); 125int tldap_add(struct tldap_context *ld, const char *dn, 126 int num_attributes, struct tldap_mod *attributes, 127 struct tldap_control *sctrls, int num_sctrls, 128 struct tldap_control *cctrls, int num_cctrls); 129 130struct tevent_req *tldap_modify_send(TALLOC_CTX *mem_ctx, 131 struct tevent_context *ev, 132 struct tldap_context *ld, 133 const char *dn, 134 int num_mods, struct tldap_mod *mods, 135 struct tldap_control *sctrls, 136 int num_sctrls, 137 struct tldap_control *cctrls, 138 int num_cctrls); 139int tldap_modify_recv(struct tevent_req *req); 140int tldap_modify(struct tldap_context *ld, const char *dn, 141 int num_mods, struct tldap_mod *mods, 142 struct tldap_control *sctrls, int num_sctrls, 143 struct tldap_control *cctrls, int num_cctrls); 144 145struct tevent_req *tldap_delete_send(TALLOC_CTX *mem_ctx, 146 struct tevent_context *ev, 147 struct tldap_context *ld, 148 const char *dn, 149 struct tldap_control *sctrls, 150 int num_sctrls, 151 struct tldap_control *cctrls, 152 int num_cctrls); 153int tldap_delete_recv(struct tevent_req *req); 154int tldap_delete(struct tldap_context *ld, const char *dn, 155 struct tldap_control *sctrls, int num_sctrls, 156 struct tldap_control *cctrls, int num_cctrls); 157 158int tldap_msg_id(const struct tldap_message *msg); 159int tldap_msg_type(const struct tldap_message *msg); 160const char *tldap_msg_matcheddn(struct tldap_message *msg); 161const char *tldap_msg_diagnosticmessage(struct tldap_message *msg); 162const char *tldap_msg_referral(struct tldap_message *msg); 163void tldap_msg_sctrls(struct tldap_message *msg, int *num_sctrls, 164 struct tldap_control **sctrls); 165struct tldap_message *tldap_ctx_lastmsg(struct tldap_context *ld); 166const char *tldap_err2string(int rc); 167 168/* DEBUG */ 169enum tldap_debug_level { 170 TLDAP_DEBUG_FATAL, 171 TLDAP_DEBUG_ERROR, 172 TLDAP_DEBUG_WARNING, 173 TLDAP_DEBUG_TRACE 174}; 175 176void tldap_set_debug(struct tldap_context *ld, 177 void (*log_fn)(void *log_private, 178 enum tldap_debug_level level, 179 const char *fmt, 180 va_list ap) PRINTF_ATTRIBUTE(3,0), 181 void *log_private); 182 183/* 184 * "+ 0x60" is from ASN1_APPLICATION 185 */ 186#define TLDAP_REQ_BIND (0 + 0x60) 187#define TLDAP_RES_BIND (1 + 0x60) 188#define TLDAP_REQ_UNBIND (2 + 0x60) 189#define TLDAP_REQ_SEARCH (3 + 0x60) 190#define TLDAP_RES_SEARCH_ENTRY (4 + 0x60) 191#define TLDAP_RES_SEARCH_RESULT (5 + 0x60) 192#define TLDAP_REQ_MODIFY (6 + 0x60) 193#define TLDAP_RES_MODIFY (7 + 0x60) 194#define TLDAP_REQ_ADD (8 + 0x60) 195#define TLDAP_RES_ADD (9 + 0x60) 196/* ASN1_APPLICATION_SIMPLE instead of ASN1_APPLICATION */ 197#define TLDAP_REQ_DELETE (10 + 0x40) 198#define TLDAP_RES_DELETE (11 + 0x60) 199#define TLDAP_REQ_MODDN (12 + 0x60) 200#define TLDAP_RES_MODDN (13 + 0x60) 201#define TLDAP_REQ_COMPARE (14 + 0x60) 202#define TLDAP_RES_COMPARE (15 + 0x60) 203/* ASN1_APPLICATION_SIMPLE instead of ASN1_APPLICATION */ 204#define TLDAP_REQ_ABANDON (16 + 0x40) 205#define TLDAP_RES_SEARCH_REFERENCE (19 + 0x60) 206#define TLDAP_REQ_EXTENDED (23 + 0x60) 207#define TLDAP_RES_EXTENDED (24 + 0x60) 208#define TLDAP_RES_INTERMEDIATE (25 + 0x60) 209 210#define TLDAP_SUCCESS (0x00) 211#define TLDAP_OPERATIONS_ERROR (0x01) 212#define TLDAP_PROTOCOL_ERROR (0x02) 213#define TLDAP_TIMELIMIT_EXCEEDED (0x03) 214#define TLDAP_SIZELIMIT_EXCEEDED (0x04) 215#define TLDAP_COMPARE_FALSE (0x05) 216#define TLDAP_COMPARE_TRUE (0x06) 217#define TLDAP_STRONG_AUTH_NOT_SUPPORTED (0x07) 218#define TLDAP_STRONG_AUTH_REQUIRED (0x08) 219#define TLDAP_REFERRAL (0x0a) 220#define TLDAP_ADMINLIMIT_EXCEEDED (0x0b) 221#define TLDAP_UNAVAILABLE_CRITICAL_EXTENSION (0x0c) 222#define TLDAP_CONFIDENTIALITY_REQUIRED (0x0d) 223#define TLDAP_SASL_BIND_IN_PROGRESS (0x0e) 224#define TLDAP_NO_SUCH_ATTRIBUTE (0x10) 225#define TLDAP_UNDEFINED_TYPE (0x11) 226#define TLDAP_INAPPROPRIATE_MATCHING (0x12) 227#define TLDAP_CONSTRAINT_VIOLATION (0x13) 228#define TLDAP_TYPE_OR_VALUE_EXISTS (0x14) 229#define TLDAP_INVALID_SYNTAX (0x15) 230#define TLDAP_NO_SUCH_OBJECT (0x20) 231#define TLDAP_ALIAS_PROBLEM (0x21) 232#define TLDAP_INVALID_DN_SYNTAX (0x22) 233#define TLDAP_IS_LEAF (0x23) 234#define TLDAP_ALIAS_DEREF_PROBLEM (0x24) 235#define TLDAP_INAPPROPRIATE_AUTH (0x30) 236#define TLDAP_INVALID_CREDENTIALS (0x31) 237#define TLDAP_INSUFFICIENT_ACCESS (0x32) 238#define TLDAP_BUSY (0x33) 239#define TLDAP_UNAVAILABLE (0x34) 240#define TLDAP_UNWILLING_TO_PERFORM (0x35) 241#define TLDAP_LOOP_DETECT (0x36) 242#define TLDAP_NAMING_VIOLATION (0x40) 243#define TLDAP_OBJECT_CLASS_VIOLATION (0x41) 244#define TLDAP_NOT_ALLOWED_ON_NONLEAF (0x42) 245#define TLDAP_NOT_ALLOWED_ON_RDN (0x43) 246#define TLDAP_ALREADY_EXISTS (0x44) 247#define TLDAP_NO_OBJECT_CLASS_MODS (0x45) 248#define TLDAP_RESULTS_TOO_LARGE (0x46) 249#define TLDAP_AFFECTS_MULTIPLE_DSAS (0x47) 250#define TLDAP_OTHER (0x50) 251#define TLDAP_SERVER_DOWN (0x51) 252#define TLDAP_LOCAL_ERROR (0x52) 253#define TLDAP_ENCODING_ERROR (0x53) 254#define TLDAP_DECODING_ERROR (0x54) 255#define TLDAP_TIMEOUT (0x55) 256#define TLDAP_AUTH_UNKNOWN (0x56) 257#define TLDAP_FILTER_ERROR (0x57) 258#define TLDAP_USER_CANCELLED (0x58) 259#define TLDAP_PARAM_ERROR (0x59) 260#define TLDAP_NO_MEMORY (0x5a) 261#define TLDAP_CONNECT_ERROR (0x5b) 262#define TLDAP_NOT_SUPPORTED (0x5c) 263#define TLDAP_CONTROL_NOT_FOUND (0x5d) 264#define TLDAP_NO_RESULTS_RETURNED (0x5e) 265#define TLDAP_MORE_RESULTS_TO_RETURN (0x5f) 266#define TLDAP_CLIENT_LOOP (0x60) 267#define TLDAP_REFERRAL_LIMIT_EXCEEDED (0x61) 268 269#define TLDAP_MOD_ADD (0) 270#define TLDAP_MOD_DELETE (1) 271#define TLDAP_MOD_REPLACE (2) 272 273#define TLDAP_SCOPE_BASE (0) 274#define TLDAP_SCOPE_ONE (1) 275#define TLDAP_SCOPE_SUB (2) 276 277#define TLDAP_CONTROL_PAGEDRESULTS "1.2.840.113556.1.4.319" 278 279#endif 280