1/*	$NetBSD: rwm.h,v 1.3 2021/08/14 16:15:02 christos Exp $	*/
2
3/* rwm.h - dn rewrite/attribute mapping header file */
4/* $OpenLDAP$ */
5/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6 *
7 * Copyright 1999-2021 The OpenLDAP Foundation.
8 * Portions Copyright 1999-2003 Howard Chu.
9 * Portions Copyright 2000-2003 Pierangelo Masarati.
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted only as authorized by the OpenLDAP
14 * Public License.
15 *
16 * A copy of this license is available in the file LICENSE in the
17 * top-level directory of the distribution or, alternatively, at
18 * <http://www.OpenLDAP.org/license.html>.
19 */
20/* ACKNOWLEDGEMENTS:
21 * This work was initially developed by the Howard Chu for inclusion
22 * in OpenLDAP Software and subsequently enhanced by Pierangelo
23 * Masarati.
24 */
25
26#ifndef RWM_H
27#define RWM_H
28
29/* String rewrite library */
30#include "rewrite.h"
31
32LDAP_BEGIN_DECL
33
34/* define to enable referral DN massage by default */
35#undef RWM_REFERRAL_REWRITE
36
37struct ldapmap {
38	int drop_missing;
39
40	Avlnode *map;
41	Avlnode *remap;
42};
43
44struct ldapmapping {
45	int			m_flags;
46#define	RWMMAP_F_NONE		0x00
47#define	RWMMAP_F_IS_OC		0x01
48#define RWMMAP_F_FREE_SRC	0x10
49#define RWMMAP_F_FREE_DST	0x20
50	struct berval		m_src;
51	union {
52		AttributeDescription	*m_s_ad;
53		ObjectClass		*m_s_oc;
54	} m_src_ref;
55#define m_src_ad	m_src_ref.m_s_ad
56#define m_src_oc	m_src_ref.m_s_oc
57	struct berval		m_dst;
58	union {
59		AttributeDescription	*m_d_ad;
60		ObjectClass		*m_d_oc;
61	} m_dst_ref;
62#define m_dst_ad	m_dst_ref.m_d_ad
63#define m_dst_oc	m_dst_ref.m_d_oc
64};
65
66struct ldaprwmap {
67	/*
68	 * DN rewriting
69	 */
70	struct rewrite_info *rwm_rw;
71	BerVarray rwm_bva_rewrite;
72
73	/*
74	 * Attribute/objectClass mapping
75	 */
76	struct ldapmap rwm_oc;
77	struct ldapmap rwm_at;
78	BerVarray rwm_bva_map;
79
80#define	RWM_F_NONE			(0x0000U)
81#define	RWM_F_NORMALIZE_MAPPED_ATTRS    (0x0001U)
82#define	RWM_F_DROP_UNREQUESTED_ATTRS	(0x0002U)
83#define	RWM_F_SUPPORT_T_F		(0x4000U)
84#define	RWM_F_SUPPORT_T_F_DISCOVER	(0x8000U)
85#define	RWM_F_SUPPORT_T_F_MASK		(RWM_F_SUPPORT_T_F)
86#define	RWM_F_SUPPORT_T_F_MASK2		(RWM_F_SUPPORT_T_F|RWM_F_SUPPORT_T_F_DISCOVER)
87	unsigned	rwm_flags;
88};
89
90/* Whatever context ldap_back_dn_massage needs... */
91typedef struct dncookie {
92	struct ldaprwmap *rwmap;
93
94	Connection *conn;
95	char *ctx;
96	SlapReply *rs;
97} dncookie;
98
99int rwm_dn_massage( dncookie *dc, struct berval *in, struct berval *dn );
100int rwm_dn_massage_pretty( dncookie *dc, struct berval *in, struct berval *pdn );
101int rwm_dn_massage_normalize( dncookie *dc, struct berval *in, struct berval *ndn );
102int rwm_dn_massage_pretty_normalize( dncookie *dc, struct berval *in, struct berval *pdn, struct berval *ndn );
103
104/* attributeType/objectClass mapping */
105int rwm_mapping_cmp (const void *, const void *);
106int rwm_mapping_dup (void *, void *);
107
108int rwm_map_init ( struct ldapmap *lm, struct ldapmapping ** );
109void rwm_map ( struct ldapmap *map, struct berval *s, struct berval *m,
110	int remap );
111int rwm_mapping ( struct ldapmap *map, struct berval *s,
112		struct ldapmapping **m, int remap );
113#define RWM_MAP		0
114#define RWM_REMAP	1
115char *
116rwm_map_filter(
117		struct ldapmap *at_map,
118		struct ldapmap *oc_map,
119		struct berval *f );
120
121#if 0 /* unused! */
122int
123rwm_map_attrs(
124		struct ldapmap *at_map,
125		AttributeName *a,
126		int remap,
127		char ***mapped_attrs );
128#endif
129
130int
131rwm_map_attrnames(
132		Operation *op,
133		struct ldapmap *at_map,
134		struct ldapmap *oc_map,
135		AttributeName *an,
136		AttributeName **anp,
137		int remap );
138
139extern void rwm_mapping_dst_free ( void *mapping );
140
141extern void rwm_mapping_free ( void *mapping );
142
143extern int rwm_map_config(
144		struct ldapmap	*oc_map,
145		struct ldapmap	*at_map,
146		const char	*fname,
147		int		lineno,
148		int		argc,
149		char		**argv );
150
151extern int
152rwm_filter_map_rewrite(
153		Operation		*op,
154		dncookie		*dc,
155		Filter			*f,
156		struct berval		*fstr );
157
158/* suffix massaging by means of librewrite */
159extern int
160rwm_suffix_massage_config(
161	struct rewrite_info	*info,
162	struct berval		*pvnc,
163	struct berval		*nvnc,
164	struct berval		*prnc,
165	struct berval		*nrnc);
166extern int
167rwm_dnattr_rewrite(
168	Operation		*op,
169	SlapReply		*rs,
170	void			*cookie,
171	BerVarray		a_vals,
172	BerVarray		*pa_nvals );
173extern int
174rwm_referral_rewrite(
175	Operation		*op,
176	SlapReply		*rs,
177	void			*cookie,
178	BerVarray		a_vals,
179	BerVarray		*pa_nvals );
180extern int rwm_dnattr_result_rewrite( dncookie *dc, BerVarray a_vals, BerVarray a_nvals );
181extern int rwm_referral_result_rewrite( dncookie *dc, BerVarray a_vals );
182
183LDAP_END_DECL
184
185#endif /* RWM_H */
186