]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/memberof.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / servers / slapd / overlays / memberof.c
index 502cb46fc1bd4f8037fe32dd158d21b4437bf918..c3cc3cfbf02d105a6e801b02dbd0ce63bdc62766 100644 (file)
@@ -817,6 +817,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
                                switch ( ml->sml_op ) {
                                case LDAP_MOD_DELETE:
                                case LDAP_MOD_REPLACE:
+                               case SLAP_MOD_SOFTDEL: /* ITS#7487: can be used by syncrepl (in mirror mode?) */
                                        save_member = 1;
                                        break;
                                }
@@ -844,6 +845,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
                
                                switch ( ml->sml_op ) {
                                case LDAP_MOD_DELETE:
+                               case SLAP_MOD_SOFTDEL: /* ITS#7487: can be used by syncrepl (in mirror mode?) */
                                        /* we don't care about cancellations: if the value
                                         * exists, fine; if it doesn't, we let the underlying
                                         * database fail as appropriate; */
@@ -858,6 +860,8 @@ memberof_op_modify( Operation *op, SlapReply *rs )
                                        }
  
                                case LDAP_MOD_ADD:
+                               case SLAP_MOD_SOFTADD: /* ITS#7487 */
+                               case SLAP_MOD_ADD_IF_NOT_PRESENT: /* ITS#7487 */
                                        /* NOTE: right now, the attributeType we use
                                         * for member must have a normalized value */
                                        assert( ml->sml_nvalues != NULL );
@@ -946,6 +950,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
 
                switch ( ml->sml_op ) {
                case LDAP_MOD_DELETE:
+               case SLAP_MOD_SOFTDEL: /* ITS#7487: can be used by syncrepl (in mirror mode?) */
                        if ( ml->sml_nvalues != NULL ) {
                                AccessControlState      acl_state = ACL_STATE_INIT;
 
@@ -1056,12 +1061,15 @@ memberof_op_modify( Operation *op, SlapReply *rs )
                                goto done2;
                        }
 
-                       if ( ml->sml_op == LDAP_MOD_DELETE || !ml->sml_values ) {
+                       if ( ml->sml_op == LDAP_MOD_DELETE || ml->sml_op == SLAP_MOD_SOFTDEL || !ml->sml_values ) {
                                break;
                        }
                        /* fall thru */
 
-               case LDAP_MOD_ADD: {
+               case LDAP_MOD_ADD:
+               case SLAP_MOD_SOFTADD: /* ITS#7487 */
+               case SLAP_MOD_ADD_IF_NOT_PRESENT: /* ITS#7487 */
+                       {
                        AccessControlState      acl_state = ACL_STATE_INIT;
 
                        for ( i = 0; !BER_BVISNULL( &ml->sml_nvalues[ i ] ); i++ ) {
@@ -1363,6 +1371,7 @@ memberof_res_modify( Operation *op, SlapReply *rs )
 
                switch ( mml->sml_op ) {
                case LDAP_MOD_DELETE:
+               case SLAP_MOD_SOFTDEL: /* ITS#7487: can be used by syncrepl (in mirror mode?) */
                        if ( vals != NULL ) {
                                for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) {
                                        memberof_value_modify( op,
@@ -1396,6 +1405,8 @@ memberof_res_modify( Operation *op, SlapReply *rs )
                        /* fall thru */
 
                case LDAP_MOD_ADD:
+               case SLAP_MOD_SOFTADD: /* ITS#7487 */
+               case SLAP_MOD_ADD_IF_NOT_PRESENT: /* ITS#7487 */
                        assert( vals != NULL );
 
                        for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) {
@@ -1420,6 +1431,7 @@ memberof_res_modify( Operation *op, SlapReply *rs )
 
                        switch ( ml->sml_op ) {
                        case LDAP_MOD_DELETE:
+                       case SLAP_MOD_SOFTDEL: /* ITS#7487: can be used by syncrepl (in mirror mode?) */
                                vals = ml->sml_nvalues;
                                if ( vals != NULL ) {
                                        for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) {
@@ -1445,12 +1457,14 @@ memberof_res_modify( Operation *op, SlapReply *rs )
                                        }
                                }
        
-                               if ( ml->sml_op == LDAP_MOD_DELETE || !ml->sml_values ) {
+                               if ( ml->sml_op == LDAP_MOD_DELETE || ml->sml_op == SLAP_MOD_SOFTDEL || !ml->sml_values ) {
                                        break;
                                }
                                /* fall thru */
        
                        case LDAP_MOD_ADD:
+                       case SLAP_MOD_SOFTADD: /* ITS#7487 */
+                       case SLAP_MOD_ADD_IF_NOT_PRESENT : /* ITS#7487 */
                                assert( ml->sml_nvalues != NULL );
                                vals = ml->sml_nvalues;
                                for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) {