1*9e7c127fSCraig Rodrigues /* $Id: aldap.h,v 1.9 2012/04/30 21:40:03 jmatthew Exp $ */ 2*9e7c127fSCraig Rodrigues /* $OpenBSD: aldap.h,v 1.9 2012/04/30 21:40:03 jmatthew Exp $ */ 3*9e7c127fSCraig Rodrigues 4*9e7c127fSCraig Rodrigues /* 5*9e7c127fSCraig Rodrigues * Copyright (c) 2008 Alexander Schrijver <aschrijver@openbsd.org> 6*9e7c127fSCraig Rodrigues * Copyright (c) 2006, 2007 Marc Balmer <mbalmer@openbsd.org> 7*9e7c127fSCraig Rodrigues * 8*9e7c127fSCraig Rodrigues * Permission to use, copy, modify, and distribute this software for any 9*9e7c127fSCraig Rodrigues * purpose with or without fee is hereby granted, provided that the above 10*9e7c127fSCraig Rodrigues * copyright notice and this permission notice appear in all copies. 11*9e7c127fSCraig Rodrigues * 12*9e7c127fSCraig Rodrigues * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13*9e7c127fSCraig Rodrigues * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14*9e7c127fSCraig Rodrigues * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15*9e7c127fSCraig Rodrigues * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16*9e7c127fSCraig Rodrigues * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17*9e7c127fSCraig Rodrigues * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18*9e7c127fSCraig Rodrigues * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19*9e7c127fSCraig Rodrigues */ 20*9e7c127fSCraig Rodrigues 21*9e7c127fSCraig Rodrigues #include <stdio.h> 22*9e7c127fSCraig Rodrigues #include "ber.h" 23*9e7c127fSCraig Rodrigues 24*9e7c127fSCraig Rodrigues #define LDAP_URL "ldap://" 25*9e7c127fSCraig Rodrigues #define LDAP_PORT 389 26*9e7c127fSCraig Rodrigues #define LDAP_PAGED_OID "1.2.840.113556.1.4.319" 27*9e7c127fSCraig Rodrigues 28*9e7c127fSCraig Rodrigues struct aldap { 29*9e7c127fSCraig Rodrigues #define ALDAP_ERR_SUCCESS 0 30*9e7c127fSCraig Rodrigues #define ALDAP_ERR_PARSER_ERROR 1 31*9e7c127fSCraig Rodrigues #define ALDAP_ERR_INVALID_FILTER 2 32*9e7c127fSCraig Rodrigues #define ALDAP_ERR_OPERATION_FAILED 3 33*9e7c127fSCraig Rodrigues u_int8_t err; 34*9e7c127fSCraig Rodrigues int msgid; 35*9e7c127fSCraig Rodrigues struct ber ber; 36*9e7c127fSCraig Rodrigues }; 37*9e7c127fSCraig Rodrigues 38*9e7c127fSCraig Rodrigues struct aldap_page_control { 39*9e7c127fSCraig Rodrigues int size; 40*9e7c127fSCraig Rodrigues char *cookie; 41*9e7c127fSCraig Rodrigues unsigned int cookie_len; 42*9e7c127fSCraig Rodrigues }; 43*9e7c127fSCraig Rodrigues 44*9e7c127fSCraig Rodrigues struct aldap_message { 45*9e7c127fSCraig Rodrigues int msgid; 46*9e7c127fSCraig Rodrigues int message_type; 47*9e7c127fSCraig Rodrigues 48*9e7c127fSCraig Rodrigues struct ber_element *msg; 49*9e7c127fSCraig Rodrigues 50*9e7c127fSCraig Rodrigues struct ber_element *header; 51*9e7c127fSCraig Rodrigues struct ber_element *protocol_op; 52*9e7c127fSCraig Rodrigues 53*9e7c127fSCraig Rodrigues struct ber_element *dn; 54*9e7c127fSCraig Rodrigues 55*9e7c127fSCraig Rodrigues union { 56*9e7c127fSCraig Rodrigues struct { 57*9e7c127fSCraig Rodrigues long long rescode; 58*9e7c127fSCraig Rodrigues struct ber_element *diagmsg; 59*9e7c127fSCraig Rodrigues } res; 60*9e7c127fSCraig Rodrigues struct { 61*9e7c127fSCraig Rodrigues struct ber_element *iter; 62*9e7c127fSCraig Rodrigues struct ber_element *attrs; 63*9e7c127fSCraig Rodrigues } search; 64*9e7c127fSCraig Rodrigues } body; 65*9e7c127fSCraig Rodrigues struct ber_element *references; 66*9e7c127fSCraig Rodrigues struct aldap_page_control *page; 67*9e7c127fSCraig Rodrigues }; 68*9e7c127fSCraig Rodrigues 69*9e7c127fSCraig Rodrigues enum aldap_protocol { 70*9e7c127fSCraig Rodrigues LDAP, 71*9e7c127fSCraig Rodrigues LDAPS 72*9e7c127fSCraig Rodrigues }; 73*9e7c127fSCraig Rodrigues 74*9e7c127fSCraig Rodrigues struct aldap_url { 75*9e7c127fSCraig Rodrigues int protocol; 76*9e7c127fSCraig Rodrigues char *host; 77*9e7c127fSCraig Rodrigues in_port_t port; 78*9e7c127fSCraig Rodrigues char *dn; 79*9e7c127fSCraig Rodrigues #define MAXATTR 1024 80*9e7c127fSCraig Rodrigues char *attributes[MAXATTR]; 81*9e7c127fSCraig Rodrigues int scope; 82*9e7c127fSCraig Rodrigues char *filter; 83*9e7c127fSCraig Rodrigues char *buffer; 84*9e7c127fSCraig Rodrigues }; 85*9e7c127fSCraig Rodrigues 86*9e7c127fSCraig Rodrigues enum protocol_op { 87*9e7c127fSCraig Rodrigues LDAP_REQ_BIND = 0, 88*9e7c127fSCraig Rodrigues LDAP_RES_BIND = 1, 89*9e7c127fSCraig Rodrigues LDAP_REQ_UNBIND_30 = 2, 90*9e7c127fSCraig Rodrigues LDAP_REQ_SEARCH = 3, 91*9e7c127fSCraig Rodrigues LDAP_RES_SEARCH_ENTRY = 4, 92*9e7c127fSCraig Rodrigues LDAP_RES_SEARCH_RESULT = 5, 93*9e7c127fSCraig Rodrigues LDAP_REQ_MODIFY = 6, 94*9e7c127fSCraig Rodrigues LDAP_RES_MODIFY = 7, 95*9e7c127fSCraig Rodrigues LDAP_REQ_ADD = 8, 96*9e7c127fSCraig Rodrigues LDAP_RES_ADD = 9, 97*9e7c127fSCraig Rodrigues LDAP_REQ_DELETE_30 = 10, 98*9e7c127fSCraig Rodrigues LDAP_RES_DELETE = 11, 99*9e7c127fSCraig Rodrigues LDAP_REQ_MODRDN = 12, 100*9e7c127fSCraig Rodrigues LDAP_RES_MODRDN = 13, 101*9e7c127fSCraig Rodrigues LDAP_REQ_COMPARE = 14, 102*9e7c127fSCraig Rodrigues LDAP_RES_COMPARE = 15, 103*9e7c127fSCraig Rodrigues LDAP_REQ_ABANDON_30 = 16, 104*9e7c127fSCraig Rodrigues 105*9e7c127fSCraig Rodrigues LDAP_RES_SEARCH_REFERENCE = 19, 106*9e7c127fSCraig Rodrigues }; 107*9e7c127fSCraig Rodrigues 108*9e7c127fSCraig Rodrigues enum deref_aliases { 109*9e7c127fSCraig Rodrigues LDAP_DEREF_NEVER = 0, 110*9e7c127fSCraig Rodrigues LDAP_DEREF_SEARCHING = 1, 111*9e7c127fSCraig Rodrigues LDAP_DEREF_FINDING = 2, 112*9e7c127fSCraig Rodrigues LDAP_DEREF_ALWAYS = 3, 113*9e7c127fSCraig Rodrigues }; 114*9e7c127fSCraig Rodrigues 115*9e7c127fSCraig Rodrigues enum authentication_choice { 116*9e7c127fSCraig Rodrigues LDAP_AUTH_SIMPLE = 0, 117*9e7c127fSCraig Rodrigues }; 118*9e7c127fSCraig Rodrigues 119*9e7c127fSCraig Rodrigues enum scope { 120*9e7c127fSCraig Rodrigues LDAP_SCOPE_BASE = 0, 121*9e7c127fSCraig Rodrigues LDAP_SCOPE_ONELEVEL = 1, 122*9e7c127fSCraig Rodrigues LDAP_SCOPE_SUBTREE = 2, 123*9e7c127fSCraig Rodrigues }; 124*9e7c127fSCraig Rodrigues 125*9e7c127fSCraig Rodrigues enum result_code { 126*9e7c127fSCraig Rodrigues LDAP_SUCCESS = 0, 127*9e7c127fSCraig Rodrigues LDAP_OPERATIONS_ERROR = 1, 128*9e7c127fSCraig Rodrigues LDAP_PROTOCOL_ERROR = 2, 129*9e7c127fSCraig Rodrigues LDAP_TIMELIMIT_EXCEEDED = 3, 130*9e7c127fSCraig Rodrigues LDAP_SIZELIMIT_EXCEEDED = 4, 131*9e7c127fSCraig Rodrigues LDAP_COMPARE_FALSE = 5, 132*9e7c127fSCraig Rodrigues LDAP_COMPARE_TRUE = 6, 133*9e7c127fSCraig Rodrigues LDAP_STRONG_AUTH_NOT_SUPPORTED = 7, 134*9e7c127fSCraig Rodrigues LDAP_STRONG_AUTH_REQUIRED = 8, 135*9e7c127fSCraig Rodrigues 136*9e7c127fSCraig Rodrigues LDAP_REFERRAL = 10, 137*9e7c127fSCraig Rodrigues LDAP_ADMINLIMIT_EXCEEDED = 11, 138*9e7c127fSCraig Rodrigues LDAP_UNAVAILABLE_CRITICAL_EXTENSION = 12, 139*9e7c127fSCraig Rodrigues LDAP_CONFIDENTIALITY_REQUIRED = 13, 140*9e7c127fSCraig Rodrigues LDAP_SASL_BIND_IN_PROGRESS = 14, 141*9e7c127fSCraig Rodrigues LDAP_NO_SUCH_ATTRIBUTE = 16, 142*9e7c127fSCraig Rodrigues LDAP_UNDEFINED_TYPE = 17, 143*9e7c127fSCraig Rodrigues LDAP_INAPPROPRIATE_MATCHING = 18, 144*9e7c127fSCraig Rodrigues LDAP_CONSTRAINT_VIOLATION = 19, 145*9e7c127fSCraig Rodrigues LDAP_TYPE_OR_VALUE_EXISTS = 20, 146*9e7c127fSCraig Rodrigues LDAP_INVALID_SYNTAX = 21, 147*9e7c127fSCraig Rodrigues 148*9e7c127fSCraig Rodrigues LDAP_NO_SUCH_OBJECT = 32, 149*9e7c127fSCraig Rodrigues LDAP_ALIAS_PROBLEM = 33, 150*9e7c127fSCraig Rodrigues LDAP_INVALID_DN_SYNTAX = 34, 151*9e7c127fSCraig Rodrigues 152*9e7c127fSCraig Rodrigues LDAP_ALIAS_DEREF_PROBLEM = 36, 153*9e7c127fSCraig Rodrigues 154*9e7c127fSCraig Rodrigues LDAP_INAPPROPRIATE_AUTH = 48, 155*9e7c127fSCraig Rodrigues LDAP_INVALID_CREDENTIALS = 49, 156*9e7c127fSCraig Rodrigues LDAP_INSUFFICIENT_ACCESS = 50, 157*9e7c127fSCraig Rodrigues LDAP_BUSY = 51, 158*9e7c127fSCraig Rodrigues LDAP_UNAVAILABLE = 52, 159*9e7c127fSCraig Rodrigues LDAP_UNWILLING_TO_PERFORM = 53, 160*9e7c127fSCraig Rodrigues LDAP_LOOP_DETECT = 54, 161*9e7c127fSCraig Rodrigues 162*9e7c127fSCraig Rodrigues LDAP_NAMING_VIOLATION = 64, 163*9e7c127fSCraig Rodrigues LDAP_OBJECT_CLASS_VIOLATION = 65, 164*9e7c127fSCraig Rodrigues LDAP_NOT_ALLOWED_ON_NONLEAF = 66, 165*9e7c127fSCraig Rodrigues LDAP_NOT_ALLOWED_ON_RDN = 67, 166*9e7c127fSCraig Rodrigues LDAP_ALREADY_EXISTS = 68, 167*9e7c127fSCraig Rodrigues LDAP_NO_OBJECT_CLASS_MODS = 69, 168*9e7c127fSCraig Rodrigues 169*9e7c127fSCraig Rodrigues LDAP_AFFECTS_MULTIPLE_DSAS = 71, 170*9e7c127fSCraig Rodrigues 171*9e7c127fSCraig Rodrigues LDAP_OTHER = 80, 172*9e7c127fSCraig Rodrigues }; 173*9e7c127fSCraig Rodrigues 174*9e7c127fSCraig Rodrigues enum filter { 175*9e7c127fSCraig Rodrigues LDAP_FILT_AND = 0, 176*9e7c127fSCraig Rodrigues LDAP_FILT_OR = 1, 177*9e7c127fSCraig Rodrigues LDAP_FILT_NOT = 2, 178*9e7c127fSCraig Rodrigues LDAP_FILT_EQ = 3, 179*9e7c127fSCraig Rodrigues LDAP_FILT_SUBS = 4, 180*9e7c127fSCraig Rodrigues LDAP_FILT_GE = 5, 181*9e7c127fSCraig Rodrigues LDAP_FILT_LE = 6, 182*9e7c127fSCraig Rodrigues LDAP_FILT_PRES = 7, 183*9e7c127fSCraig Rodrigues LDAP_FILT_APPR = 8, 184*9e7c127fSCraig Rodrigues }; 185*9e7c127fSCraig Rodrigues 186*9e7c127fSCraig Rodrigues enum subfilter { 187*9e7c127fSCraig Rodrigues LDAP_FILT_SUBS_INIT = 0, 188*9e7c127fSCraig Rodrigues LDAP_FILT_SUBS_ANY = 1, 189*9e7c127fSCraig Rodrigues LDAP_FILT_SUBS_FIN = 2, 190*9e7c127fSCraig Rodrigues }; 191*9e7c127fSCraig Rodrigues 192*9e7c127fSCraig Rodrigues struct aldap *aldap_init(int fd); 193*9e7c127fSCraig Rodrigues int aldap_close(struct aldap *); 194*9e7c127fSCraig Rodrigues struct aldap_message *aldap_parse(struct aldap *); 195*9e7c127fSCraig Rodrigues void aldap_freemsg(struct aldap_message *); 196*9e7c127fSCraig Rodrigues 197*9e7c127fSCraig Rodrigues int aldap_bind(struct aldap *, char *, char *); 198*9e7c127fSCraig Rodrigues int aldap_unbind(struct aldap *); 199*9e7c127fSCraig Rodrigues int aldap_search(struct aldap *, char *, enum scope, char *, char **, int, int, int, struct aldap_page_control *); 200*9e7c127fSCraig Rodrigues int aldap_get_errno(struct aldap *, const char **); 201*9e7c127fSCraig Rodrigues 202*9e7c127fSCraig Rodrigues int aldap_get_resultcode(struct aldap_message *); 203*9e7c127fSCraig Rodrigues char *aldap_get_dn(struct aldap_message *); 204*9e7c127fSCraig Rodrigues char *aldap_get_diagmsg(struct aldap_message *); 205*9e7c127fSCraig Rodrigues char **aldap_get_references(struct aldap_message *); 206*9e7c127fSCraig Rodrigues void aldap_free_references(char **values); 207*9e7c127fSCraig Rodrigues #if 0 208*9e7c127fSCraig Rodrigues int aldap_parse_url(char *, struct aldap_url *); 209*9e7c127fSCraig Rodrigues void aldap_free_url(struct aldap_url *); 210*9e7c127fSCraig Rodrigues int aldap_search_url(struct aldap *, char *, int, int, int); 211*9e7c127fSCraig Rodrigues #endif 212*9e7c127fSCraig Rodrigues 213*9e7c127fSCraig Rodrigues int aldap_count_attrs(struct aldap_message *); 214*9e7c127fSCraig Rodrigues int aldap_match_attr(struct aldap_message *, char *, char ***); 215*9e7c127fSCraig Rodrigues int aldap_first_attr(struct aldap_message *, char **, char ***); 216*9e7c127fSCraig Rodrigues int aldap_next_attr(struct aldap_message *, char **, char ***); 217*9e7c127fSCraig Rodrigues int aldap_free_attr(char **); 218*9e7c127fSCraig Rodrigues 219*9e7c127fSCraig Rodrigues struct aldap_page_control *aldap_parse_page_control(struct ber_element *, size_t len); 220*9e7c127fSCraig Rodrigues void aldap_freepage(struct aldap_page_control *); 221