@@ -1306,38 +1306,6 @@ op_shared_allow_pw_change(Slapi_PBlock *pb, LDAPMod *mod, char **old_pw, Slapi_M
13061306 pwpolicy = new_passwdPolicy (pb , (char * )slapi_sdn_get_ndn (& sdn ));
13071307 internal_op = operation_is_flag_set (operation , OP_FLAG_INTERNAL );
13081308
1309- #ifdef ENABLE_HIBP
1310- /* Check all passwords against breach database before any other checks */
1311- if (pwpolicy -> pw_check_breach && mod -> mod_bvalues ) {
1312- Slapi_Value * * breach_vals = NULL ;
1313- valuearray_init_bervalarray (mod -> mod_bvalues , & breach_vals );
1314- if (breach_vals ) {
1315- for (size_t i = 0 ; breach_vals [i ] != NULL ; i ++ ) {
1316- const char * pwd = slapi_value_get_string (breach_vals [i ]);
1317- if (pwd && !slapi_is_encoded ((char * )pwd )) {
1318- int breach_count = hibp_check_password (pwd , pwpolicy );
1319- if (breach_count > 0 ) {
1320- slapi_log_err (SLAPI_LOG_WARNING , "op_shared_allow_pw_change" ,
1321- "Rejecting password for %s - found in breach database (%d occurrences)\n" ,
1322- dn , breach_count );
1323- if (pwresponse_req == 1 ) {
1324- slapi_pwpolicy_make_response_control (pb , -1 , -1 , LDAP_PWPOLICY_INVALIDPWDSYNTAX );
1325- }
1326- send_ldap_result (pb , LDAP_CONSTRAINT_VIOLATION , NULL ,
1327- "Password found in breach database - choose a different password" , 0 , NULL );
1328- valuearray_free (& breach_vals );
1329- rc = -1 ;
1330- goto done ;
1331- } else if (breach_count < 0 ) {
1332- slapi_log_err (SLAPI_LOG_WARNING , "op_shared_allow_pw_change" ,
1333- "Failed to check password against breach database for %s\n" , dn );
1334- }
1335- }
1336- }
1337- valuearray_free (& breach_vals );
1338- }
1339- }
1340- #endif
13411309 /* internal operation has root permissions for subtrees it is allowed to access */
13421310 if (!internal_op ) {
13431311 /* slapi_acl_check_mods needs an array of LDAPMods, but
@@ -1392,6 +1360,43 @@ op_shared_allow_pw_change(Slapi_PBlock *pb, LDAPMod *mod, char **old_pw, Slapi_M
13921360 /* done with slapi entry e */
13931361 slapi_search_get_entry_done (& entry_pb );
13941362
1363+ #ifdef ENABLE_HIBP
1364+ /*
1365+ * Check password against breach database after ACI validation.
1366+ */
1367+ if (!SLAPI_IS_MOD_DELETE (mod -> mod_op ) &&
1368+ !pw_is_pwp_admin (pb , pwpolicy , PWP_ADMIN_OR_ROOTDN ) &&
1369+ pwpolicy -> pw_check_breach && mod -> mod_bvalues ) {
1370+ Slapi_Value * * breach_vals = NULL ;
1371+ valuearray_init_bervalarray (mod -> mod_bvalues , & breach_vals );
1372+ if (breach_vals ) {
1373+ for (size_t i = 0 ; breach_vals [i ] != NULL ; i ++ ) {
1374+ const char * pwd = slapi_value_get_string (breach_vals [i ]);
1375+ if (pwd && !slapi_is_encoded ((char * )pwd )) {
1376+ int breach_count = hibp_check_password (pwd , pwpolicy );
1377+ if (breach_count > 0 ) {
1378+ slapi_log_err (SLAPI_LOG_PWDPOLICY , PWDPOLICY_DEBUG ,
1379+ "Rejecting password for %s - found in breach database (%d occurrences)\n" ,
1380+ dn , breach_count );
1381+ if (pwresponse_req == 1 ) {
1382+ slapi_pwpolicy_make_response_control (pb , -1 , -1 , LDAP_PWPOLICY_INVALIDPWDSYNTAX );
1383+ }
1384+ send_ldap_result (pb , LDAP_CONSTRAINT_VIOLATION , NULL ,
1385+ "Password found in breach database - choose a different password" , 0 , NULL );
1386+ valuearray_free (& breach_vals );
1387+ rc = -1 ;
1388+ goto done ;
1389+ } else if (breach_count < 0 ) {
1390+ slapi_log_err (SLAPI_LOG_WARNING , "op_shared_allow_pw_change" ,
1391+ "Failed to check password against breach database for %s\n" , dn );
1392+ }
1393+ }
1394+ }
1395+ valuearray_free (& breach_vals );
1396+ }
1397+ }
1398+ #endif
1399+
13951400 /*
13961401 * If this mod is being performed by a password administrator/rootDN,
13971402 * just return success.
0 commit comments