1*cf1d77f7Schristos /*	$NetBSD: rewrite-int.h,v 1.3 2021/08/14 16:14:58 christos Exp $	*/
24e6df137Slukem 
333197c6aStron /* $OpenLDAP$ */
42de962bdSlukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
52de962bdSlukem  *
6*cf1d77f7Schristos  * Copyright 2000-2021 The OpenLDAP Foundation.
72de962bdSlukem  * All rights reserved.
82de962bdSlukem  *
92de962bdSlukem  * Redistribution and use in source and binary forms, with or without
102de962bdSlukem  * modification, are permitted only as authorized by the OpenLDAP
112de962bdSlukem  * Public License.
122de962bdSlukem  *
132de962bdSlukem  * A copy of this license is available in the file LICENSE in the
142de962bdSlukem  * top-level directory of the distribution or, alternatively, at
152de962bdSlukem  * <http://www.OpenLDAP.org/license.html>.
162de962bdSlukem  */
172de962bdSlukem /* ACKNOWLEDGEMENT:
182de962bdSlukem  * This work was initially developed by Pierangelo Masarati for
192de962bdSlukem  * inclusion in OpenLDAP Software.
202de962bdSlukem  */
212de962bdSlukem 
222de962bdSlukem #ifndef REWRITE_INT_H
232de962bdSlukem #define REWRITE_INT_H
242de962bdSlukem 
252de962bdSlukem /*
262de962bdSlukem  * These are required by every file of the library, so they're included here
272de962bdSlukem  */
282de962bdSlukem #include <ac/stdlib.h>
292de962bdSlukem #include <ac/string.h>
302de962bdSlukem #include <ac/syslog.h>
312de962bdSlukem #include <ac/regex.h>
322de962bdSlukem #include <ac/socket.h>
332de962bdSlukem #include <ac/unistd.h>
342de962bdSlukem #include <ac/ctype.h>
352de962bdSlukem 
362de962bdSlukem #include <lber.h>
372de962bdSlukem #include <ldap.h>
3833197c6aStron #define LDAP_DEFINE_LDAP_DEBUG
3933197c6aStron #include <ldap_log.h>
402de962bdSlukem #include <lutil.h>
41*cf1d77f7Schristos #include <ldap_avl.h>
422de962bdSlukem 
432de962bdSlukem #include <rewrite.h>
442de962bdSlukem 
454e6df137Slukem #define malloc(x)	ber_memalloc(x)
464e6df137Slukem #define calloc(x,y)	ber_memcalloc(x,y)
474e6df137Slukem #define realloc(x,y)	ber_memrealloc(x,y)
484e6df137Slukem #define free(x)	ber_memfree(x)
494e6df137Slukem #undef strdup
504e6df137Slukem #define	strdup(x)	ber_strdup(x)
514e6df137Slukem 
52*cf1d77f7Schristos #ifndef NO_THREADS
532de962bdSlukem #define USE_REWRITE_LDAP_PVT_THREADS
542de962bdSlukem #include <ldap_pvt_thread.h>
55*cf1d77f7Schristos #endif
562de962bdSlukem 
572de962bdSlukem /*
582de962bdSlukem  * For details, see RATIONALE.
592de962bdSlukem  */
602de962bdSlukem 
612de962bdSlukem #define REWRITE_MAX_MATCH	11	/* 0: overall string; 1-9: submatches */
622de962bdSlukem #define REWRITE_MAX_PASSES	100
632de962bdSlukem 
642de962bdSlukem /*
652de962bdSlukem  * Submatch escape char
662de962bdSlukem  */
672de962bdSlukem /* the '\' conflicts with slapd.conf parsing */
682de962bdSlukem /* #define REWRITE_SUBMATCH_ESCAPE			'\\' */
692de962bdSlukem #define REWRITE_SUBMATCH_ESCAPE_ORIG		'%'
702de962bdSlukem #define REWRITE_SUBMATCH_ESCAPE			'$'
712de962bdSlukem #define IS_REWRITE_SUBMATCH_ESCAPE(c) \
722de962bdSlukem 	((c) == REWRITE_SUBMATCH_ESCAPE || (c) == REWRITE_SUBMATCH_ESCAPE_ORIG)
732de962bdSlukem 
742de962bdSlukem /*
752de962bdSlukem  * REGEX flags
762de962bdSlukem  */
772de962bdSlukem 
782de962bdSlukem #define REWRITE_FLAG_HONORCASE			'C'
792de962bdSlukem #define REWRITE_FLAG_BASICREGEX			'R'
802de962bdSlukem 
812de962bdSlukem /*
822de962bdSlukem  * Action flags
832de962bdSlukem  */
842de962bdSlukem #define REWRITE_FLAG_EXECONCE			':'
852de962bdSlukem #define REWRITE_FLAG_STOP			'@'
862de962bdSlukem #define REWRITE_FLAG_UNWILLING			'#'
872de962bdSlukem #define REWRITE_FLAG_GOTO			'G'	/* requires an arg */
882de962bdSlukem #define REWRITE_FLAG_USER			'U'	/* requires an arg */
892de962bdSlukem #define REWRITE_FLAG_MAX_PASSES			'M'	/* requires an arg */
902de962bdSlukem #define REWRITE_FLAG_IGNORE_ERR			'I'
912de962bdSlukem 
922de962bdSlukem /*
932de962bdSlukem  * Map operators
942de962bdSlukem  */
952de962bdSlukem #define REWRITE_OPERATOR_SUBCONTEXT		'>'
962de962bdSlukem #define REWRITE_OPERATOR_COMMAND		'|'
972de962bdSlukem #define REWRITE_OPERATOR_VARIABLE_SET		'&'
982de962bdSlukem #define REWRITE_OPERATOR_VARIABLE_GET		'*'
992de962bdSlukem #define REWRITE_OPERATOR_PARAM_GET		'$'
1002de962bdSlukem 
1012de962bdSlukem 
1022de962bdSlukem /***********
1032de962bdSlukem  * PRIVATE *
1042de962bdSlukem  ***********/
1052de962bdSlukem 
1062de962bdSlukem /*
1072de962bdSlukem  * Action
1082de962bdSlukem  */
1092de962bdSlukem struct rewrite_action {
1102de962bdSlukem 	struct rewrite_action          *la_next;
1112de962bdSlukem 
1122de962bdSlukem #define REWRITE_ACTION_STOP		0x0001
1132de962bdSlukem #define REWRITE_ACTION_UNWILLING	0x0002
1142de962bdSlukem #define REWRITE_ACTION_GOTO		0x0003
1152de962bdSlukem #define REWRITE_ACTION_IGNORE_ERR	0x0004
1162de962bdSlukem #define REWRITE_ACTION_USER		0x0005
1172de962bdSlukem 	int                             la_type;
1182de962bdSlukem 	void                           *la_args;
1192de962bdSlukem };
1202de962bdSlukem 
1212de962bdSlukem /*
1222de962bdSlukem  * Map
1232de962bdSlukem  */
1242de962bdSlukem struct rewrite_map {
1252de962bdSlukem 
1262de962bdSlukem 	/*
1272de962bdSlukem 	 * Legacy stuff
1282de962bdSlukem 	 */
1292de962bdSlukem #define REWRITE_MAP_XFILEMAP		0x0001	/* Rough implementation! */
1302de962bdSlukem #define REWRITE_MAP_XPWDMAP		0x0002  /* uid -> gecos */
1312de962bdSlukem #define REWRITE_MAP_XLDAPMAP		0x0003	/* Not implemented yet! */
1322de962bdSlukem 
1332de962bdSlukem 	/*
1342de962bdSlukem 	 * Maps with args
1352de962bdSlukem 	 */
1362de962bdSlukem #define REWRITE_MAP_SUBCONTEXT		0x0101
1372de962bdSlukem 
1382de962bdSlukem #define REWRITE_MAP_SET_OP_VAR		0x0102
1392de962bdSlukem #define REWRITE_MAP_SETW_OP_VAR		0x0103
1402de962bdSlukem #define REWRITE_MAP_GET_OP_VAR		0x0104
1412de962bdSlukem #define	REWRITE_MAP_SET_SESN_VAR	0x0105
1422de962bdSlukem #define REWRITE_MAP_SETW_SESN_VAR	0x0106
1432de962bdSlukem #define	REWRITE_MAP_GET_SESN_VAR	0x0107
1442de962bdSlukem #define REWRITE_MAP_GET_PARAM		0x0108
1452de962bdSlukem #define REWRITE_MAP_BUILTIN		0x0109
1462de962bdSlukem 	int                             lm_type;
1472de962bdSlukem 
1482de962bdSlukem 	char                           *lm_name;
1492de962bdSlukem 	void                           *lm_data;
1502de962bdSlukem 
1512de962bdSlukem 	/*
1522de962bdSlukem 	 * Old maps store private data in _lm_args;
1532de962bdSlukem 	 * new maps store the substitution pattern in _lm_subst
1542de962bdSlukem 	 */
1552de962bdSlukem 	union {
1562de962bdSlukem 	        void                   *_lm_args;
1572de962bdSlukem 		struct rewrite_subst   *_lm_subst;
1582de962bdSlukem 	} lm_union;
1592de962bdSlukem #define	lm_args lm_union._lm_args
1602de962bdSlukem #define	lm_subst lm_union._lm_subst
1612de962bdSlukem 
1622de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
1632de962bdSlukem 	ldap_pvt_thread_mutex_t         lm_mutex;
1642de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
1652de962bdSlukem };
1662de962bdSlukem 
1672de962bdSlukem /*
1682de962bdSlukem  * Builtin maps
1692de962bdSlukem  */
1702de962bdSlukem struct rewrite_builtin_map {
1712de962bdSlukem #define REWRITE_BUILTIN_MAP	0x0200
1722de962bdSlukem 	int                             lb_type;
1732de962bdSlukem 	char                           *lb_name;
1742de962bdSlukem 	void                           *lb_private;
1752de962bdSlukem 	const rewrite_mapper		   *lb_mapper;
1762de962bdSlukem 
1772de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
1782de962bdSlukem 	ldap_pvt_thread_mutex_t         lb_mutex;
1792de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
1802de962bdSlukem };
1812de962bdSlukem 
1822de962bdSlukem /*
1832de962bdSlukem  * Submatch substitution
1842de962bdSlukem  */
1852de962bdSlukem struct rewrite_submatch {
1862de962bdSlukem #define REWRITE_SUBMATCH_ASIS		0x0000
1872de962bdSlukem #define REWRITE_SUBMATCH_XMAP		0x0001
1882de962bdSlukem #define REWRITE_SUBMATCH_MAP_W_ARG	0x0002
1892de962bdSlukem 	int                             ls_type;
1902de962bdSlukem 	struct rewrite_map             *ls_map;
1912de962bdSlukem 	int                             ls_submatch;
1922de962bdSlukem 	/*
1932de962bdSlukem 	 * The first one represents the index of the submatch in case
1942de962bdSlukem 	 * the map has single submatch as argument;
1952de962bdSlukem 	 * the latter represents the map argument scheme in case
1962de962bdSlukem 	 * the map has substitution string argument form
1972de962bdSlukem 	 */
1982de962bdSlukem };
1992de962bdSlukem 
2002de962bdSlukem /*
2012de962bdSlukem  * Pattern substitution
2022de962bdSlukem  */
2032de962bdSlukem struct rewrite_subst {
2042de962bdSlukem 	size_t                          lt_subs_len;
2052de962bdSlukem 	struct berval                  *lt_subs;
2062de962bdSlukem 
2072de962bdSlukem 	int                             lt_num_submatch;
2082de962bdSlukem 	struct rewrite_submatch        *lt_submatch;
2092de962bdSlukem };
2102de962bdSlukem 
2112de962bdSlukem /*
2122de962bdSlukem  * Rule
2132de962bdSlukem  */
2142de962bdSlukem struct rewrite_rule {
2152de962bdSlukem 	struct rewrite_rule            *lr_next;
2162de962bdSlukem 	struct rewrite_rule            *lr_prev;
2172de962bdSlukem 
2182de962bdSlukem 	char                           *lr_pattern;
2192de962bdSlukem 	char                           *lr_subststring;
2202de962bdSlukem 	char                           *lr_flagstring;
2212de962bdSlukem 	regex_t				lr_regex;
2222de962bdSlukem 
2232de962bdSlukem 	/*
2242de962bdSlukem 	 * I was thinking about some kind of per-rule mutex, but there's
2252de962bdSlukem 	 * probably no need, because rules after compilation are only read;
2262de962bdSlukem 	 * however, I need to check whether regexec is reentrant ...
2272de962bdSlukem 	 */
2282de962bdSlukem 
2292de962bdSlukem 	struct rewrite_subst           *lr_subst;
2302de962bdSlukem 
2312de962bdSlukem #define REWRITE_REGEX_ICASE		REG_ICASE
2322de962bdSlukem #define REWRITE_REGEX_EXTENDED		REG_EXTENDED
2332de962bdSlukem 	int                             lr_flags;
2342de962bdSlukem 
2352de962bdSlukem #define REWRITE_RECURSE			0x0001
2362de962bdSlukem #define REWRITE_EXEC_ONCE          	0x0002
2372de962bdSlukem 	int				lr_mode;
2382de962bdSlukem 	int				lr_max_passes;
2392de962bdSlukem 
2402de962bdSlukem 	struct rewrite_action          *lr_action;
2412de962bdSlukem };
2422de962bdSlukem 
2432de962bdSlukem /*
2442de962bdSlukem  * Rewrite Context (set of rules)
2452de962bdSlukem  */
2462de962bdSlukem struct rewrite_context {
2472de962bdSlukem 	char                           *lc_name;
2482de962bdSlukem 	struct rewrite_context         *lc_alias;
2492de962bdSlukem 	struct rewrite_rule            *lc_rule;
2502de962bdSlukem };
2512de962bdSlukem 
2522de962bdSlukem /*
2532de962bdSlukem  * Session
2542de962bdSlukem  */
2552de962bdSlukem struct rewrite_session {
2562de962bdSlukem 	void                           *ls_cookie;
2572de962bdSlukem 	Avlnode                        *ls_vars;
2582de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
2592de962bdSlukem 	ldap_pvt_thread_rdwr_t          ls_vars_mutex;
2602de962bdSlukem 	ldap_pvt_thread_mutex_t		ls_mutex;
2612de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
2622de962bdSlukem 	int				ls_count;
2632de962bdSlukem };
2642de962bdSlukem 
2652de962bdSlukem /*
2662de962bdSlukem  * Variable
2672de962bdSlukem  */
2682de962bdSlukem struct rewrite_var {
2692de962bdSlukem 	char                           *lv_name;
2702de962bdSlukem 	int				lv_flags;
2712de962bdSlukem 	struct berval                   lv_value;
2722de962bdSlukem };
2732de962bdSlukem 
2742de962bdSlukem /*
2752de962bdSlukem  * Operation
2762de962bdSlukem  */
2772de962bdSlukem struct rewrite_op {
2782de962bdSlukem 	int                             lo_num_passes;
2792de962bdSlukem 	int                             lo_depth;
2802de962bdSlukem #if 0 /* FIXME: not used anywhere! (debug? then, why strdup?) */
2812de962bdSlukem 	char                           *lo_string;
2822de962bdSlukem #endif
2832de962bdSlukem 	char                           *lo_result;
2842de962bdSlukem 	Avlnode                        *lo_vars;
2852de962bdSlukem 	const void                     *lo_cookie;
2862de962bdSlukem };
2872de962bdSlukem 
2882de962bdSlukem 
2892de962bdSlukem /**********
2902de962bdSlukem  * PUBLIC *
2912de962bdSlukem  **********/
2922de962bdSlukem 
2932de962bdSlukem /*
2942de962bdSlukem  * Rewrite info
2952de962bdSlukem  */
2962de962bdSlukem struct rewrite_info {
2972de962bdSlukem 	Avlnode                        *li_context;
2982de962bdSlukem 	Avlnode                        *li_maps;
2992de962bdSlukem 	/*
3002de962bdSlukem 	 * No global mutex because maps are read only at
3012de962bdSlukem 	 * config time
3022de962bdSlukem 	 */
3032de962bdSlukem 	Avlnode                        *li_params;
3042de962bdSlukem 	Avlnode                        *li_cookies;
3052de962bdSlukem 	int                             li_num_cookies;
3062de962bdSlukem 
3072de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
3082de962bdSlukem 	ldap_pvt_thread_rdwr_t          li_params_mutex;
3092de962bdSlukem         ldap_pvt_thread_rdwr_t          li_cookies_mutex;
3102de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
3112de962bdSlukem 
3122de962bdSlukem 	/*
3132de962bdSlukem 	 * Default to `off';
3142de962bdSlukem 	 * use `rewriteEngine {on|off}' directive to alter
3152de962bdSlukem 	 */
3162de962bdSlukem 	int				li_state;
3172de962bdSlukem 
3182de962bdSlukem 	/*
3192de962bdSlukem 	 * Defaults to REWRITE_MAXPASSES;
3202de962bdSlukem 	 * use `rewriteMaxPasses numPasses' directive to alter
3212de962bdSlukem 	 */
3222de962bdSlukem #define REWRITE_MAXPASSES		100
3232de962bdSlukem 	int                             li_max_passes;
3242de962bdSlukem 	int                             li_max_passes_per_rule;
3252de962bdSlukem 
3262de962bdSlukem 	/*
3272de962bdSlukem 	 * Behavior in case a NULL or non-existent context is required
3282de962bdSlukem 	 */
3292de962bdSlukem 	int                             li_rewrite_mode;
3302de962bdSlukem };
3312de962bdSlukem 
3322de962bdSlukem /***********
3332de962bdSlukem  * PRIVATE *
3342de962bdSlukem  ***********/
3352de962bdSlukem 
3362de962bdSlukem LDAP_REWRITE_V (struct rewrite_context*) rewrite_int_curr_context;
3372de962bdSlukem 
3382de962bdSlukem /*
3392de962bdSlukem  * Maps
3402de962bdSlukem  */
3412de962bdSlukem 
3422de962bdSlukem /*
3432de962bdSlukem  * Parses a map (also in legacy 'x' version)
3442de962bdSlukem  */
3452de962bdSlukem LDAP_REWRITE_F (struct rewrite_map *)
3462de962bdSlukem rewrite_map_parse(
3472de962bdSlukem 		struct rewrite_info *info,
3482de962bdSlukem 		const char *s,
3492de962bdSlukem 		const char **end
3502de962bdSlukem );
3512de962bdSlukem 
3522de962bdSlukem LDAP_REWRITE_F (struct rewrite_map *)
3532de962bdSlukem rewrite_xmap_parse(
3542de962bdSlukem 		struct rewrite_info *info,
3552de962bdSlukem 		const char *s,
3562de962bdSlukem 		const char **end
3572de962bdSlukem );
3582de962bdSlukem 
3592de962bdSlukem /*
3602de962bdSlukem  * Resolves key in val by means of map (also in legacy 'x' version)
3612de962bdSlukem  */
3622de962bdSlukem LDAP_REWRITE_F (int)
3632de962bdSlukem rewrite_map_apply(
3642de962bdSlukem 		struct rewrite_info *info,
3652de962bdSlukem 		struct rewrite_op *op,
3662de962bdSlukem 		struct rewrite_map *map,
3672de962bdSlukem 		struct berval *key,
3682de962bdSlukem 		struct berval *val
3692de962bdSlukem );
3702de962bdSlukem 
3712de962bdSlukem LDAP_REWRITE_F (int)
3722de962bdSlukem rewrite_xmap_apply(
3732de962bdSlukem 		struct rewrite_info *info,
3742de962bdSlukem 		struct rewrite_op *op,
3752de962bdSlukem 		struct rewrite_map *map,
3762de962bdSlukem 		struct berval *key,
3772de962bdSlukem 		struct berval *val
3782de962bdSlukem );
3792de962bdSlukem 
3802de962bdSlukem LDAP_REWRITE_F (int)
3812de962bdSlukem rewrite_map_destroy(
3822de962bdSlukem 		struct rewrite_map **map
3832de962bdSlukem );
3842de962bdSlukem 
3852de962bdSlukem LDAP_REWRITE_F (int)
3862de962bdSlukem rewrite_xmap_destroy(
3872de962bdSlukem 		struct rewrite_map **map
3882de962bdSlukem );
3892de962bdSlukem 
3902de962bdSlukem LDAP_REWRITE_F (void)
3912de962bdSlukem rewrite_builtin_map_free(
3922de962bdSlukem 		void *map
3932de962bdSlukem );
3942de962bdSlukem /*
3952de962bdSlukem  * Submatch substitution
3962de962bdSlukem  */
3972de962bdSlukem 
3982de962bdSlukem /*
3992de962bdSlukem  * Compiles a substitution pattern
4002de962bdSlukem  */
4012de962bdSlukem LDAP_REWRITE_F (struct rewrite_subst *)
4022de962bdSlukem rewrite_subst_compile(
4032de962bdSlukem 		struct rewrite_info *info,
4042de962bdSlukem 		const char *result
4052de962bdSlukem );
4062de962bdSlukem 
4072de962bdSlukem /*
4082de962bdSlukem  * Substitutes a portion of rewritten string according to substitution
4092de962bdSlukem  * pattern using submatches
4102de962bdSlukem  */
4112de962bdSlukem LDAP_REWRITE_F (int)
4122de962bdSlukem rewrite_subst_apply(
4132de962bdSlukem 		struct rewrite_info *info,
4142de962bdSlukem 		struct rewrite_op *op,
4152de962bdSlukem 		struct rewrite_subst *subst,
4162de962bdSlukem 		const char *string,
4172de962bdSlukem 		const regmatch_t *match,
4182de962bdSlukem 		struct berval *val
4192de962bdSlukem );
4202de962bdSlukem 
4212de962bdSlukem LDAP_REWRITE_F (int)
4222de962bdSlukem rewrite_subst_destroy(
4232de962bdSlukem 		struct rewrite_subst **subst
4242de962bdSlukem );
4252de962bdSlukem 
4262de962bdSlukem 
4272de962bdSlukem /*
4282de962bdSlukem  * Rules
4292de962bdSlukem  */
4302de962bdSlukem 
4312de962bdSlukem /*
4322de962bdSlukem  * Compiles the rule and appends it at the running context
4332de962bdSlukem  */
4342de962bdSlukem LDAP_REWRITE_F (int)
4352de962bdSlukem rewrite_rule_compile(
4362de962bdSlukem 		struct rewrite_info *info,
4372de962bdSlukem 		struct rewrite_context *context,
4382de962bdSlukem 		const char *pattern,
4392de962bdSlukem 		const char *result,
4402de962bdSlukem 		const char *flagstring
4412de962bdSlukem );
4422de962bdSlukem 
4432de962bdSlukem /*
4442de962bdSlukem  * Rewrites string according to rule; may return:
4452de962bdSlukem  *      REWRITE_REGEXEC_OK:	fine; if *result != NULL rule matched
4462de962bdSlukem  *      			and rewrite succeeded.
4472de962bdSlukem  *      REWRITE_REGEXEC_STOP:   fine, rule matched; stop processing
4482de962bdSlukem  *      			following rules
4492de962bdSlukem  *      REWRITE_REGEXEC_UNWILL: rule matched; force 'unwilling to perform'
4502de962bdSlukem  *      REWRITE_REGEXEC_ERR:	an error occurred
4512de962bdSlukem  */
4522de962bdSlukem LDAP_REWRITE_F (int)
4532de962bdSlukem rewrite_rule_apply(
4542de962bdSlukem 		struct rewrite_info *info,
4552de962bdSlukem 		struct rewrite_op *op,
4562de962bdSlukem 		struct rewrite_rule *rule,
4572de962bdSlukem 		const char *string,
4582de962bdSlukem 		char **result
4592de962bdSlukem );
4602de962bdSlukem 
4612de962bdSlukem LDAP_REWRITE_F (int)
4622de962bdSlukem rewrite_rule_destroy(
4632de962bdSlukem 		struct rewrite_rule **rule
4642de962bdSlukem );
4652de962bdSlukem 
4662de962bdSlukem /*
4672de962bdSlukem  * Sessions
4682de962bdSlukem  */
4692de962bdSlukem 
4702de962bdSlukem /*
4712de962bdSlukem  * Fetches a struct rewrite_session
4722de962bdSlukem  */
4732de962bdSlukem LDAP_REWRITE_F (struct rewrite_session *)
4742de962bdSlukem rewrite_session_find(
4752de962bdSlukem                 struct rewrite_info *info,
4762de962bdSlukem                 const void *cookie
4772de962bdSlukem );
4782de962bdSlukem 
4792de962bdSlukem /*
4802de962bdSlukem  * Defines and inits a variable with session scope
4812de962bdSlukem  */
4822de962bdSlukem LDAP_REWRITE_F (int)
4832de962bdSlukem rewrite_session_var_set_f(
4842de962bdSlukem                 struct rewrite_info *info,
4852de962bdSlukem                 const void *cookie,
4862de962bdSlukem                 const char *name,
4872de962bdSlukem                 const char *value,
4882de962bdSlukem 		int flags
4892de962bdSlukem );
4902de962bdSlukem 
4912de962bdSlukem /*
4922de962bdSlukem  * Gets a var with session scope
4932de962bdSlukem  */
4942de962bdSlukem LDAP_REWRITE_F (int)
4952de962bdSlukem rewrite_session_var_get(
4962de962bdSlukem                 struct rewrite_info *info,
4972de962bdSlukem                 const void *cookie,
4982de962bdSlukem                 const char *name,
4992de962bdSlukem                 struct berval *val
5002de962bdSlukem );
5012de962bdSlukem 
5022de962bdSlukem /*
5032de962bdSlukem  * Deletes a session
5042de962bdSlukem  */
5052de962bdSlukem LDAP_REWRITE_F (int)
5062de962bdSlukem rewrite_session_delete(
5072de962bdSlukem                 struct rewrite_info *info,
5082de962bdSlukem                 const void *cookie
5092de962bdSlukem );
5102de962bdSlukem 
5112de962bdSlukem /*
5122de962bdSlukem  * Destroys the cookie tree
5132de962bdSlukem  */
5142de962bdSlukem LDAP_REWRITE_F (int)
5152de962bdSlukem rewrite_session_destroy(
5162de962bdSlukem                 struct rewrite_info *info
5172de962bdSlukem );
5182de962bdSlukem 
5192de962bdSlukem 
5202de962bdSlukem /*
5212de962bdSlukem  * Vars
5222de962bdSlukem  */
5232de962bdSlukem 
5242de962bdSlukem /*
5252de962bdSlukem  * Finds a var
5262de962bdSlukem  */
5272de962bdSlukem LDAP_REWRITE_F (struct rewrite_var *)
5282de962bdSlukem rewrite_var_find(
5292de962bdSlukem                 Avlnode *tree,
5302de962bdSlukem                 const char *name
5312de962bdSlukem );
5322de962bdSlukem 
5332de962bdSlukem /*
5342de962bdSlukem  * Replaces the value of a variable
5352de962bdSlukem  */
5362de962bdSlukem LDAP_REWRITE_F (int)
5372de962bdSlukem rewrite_var_replace(
5382de962bdSlukem 		struct rewrite_var *var,
5392de962bdSlukem 		const char *value,
5402de962bdSlukem 		int flags
5412de962bdSlukem );
5422de962bdSlukem 
5432de962bdSlukem /*
5442de962bdSlukem  * Inserts a newly created var
5452de962bdSlukem  */
5462de962bdSlukem LDAP_REWRITE_F (struct rewrite_var *)
5472de962bdSlukem rewrite_var_insert_f(
5482de962bdSlukem                 Avlnode **tree,
5492de962bdSlukem                 const char *name,
5502de962bdSlukem                 const char *value,
5512de962bdSlukem 		int flags
5522de962bdSlukem );
5532de962bdSlukem 
5542de962bdSlukem #define rewrite_var_insert(tree, name, value) \
5552de962bdSlukem 	rewrite_var_insert_f((tree), (name), (value), \
5562de962bdSlukem 			REWRITE_VAR_UPDATE|REWRITE_VAR_COPY_NAME|REWRITE_VAR_COPY_VALUE)
5572de962bdSlukem 
5582de962bdSlukem /*
5592de962bdSlukem  * Sets/inserts a var
5602de962bdSlukem  */
5612de962bdSlukem LDAP_REWRITE_F (struct rewrite_var *)
5622de962bdSlukem rewrite_var_set_f(
5632de962bdSlukem                 Avlnode **tree,
5642de962bdSlukem                 const char *name,
5652de962bdSlukem                 const char *value,
5662de962bdSlukem                 int flags
5672de962bdSlukem );
5682de962bdSlukem 
5692de962bdSlukem #define rewrite_var_set(tree, name, value, insert) \
5702de962bdSlukem 	rewrite_var_set_f((tree), (name), (value), \
5712de962bdSlukem 			REWRITE_VAR_UPDATE|REWRITE_VAR_COPY_NAME|REWRITE_VAR_COPY_VALUE|((insert)? REWRITE_VAR_INSERT : 0))
5722de962bdSlukem 
5732de962bdSlukem /*
5742de962bdSlukem  * Deletes a var tree
5752de962bdSlukem  */
5762de962bdSlukem LDAP_REWRITE_F (int)
5772de962bdSlukem rewrite_var_delete(
5782de962bdSlukem                 Avlnode *tree
5792de962bdSlukem );
5802de962bdSlukem 
5812de962bdSlukem 
5822de962bdSlukem /*
5832de962bdSlukem  * Contexts
5842de962bdSlukem  */
5852de962bdSlukem 
5862de962bdSlukem /*
5872de962bdSlukem  * Finds the context named rewriteContext in the context tree
5882de962bdSlukem  */
5892de962bdSlukem LDAP_REWRITE_F (struct rewrite_context *)
5902de962bdSlukem rewrite_context_find(
5912de962bdSlukem 		struct rewrite_info *info,
5922de962bdSlukem 		const char *rewriteContext
5932de962bdSlukem );
5942de962bdSlukem 
5952de962bdSlukem /*
5962de962bdSlukem  * Creates a new context called rewriteContext and stores in into the tree
5972de962bdSlukem  */
5982de962bdSlukem LDAP_REWRITE_F (struct rewrite_context *)
5992de962bdSlukem rewrite_context_create(
6002de962bdSlukem 		struct rewrite_info *info,
6012de962bdSlukem 		const char *rewriteContext
6022de962bdSlukem );
6032de962bdSlukem 
6042de962bdSlukem /*
6052de962bdSlukem  * Rewrites string according to context; may return:
6062de962bdSlukem  *      OK:     fine; if *result != NULL rule matched and rewrite succeeded.
6072de962bdSlukem  *      STOP:   fine, rule matched; stop processing following rules
6082de962bdSlukem  *      UNWILL: rule matched; force 'unwilling to perform'
6092de962bdSlukem  */
6102de962bdSlukem LDAP_REWRITE_F (int)
6112de962bdSlukem rewrite_context_apply(
6122de962bdSlukem 		struct rewrite_info *info,
6132de962bdSlukem 		struct rewrite_op *op,
6142de962bdSlukem 		struct rewrite_context *context,
6152de962bdSlukem 		const char *string,
6162de962bdSlukem 		char **result
6172de962bdSlukem );
6182de962bdSlukem 
6192de962bdSlukem LDAP_REWRITE_F (int)
6202de962bdSlukem rewrite_context_destroy(
6212de962bdSlukem 		struct rewrite_context **context
6222de962bdSlukem );
6232de962bdSlukem 
6242de962bdSlukem LDAP_REWRITE_F (void)
6252de962bdSlukem rewrite_context_free(
6262de962bdSlukem 		void *tmp
6272de962bdSlukem );
6282de962bdSlukem 
6292de962bdSlukem #endif /* REWRITE_INT_H */
6302de962bdSlukem 
631