Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Robert Dubner
OpenLDAP
Commits
d2facfe1
Commit
d2facfe1
authored
Dec 16, 2003
by
Kurt Zeilenga
Browse files
Backport -lrewrite fixes (from Ando)
Need to flush CHANGES out (with specific ITS #s)
parent
5cdce96d
Changes
20
Hide whitespace changes
Inline
Side-by-side
CHANGES
View file @
d2facfe1
OpenLDAP 2.1 Change Log
OpenLDAP 2.1.25 Release
Update librewrite (misc bug fixes)
Build Environment
Fix LDBM link bug (ITS#2863)
...
...
INSTALL
View file @
d2facfe1
...
...
@@ -94,8 +94,21 @@ configuration directory (normally /usr/local/etc/openldap).
slapd.conf Standalone LDAP daemon
schema/*.schema Schema Definitions
End of OpenLDAP INSTALL file.
---
$OpenLDAP: pkg/openldap-guide/release/install.sdf,v 1.16 2002/02/18
17:09:26 kurt Exp $
This work is part of OpenLDAP Software <http://www.openldap.org/>.
Copyright 1998-2003 The OpenLDAP Foundation.
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 the file LICENSE in the
top-level directory of the distribution or, alternatively, at
<http://www.OpenLDAP.org/license.html>.
OpenLDAP is a registered trademark of the OpenLDAP Foundation.
build/top.mk
View file @
d2facfe1
...
...
@@ -185,7 +185,6 @@ SECURITY_LIBS = $(SASL_LIBS) $(KRB_LIBS) $(TLS_LIBS) $(AUTH_LIBS)
MODULES_CPPFLAGS
=
@SLAPD_MODULES_CPPFLAGS@
MODULES_LDFLAGS
=
@SLAPD_MODULES_LDFLAGS@
MODULES_LIBS
=
@MODULES_LIBS@
TERMCAP_LIBS
=
@TERMCAP_LIBS@
SLAPD_PERL_LDFLAGS
=
@SLAPD_PERL_LDFLAGS@
SLAPD_SQL_LDFLAGS
=
@SLAPD_SQL_LDFLAGS@
...
...
include/rewrite.h
0 → 100644
View file @
d2facfe1
/******************************************************************************
*
* Copyright (C) 2000 Pierangelo Masarati, <ando@sys-net.it>
* All rights reserved.
*
* Permission is granted to anyone to use this software for any purpose
* on any computer system, and to alter it and redistribute it, subject
* to the following restrictions:
*
* 1. The author is not responsible for the consequences of use of this
* software, no matter how awful, even if they arise from flaws in it.
*
* 2. The origin of this software must not be misrepresented, either by
* explicit claim or by omission. Since few users ever read sources,
* credits should appear in the documentation.
*
* 3. Altered versions must be plainly marked as such, and must not be
* misrepresented as being the original software. Since few users
* ever read sources, credits should appear in the documentation.
*
* 4. This notice may not be removed or altered.
*
******************************************************************************/
#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_OPERATIONS_ERROR
#define REWRITE_NO_SUCH_OBJECT LDAP_NO_SUCH_OBJECT
/*
* 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 0x0000
#define REWRITE_REGEXEC_ERR 0x0001
#define REWRITE_REGEXEC_STOP 0x0002
#define REWRITE_REGEXEC_UNWILLING 0x0004
/*
* 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
(
struct
rewrite_info
*
info
,
const
void
*
cookie
,
const
char
*
name
,
const
char
*
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
);
LDAP_END_DECL
#endif
/* REWRITE_H */
libraries/librewrite/Makefile.in
View file @
d2facfe1
...
...
@@ -8,11 +8,11 @@
##
SRCS
=
config.c context.c info.c ldapmap.c map.c params.c rule.c
\
session.c subst.c var.c
\
session.c subst.c var.c
xmap.c
\
parse.c rewrite.c
XSRCS
=
version.c
OBJS
=
config.o context.o info.o ldapmap.o map.o params.o rule.o
\
session.o subst.o var.o
session.o subst.o var.o
xmap.o
LDAP_INCDIR
=
../../include
LDAP_LIBDIR
=
../../libraries
...
...
@@ -21,7 +21,7 @@ LIBRARY = librewrite.a
PROGRAMS
=
rewrite
XLIBS
=
$(LIBRARY)
$(LDAP_LIBAVL_A)
$(LDAP_LIBLUTIL_A)
\
$(LDAP_LIBLDAP_R_LA)
$(LDAP_LIBLBER_LA)
XXLIBS
=
$(SECURITY_LIBS)
$(LDIF_LIBS)
$(LUTIL_LIBS)
XXLIBS
=
$(SECURITY_LIBS)
$(LUTIL_LIBS)
XXXLIBS
=
$(LTHREAD_LIBS)
rewrite
:
$(XLIBS) rewrite.o parse.o
...
...
libraries/librewrite/config.c
View file @
d2facfe1
...
...
@@ -75,6 +75,7 @@ rewrite_parse(
"[%s:%d] rewriteEngine needs 'state'
\n
%s"
,
fname
,
lineno
,
""
);
return
-
1
;
}
else
if
(
argc
>
2
)
{
Debug
(
LDAP_DEBUG_ANY
,
"[%s:%d] extra fields in rewriteEngine"
...
...
@@ -84,8 +85,10 @@ rewrite_parse(
if
(
strcasecmp
(
argv
[
1
],
"on"
)
==
0
)
{
info
->
li_state
=
REWRITE_ON
;
}
else
if
(
strcasecmp
(
argv
[
1
],
"off"
)
==
0
)
{
info
->
li_state
=
REWRITE_OFF
;
}
else
{
Debug
(
LDAP_DEBUG_ANY
,
"[%s:%d] unknown 'state' in rewriteEngine;"
...
...
@@ -123,12 +126,12 @@ rewrite_parse(
* Checks for existence (lots of contexts should be
* available by default ...)
*/
_
_curr_context
=
rewrite_context_find
(
info
,
argv
[
1
]
);
if
(
_
_curr_context
==
NULL
)
{
_
_curr_context
=
rewrite_context_create
(
info
,
rewrite_int
_curr_context
=
rewrite_context_find
(
info
,
argv
[
1
]
);
if
(
rewrite_int
_curr_context
==
NULL
)
{
rewrite_int
_curr_context
=
rewrite_context_create
(
info
,
argv
[
1
]
);
}
if
(
_
_curr_context
==
NULL
)
{
if
(
rewrite_int
_curr_context
==
NULL
)
{
return
-
1
;
}
...
...
@@ -151,6 +154,7 @@ rewrite_parse(
" 'alias'
\n
%s"
,
fname
,
lineno
,
""
);
return
-
1
;
}
else
if
(
argc
>
4
)
{
Debug
(
LDAP_DEBUG_ANY
,
"[%s:%d] extra fields in"
...
...
@@ -173,8 +177,9 @@ rewrite_parse(
return
-
1
;
}
__curr_context
->
lc_alias
=
aliased
;
__curr_context
=
aliased
;
rewrite_int_curr_context
->
lc_alias
=
aliased
;
rewrite_int_curr_context
=
aliased
;
}
else
{
Debug
(
LDAP_DEBUG_ANY
,
"[%s:%d] extra fields"
...
...
@@ -195,6 +200,7 @@ rewrite_parse(
" 'subst' ['flags']
\n
%s"
,
fname
,
lineno
,
""
);
return
-
1
;
}
else
if
(
argc
>
4
)
{
Debug
(
LDAP_DEBUG_ANY
,
"[%s:%d] extra fields in rewriteRule"
...
...
@@ -202,22 +208,22 @@ rewrite_parse(
fname
,
lineno
,
""
);
}
if
(
_
_curr_context
==
NULL
)
{
if
(
rewrite_int
_curr_context
==
NULL
)
{
Debug
(
LDAP_DEBUG_ANY
,
"[%s:%d] rewriteRule outside a"
" context; will add to default
\n
%s"
,
fname
,
lineno
,
""
);
_
_curr_context
=
rewrite_context_find
(
info
,
rewrite_int
_curr_context
=
rewrite_context_find
(
info
,
REWRITE_DEFAULT_CONTEXT
);
/*
* Default context MUST exist in a properly initialized
* struct rewrite_info
*/
assert
(
_
_curr_context
!=
NULL
);
assert
(
rewrite_int
_curr_context
!=
NULL
);
}
rc
=
rewrite_rule_compile
(
info
,
_
_curr_context
,
argv
[
1
],
rc
=
rewrite_rule_compile
(
info
,
rewrite_int
_curr_context
,
argv
[
1
],
argv
[
2
],
(
argc
==
4
?
argv
[
3
]
:
""
)
);
/*
...
...
libraries/librewrite/context.c
View file @
d2facfe1
...
...
@@ -144,6 +144,7 @@ rewrite_context_create(
free
(
context
);
return
NULL
;
}
memset
(
context
->
lc_rule
,
0
,
sizeof
(
struct
rewrite_rule
)
);
/*
* Add context to tree
...
...
@@ -250,7 +251,7 @@ rewrite_context_apply(
case
REWRITE_REGEXEC_ERR
:
Debug
(
LDAP_DEBUG_ANY
,
"==> rewrite_context_apply"
" error ...
\n
%s%s%s"
,
""
,
""
,
""
);
" error ...
\n
"
,
0
,
0
,
0
);
/*
* Checks for special actions to be taken
...
...
@@ -272,8 +273,7 @@ rewrite_context_apply(
case
REWRITE_ACTION_IGNORE_ERR
:
Debug
(
LDAP_DEBUG_ANY
,
"==> rewrite_context_apply"
" ignoring error ...
\n
%s%s%s"
,
""
,
""
,
""
);
" ignoring error ...
\n
"
,
0
,
0
,
0
);
do_continue
=
1
;
break
;
...
...
@@ -413,3 +413,49 @@ rc_end_of_context:;
return
return_code
;
}
void
rewrite_context_free
(
void
*
tmp
)
{
struct
rewrite_context
*
context
=
(
struct
rewrite_context
*
)
tmp
;
assert
(
tmp
);
rewrite_context_destroy
(
&
context
);
}
int
rewrite_context_destroy
(
struct
rewrite_context
**
pcontext
)
{
struct
rewrite_context
*
context
;
struct
rewrite_rule
*
r
;
assert
(
pcontext
);
assert
(
*
pcontext
);
context
=
*
pcontext
;
assert
(
context
->
lc_rule
);
for
(
r
=
context
->
lc_rule
->
lr_next
;
r
;
)
{
struct
rewrite_rule
*
cr
=
r
;
r
=
r
->
lr_next
;
rewrite_rule_destroy
(
&
cr
);
}
free
(
context
->
lc_rule
);
context
->
lc_rule
=
NULL
;
assert
(
context
->
lc_name
);
free
(
context
->
lc_name
);
context
->
lc_name
=
NULL
;
free
(
context
);
*
pcontext
=
NULL
;
return
0
;
}
libraries/librewrite/info.c
0 → 100644
View file @
d2facfe1
/******************************************************************************
*
* Copyright (C) 2000 Pierangelo Masarati, <ando@sys-net.it>
* All rights reserved.
*
* Permission is granted to anyone to use this software for any purpose
* on any computer system, and to alter it and redistribute it, subject
* to the following restrictions:
*
* 1. The author is not responsible for the consequences of use of this
* software, no matter how awful, even if they arise from flaws in it.
*
* 2. The origin of this software must not be misrepresented, either by
* explicit claim or by omission. Since few users ever read sources,
* credits should appear in the documentation.
*
* 3. Altered versions must be plainly marked as such, and must not be
* misrepresented as being the original software. Since few users
* ever read sources, credits should appear in the documentation.
*
* 4. This notice may not be removed or altered.
*
******************************************************************************/
#include
<portable.h>
#include
"rewrite-int.h"
/*
* Global data
*/
/*
* This becomes the running context for subsequent calls to
* rewrite_parse; it can be altered only by a
* rewriteContext config line or by a change in info.
*/
struct
rewrite_context
*
rewrite_int_curr_context
=
NULL
;
/*
* Inits the info
*/
struct
rewrite_info
*
rewrite_info_init
(
int
mode
)
{
struct
rewrite_info
*
info
;
struct
rewrite_context
*
context
;
switch
(
mode
)
{
case
REWRITE_MODE_ERR
:
case
REWRITE_MODE_OK
:
case
REWRITE_MODE_COPY_INPUT
:
case
REWRITE_MODE_USE_DEFAULT
:
break
;
default:
mode
=
REWRITE_MODE_USE_DEFAULT
;
break
;
/* return NULL */
}
/*
* Resets the running context for parsing ...
*/
rewrite_int_curr_context
=
NULL
;
info
=
calloc
(
sizeof
(
struct
rewrite_info
),
1
);
if
(
info
==
NULL
)
{
return
NULL
;
}
info
->
li_state
=
REWRITE_DEFAULT
;
info
->
li_max_passes
=
REWRITE_MAX_PASSES
;
info
->
li_rewrite_mode
=
mode
;
/*
* Add the default (empty) rule
*/
context
=
rewrite_context_create
(
info
,
REWRITE_DEFAULT_CONTEXT
);
if
(
context
==
NULL
)
{
free
(
info
);
return
NULL
;
}
#ifdef USE_REWRITE_LDAP_PVT_THREADS
if
(
ldap_pvt_thread_rdwr_init
(
&
info
->
li_cookies_mutex
)
)
{
free
(
info
);
return
NULL
;
}
if
(
ldap_pvt_thread_rdwr_init
(
&
info
->
li_params_mutex
)
)
{
free
(
info
);
return
NULL
;
}
#endif
/* USE_REWRITE_LDAP_PVT_THREADS */
return
info
;
}
/*
* Cleans up the info structure
*/
int
rewrite_info_delete
(
struct
rewrite_info
**
pinfo
)
{
struct
rewrite_info
*
info
;
assert
(
pinfo
!=
NULL
);
assert
(
*
pinfo
!=
NULL
);
info
=
*
pinfo
;
if
(
info
->
li_context
)
{
avl_free
(
info
->
li_context
,
rewrite_context_free
);
}
info
->
li_context
=
NULL
;
if
(
info
->
li_maps
)
{
avl_free
(
info
->
li_maps
,
rewrite_builtin_map_free
);
}
info
->
li_context
=
NULL
;
rewrite_session_destroy
(
info
);
#ifdef USE_REWRITE_LDAP_PVT_THREADS
ldap_pvt_thread_rdwr_destroy
(
&
info
->
li_cookies_mutex
);
#endif
/* USE_REWRITE_LDAP_PVT_THREADS */
rewrite_param_destroy
(
info
);
#ifdef USE_REWRITE_LDAP_PVT_THREADS
ldap_pvt_thread_rdwr_destroy
(
&
info
->
li_params_mutex
);
#endif
/* USE_REWRITE_LDAP_PVT_THREADS */
free
(
info
);
*
pinfo
=
NULL
;
return
REWRITE_SUCCESS
;
}
/*
* 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.
*/
int
rewrite
(
struct
rewrite_info
*
info
,
const
char
*
rewriteContext
,
const
char
*
string
,
char
**
result
)
{
return
rewrite_session
(
info
,
rewriteContext
,
string
,
NULL
,
result
);
}
int
rewrite_session
(
struct
rewrite_info
*
info
,
const
char
*
rewriteContext
,
const
char
*
string
,