1 /*        $NetBSD: rewrite.h,v 1.3 2021/08/14 16:14:55 christos Exp $ */
2 
3 /* $OpenLDAP$
4  */
5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6  *
7  * Copyright 2000-2021 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  */
104 struct rewrite_info;
105 
106 struct berval; /* avoid include */
107 
108 LDAP_BEGIN_DECL
109 
110 /*
111  * Inits the info
112  */
113 LDAP_REWRITE_F (struct rewrite_info *)
114 rewrite_info_init(
115                     int mode
116 );
117 
118 /*
119  * Cleans up the info structure
120  */
121 LDAP_REWRITE_F (int)
122 rewrite_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  */
138 LDAP_REWRITE_F (int)
139 rewrite_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  */
150 LDAP_REWRITE_F (int)
151 rewrite_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  */
171 LDAP_REWRITE_F (int)
172 rewrite(
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  */
182 LDAP_REWRITE_F (int)
183 rewrite_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  */
194 LDAP_REWRITE_F (struct rewrite_session *)
195 rewrite_session_init(
196                 struct rewrite_info *info,
197                 const void *cookie
198 );
199 
200 /*
201  * Defines and inits a variable with session scope
202  */
203 LDAP_REWRITE_F (int)
204 rewrite_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  */
219 LDAP_REWRITE_F (int)
220 rewrite_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  */
233 LDAP_REWRITE_F (int)
234 rewrite_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  */
243 LDAP_REWRITE_F (int)
244 rewrite_param_get(
245                 struct rewrite_info *info,
246                 const char *name,
247                 struct berval *value
248 );
249 
250 /*
251  * Destroys the parameter tree
252  */
253 LDAP_REWRITE_F (int)
254 rewrite_param_destroy(
255                 struct rewrite_info *info
256 );
257 
258 /*
259  * Mapping implementations
260  */
261 
262 struct rewrite_mapper;
263 
264 typedef void * (rewrite_mapper_config)(
265           const char *fname,
266           int lineno,
267           int argc,
268           char **argv );
269 
270 typedef int (rewrite_mapper_apply)(
271           void *ctx,
272           const char *arg,
273           struct berval *retval );
274 
275 typedef int (rewrite_mapper_destroy)(
276           void *ctx );
277 
278 typedef 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 */
286 LDAP_REWRITE_F (int)
287 rewrite_mapper_register(
288           const rewrite_mapper *map );
289 
290 LDAP_REWRITE_F (int)
291 rewrite_mapper_unregister(
292           const rewrite_mapper *map );
293 
294 LDAP_REWRITE_F (const rewrite_mapper *)
295 rewrite_mapper_find(
296           const char *name );
297 
298 LDAP_END_DECL
299 
300 #endif /* REWRITE_H */
301