diff --git a/i18n/src/main/resources/openfire_i18n.properties b/i18n/src/main/resources/openfire_i18n.properties index 8022c217d9..db90b21592 100644 --- a/i18n/src/main/resources/openfire_i18n.properties +++ b/i18n/src/main/resources/openfire_i18n.properties @@ -2905,6 +2905,7 @@ pubsub.node.affiliates.delete.title=Delete Affiliate pubsub.node.affiliates.delete.info=Affiliation details: pubsub.node.affiliates.delete.info2=Current subscriptions for this affiliation (These will also be deleted): pubsub.node.affiliates.delete.info3=Are you sure you want to delete the affiliation? +pubsub.node.affiliates.delete.confirm=Are you sure you want to delete the affiliation of {0} from node {1}? pubsub.node.affiliates.delete.table.no_subscriptions=This Affiliate has no subscriptions to the Node. pubsub.node.affiliates.delete.delete_affiliate=Delete Affiliate @@ -2925,6 +2926,11 @@ pubsub.node.subscribers.expires=Expires pubsub.node.subscribers.table.info=Current node subscribers are listed in the following table: pubsub.node.subscribers.table.no_subscribers=The Node has no subscribers. pubsub.node.subscribers.deleted=Deleted subscription owned by {0} from the node. +# pubsub.node.subscribers.confirm_delete=Are you sure you want to delete this subscriber? +pubsub.node.subscribers.delete.title=Delete Subscriber +pubsub.node.subscribers.delete.info=Subscriber details: +pubsub.node.subscribers.delete.info3=Are you sure you want to delete the subscriber? +pubsub.node.subscribers.delete.delete_subscriber=Delete Subscriber # PubSub service tab diff --git a/xmppserver/src/main/webapp/pubsub-node-affiliates-delete.jsp b/xmppserver/src/main/webapp/pubsub-node-affiliates-delete.jsp index 23ffc325c4..9adbd40ca5 100644 --- a/xmppserver/src/main/webapp/pubsub-node-affiliates-delete.jsp +++ b/xmppserver/src/main/webapp/pubsub-node-affiliates-delete.jsp @@ -1,6 +1,6 @@ <%-- - - - Copyright (C) 2017-2025 Ignite Realtime Foundation. All rights reserved. + - Copyright (C) 2017-2026 Ignite Realtime Foundation. All rights reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. @@ -47,6 +47,7 @@ String csrfParam = ParamUtils.getParameter(request, "csrf"); String nodeID = ParamUtils.getParameter(request,"nodeID"); String affiliateJID = ParamUtils.getParameter(request,"affiliateJID"); + String affiliationParam = ParamUtils.getParameter(request,"affiliation"); final Map errors = new HashMap<>(); @@ -134,8 +135,14 @@ CookieUtils.setCookie(request, response, "csrf", csrfParam, -1); pageContext.setAttribute("csrf", csrfParam); + String affiliation = affiliationParam; + if (affiliation == null && affiliate != null) { + affiliation = affiliate.getAffiliation().name(); + } + pageContext.setAttribute("node", node); pageContext.setAttribute("affiliate", affiliate); + pageContext.setAttribute("affiliation", affiliation); pageContext.setAttribute("owner", owner); pageContext.setAttribute("errors", errors); %> @@ -171,74 +178,10 @@

- -

- -
- - - - - - - - - - - - - - - -
-
-
-
-

- -

- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - - -
-
-
-
-

- + + + +

