2003-12-30 02:45:33 +08:00
|
|
|
/* $OpenLDAP$
|
|
|
|
*/
|
|
|
|
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
2001-05-12 08:51:28 +08:00
|
|
|
*
|
2020-01-10 00:50:21 +08:00
|
|
|
* Copyright 2000-2020 The OpenLDAP Foundation.
|
2003-12-30 02:45:33 +08:00
|
|
|
* Portions Copyright 2000-2003 Pierangelo Masarati.
|
2001-05-12 08:51:28 +08:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
2003-12-30 02:45:33 +08:00
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted only as authorized by the OpenLDAP
|
|
|
|
* Public License.
|
2001-12-24 11:49:54 +08:00
|
|
|
*
|
2003-12-30 02:45:33 +08:00
|
|
|
* A copy of this license is available in file LICENSE in the
|
|
|
|
* top-level directory of the distribution or, alternatively, at
|
|
|
|
* <http://www.OpenLDAP.org/license.html>.
|
|
|
|
*/
|
|
|
|
/* ACKNOWLEDGEMENT:
|
|
|
|
* This work was initially developed by Pierangelo Masarati for
|
|
|
|
* inclusion in OpenLDAP Software.
|
|
|
|
*/
|
2001-05-12 08:51:28 +08:00
|
|
|
|
|
|
|
#ifndef REWRITE_H
|
|
|
|
#define REWRITE_H
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Default rewrite context
|
|
|
|
*/
|
|
|
|
#define REWRITE_DEFAULT_CONTEXT "default"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Rewrite engine states
|
|
|
|
*/
|
|
|
|
#define REWRITE_OFF 0x0000
|
|
|
|
#define REWRITE_ON 0x0001
|
|
|
|
#define REWRITE_DEFAULT REWRITE_OFF
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Rewrite internal status returns
|
|
|
|
*/
|
|
|
|
#define REWRITE_SUCCESS LDAP_SUCCESS
|
2005-01-24 05:42:05 +08:00
|
|
|
#define REWRITE_ERR LDAP_OTHER
|
2001-05-12 08:51:28 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Rewrite modes (input values for rewrite_info_init); determine the
|
|
|
|
* behavior in case a null or non existent context is required:
|
2001-12-24 11:49:54 +08:00
|
|
|
*
|
2001-05-12 08:51:28 +08:00
|
|
|
* REWRITE_MODE_ERR error
|
|
|
|
* REWRITE_MODE_OK no error but no rewrite
|
|
|
|
* REWRITE_MODE_COPY_INPUT a copy of the input is returned
|
|
|
|
* REWRITE_MODE_USE_DEFAULT the default context is used.
|
|
|
|
*/
|
|
|
|
#define REWRITE_MODE_ERR 0x0010
|
|
|
|
#define REWRITE_MODE_OK 0x0011
|
|
|
|
#define REWRITE_MODE_COPY_INPUT 0x0012
|
|
|
|
#define REWRITE_MODE_USE_DEFAULT 0x0013
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Rewrite status returns
|
2001-12-24 11:49:54 +08:00
|
|
|
*
|
2001-05-12 08:51:28 +08:00
|
|
|
* REWRITE_REGEXEC_OK success (result may be empty in case
|
|
|
|
* of no match)
|
|
|
|
* REWRITE_REGEXEC_ERR error (internal error,
|
|
|
|
* misconfiguration, map not working ...)
|
|
|
|
* REWRITE_REGEXEC_STOP internal use; never returned
|
|
|
|
* REWRITE_REGEXEC_UNWILLING the server should issue an 'unwilling
|
|
|
|
* to perform' error
|
|
|
|
*/
|
2005-01-24 05:42:05 +08:00
|
|
|
#define REWRITE_REGEXEC_OK (0)
|
|
|
|
#define REWRITE_REGEXEC_ERR (-1)
|
|
|
|
#define REWRITE_REGEXEC_STOP (-2)
|
|
|
|
#define REWRITE_REGEXEC_UNWILLING (-3)
|
|
|
|
#define REWRITE_REGEXEC_USER (1) /* and above: LDAP errors */
|
2001-05-12 08:51:28 +08:00
|
|
|
|
2003-12-28 02:48:06 +08:00
|
|
|
/*
|
|
|
|
* Rewrite variable flags
|
|
|
|
* REWRITE_VAR_INSERT insert mode (default) when adding
|
|
|
|
* a variable; if not set during value
|
|
|
|
* update, the variable is not inserted
|
|
|
|
* if not present
|
|
|
|
* REWRITE_VAR_UPDATE update mode (default) when updating
|
|
|
|
* a variable; if not set during insert,
|
|
|
|
* the value is not updated if the
|
|
|
|
* variable already exists
|
|
|
|
* REWRITE_VAR_COPY_NAME copy the variable name; if not set,
|
|
|
|
* the name is not copied; be sure the
|
|
|
|
* referenced string is available for
|
|
|
|
* the entire life scope of the variable.
|
|
|
|
* REWRITE_VAR_COPY_VALUE copy the variable value; if not set,
|
|
|
|
* the value is not copied; be sure the
|
|
|
|
* referenced string is available for
|
|
|
|
* the entire life scope of the variable.
|
|
|
|
*/
|
2003-12-30 00:14:47 +08:00
|
|
|
#define REWRITE_VAR_NONE 0x0000
|
2003-12-28 02:48:06 +08:00
|
|
|
#define REWRITE_VAR_INSERT 0x0001
|
|
|
|
#define REWRITE_VAR_UPDATE 0x0002
|
|
|
|
#define REWRITE_VAR_COPY_NAME 0x0004
|
|
|
|
#define REWRITE_VAR_COPY_VALUE 0x0008
|
|
|
|
|
2001-05-12 08:51:28 +08:00
|
|
|
/*
|
|
|
|
* Rewrite info
|
|
|
|
*/
|
|
|
|
struct rewrite_info;
|
2001-06-23 09:20:32 +08:00
|
|
|
|
|
|
|
struct berval; /* avoid include */
|
2001-05-12 08:51:28 +08:00
|
|
|
|
2002-01-13 00:11:40 +08:00
|
|
|
LDAP_BEGIN_DECL
|
|
|
|
|
2001-05-12 08:51:28 +08:00
|
|
|
/*
|
|
|
|
* Inits the info
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (struct rewrite_info *)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite_info_init(
|
|
|
|
int mode
|
|
|
|
);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Cleans up the info structure
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (int)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite_info_delete(
|
2003-11-15 02:39:18 +08:00
|
|
|
struct rewrite_info **info
|
2001-05-12 08:51:28 +08:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Parses a config line and takes actions to fit content in rewrite structure;
|
|
|
|
* lines handled are of the form:
|
|
|
|
*
|
|
|
|
* rewriteEngine {on|off}
|
|
|
|
* rewriteMaxPasses numPasses
|
|
|
|
* rewriteContext contextName [alias aliasedRewriteContex]
|
|
|
|
* rewriteRule pattern substPattern [ruleFlags]
|
|
|
|
* rewriteMap mapType mapName [mapArgs]
|
|
|
|
* rewriteParam paramName paramValue
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (int)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite_parse(
|
|
|
|
struct rewrite_info *info,
|
|
|
|
const char *fname,
|
|
|
|
int lineno,
|
|
|
|
int argc,
|
|
|
|
char **argv
|
|
|
|
);
|
2002-01-03 07:53:23 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* process a config file that was already opened. Uses rewrite_parse.
|
|
|
|
*/
|
|
|
|
LDAP_REWRITE_F (int)
|
|
|
|
rewrite_read(
|
|
|
|
FILE *fin,
|
|
|
|
struct rewrite_info *info
|
|
|
|
);
|
2001-05-12 08:51:28 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Rewrites a string according to context.
|
|
|
|
* If the engine is off, OK is returned, but the return string will be NULL.
|
|
|
|
* In case of 'unwilling to perform', UNWILLING is returned, and the
|
|
|
|
* return string will also be null. The same in case of error.
|
|
|
|
* Otherwise, OK is returned, and result will hold a newly allocated string
|
|
|
|
* with the rewriting.
|
|
|
|
*
|
|
|
|
* What to do in case of non-existing rewrite context is still an issue.
|
|
|
|
* Four possibilities:
|
2001-12-24 11:49:54 +08:00
|
|
|
* - error,
|
|
|
|
* - ok with NULL result,
|
2001-05-12 08:51:28 +08:00
|
|
|
* - ok with copy of string as result,
|
|
|
|
* - use the default rewrite context.
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (int)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite(
|
|
|
|
struct rewrite_info *info,
|
|
|
|
const char *rewriteContext,
|
|
|
|
const char *string,
|
|
|
|
char **result
|
|
|
|
);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Same as above; the cookie relates the rewrite to a session
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (int)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite_session(
|
|
|
|
struct rewrite_info *info,
|
|
|
|
const char *rewriteContext,
|
|
|
|
const char *string,
|
|
|
|
const void *cookie,
|
|
|
|
char **result
|
|
|
|
);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Inits a session
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (struct rewrite_session *)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite_session_init(
|
|
|
|
struct rewrite_info *info,
|
|
|
|
const void *cookie
|
|
|
|
);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Defines and inits a variable with session scope
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (int)
|
2003-12-28 02:48:06 +08:00
|
|
|
rewrite_session_var_set_f(
|
2001-05-12 08:51:28 +08:00
|
|
|
struct rewrite_info *info,
|
|
|
|
const void *cookie,
|
|
|
|
const char *name,
|
2003-12-28 02:48:06 +08:00
|
|
|
const char *value,
|
|
|
|
int flags
|
2001-05-12 08:51:28 +08:00
|
|
|
);
|
|
|
|
|
2003-12-28 02:48:06 +08:00
|
|
|
#define rewrite_session_var_set(info, cookie, name, value) \
|
|
|
|
rewrite_session_var_set_f((info), (cookie), (name), (value), \
|
|
|
|
REWRITE_VAR_INSERT|REWRITE_VAR_UPDATE|REWRITE_VAR_COPY_NAME|REWRITE_VAR_COPY_VALUE)
|
|
|
|
|
2001-05-12 08:51:28 +08:00
|
|
|
/*
|
|
|
|
* Deletes a session
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (int)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite_session_delete(
|
|
|
|
struct rewrite_info *info,
|
|
|
|
const void *cookie
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Params
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Defines and inits a variable with global scope
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (int)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite_param_set(
|
|
|
|
struct rewrite_info *info,
|
|
|
|
const char *name,
|
|
|
|
const char *value
|
|
|
|
);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Gets a var with global scope
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (int)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite_param_get(
|
|
|
|
struct rewrite_info *info,
|
|
|
|
const char *name,
|
|
|
|
struct berval *value
|
|
|
|
);
|
|
|
|
|
2001-12-24 11:49:54 +08:00
|
|
|
/*
|
2001-05-12 08:51:28 +08:00
|
|
|
* Destroys the parameter tree
|
|
|
|
*/
|
2001-12-07 12:03:25 +08:00
|
|
|
LDAP_REWRITE_F (int)
|
2001-05-12 08:51:28 +08:00
|
|
|
rewrite_param_destroy(
|
|
|
|
struct rewrite_info *info
|
|
|
|
);
|
|
|
|
|
2007-01-13 07:20:17 +08:00
|
|
|
/*
|
|
|
|
* Mapping implementations
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct rewrite_mapper;
|
|
|
|
|
|
|
|
typedef void * (rewrite_mapper_config)(
|
|
|
|
const char *fname,
|
|
|
|
int lineno,
|
|
|
|
int argc,
|
|
|
|
char **argv );
|
|
|
|
|
|
|
|
typedef int (rewrite_mapper_apply)(
|
|
|
|
void *ctx,
|
|
|
|
const char *arg,
|
|
|
|
struct berval *retval );
|
|
|
|
|
|
|
|
typedef int (rewrite_mapper_destroy)(
|
|
|
|
void *ctx );
|
|
|
|
|
|
|
|
typedef struct rewrite_mapper {
|
|
|
|
char *rm_name;
|
|
|
|
rewrite_mapper_config *rm_config;
|
|
|
|
rewrite_mapper_apply *rm_apply;
|
|
|
|
rewrite_mapper_destroy *rm_destroy;
|
|
|
|
} rewrite_mapper;
|
|
|
|
|
|
|
|
/* For dynamic loading and unloading of mappers */
|
|
|
|
LDAP_REWRITE_F (int)
|
|
|
|
rewrite_mapper_register(
|
|
|
|
const rewrite_mapper *map );
|
|
|
|
|
|
|
|
LDAP_REWRITE_F (int)
|
|
|
|
rewrite_mapper_unregister(
|
|
|
|
const rewrite_mapper *map );
|
|
|
|
|
|
|
|
LDAP_REWRITE_F (const rewrite_mapper *)
|
|
|
|
rewrite_mapper_find(
|
|
|
|
const char *name );
|
|
|
|
|
2001-05-12 08:51:28 +08:00
|
|
|
LDAP_END_DECL
|
|
|
|
|
|
|
|
#endif /* REWRITE_H */
|