java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java | 16 ++-
java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml | 7 +
java/code/src/com/redhat/rhn/frontend/xmlrpc/DeleteUserException.java | 40
+++++++
java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java | 12 ++
java/code/src/com/redhat/rhn/manager/user/DeleteSatAdminException.java | 52
++++++++++
java/code/src/com/redhat/rhn/manager/user/UserManager.java | 11 ++
6 files changed, 136 insertions(+), 2 deletions(-)
New commits:
commit 2d5f5fa328b2461ae4884bca56be2ce5615e6722
Author: Devan Goodwin <dgoodwin(a)redhat.com>
Date: Tue Jun 30 15:57:48 2009 -0300
508789 - Block deletion of last remaining Satellite Administrator.
diff --git a/java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java
b/java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java
index 809f4c1..d17484b 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java
@@ -21,6 +21,7 @@ import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.frontend.struts.RequestContext;
import com.redhat.rhn.frontend.struts.RhnAction;
import com.redhat.rhn.manager.acl.AclManager;
+import com.redhat.rhn.manager.user.DeleteSatAdminException;
import com.redhat.rhn.manager.user.UserManager;
import org.apache.struts.action.ActionErrors;
@@ -83,7 +84,20 @@ public class DeleteUserAction extends RhnAction {
return
getStrutsDelegate().forwardParams(mapping.findForward("failure"),
params);
}
- UserManager.deleteUser(loggedInUser, uid);
+
+ try {
+ UserManager.deleteUser(loggedInUser, uid);
+ }
+ catch (DeleteSatAdminException e) {
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("user.cannot.delete.last.sat.admin"));
+ Map params = new HashMap();
+ params.put("uid", uid);
+ addErrors(request, errors);
+ return
getStrutsDelegate().forwardParams(mapping.findForward("failure"),
+ params);
+ }
+
ActionMessages msg = new ActionMessages();
msg.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("user.delete", user.getLogin()));
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
index a1d65ac..32fafc1 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
@@ -1085,6 +1085,13 @@
http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd&q...
</context-group>
</trans-unit>
+ <trans-unit id="user.cannot.delete.last.sat.admin">
+<source>Cannot delete the last remaining satellite administrator.</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/users/DeleteUser</context>
+ </context-group>
+ </trans-unit>
+
<trans-unit id="Users/Servers">
<source>Users/Servers</source>
<context-group name="ctx">
diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/DeleteUserException.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/DeleteUserException.java
new file mode 100644
index 0000000..4d5b2c8
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/DeleteUserException.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2009 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+
+package com.redhat.rhn.frontend.xmlrpc;
+
+import com.redhat.rhn.FaultException;
+import com.redhat.rhn.common.localization.LocalizationService;
+
+/**
+ * Delete User Exception
+ *
+ * Thrown whenever a problem occurs deleting a user.
+ *
+ * @version $Rev$
+ */
+public class DeleteUserException extends FaultException {
+
+ /**
+ * Constructor
+ * @param resourceKey Resource bundle key for error message to return.
+ */
+ public DeleteUserException(String resourceKey) {
+ super(2601, "Error deleting user", LocalizationService.getInstance().
+ getMessage(resourceKey, new Object [] {}));
+ }
+
+}
+
diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java
index 15ae77f..71fcd0c 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java
@@ -14,6 +14,10 @@
*/
package com.redhat.rhn.frontend.xmlrpc.user;
+import com.redhat.rhn.frontend.xmlrpc.DeleteUserException;
+
+import com.redhat.rhn.manager.user.DeleteSatAdminException;
+
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@@ -535,7 +539,13 @@ public class UserHandler extends BaseHandler {
User loggedInUser = getLoggedInUser(sessionKey);
ensureOrgAdmin(loggedInUser);
User target = XmlRpcUserHelper.getInstance().lookupTargetUser(loggedInUser,
login);
- UserManager.deleteUser(loggedInUser, target.getId());
+
+ try {
+ UserManager.deleteUser(loggedInUser, target.getId());
+ }
+ catch (DeleteSatAdminException e) {
+ throw new
DeleteUserException("user.cannot.delete.last.sat.admin");
+ }
return 1;
}
diff --git a/java/code/src/com/redhat/rhn/manager/user/DeleteSatAdminException.java
b/java/code/src/com/redhat/rhn/manager/user/DeleteSatAdminException.java
new file mode 100644
index 0000000..c1d4482
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/manager/user/DeleteSatAdminException.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2009 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.manager.user;
+
+import com.redhat.rhn.common.RhnRuntimeException;
+
+import com.redhat.rhn.domain.user.User;
+
+/**
+ * DeleteSatAdminException
+ *
+ * Exception thrown when we cannot delete a Satellite administrator. (presumably because
+ * they are the last remaining)
+ *
+ * @version $Rev$
+ */
+public class DeleteSatAdminException extends RhnRuntimeException {
+
+ private User targetUser;
+
+ /**
+ * Constructor
+ *
+ * @param targetUserIn User we could not delete.
+ */
+ public DeleteSatAdminException(User targetUserIn) {
+ super();
+ this.targetUser = targetUserIn;
+ }
+
+ /**
+ * Return the target user we could not delete.
+ *
+ * @return target user
+ */
+ public User getTargetUser() {
+ return targetUser;
+ }
+
+}
diff --git a/java/code/src/com/redhat/rhn/manager/user/UserManager.java
b/java/code/src/com/redhat/rhn/manager/user/UserManager.java
index b2c26e1..ae9208f 100644
--- a/java/code/src/com/redhat/rhn/manager/user/UserManager.java
+++ b/java/code/src/com/redhat/rhn/manager/user/UserManager.java
@@ -40,6 +40,7 @@ import com.redhat.rhn.frontend.dto.SystemSearchResult;
import com.redhat.rhn.frontend.listview.PageControl;
import com.redhat.rhn.frontend.taglibs.list.decorators.PageSizeDecorator;
import com.redhat.rhn.manager.BaseManager;
+import com.redhat.rhn.manager.SatManager;
import org.apache.commons.lang.BooleanUtils;
import org.apache.log4j.Logger;
@@ -450,6 +451,16 @@ public class UserManager extends BaseManager {
pex.setLocalizedSummary(ls.getMessage("permission.jsp.summary.deleteuser"));
throw pex;
}
+
+ // Do not allow deletion of the last Satellite Administrator:
+ User toDelete = UserFactory.lookupById(loggedInUser, targetUid);
+ if (toDelete.hasRole(RoleFactory.SAT_ADMIN)) {
+ if (SatManager.getActiveSatAdmins().size() == 1) {
+ log.warn("Cannot delete the last Satellite Administrator");
+ throw new DeleteSatAdminException(toDelete);
+ }
+ }
+
CallableMode m = ModeFactory.getCallableMode("User_queries",
"delete_user");
Map inParams = new HashMap();