@@ -246,6 +189,7 @@ + "> "> diff --git a/xmppserver/src/main/webapp/pubsub-node-affiliates.jsp b/xmppserver/src/main/webapp/pubsub-node-affiliates.jsp index 727c9d9243..032aca7065 100644 --- a/xmppserver/src/main/webapp/pubsub-node-affiliates.jsp +++ b/xmppserver/src/main/webapp/pubsub-node-affiliates.jsp @@ -1,6 +1,6 @@ <%-- - - - Copyright (C) 2017-2025 Ignite Realtime Foundation. All rights reserved. + - Copyright (C) 2017-2026 Ignite Realtime Foundation. All rights reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. @@ -183,7 +183,7 @@ - + @@ -220,6 +220,7 @@ + "> diff --git a/xmppserver/src/main/webapp/pubsub-node-subscriber-delete.jsp b/xmppserver/src/main/webapp/pubsub-node-subscriber-delete.jsp new file mode 100644 index 0000000000..6f8d645ea4 --- /dev/null +++ b/xmppserver/src/main/webapp/pubsub-node-subscriber-delete.jsp @@ -0,0 +1,202 @@ +<%-- + - + - Copyright (C) 2017-2026 Ignite Realtime Foundation. All rights reserved. + - + - Licensed under the Apache License, Version 2.0 (the "License"); + - you may not use this file except in compliance with the License. + - You may obtain a copy of the License at + - + - http://www.apache.org/licenses/LICENSE-2.0 + - + - Unless required by applicable law or agreed to in writing, software + - distributed under the License is distributed on an "AS IS" BASIS, + - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + - See the License for the specific language governing permissions and + - limitations under the License. +--%> +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="org.jivesoftware.openfire.pep.PEPServiceInfo, + org.jivesoftware.openfire.pubsub.NodeSubscription, + org.jivesoftware.openfire.pubsub.PubSubServiceInfo, + org.jivesoftware.util.*, + org.jivesoftware.openfire.pubsub.Node, + org.jivesoftware.openfire.XMPPServer, + org.xmpp.packet.JID, + java.net.URLEncoder, + java.util.HashMap, + java.util.Map" + errorPage="error.jsp" +%> +<%@ page import="java.nio.charset.StandardCharsets" %> + +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="admin" prefix="admin" %> + + +<% webManager.init(request, response, session, application, out ); %> + +<% // Get parameters // + boolean cancel = ParamUtils.getParameter(request,"cancel") != null; + boolean delete = ParamUtils.getParameter(request,"delete") != null; + Cookie csrfCookie = CookieUtils.getCookie(request, "csrf"); + String csrfParam = ParamUtils.getParameter(request, "csrf"); + String nodeID = ParamUtils.getParameter(request,"nodeID"); + String deleteID = ParamUtils.getParameter(request,"deleteID"); + + final Map errors = new HashMap<>(); + + String ownerString = ParamUtils.getParameter( request, "owner" ); + if ( ownerString == null ) + { + ownerString = ParamUtils.getParameter( request, "username" ); + } + + JID owner = null; + if (ownerString != null) + { + if ( ownerString.contains( "@" ) ) + { + owner = new JID( ownerString ).asBareJID(); + } + else + { + owner = XMPPServer.getInstance().createJID( ownerString, null ); + } + } + + if (delete) { + if (csrfCookie == null || csrfParam == null || !csrfCookie.getValue().equals(csrfParam)) { + delete = false; + errors.put("csrf", "CSRF Failure!"); + } + } + + // Handle a cancel + if (cancel) { + response.sendRedirect("pubsub-node-subscribers.jsp?nodeID="+URLEncoder.encode(nodeID, StandardCharsets.UTF_8) + (owner != null ? "&owner=" + URLEncoder.encode(owner.toBareJID(), StandardCharsets.UTF_8) : "")); + return; + } + + PubSubServiceInfo pubSubServiceInfo; + if ( owner == null ) + { + pubSubServiceInfo = webManager.getPubSubInfo(); + } + else + { + pubSubServiceInfo = new PEPServiceInfo( owner ); + } + + // Load the node object + Node node = pubSubServiceInfo.getNode(nodeID); + if (node == null) { + // The requested node does not exist so return to the list of the existing node + response.sendRedirect("pubsub-node-summary.jsp" + (owner != null ? "?owner=" + URLEncoder.encode(owner.toBareJID(), StandardCharsets.UTF_8) : "")); + return; + } + + NodeSubscription subscription = node.getSubscription(deleteID); + + // Handle a subscriber delete: + if (errors.isEmpty() && delete) { + if (subscription != null) { + node.cancelSubscription(subscription); + + // Log the event + webManager.logEvent("Cancelled subscription ID: " + deleteID + ", from node ID: " + nodeID, "Owner: " + subscription.getOwner().toBareJID()); + } + // Done, so redirect + response.sendRedirect("pubsub-node-subscribers.jsp?nodeID=" + URLEncoder.encode(nodeID, StandardCharsets.UTF_8) + + "&deleteSuccess=true" + + (owner != null ? "&owner=" + URLEncoder.encode(owner.toBareJID(), StandardCharsets.UTF_8) : "") + + (subscription != null ? "&ownerOfDeleted=" + URLEncoder.encode(subscription.getOwner().toBareJID(), StandardCharsets.UTF_8) : "")); + return; + } + + csrfParam = StringUtils.randomString(15); + CookieUtils.setCookie(request, response, "csrf", csrfParam, -1); + pageContext.setAttribute("csrf", csrfParam); + + pageContext.setAttribute("node", node); + pageContext.setAttribute("subscription", subscription); + pageContext.setAttribute("owner", owner); + pageContext.setAttribute("errors", errors); +%> + + + + <fmt:message key="pubsub.node.subscribers.delete.title"/> + + + + + + + + + + + + + + + + + + + + : + + () + + + + + +

