From 369a06a32b57ba6b32dd0b75991f40f1e575f09d Mon Sep 17 00:00:00 2001 From: Guus der Kinderen Date: Wed, 11 Sep 2024 17:26:12 +0200 Subject: [PATCH] Fix compatibility issue with Openfire 4.9.0 Replaced Openfire API usage that was deprecated in Openfire 4.8.0 and removed in 4.9.0, but also API usage that was removed earlier (4.5, 4.6?) This plugin is now compatible with Openfire 4.9.0 and requires 4.8.0 or later. No longer compatible with versions older than 4.8.0. fixes #68 --- changelog.html | 2 + plugin.xml | 4 +- pom.xml | 6 +-- .../openfire/fastpath/FastpathPlugin.java | 34 ++++++----------- .../interceptor/UserInterceptor.java | 29 ++++++++++---- .../xmpp/workgroup/search/ChatSearch.java | 8 ++-- .../workgroup/search/ChatSearchManager.java | 38 ++++++++++--------- src/web/agent-selectors.jsp | 2 +- src/web/interceptors.jsp | 4 +- 9 files changed, 68 insertions(+), 59 deletions(-) diff --git a/changelog.html b/changelog.html index 162befd6e..f2aafab53 100644 --- a/changelog.html +++ b/changelog.html @@ -46,6 +46,8 @@

4.5.1 -- tbd

4.5.0 -- November 20, 2023

