/* $OpenLDAP$
*/
/* This work is part of OpenLDAP Software .
*
* Copyright 2000-2018 The OpenLDAP Foundation.
* Portions Copyright 2000-2003 Pierangelo Masarati.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted only as authorized by the OpenLDAP
* Public License.
*
* A copy of this license is available in file LICENSE in the
* top-level directory of the distribution or, alternatively, at
* .
*/
/* ACKNOWLEDGEMENT:
* This work was initially developed by Pierangelo Masarati for
* inclusion in OpenLDAP Software.
*/
#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
#define REWRITE_ERR LDAP_OTHER
/*
* Rewrite modes (input values for rewrite_info_init); determine the
* behavior in case a null or non existent context is required:
*
* 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
*
* 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
*/
#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 */
/*
* 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.
*/
#define REWRITE_VAR_NONE 0x0000
#define REWRITE_VAR_INSERT 0x0001
#define REWRITE_VAR_UPDATE 0x0002
#define REWRITE_VAR_COPY_NAME 0x0004
#define REWRITE_VAR_COPY_VALUE 0x0008
/*
* Rewrite info
*/
struct rewrite_info;
struct berval; /* avoid include */
LDAP_BEGIN_DECL
/*
* Inits the info
*/
LDAP_REWRITE_F (struct rewrite_info *)
rewrite_info_init(
int mode
);
/*
* Cleans up the info structure
*/
LDAP_REWRITE_F (int)
rewrite_info_delete(
struct rewrite_info **info
);
/*
* 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
*/
LDAP_REWRITE_F (int)
rewrite_parse(
struct rewrite_info *info,
const char *fname,
int lineno,
int argc,
char **argv
);
/*
* process a config file that was already opened. Uses rewrite_parse.
*/
LDAP_REWRITE_F (int)
rewrite_read(
FILE *fin,
struct rewrite_info *info
);
/*
* 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:
* - error,
* - ok with NULL result,
* - ok with copy of string as result,
* - use the default rewrite context.
*/
LDAP_REWRITE_F (int)
rewrite(
struct rewrite_info *info,
const char *rewriteContext,
const char *string,
char **result
);
/*
* Same as above; the cookie relates the rewrite to a session
*/
LDAP_REWRITE_F (int)
rewrite_session(
struct rewrite_info *info,
const char *rewriteContext,
const char *string,
const void *cookie,
char **result
);
/*
* Inits a session
*/
LDAP_REWRITE_F (struct rewrite_session *)
rewrite_session_init(
struct rewrite_info *info,
const void *cookie
);
/*
* Defines and inits a variable with session scope
*/
LDAP_REWRITE_F (int)
rewrite_session_var_set_f(
struct rewrite_info *info,
const void *cookie,
const char *name,
const char *value,
int flags
);
#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)
/*
* Deletes a session
*/
LDAP_REWRITE_F (int)
rewrite_session_delete(
struct rewrite_info *info,
const void *cookie
);
/*
* Params
*/
/*
* Defines and inits a variable with global scope
*/
LDAP_REWRITE_F (int)
rewrite_param_set(
struct rewrite_info *info,
const char *name,
const char *value
);
/*
* Gets a var with global scope
*/
LDAP_REWRITE_F (int)
rewrite_param_get(
struct rewrite_info *info,
const char *name,
struct berval *value
);
/*
* Destroys the parameter tree
*/
LDAP_REWRITE_F (int)
rewrite_param_destroy(
struct rewrite_info *info
);
/*
* 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 );
LDAP_END_DECL
#endif /* REWRITE_H */