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