From b2a926948b974ac8c64faf80dd0d3b99583e3f33 Mon Sep 17 00:00:00 2001
From: Noriko Hosoi <nhosoi@redhat.com>
Date: Tue, 26 Jun 2012 16:56:19 -0700
Subject: [PATCH] Trac Ticket 396 - Account Usability Control Not Working [Bug
 835238]

https://fedorahosted.org/389/ticket/396

Fix Description: Commit 003812911f56619f0db58ba627037644fb0f68fb
broke the feature.  This patch is backing off the change so that
get_entry accepts NULL pblock, which is necessary for the
Account Usability plugin.
---
 ldap/servers/slapd/pw.c       |   15 +++++--------
 ldap/servers/slapd/pw_retry.c |   42 +++++++++++++++++++++++-----------------
 2 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/ldap/servers/slapd/pw.c b/ldap/servers/slapd/pw.c
index 8cef61d..93fc899 100644
--- a/ldap/servers/slapd/pw.c
+++ b/ldap/servers/slapd/pw.c
@@ -1548,23 +1548,20 @@ new_passwdPolicy(Slapi_PBlock *pb, const char *dn)
 	slapdFrontendConfig_t *slapdFrontendConfig;
 	int optype = -1;
 
-	/* RFE - is there a way to make this work for non-existent entries 
-	 * when we don't pass in pb?  We'll need to do this if we add support 
-	 * for password policy plug-ins. */
-	if (NULL == pb) {
-		LDAPDebug0Args(LDAP_DEBUG_ANY, 
-		               "new_passwdPolicy: NULL pblock was passed.\n");
-		return NULL;
-	}
 	slapdFrontendConfig = getFrontendConfig();
 	pwdpolicy = (passwdPolicy *)slapi_ch_calloc(1, sizeof(passwdPolicy));
 
-	slapi_pblock_get( pb, SLAPI_OPERATION_TYPE, &optype );
+	if (pb) {
+		slapi_pblock_get( pb, SLAPI_OPERATION_TYPE, &optype );
+	}
 
 	if (dn && (slapdFrontendConfig->pwpolicy_local == 1)) {
 		/*  If we're doing an add, COS does not apply yet so we check
 			parents for the pwdpolicysubentry.  We look only for virtual
 			attributes, because real ones are for single-target policy. */
+		/* RFE - is there a way to make this work for non-existent entries 
+		 * when we don't pass in pb?  We'll need to do this if we add support 
+		 * for password policy plug-ins. */
 		if (optype == SLAPI_OPERATION_ADD) {
 			char *parentdn = slapi_ch_strdup(dn);
 			char *nextdn = NULL;
diff --git a/ldap/servers/slapd/pw_retry.c b/ldap/servers/slapd/pw_retry.c
index 09d0ed0..74e575e 100644
--- a/ldap/servers/slapd/pw_retry.c
+++ b/ldap/servers/slapd/pw_retry.c
@@ -210,43 +210,49 @@ int set_retry_cnt ( Slapi_PBlock *pb, int count)
 }
 
 
+/* 
+ * If "dn" is passed, get_entry returns an entry which dn is "dn".
+ * If "dn" is not passed, it returns an entry which dn is set in 
+ * SLAPI_TARGET_SDN in pblock.
+ * Note: pblock is not mandatory for get_entry (e.g., new_passwdPolicy).
+ */
 Slapi_Entry *get_entry ( Slapi_PBlock *pb, const char *dn)
 {
 	int             search_result = 0;
 	Slapi_Entry     *retentry = NULL;
 	Slapi_DN        *target_sdn = NULL;
+	char            *target_dn = (char *)dn;
 	Slapi_DN        sdn;
 
-	if (NULL == pb) {
-		LDAPDebug(LDAP_DEBUG_ANY, "get_entry - no pblock specified.\n",
-		          0, 0, 0);
-		goto bail;
-	}
-
-	slapi_pblock_get( pb, SLAPI_TARGET_SDN, &target_sdn );
-
-	if (dn == NULL) {
-		dn = slapi_sdn_get_dn(target_sdn);
+	if (pb) {
+		slapi_pblock_get( pb, SLAPI_TARGET_SDN, &target_sdn );
+		if (target_dn == NULL) {
+			target_dn = slapi_sdn_get_dn(target_sdn);
+		}
 	}
 
-	if (dn == NULL) {
-		LDAPDebug (LDAP_DEBUG_TRACE, "WARNING: 'get_entry' - no dn specified.\n", 0, 0, 0);
+	if (target_dn == NULL) {
+		LDAPDebug0Args(LDAP_DEBUG_TRACE,
+		               "WARNING: 'get_entry' - no dn specified.\n");
 		goto bail;
 	}
 
-	slapi_sdn_init_dn_byref(&sdn, dn);
-
-	if (slapi_sdn_compare(&sdn, target_sdn)) { /* does not match */
-	    target_sdn = &sdn;
+	if (target_dn == dn) { /* target_dn is NOT from target_sdn */
+		slapi_sdn_init_dn_byref(&sdn, target_dn);
+		target_sdn = &sdn;
 	}
 
 	search_result = slapi_search_internal_get_entry(target_sdn, NULL,
 	                                                &retentry, 
 	                                                pw_get_componentID());
 	if (search_result != LDAP_SUCCESS) {
-		LDAPDebug (LDAP_DEBUG_TRACE, "WARNING: 'get_entry' can't find entry '%s', err %d\n", dn, search_result, 0);
+		LDAPDebug2Args(LDAP_DEBUG_TRACE,
+		               "WARNING: 'get_entry' can't find entry '%s', err %d\n",
+		               target_dn, search_result);
+	}
+	if (target_dn == dn) { /* target_dn is NOT from target_sdn */
+		slapi_sdn_done(&sdn);
 	}
-	slapi_sdn_done(&sdn);
 bail:
 	return retentry;
 }
-- 
1.7.6.5

