1/*	$NetBSD: rewrite.h,v 1.1.1.3 2010/12/12 15:21:25 adam Exp $	*/
2
3/* OpenLDAP: pkg/ldap/include/rewrite.h,v 1.15.2.5 2010/04/13 20:22:50 kurt Exp
4 */
5/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6 *
7 * Copyright 2000-2010 The OpenLDAP Foundation.
8 * Portions Copyright 2000-2003 Pierangelo Masarati.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted only as authorized by the OpenLDAP
13 * Public License.
14 *
15 * A copy of this license is available in file LICENSE in the
16 * top-level directory of the distribution or, alternatively, at
17 * <http://www.OpenLDAP.org/license.html>.
18 */
19/* ACKNOWLEDGEMENT:
20 * This work was initially developed by Pierangelo Masarati for
21 * inclusion in OpenLDAP Software.
22 */
23
24#ifndef REWRITE_H
25#define REWRITE_H
26
27/*
28 * Default rewrite context
29 */
30#define REWRITE_DEFAULT_CONTEXT		"default"
31
32/*
33 * Rewrite engine states
34 */
35#define REWRITE_OFF			0x0000
36#define REWRITE_ON			0x0001
37#define REWRITE_DEFAULT			REWRITE_OFF
38
39/*
40 * Rewrite internal status returns
41 */
42#define REWRITE_SUCCESS			LDAP_SUCCESS
43#define REWRITE_ERR			LDAP_OTHER
44
45/*
46 * Rewrite modes (input values for rewrite_info_init); determine the
47 * behavior in case a null or non existent context is required:
48 *
49 * 	REWRITE_MODE_ERR		error
50 * 	REWRITE_MODE_OK			no error but no rewrite
51 * 	REWRITE_MODE_COPY_INPUT		a copy of the input is returned
52 * 	REWRITE_MODE_USE_DEFAULT	the default context is used.
53 */
54#define REWRITE_MODE_ERR		0x0010
55#define REWRITE_MODE_OK			0x0011
56#define REWRITE_MODE_COPY_INPUT		0x0012
57#define REWRITE_MODE_USE_DEFAULT	0x0013
58
59/*
60 * Rewrite status returns
61 *
62 * 	REWRITE_REGEXEC_OK		success (result may be empty in case
63 * 					of no match)
64 * 	REWRITE_REGEXEC_ERR		error (internal error,
65 * 					misconfiguration, map not working ...)
66 * 	REWRITE_REGEXEC_STOP		internal use; never returned
67 * 	REWRITE_REGEXEC_UNWILLING	the server should issue an 'unwilling
68 * 					to perform' error
69 */
70#define REWRITE_REGEXEC_OK              (0)
71#define REWRITE_REGEXEC_ERR             (-1)
72#define REWRITE_REGEXEC_STOP            (-2)
73#define REWRITE_REGEXEC_UNWILLING       (-3)
74#define REWRITE_REGEXEC_USER		(1)	/* and above: LDAP errors */
75
76/*
77 * Rewrite variable flags
78 *	REWRITE_VAR_INSERT		insert mode (default) when adding
79 *					a variable; if not set during value
80 *					update, the variable is not inserted
81 *					if not present
82 *	REWRITE_VAR_UPDATE		update mode (default) when updating
83 *					a variable; if not set during insert,
84 *					the value is not updated if the
85 *					variable already exists
86 *	REWRITE_VAR_COPY_NAME		copy the variable name; if not set,
87 *					the name is not copied; be sure the
88 *					referenced string is available for
89 *					the entire life scope of the variable.
90 *	REWRITE_VAR_COPY_VALUE		copy the variable value; if not set,
91 *					the value is not copied; be sure the
92 *					referenced string is available for
93 *					the entire life scope of the variable.
94 */
95#define REWRITE_VAR_NONE		0x0000
96#define REWRITE_VAR_INSERT		0x0001
97#define REWRITE_VAR_UPDATE		0x0002
98#define REWRITE_VAR_COPY_NAME		0x0004
99#define REWRITE_VAR_COPY_VALUE		0x0008
100
101/*
102 * Rewrite info
103 */
104struct rewrite_info;
105
106struct berval; /* avoid include */
107
108LDAP_BEGIN_DECL
109
110/*
111 * Inits the info
112 */
113LDAP_REWRITE_F (struct rewrite_info *)
114rewrite_info_init(
115		int mode
116);
117
118/*
119 * Cleans up the info structure
120 */
121LDAP_REWRITE_F (int)
122rewrite_info_delete(
123                struct rewrite_info **info
124);
125
126
127/*
128 * Parses a config line and takes actions to fit content in rewrite structure;
129 * lines handled are of the form:
130 *
131 *      rewriteEngine 		{on|off}
132 *      rewriteMaxPasses	numPasses
133 *      rewriteContext 		contextName [alias aliasedRewriteContex]
134 *      rewriteRule 		pattern substPattern [ruleFlags]
135 *      rewriteMap 		mapType mapName [mapArgs]
136 *      rewriteParam		paramName paramValue
137 */
138LDAP_REWRITE_F (int)
139rewrite_parse(
140		struct rewrite_info *info,
141                const char *fname,
142                int lineno,
143                int argc,
144                char **argv
145);
146
147/*
148 * process a config file that was already opened. Uses rewrite_parse.
149 */
150LDAP_REWRITE_F (int)
151rewrite_read(
152		FILE *fin,
153		struct rewrite_info *info
154);
155
156/*
157 * Rewrites a string according to context.
158 * If the engine is off, OK is returned, but the return string will be NULL.
159 * In case of 'unwilling to perform', UNWILLING is returned, and the
160 * return string will also be null. The same in case of error.
161 * Otherwise, OK is returned, and result will hold a newly allocated string
162 * with the rewriting.
163 *
164 * What to do in case of non-existing rewrite context is still an issue.
165 * Four possibilities:
166 *      - error,
167 *      - ok with NULL result,
168 *      - ok with copy of string as result,
169 *      - use the default rewrite context.
170 */
171LDAP_REWRITE_F (int)
172rewrite(
173		struct rewrite_info *info,
174		const char *rewriteContext,
175		const char *string,
176		char **result
177);
178
179/*
180 * Same as above; the cookie relates the rewrite to a session
181 */
182LDAP_REWRITE_F (int)
183rewrite_session(
184		struct rewrite_info *info,
185		const char *rewriteContext,
186		const char *string,
187		const void *cookie,
188		char **result
189);
190
191/*
192 * Inits a session
193 */
194LDAP_REWRITE_F (struct rewrite_session *)
195rewrite_session_init(
196                struct rewrite_info *info,
197                const void *cookie
198);
199
200/*
201 * Defines and inits a variable with session scope
202 */
203LDAP_REWRITE_F (int)
204rewrite_session_var_set_f(
205		struct rewrite_info *info,
206		const void *cookie,
207		const char *name,
208		const char *value,
209		int flags
210);
211
212#define rewrite_session_var_set(info, cookie, name, value) \
213	rewrite_session_var_set_f((info), (cookie), (name), (value), \
214			REWRITE_VAR_INSERT|REWRITE_VAR_UPDATE|REWRITE_VAR_COPY_NAME|REWRITE_VAR_COPY_VALUE)
215
216/*
217 * Deletes a session
218 */
219LDAP_REWRITE_F (int)
220rewrite_session_delete(
221		struct rewrite_info *info,
222		const void *cookie
223);
224
225
226/*
227 * Params
228 */
229
230/*
231 * Defines and inits a variable with global scope
232 */
233LDAP_REWRITE_F (int)
234rewrite_param_set(
235                struct rewrite_info *info,
236                const char *name,
237                const char *value
238);
239
240/*
241 * Gets a var with global scope
242 */
243LDAP_REWRITE_F (int)
244rewrite_param_get(
245                struct rewrite_info *info,
246                const char *name,
247                struct berval *value
248);
249
250/*
251 * Destroys the parameter tree
252 */
253LDAP_REWRITE_F (int)
254rewrite_param_destroy(
255                struct rewrite_info *info
256);
257
258/*
259 * Mapping implementations
260 */
261
262struct rewrite_mapper;
263
264typedef void * (rewrite_mapper_config)(
265	const char *fname,
266	int lineno,
267	int argc,
268	char **argv );
269
270typedef int (rewrite_mapper_apply)(
271	void *ctx,
272	const char *arg,
273	struct berval *retval );
274
275typedef int (rewrite_mapper_destroy)(
276	void *ctx );
277
278typedef struct rewrite_mapper {
279	char *rm_name;
280	rewrite_mapper_config *rm_config;
281	rewrite_mapper_apply *rm_apply;
282	rewrite_mapper_destroy *rm_destroy;
283} rewrite_mapper;
284
285/* For dynamic loading and unloading of mappers */
286LDAP_REWRITE_F (int)
287rewrite_mapper_register(
288	const rewrite_mapper *map );
289
290LDAP_REWRITE_F (int)
291rewrite_mapper_unregister(
292	const rewrite_mapper *map );
293
294LDAP_REWRITE_F (const rewrite_mapper *)
295rewrite_mapper_find(
296	const char *name );
297
298LDAP_END_DECL
299
300#endif /* REWRITE_H */
301