diff --git a/plugin.xml b/plugin.xml index 4eefa0429..acefc89fb 100644 --- a/plugin.xml +++ b/plugin.xml @@ -6,8 +6,8 @@ Support for managed queued chat requests, such as a support team might use. Ignite Realtime ${project.version} - 2023-11-20 - 4.1.1 + 2024-09-11 + 4.8.0 fastpath 1 diff --git a/pom.xml b/pom.xml index e094811b0..c13a75602 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ plugins org.igniterealtime.openfire - 4.7.1 + 4.8.0 org.igniterealtime.openfire.plugins fastpath @@ -20,8 +20,8 @@ maven-compiler-plugin 3.3 - 1.8 - 1.8 + 11 + 11 true -XDignore.symbol.file diff --git a/src/java/org/jivesoftware/openfire/fastpath/FastpathPlugin.java b/src/java/org/jivesoftware/openfire/fastpath/FastpathPlugin.java index 2a0cc2812..149117c53 100644 --- a/src/java/org/jivesoftware/openfire/fastpath/FastpathPlugin.java +++ b/src/java/org/jivesoftware/openfire/fastpath/FastpathPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Jive Software. All rights reserved. + * Copyright (C) 2004-2008 Jive Software, 2024 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. @@ -17,7 +17,9 @@ package org.jivesoftware.openfire.fastpath; import java.io.File; -import java.io.FileFilter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.*; import org.jivesoftware.openfire.cluster.ClusterEventListener; @@ -40,9 +42,6 @@ import org.eclipse.jetty.apache.jsp.JettyJasperInitializer; import org.eclipse.jetty.plus.annotation.ContainerInitializer; -import org.eclipse.jetty.server.handler.ContextHandlerCollection; -import org.eclipse.jetty.servlet.*; -import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.webapp.WebAppContext; import org.apache.tomcat.InstanceManager; @@ -64,25 +63,14 @@ public class FastpathPlugin implements Plugin, ClusterEventListener { private WebAppContext context; public void initializePlugin(PluginManager manager, File pluginDirectory) { - // Check if we Enterprise is installed and stop loading this plugin if found - File pluginDir = new File(JiveGlobals.getHomeDirectory(), "plugins"); - File[] jars = pluginDir.listFiles(new FileFilter() { - public boolean accept(File pathname) { - String fileName = pathname.getName().toLowerCase(); - return (fileName.equalsIgnoreCase("enterprise.jar")); - } - }); - if (jars.length > 0) { - // Do not load this plugin since Enterprise is still installed - System.out.println("Enterprise plugin found. Stopping Fastpath Plugin"); - throw new IllegalStateException("This plugin cannot run next to the Enterprise plugin"); - } - // Make sure that the fastpath folder exists under the home directory - File fastpathDir = new File(JiveGlobals.getHomeDirectory() + - File.separator + "fastpath"); - if (!fastpathDir.exists()) { - fastpathDir.mkdirs(); + Path fastpathDir = JiveGlobals.getHomePath().resolve("fastpath"); + if (!Files.exists(fastpathDir)) { + try { + Files.createDirectories(fastpathDir); + } catch (IOException e) { + throw new IllegalStateException("Unable to create fastpath directory: " + fastpathDir, e); + } } workgroupManagerStart(); diff --git a/src/java/org/jivesoftware/xmpp/workgroup/interceptor/UserInterceptor.java b/src/java/org/jivesoftware/xmpp/workgroup/interceptor/UserInterceptor.java index 6b400ba4b..44560fcbe 100644 --- a/src/java/org/jivesoftware/xmpp/workgroup/interceptor/UserInterceptor.java +++ b/src/java/org/jivesoftware/xmpp/workgroup/interceptor/UserInterceptor.java @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2004-2008 Jive Software, 2024 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. + */ package org.jivesoftware.xmpp.workgroup.interceptor; import org.jivesoftware.util.StringUtils; @@ -17,11 +32,11 @@ public class UserInterceptor implements PacketInterceptor { /** * A Map of banned bare JIDs. */ - private Map jidBanMap = new HashMap(); + private Map jidBanMap = new HashMap<>(); /** * A Map of banned domains. */ - private Map domainBanMap = new HashMap(); + private Map domainBanMap = new HashMap<>(); private String fromEmail; private String fromName; private String emailSubject = ""; @@ -130,7 +145,7 @@ public void setEmailNotifyList(String notifyList) { emailNotifyList = null; } else { - emailNotifyList = new ArrayList(); + emailNotifyList = new ArrayList<>(); StringTokenizer tokenizer = new StringTokenizer(notifyList, ","); while (tokenizer.hasMoreTokens()) { String emailAddress = tokenizer.nextToken().trim(); @@ -215,14 +230,14 @@ private void sendNotifications(Packet packet, String packetSender) { return; } for (String toEmail : emailNotifyList) { - body = StringUtils.replace(emailBody, "{packet}", packet.toXML()); - body = StringUtils.replace(body, "{sender}", packetSender); + body = emailBody.replaceAll("\\{packet}", packet.toXML()); + body = body.replaceAll("\\{sender}", packetSender); emailService.sendMessage(null, toEmail, fromName, fromEmail, emailSubject, body, null); } } private static Map getMap(String iPStr) { - Map newMap = new HashMap(); + Map newMap = new HashMap<>(); if (iPStr == null) { return newMap; } @@ -236,7 +251,7 @@ private static Map getMap(String iPStr) { private static String getString(Map map) { - if (map == null || map.size() == 0) { + if (map == null || map.isEmpty()) { return ""; } // Iterate through the elements in the map. diff --git a/src/java/org/jivesoftware/xmpp/workgroup/search/ChatSearch.java b/src/java/org/jivesoftware/xmpp/workgroup/search/ChatSearch.java index b6602f0ae..0832a09d3 100644 --- a/src/java/org/jivesoftware/xmpp/workgroup/search/ChatSearch.java +++ b/src/java/org/jivesoftware/xmpp/workgroup/search/ChatSearch.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Jive Software. All rights reserved. + * Copyright (C) 2004-2008 Jive Software, 2024 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. @@ -334,9 +334,9 @@ else if (beforeDate == null) { } private String stripWildcards(String string) { - string = StringUtils.replace(string, "*", ""); - string = StringUtils.replace(string, "?", ""); - string = StringUtils.replace(string, "~", ""); + string = string.replaceAll("\\*", ""); + string = string.replaceAll("\\?", ""); + string = string.replaceAll("~", ""); return string; } diff --git a/src/java/org/jivesoftware/xmpp/workgroup/search/ChatSearchManager.java b/src/java/org/jivesoftware/xmpp/workgroup/search/ChatSearchManager.java index 6c4e66c38..ee566d510 100644 --- a/src/java/org/jivesoftware/xmpp/workgroup/search/ChatSearchManager.java +++ b/src/java/org/jivesoftware/xmpp/workgroup/search/ChatSearchManager.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Jive Software. All rights reserved. + * Copyright (C) 2004-2008 Jive Software, 2024 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. @@ -19,6 +19,8 @@ import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; +import java.nio.file.Files; +import java.nio.file.Path; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -137,7 +139,7 @@ public class ChatSearchManager implements WorkgroupEventListener { * Holds the path to the parent folder of the folders that will store the workgroup * index files. */ - private static String parentFolder = JiveGlobals.getHomeDirectory() + File.separator + "index"; + private static Path parentFolder = JiveGlobals.getHomePath().resolve("index"); private static final long ONE_HOUR = 60 * 60 * 1000; /** @@ -147,7 +149,7 @@ public class ChatSearchManager implements WorkgroupEventListener { */ private Workgroup workgroup; private Analyzer indexerAnalyzer; - private String searchDirectory; + private Path searchDirectory; private Searcher searcher = null; private IndexReader searcherReader = null; ReadWriteLock searcherLock = new ReentrantReadWriteLock(); @@ -180,9 +182,12 @@ public class ChatSearchManager implements WorkgroupEventListener { static { // Check if we need to create the parent folder - File dir = new File(parentFolder); - if (!dir.exists() || !dir.isDirectory()) { - dir.mkdir(); + if (!Files.exists(parentFolder) || !Files.isDirectory(parentFolder)) { + try { + Files.createDirectories(parentFolder); + } catch (IOException e) { + Log.warn("Unable to create folder: " + parentFolder, e); + } } } @@ -299,7 +304,7 @@ private static int getOptimizationFrequency() { ChatSearchManager(Workgroup workgroup) { this.workgroup = workgroup; - searchDirectory = parentFolder + File.separator + workgroup.getJID().getNode(); + searchDirectory = parentFolder.resolve(workgroup.getJID().getNode()); loadAnalyzer(); loadLastUpdated(); WorkgroupEventDispatcher.addListener(this); @@ -460,9 +465,8 @@ public synchronized void rebuildIndex() throws IOException { * there is a problem adding a document to the index. */ public synchronized void updateIndex(boolean forceUpdate) throws IOException { - // Check that the index files exist - File dir = new File(searchDirectory); - boolean create = !dir.exists() || !dir.isDirectory(); + // Check that the index files exist; + boolean create = !Files.exists(searchDirectory) || !Files.isDirectory(searchDirectory); if (lastUpdated == null || create) { // Recreate the index since it was never created or the index files disappeared rebuildIndex(); @@ -511,12 +515,12 @@ public void delete() { // Ignore. } // Delete index files - String[] files = new File(searchDirectory).list(); + String[] files = searchDirectory.toFile().list(); for (int i = 0; i < files.length; i++) { - File file = new File(searchDirectory, files[i]); + File file = new File(searchDirectory.toFile(), files[i]); file.delete(); } - new File(searchDirectory).delete(); + searchDirectory.toFile().delete(); // Delete dates from the database deleteDates(); // Remove this instance from the list of instances @@ -543,8 +547,8 @@ public void delete() { public Searcher getSearcher() throws IOException { synchronized (indexerAnalyzer) { if (searcherReader == null) { - if (searchDirectory != null && IndexReader.indexExists(searchDirectory)) { - searcherReader = IndexReader.open(searchDirectory); + if (searchDirectory != null && IndexReader.indexExists(searchDirectory.toFile())) { + searcherReader = IndexReader.open(searchDirectory.toFile()); searcher = new IndexSearcher(searcherReader); } else { @@ -553,7 +557,7 @@ public Searcher getSearcher() throws IOException { Log.warn("Search " + "directory not set, you must rebuild the index."); } - else if (!IndexReader.indexExists(searchDirectory)) { + else if (!IndexReader.indexExists(searchDirectory.toFile())) { Log.warn("Search " + "directory " + searchDirectory + " does not appear to " + "be a valid search index. You must rebuild the index."); @@ -945,7 +949,7 @@ private void addTranscriptToIndex(ChatInformation chat, IndexWriter writer) thro * existing index should be used if it's found there. */ private IndexWriter getWriter(boolean create) throws IOException { - IndexWriter writer = new IndexWriter(searchDirectory, indexerAnalyzer, create); + IndexWriter writer = new IndexWriter(searchDirectory.toFile(), indexerAnalyzer, create); return writer; } diff --git a/src/web/agent-selectors.jsp b/src/web/agent-selectors.jsp index 97b4dc67a..7dec76c09 100644 --- a/src/web/agent-selectors.jsp +++ b/src/web/agent-selectors.jsp @@ -88,7 +88,7 @@ "<%= descriptor.getBeanClass().getName() %>", "<%= descriptor.getValue("version") %>", "<%= descriptor.getValue("author") %>", - "<%= StringUtils.replace(descriptor.getShortDescription(), "\"", "\\\"") %>" + "<%= descriptor.getShortDescription().replaceAll("\"", "\\\"") %>" ) <% if ((availableAgentSelectors.size() - i) > 1) { %> , diff --git a/src/web/interceptors.jsp b/src/web/interceptors.jsp index ba5254daa..1ddf65f6d 100644 --- a/src/web/interceptors.jsp +++ b/src/web/interceptors.jsp @@ -192,7 +192,7 @@ } private String escapeHTML(String html) { - html = StringUtils.replace(html, "\"", """); + html = html.replaceAll("\"", """); return StringUtils.escapeHTMLTags(html); } %> @@ -598,7 +598,7 @@ var routerInfo = new Array( "<%= descriptor.getBeanClass().getName() %>", "<%= descriptor.getValue("version") %>", "<%= descriptor.getValue("author") %>", - "<%= StringUtils.replace(descriptor.getShortDescription(), "\"", "\\\"") %>" + "<%= descriptor.getShortDescription().replaceAll("\"", "\\\"") %>" ) <% if ((interceptorManager.getAvailableInterceptors().size() - i) > 1) { %> ,