]> git.sur5r.net Git - openldap/commitdiff
allow to customize the modifiersName of internal modifications (partially addresses...
authorPierangelo Masarati <ando@openldap.org>
Sat, 24 May 2008 11:57:18 +0000 (11:57 +0000)
committerPierangelo Masarati <ando@openldap.org>
Sat, 24 May 2008 11:57:18 +0000 (11:57 +0000)
doc/man/man5/slapo-refint.5
servers/slapd/overlays/refint.c

index 4a4580cf34d935b328289fbcd5c3bccf30ff3545..fc8c3c94b45b6fb20b532d8f05597620f4f3d7f6 100644 (file)
@@ -39,7 +39,7 @@ They should appear after the
 .B overlay
 directive.
 .TP
-.B refint_attributes <attribute...>
+.B refint_attributes <attribute> [...]
 Specify one or more attributes for which integrity will be maintained
 as described above.
 .TP
@@ -49,6 +49,12 @@ would otherwise be deleted from an attribute. This can be useful in cases
 where the schema requires the existence of an attribute for which referential
 integrity is enforced. The attempted deletion of a required attribute will
 otherwise result in an Object Class Violation, causing the request to fail.
+The string must be a valid DN.
+.TP
+.B refint_modifiersname <DN>
+Specify the DN to be used as the modifiersName of the internal modifications
+performed by the overlay.
+It defaults to "\fIcn=Referential Integrity Overlay\fP".
 .B
 .SH FILES
 .TP
index 13c520ecc6992103f69922c602d0c9e7db31752f..a75d0975d0787309f116b2cf3b5dc5e11b5ac344 100644 (file)
@@ -81,6 +81,8 @@ typedef struct refint_data_s {
        BerValue dn;                            /* basedn in parent, */
        BerValue nothing;                       /* the nothing value, if needed */
        BerValue nnothing;                      /* normalized nothingness */
+       BerValue refint_dn;                     /* modifier's name */
+       BerValue refint_ndn;                    /* normalized modifier's name */
        struct re_s *qtask;
        refint_q *qhead;
        refint_q *qtail;
@@ -93,7 +95,8 @@ static MatchingRule   *mr_dnSubtreeMatch;
 
 enum {
        REFINT_ATTRS = 1,
-       REFINT_NOTHING
+       REFINT_NOTHING,
+       REFINT_MODIFIERSNAME
 };
 
 static ConfigDriver refint_cf_gen;
@@ -110,6 +113,11 @@ static ConfigTable refintcfg[] = {
          "( OLcfgOvAt:11.2 NAME 'olcRefintNothing' "
          "DESC 'Replacement DN to supply when needed' "
          "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
+       { "refint_modifiersName", "DN", 2, 2, 0,
+         ARG_DN|ARG_MAGIC|REFINT_MODIFIERSNAME, refint_cf_gen,
+         "( OLcfgOvAt:11.3 NAME 'olcRefintModifiersName' "
+         "DESC 'The DN to use as modifiersName' "
+         "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
        { NULL, NULL, 0, 0, 0, ARG_IGNORED }
 };
 
@@ -118,7 +126,10 @@ static ConfigOCs refintocs[] = {
          "NAME 'olcRefintConfig' "
          "DESC 'Referential integrity configuration' "
          "SUP olcOverlayConfig "
-         "MAY ( olcRefintAttribute $ olcRefintNothing ) )",
+         "MAY ( olcRefintAttribute "
+               "$ olcRefintNothing "
+               "$ olcRefintModifiersName "
+         ") )",
          Cft_Overlay, refintcfg },
        { NULL, 0, NULL }
 };
@@ -157,6 +168,17 @@ refint_cf_gen(ConfigArgs *c)
                        }
                        rc = 0;
                        break;
+               case REFINT_MODIFIERSNAME:
+                       if ( !BER_BVISEMPTY( &dd->refint_dn )) {
+                               rc = value_add_one( &c->rvalue_vals,
+                                                   &dd->refint_dn );
+                               if ( rc ) return rc;
+                               rc = value_add_one( &c->rvalue_nvals,
+                                                   &dd->refint_ndn );
+                               return rc;
+                       }
+                       rc = 0;
+                       break;
                default:
                        abort ();
                }
@@ -196,6 +218,15 @@ refint_cf_gen(ConfigArgs *c)
                        dd->nnothing.bv_len = 0;
                        rc = 0;
                        break;
+               case REFINT_MODIFIERSNAME:
+                       if ( dd->refint_dn.bv_val )
+                               ber_memfree ( dd->refint_dn.bv_val );
+                       if ( dd->refint_ndn.bv_val )
+                               ber_memfree ( dd->refint_ndn.bv_val );
+                       dd->refint_dn.bv_len = 0;
+                       dd->refint_ndn.bv_len = 0;
+                       rc = 0;
+                       break;
                default:
                        abort ();
                }
@@ -233,6 +264,15 @@ refint_cf_gen(ConfigArgs *c)
                        dd->nnothing = c->value_ndn;
                        rc = 0;
                        break;
+               case REFINT_MODIFIERSNAME:
+                       if ( dd->refint_dn.bv_val )
+                               ber_memfree ( dd->refint_dn.bv_val );
+                       if ( dd->refint_ndn.bv_val )
+                               ber_memfree ( dd->refint_ndn.bv_val );
+                       dd->refint_dn = c->value_dn;
+                       dd->refint_ndn = c->value_ndn;
+                       rc = 0;
+                       break;
                default:
                        abort ();
                }
@@ -302,6 +342,10 @@ refint_open(
                        return -1;
                ber_dupbv( &id->dn, &be->be_nsuffix[0] );
        }
+       if ( BER_BVISNULL( &id->refint_dn ) ) {
+               ber_dupbv( &id->refint_dn, &refint_dn );
+               ber_dupbv( &id->refint_ndn, &refint_ndn );
+       }
        return(0);
 }
 
@@ -339,6 +383,10 @@ refint_close(
        BER_BVZERO( &id->nothing );
        ch_free( id->nnothing.bv_val );
        BER_BVZERO( &id->nnothing );
+       ch_free( id->refint_dn.bv_val );
+       BER_BVZERO( &id->refint_dn );
+       ch_free( id->refint_ndn.bv_val );
+       BER_BVZERO( &id->refint_ndn );
 
        return(0);
 }
@@ -580,8 +628,8 @@ refint_repair(
                                m->sml_nvalues = m->sml_values+2;
                                BER_BVZERO( &m->sml_values[1] );
                                BER_BVZERO( &m->sml_nvalues[1] );
-                               m->sml_values[0] = refint_dn;
-                               m->sml_nvalues[0] = refint_ndn;
+                               m->sml_values[0] = id->refint_dn;
+                               m->sml_nvalues[0] = id->refint_ndn;
                        }
                        if ( !BER_BVISEMPTY( &rq->newdn ) || ( ra->next &&
                                ra->attr == ra->next->attr ) )