]> git.sur5r.net Git - openldap/commitdiff
ITS#8249 add option to return search entry
authorHoward Chu <hyc@openldap.org>
Thu, 17 Sep 2015 19:41:58 +0000 (20:41 +0100)
committerHoward Chu <hyc@openldap.org>
Thu, 17 Sep 2015 19:43:37 +0000 (20:43 +0100)
doc/man/man5/slapd-null.5
servers/slapd/back-null/null.c

index 0026f0436b7b7213d70b6276c9473e6260bd4938..752444d542a9cfc073f2deecaf19146e0bd7c4b1 100644 (file)
@@ -41,6 +41,11 @@ manual page.
 .B bind <on/off>
 Allow binds as any DN in this backend's suffix, with any password.
 The default is "off".
+.TP
+.B dosearch <on/off>
+If enabled, a single entry will be returned on all search requests.
+The entry's DN will be the same as the database suffix.
+The default is "off".
 .SH EXAMPLE
 Here is a possible slapd.conf extract using the Null backend:
 .LP
index d9a7db1908e7a8b99ce3ec7ce364268c302d4eed..4066521b56bb97bf711b4715f57fde2a334b64c6 100644 (file)
 #include "slap.h"
 #include "config.h"
 
-struct null_info {
+typedef struct null_info {
        int     ni_bind_allowed;
+       int ni_dosearch;
        ID      ni_nextid;
-};
-
-static ConfigDriver null_cf_gen;
+       Entry *ni_entry;
+} null_info;
 
 static ConfigTable nullcfg[] = {
-       { "bind", "true|FALSE", 1, 2, 0, ARG_ON_OFF|ARG_MAGIC,
-               null_cf_gen,
+       { "bind", "true|FALSE", 1, 2, 0, ARG_ON_OFF|ARG_OFFSET,
+               (void *)offsetof(null_info, ni_bind_allowed),
                "( OLcfgDbAt:8.1 NAME 'olcDbBindAllowed' "
                "DESC 'Allow binds to this database' "
                "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
+       { "dosearch", "true|FALSE", 1, 2, 0, ARG_ON_OFF|ARG_OFFSET,
+               (void *)offsetof(null_info, ni_dosearch),
+               "( OLcfgDbAt:8.2 NAME 'olcDbDoSearch' "
+               "DESC 'Return an entry on searches' "
+               "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
        { NULL, NULL, 0, 0, 0, ARG_IGNORED,
                NULL, NULL, NULL, NULL }
 };
@@ -48,12 +53,41 @@ static ConfigOCs nullocs[] = {
                "NAME 'olcNullConfig' "
                "DESC 'Null backend ocnfiguration' "
                "SUP olcDatabaseConfig "
-               "MAY ( olcDbBindAllowed ) )",
+               "MAY ( olcDbBindAllowed $ olcDbDoSearch ) )",
                Cft_Database, nullcfg },
        { NULL, 0, NULL }
 };
 
 
+static int
+null_back_db_open( BackendDB *be, ConfigReply *cr )
+{
+       struct null_info *ni = (struct null_info *) be->be_private;
+       struct berval bv[2];
+       AttributeDescription *ad = NULL;
+       const char *text;
+       Entry *e;
+
+       if ( ni->ni_dosearch ) {
+               e = entry_alloc();
+               e->e_name = be->be_suffix[0];
+               e->e_nname = be->be_nsuffix[0];
+
+               dnRdn( &e->e_nname, &bv[0] );
+               bv[1].bv_val = strchr(bv[0].bv_val, '=') + 1;
+               bv[1].bv_len = bv[0].bv_len - (bv[1].bv_val -
+                       bv[0].bv_val);
+               bv[0].bv_len -= bv[1].bv_len + 1;
+               slap_bv2ad( &bv[0], &ad, &text );
+               attr_merge_one( e, ad, &bv[1], NULL );
+
+               ber_str2bv("extensibleObject", 0, 0, &bv[0]);
+               attr_merge_one( e, slap_schema.si_ad_objectClass, &bv[0], NULL);
+               ni->ni_entry = e;
+       }
+       return 0;
+}
+
 /* LDAP operations */
 
 static int
@@ -245,6 +279,21 @@ null_back_false( Operation *op, SlapReply *rs )
        return null_back_respond( op, rs, LDAP_COMPARE_FALSE );
 }
 
+static int
+null_back_search( Operation *op, SlapReply *rs )
+{
+       struct null_info *ni = (struct null_info *) op->o_bd->be_private;
+
+       if ( ni->ni_entry ) {
+               rs->sr_entry = ni->ni_entry;
+               rs->sr_flags = 0;
+
+               rs->sr_attrs = op->ors_attrs;
+               rs->sr_operational_attrs = NULL;
+               send_search_entry( op, rs );
+       }
+       return null_back_respond( op, rs, LDAP_SUCCESS );
+}
 
 /* for overlays */
 static int
@@ -260,6 +309,15 @@ null_back_entry_get(
        return oc || at ? LDAP_NO_SUCH_ATTRIBUTE : LDAP_BUSY;
 }
 
+static int
+null_back_entry_release(
+       Operation *op,
+       Entry *e,
+       int rw )
+{
+       /* we reuse our entry, don't free it */
+       return 0;
+}
 
 /* Slap tools */
 
@@ -310,23 +368,6 @@ null_tool_entry_put( BackendDB *be, Entry *e, struct berval *text )
 
 /* Setup */
 
-static int
-null_cf_gen( ConfigArgs *c )
-{
-       struct null_info *ni = (struct null_info *) c->be->be_private;
-
-       if ( c->op == SLAP_CONFIG_EMIT ) {
-               c->value_int = ni->ni_bind_allowed;
-               return LDAP_SUCCESS;
-       } else if ( c->op == LDAP_MOD_DELETE ) {
-               ni->ni_bind_allowed = 0;
-               return LDAP_SUCCESS;
-       }
-
-       ni->ni_bind_allowed = c->value_int;
-       return LDAP_SUCCESS;
-}
-
 static int
 null_back_db_init( BackendDB *be, ConfigReply *cr )
 {
@@ -341,6 +382,12 @@ null_back_db_init( BackendDB *be, ConfigReply *cr )
 static int
 null_back_db_destroy( Backend *be, ConfigReply *cr )
 {
+       struct null_info *ni = be->be_private;
+
+       if ( ni->ni_entry ) {
+               entry_free( ni->ni_entry );
+               ni->ni_entry = NULL;
+       }
        free( be->be_private );
        return 0;
 }
@@ -379,13 +426,13 @@ null_back_initialize( BackendInfo *bi )
 
        bi->bi_db_init = null_back_db_init;
        bi->bi_db_config = config_generic_wrapper;
-       bi->bi_db_open = 0;
+       bi->bi_db_open = null_back_db_open;
        bi->bi_db_close = 0;
        bi->bi_db_destroy = null_back_db_destroy;
 
        bi->bi_op_bind = null_back_bind;
        bi->bi_op_unbind = 0;
-       bi->bi_op_search = null_back_success;
+       bi->bi_op_search = null_back_search;
        bi->bi_op_compare = null_back_false;
        bi->bi_op_modify = null_back_success;
        bi->bi_op_modrdn = null_back_success;
@@ -401,6 +448,7 @@ null_back_initialize( BackendInfo *bi )
        bi->bi_connection_destroy = 0;
 
        bi->bi_entry_get_rw = null_back_entry_get;
+       bi->bi_entry_release_rw = null_back_entry_release;
 
        bi->bi_tool_entry_open = null_tool_entry_open;
        bi->bi_tool_entry_close = null_tool_entry_close;