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