modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/auth/test/SubjectManagerBeanTest.java
| 33 +++++-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
| 54 +++++-----
2 files changed, 57 insertions(+), 30 deletions(-)
New commits:
commit 8e62d50b8edd576ca3b53ecb9c198d9df288b35d
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Thu May 2 12:55:57 2013 +0200
Bug 952652 - Unable to delete a user who has saved searches objects in the database
Now deleting saved searches prior to deleting the user.
Merged delete methods.
Fail fast if caller tries to delete a superuser.
Added itest for the BZ
diff --git
a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/auth/test/SubjectManagerBeanTest.java
b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/auth/test/SubjectManagerBeanTest.java
index 4b17dc5..9f204dd 100644
---
a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/auth/test/SubjectManagerBeanTest.java
+++
b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/auth/test/SubjectManagerBeanTest.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,8 +13,8 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.enterprise.server.auth.test;
@@ -41,6 +41,8 @@ import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.criteria.SubjectCriteria;
+import org.rhq.core.domain.search.SavedSearch;
+import org.rhq.core.domain.search.SearchSubsystem;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
@@ -50,6 +52,7 @@ import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RoleManagerLocal;
+import org.rhq.enterprise.server.search.SavedSearchManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.test.TransactionCallback;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -70,12 +73,14 @@ public class SubjectManagerBeanTest extends AbstractEJB3Test {
private SubjectManagerLocal subjectManager;
private AuthorizationManagerLocal authorizationManager;
private RoleManagerLocal roleManager;
+ private SavedSearchManagerLocal savedSearchManager;
@Override
protected void beforeMethod() {
subjectManager = LookupUtil.getSubjectManager();
authorizationManager = LookupUtil.getAuthorizationManager();
roleManager = LookupUtil.getRoleManager();
+ savedSearchManager = LookupUtil.getSavedSearchManager();
createITestSubject();
}
@@ -756,4 +761,24 @@ public class SubjectManagerBeanTest extends AbstractEJB3Test {
}
});
}
-}
\ No newline at end of file
+
+ public void shouldBeAbleToDeleteASubjectWhoOwnsASavedSearch() {
+ // See
https://bugzilla.redhat.com/show_bug.cgi?id=952652
+ SavedSearch savedSearch = new SavedSearch(SearchSubsystem.GROUP, "fake saved
search", "pipo", subjectManager.getSubjectByName(ITEST_USER));
+ Integer savedSearchId =
savedSearchManager.createSavedSearch(subjectManager.getOverlord(), savedSearch);
+ boolean subjectDeleted = false;
+ try {
+ deleteITestSubject();
+ subjectDeleted = true;
+ } catch (Exception e) {
+ LOG.error("Failed to delete a subject who owns a saved search",
e);
+ fail("Failed to delete a subject who owns a saved search");
+ } finally {
+ // This is only necessary if we failed to delete subject
+ if (!subjectDeleted) {
+ savedSearchManager.deleteSavedSearch(subjectManager.getOverlord(),
savedSearchId);
+ }
+ }
+ }
+
+}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
index c78a1bd..43d955f 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2012 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,8 +13,8 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.enterprise.server.auth;
@@ -59,8 +59,10 @@ import org.rhq.core.domain.common.composite.SystemSettings;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.criteria.RoleCriteria;
+import org.rhq.core.domain.criteria.SavedSearchCriteria;
import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.search.SavedSearch;
import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -75,6 +77,7 @@ import org.rhq.enterprise.server.core.CustomJaasDeploymentServiceMBean;
import org.rhq.enterprise.server.exception.LoginException;
import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
+import org.rhq.enterprise.server.search.SavedSearchManagerLocal;
import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
@@ -117,6 +120,9 @@ public class SubjectManagerBean implements SubjectManagerLocal,
SubjectManagerRe
//@IgnoreDependency
private RepoManagerLocal repoManager;
+ @EJB
+ private SavedSearchManagerLocal savedSearchManager;
+
@Resource
private TimerService timerService;
@@ -661,6 +667,10 @@ public class SubjectManagerBean implements SubjectManagerLocal,
SubjectManagerRe
throw new PermissionException("You cannot remove yourself: " +
doomedSubject.getName());
}
+ if (authorizationManager.isSystemSuperuser(doomedSubject)) {
+ throw new PermissionException("You cannot delete a system root user
- they must always exist");
+ }
+
Set<Role> roles = doomedSubject.getRoles();
doomedSubject.setRoles(new HashSet<Role>()); // clean out roles
@@ -694,7 +704,20 @@ public class SubjectManagerBean implements SubjectManagerLocal,
SubjectManagerRe
}
}
- deleteSubject(doomedSubject);
+ // Delete searches saved by this user
+ SavedSearchCriteria savedSearchCriteria = new SavedSearchCriteria();
+ savedSearchCriteria.addFilterSubjectId(doomedSubjectId);
+ savedSearchCriteria.clearPaging();
+ PageList<SavedSearch> savedSearches =
savedSearchManager.findSavedSearchesByCriteria(subject, savedSearchCriteria);
+ for (SavedSearch savedSearch : savedSearches) {
+ savedSearchManager.deleteSavedSearch(subject, savedSearch.getId());
+ }
+
+
alertNotificationManager.cleanseAlertNotificationBySubject(doomedSubject.getId());
+
+ repoManager.removeOwnershipOfSubject(doomedSubject.getId());
+
+ entityManager.remove(doomedSubject);
}
return;
@@ -709,27 +732,6 @@ public class SubjectManagerBean implements SubjectManagerLocal,
SubjectManagerRe
}
/**
- * Deletes the given {@link Subject} from the database.
- *
- *
- * @param doomedSubject identifies the subject to delete
- *
- * @throws PermissionException if caller tried to delete a system superuser
- */
- private void deleteSubject(Subject doomedSubject) throws PermissionException {
- if (authorizationManager.isSystemSuperuser(doomedSubject)) {
- throw new PermissionException("You cannot delete a system root user -
they must always exist");
- }
-
-
alertNotificationManager.cleanseAlertNotificationBySubject(doomedSubject.getId());
- repoManager.removeOwnershipOfSubject(doomedSubject.getId());
-
- entityManager.remove(doomedSubject);
-
- return;
- }
-
- /**
* Delete a user's principal from the internal database.
*
*
@@ -883,4 +885,4 @@ public class SubjectManagerBean implements SubjectManagerLocal,
SubjectManagerRe
return;
}
-}
\ No newline at end of file
+}