+ +

+ +
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+
+

+ +

+ + + + + + + + "> + "> + + + + diff --git a/xmppserver/src/main/webapp/pubsub-node-subscribers.jsp b/xmppserver/src/main/webapp/pubsub-node-subscribers.jsp index 5bbe337782..7c1cd9c5f8 100644 --- a/xmppserver/src/main/webapp/pubsub-node-subscribers.jsp +++ b/xmppserver/src/main/webapp/pubsub-node-subscribers.jsp @@ -1,6 +1,6 @@ <%-- - - - Copyright (C) 2017-2025 Ignite Realtime Foundation. All rights reserved. + - Copyright (C) 2017-2026 Ignite Realtime Foundation. All rights reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. @@ -41,7 +41,6 @@ <% // Get parameters String nodeID = ParamUtils.getParameter(request,"nodeID"); - String deleteID = ParamUtils.getParameter(request,"deleteID"); String ownerString = ParamUtils.getParameter( request, "owner" ); if ( ownerString == null ) { @@ -66,13 +65,6 @@ Cookie csrfCookie = CookieUtils.getCookie(request, "csrf"); String csrfParam = ParamUtils.getParameter(request, "csrf"); - if (deleteID != null) { - if (csrfCookie == null || csrfParam == null || !csrfCookie.getValue().equals(csrfParam)) { - deleteID = null; - errors.put("csrf", "CSRF Failure!"); - } - } - // Load the node object PubSubServiceInfo pubSubServiceInfo; if ( owner == null ) @@ -91,22 +83,7 @@ return; } - // Delete specified subscription ID - if (errors.isEmpty() && deleteID != null) { - NodeSubscription subscription = node.getSubscription(deleteID); - if (subscription != null) { - - node.cancelSubscription(subscription); - // Log the event - webManager.logEvent("Cancelled subscription ID: " + deleteID + ", from node ID: " + nodeID, "Owner: " + subscription.getOwner().toBareJID()); - // Done, so redirect - response.sendRedirect("pubsub-node-subscribers.jsp?nodeID=" + URLEncoder.encode(nodeID, StandardCharsets.UTF_8) - + "&deleteSuccess=true" - + (owner != null ? "&owner=" + URLEncoder.encode(owner.toBareJID(), StandardCharsets.UTF_8) : "") - + "&ownerOfDeleted=" + URLEncoder.encode(subscription.getOwner().toBareJID(), StandardCharsets.UTF_8)); - return; - } - } + // No deletion logic here; handled by pubsub-node-subscriber-delete.jsp csrfParam = StringUtils.randomString(15); CookieUtils.setCookie(request, response, "csrf", csrfParam, -1); @@ -235,10 +212,9 @@ - + -
">