/* slap.h - stand alone ldap server include file */
+/*
+ * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
#ifndef _SLDAPD_H_
#define _SLDAPD_H_
#include <ac/syslog.h>
#include <ac/regex.h>
#include <ac/socket.h>
+#include <ac/time.h>
+
+#ifdef HAVE_CYRUS_SASL
+#include <sasl.h>
+#endif
#include "avl.h"
#include "ldap_log.h"
-#include "lber.h"
-#include "ldap.h"
-
-#include "ldap_schema.h"
+#include <ldap.h>
+#include <ldap_schema.h>
#include "ldap_pvt_thread.h"
#include "ldif.h"
*/
#define LDAP_MOD_SOFTADD 0x1000
+#ifdef DNS_DN
#define DN_DNS 0
#define DN_X500 1
+#endif
#define ON 1
#define OFF (-1)
#define MAXREMATCHES 10
+/* XXYYZ: these macros assume 'x' is an ASCII x */
#define DNSEPARATOR(c) ((c) == ',' || (c) == ';')
#define SEPARATOR(c) ((c) == ',' || (c) == ';' || (c) == '+')
#define SPACE(c) ((c) == ' ' || (c) == '\n')
+
+#define ASCII_LOWER(c) ( (c) >= 'a' && (c) <= 'z' )
+#define ASCII_UPPER(c) ( (c) >= 'A' && (c) <= 'Z' )
+#define ASCII_ALPHA(c) ( ASCII_LOWER(c) || ASCII_UPPER(c) )
+#define ASCII_DIGIT(c) ( (c) >= '0' && (c) <= '9' )
+#define ASCII_ALNUM(c) ( ASCII_ALPHA(c) || ASCII_DIGIT(c) )
+
+#define LEADKEYCHAR(c) ( ASCII_ALPHA(c) )
+#define KEYCHAR(c) ( ASCII_ALNUM(c) || (c) == '-' )
+#define LEADOIDCHAR(c) ( ASCII_DIGIT(c) )
+#define OIDCHAR(c) ( ASCII_DIGIT(c) || (c) == '.' )
+
+#define LEADATTRCHAR(c) ( LEADKEYCHAR(c) || LEADOIDCHAR(c) )
+#define ATTRCHAR(c) ( KEYCHAR((c)) || (c) == '.' )
+
#define NEEDSESCAPE(c) ((c) == '\\' || (c) == '"')
#define SLAP_SCHERR_OUTOFMEM 1
struct slap_op;
struct slap_conn;
+struct replog_moddn {
+ char *newrdn;
+ int deloldrdn;
+ char *newsup;
+};
+
/*
* represents an attribute value assertion (i.e., attr=value)
*/
-typedef struct ava {
+typedef struct slap_ava {
char *ava_type;
struct berval ava_value;
} Ava;
+typedef struct slap_mra {
+ char *mra_rule;
+ char *mra_type;
+ char *mra_value;
+ int mra_dnattrs;
+} Mra;
+
/*
* represents a search filter
*/
-typedef struct filter {
+typedef struct slap_filter {
ber_tag_t f_choice; /* values taken from ldap.h */
union f_un_u {
/* equality, lessorequal, greaterorequal, approx */
Ava f_un_ava;
+ /* extensible */
+ Mra f_un_fra;
+
/* and, or, not */
- struct filter *f_un_complex;
+ struct slap_filter *f_un_complex;
/* substrings */
struct sub {
#define f_ava f_un.f_un_ava
#define f_avtype f_un.f_un_ava.ava_type
#define f_avvalue f_un.f_un_ava.ava_value
+#define f_mra f_un.f_un_mra
+#define f_mrtype f_un.f_un_mra.mra_type
+#define f_mrvalue f_un.f_un_mra.mra_value
+#define f_mrdnaddrs f_un.f_un_mra.mra_dnattrs
#define f_and f_un.f_un_complex
#define f_or f_un.f_un_complex
#define f_not f_un.f_un_complex
#define f_sub_any f_un.f_un_sub.f_un_sub_any
#define f_sub_final f_un.f_un_sub.f_un_sub_final
- struct filter *f_next;
+ struct slap_filter *f_next;
} Filter;
/*
* represents an attribute (type + values + syntax)
*/
-typedef struct attr {
+typedef struct slap_attr {
char *a_type;
struct berval **a_vals;
int a_syntax;
- struct attr *a_next;
+ struct slap_attr *a_next;
} Attribute;
/*
* the id used in the indexes to refer to an entry
*/
typedef unsigned long ID;
-#define NOID ((unsigned long)~0)
+#define NOID ((ID)~0)
/*
* represents an entry in core
*/
-typedef struct entry {
+typedef struct slap_entry {
/*
* The ID field should only be changed before entry is
* inserted into a cache. The ID value is backend
*/
/* the "by" part */
-struct access {
-#define ACL_NONE 0x01
-#define ACL_COMPARE 0x02
-#define ACL_SEARCH 0x04
-#define ACL_READ 0x08
-#define ACL_WRITE 0x10
-#define ACL_SELF 0x40
+typedef struct slap_access {
+
+#define ACL_NONE 0x0001
+#define ACL_AUTH 0x0004
+#define ACL_COMPARE 0x0008
+#define ACL_SEARCH 0x0010
+#define ACL_READ 0x0020
+#define ACL_WRITE 0x0040
+#define ACL_PRIV_MASK 0x00ff
+
+#define ACL_SELF 0x4000
+#define ACL_INVALID (-1)
+
+#define ACL_IS(a,lvl) (((a) & (lvl)) == (lvl))
+
+#define ACL_IS_NONE(a) ACL_IS((a),ACL_SELF)
+#define ACL_IS_AUTH(a) ACL_IS((a),ACL_AUTH)
+#define ACL_IS_COMPARE(a) ACL_IS((a),ACL_COMPARE)
+#define ACL_IS_SEARCH(a) ACL_IS((a),ACL_SEARCH)
+#define ACL_IS_READ(a) ACL_IS((a),ACL_READ)
+#define ACL_IS_WRITE(a) ACL_IS((a),ACL_WRITE)
+#define ACL_IS_SELF(a) ACL_IS((a),ACL_SELF)
+#define ACL_IS_INVALID(a) ((a) == ACL_INVALID)
+
+#define ACL_CLR(a) ((a) = 0)
+#define ACL_SET(a,lvl) ((a) |= (lvl))
+#define ACL_SET_NONE(a) ACL_SET((a),ACL_SELF)
+#define ACL_SET_AUTH(a) ACL_SET((a),ACL_AUTH)
+#define ACL_SET_COMPARE(a) ACL_SET((a),ACL_COMPARE)
+#define ACL_SET_SEARCH(a) ACL_SET((a),ACL_SEARCH)
+#define ACL_SET_READ(a) ACL_SET((a),ACL_READ)
+#define ACL_SET_WRITE(a) ACL_SET((a),ACL_WRITE)
+#define ACL_SET_SELF(a) ACL_SET((a),ACL_SELF)
+#define ACL_SET_INVALID(a) ((a) = ACL_INVALID)
+
+#define ACL_PRIV(a) ((a) & ACL_PRIV_MASK)
+#define ACL_GRANT(a,lvl) (ACL_PRIV(a) >= (lvl))
+
int a_access;
- char *a_dnpat;
- char *a_addrpat;
- char *a_domainpat;
- char *a_dnattr;
+ char *a_dn_pat;
+ char *a_dn_at;
-#ifdef SLAPD_ACLGROUPS
- char *a_group;
- char *a_objectclassvalue;
- char *a_groupattrname;
-#endif
- struct access *a_next;
-};
+ char *a_peername_pat;
+ char *a_sockname_pat;
+
+ char *a_domain_pat;
+ char *a_sockurl_pat;
+
+ /* ACL Groups */
+ char *a_group_pat;
+ char *a_group_oc;
+ char *a_group_at;
+
+ struct slap_access *a_next;
+} Access;
/* the "to" part */
-struct acl {
+typedef struct slap_acl {
/* "to" part: the entries this acl applies to */
Filter *acl_filter;
- regex_t acl_dnre;
- char *acl_dnpat;
+ regex_t acl_dn_re;
+ char *acl_dn_pat;
char **acl_attrs;
/* "by" part: list of who has what access to the entries */
- struct access *acl_access;
+ Access *acl_access;
- struct acl *acl_next;
-};
+ struct slap_acl *acl_next;
+} AccessControl;
/*
* A list of LDAPMods
* represents a backend
*/
-typedef struct backend_info BackendInfo; /* per backend type */
-typedef struct backend_db BackendDB; /* per backend database */
+typedef struct slap_backend_info BackendInfo; /* per backend type */
+typedef struct slap_backend_db BackendDB; /* per backend database */
extern int nBackendInfo;
extern int nBackendDB;
#define nbackends nBackendDB
#define backends backendDB
-struct backend_db {
+struct slap_backend_db {
BackendInfo *bd_info; /* pointer to shared backend info */
/* BackendInfo accessors */
/* these should be renamed from be_ to bd_ */
char **be_suffix; /* the DN suffixes of data in this backend */
char **be_nsuffix; /* the normalized DN suffixes in this backend */
- char **be_suffixAlias; /* the DN suffix aliases of data in this backend */
+ char **be_suffixAlias; /* pairs of DN suffix aliases and deref values */
char *be_root_dn; /* the magic "root" dn for this db */
char *be_root_ndn; /* the magic "root" normalized dn for this db */
char *be_root_pw; /* the magic "root" password for this db */
int be_readonly; /* 1 => db is in "read only" mode */
- int be_maxDerefDepth; /* limit for depth of an alias deref */
+ unsigned int be_max_deref_depth; /* limit for depth of an alias deref */
int be_sizelimit; /* size limit for this backend */
int be_timelimit; /* time limit for this backend */
- struct acl *be_acl; /* access control list for this backend */
+ AccessControl *be_acl; /* access control list for this backend */
int be_dfltaccess; /* access given if no acl matches */
char **be_replica; /* replicas of this backend (in master) */
char *be_replogfile; /* replication log file (in master) */
char *be_update_ndn; /* allowed to make changes (in replicas) */
+ struct berval **be_update_refs; /* where to refer modifying clients to */
int be_lastmod; /* keep track of lastmodified{by,time} */
+ char *be_realm;
+
void *be_private; /* anything the backend database needs */
};
-struct backend_info {
+struct slap_backend_info {
char *bi_type; /* type of backend */
/*
int (*bi_op_delete) LDAP_P((BackendDB *bd,
struct slap_conn *c, struct slap_op *o,
char *dn));
- /* Bug: be_op_abandon in unused! */
int (*bi_op_abandon) LDAP_P((BackendDB *bd,
struct slap_conn *c, struct slap_op *o,
ber_int_t msgid));
/* Auxilary Functions */
int (*bi_entry_release_rw) LDAP_P((BackendDB *bd, Entry *e, int rw));
-#ifdef SLAPD_ACLGROUPS
+
int (*bi_acl_group) LDAP_P((Backend *bd,
Entry *e, char *bdn, char *edn,
char *objectclassValue, char *groupattrName ));
-#endif
int (*bi_connection_init) LDAP_P((BackendDB *bd,
struct slap_conn *c));
ber_tag_t o_tag; /* tag of the request */
time_t o_time; /* time op was initiated */
- int o_bind_in_progress; /* multi-op bind in progress */
+ int o_bind_in_progress; /* multi-step bind in progress */
char *o_dn; /* dn bound when op was initiated */
char *o_ndn; /* normalized dn bound when op was initiated */
LDAPControl **o_ctrls; /* controls */
-/* long o_connid; *//* id of conn initiating this op */
+ unsigned long o_connid; /* id of conn initiating this op */
#ifdef LDAP_CONNECTIONLESS
int o_cldap; /* != 0 if this came in via CLDAP */
time_t c_starttime; /* when the connection was opened */
time_t c_activitytime; /* when the connection was last used */
unsigned long c_connid; /* id of this connection for stats*/
- char *c_client_addr; /* address of client */
- char *c_client_name; /* name of client */
+
+ char *c_listener_url; /* listener URL */
+ char *c_peer_domain; /* DNS name of client */
+ char *c_peer_name; /* peer name (trans=addr:port) */
+ char *c_sock_name; /* sock name (trans=addr:port) */
+
+#ifdef HAVE_CYRUS_SASL
+ sasl_conn_t *c_sasl_context;
+#endif
/* only can be changed by binding thread */
int c_bind_in_progress; /* multi-op bind in progress */
char *c_cdn; /* DN provided by the client */
char *c_dn; /* DN bound to this conn */
ber_int_t c_protocol; /* version of the LDAP protocol used by client */
- ber_tag_t c_authtype; /* auth method used to bind c_dn */
+ ber_tag_t c_authtype;/* auth method used to bind c_dn */
char *c_authmech; /* SASL mechanism used to bind c_dn */
+ void *c_authstate; /* SASL state data */
Operation *c_ops; /* list of operations being processed */
Operation *c_pending_ops; /* list of pending operations */
BerElement *c_currentber; /* ber we're attempting to read */
int c_writewaiter; /* true if writer is waiting */
+#ifdef HAVE_TLS
+ int c_is_tls; /* true if this LDAP over raw TLS */
+ int c_needs_tls_accept; /* true if SSL_accept should be called */
+#endif
+
long c_n_ops_received; /* num of ops received (next op_id) */
long c_n_ops_executing; /* num of ops currently executing */
long c_n_ops_pending; /* num of ops pending execution */