xref: /freebsd/usr.sbin/ypldap/aldap.h (revision 2a63c3be158216222d89a073dcbd6a72ee4aab5a)
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