diff --git a/changelog.html b/changelog.html index 27cd5726d..2e89159ad 100644 --- a/changelog.html +++ b/changelog.html @@ -44,8 +44,11 @@

Client Control Plugin Changelog

-

2.1.11 Unreleased version

+

2.2.0 March 15, 2026

2.1.10 June 24, 2025

diff --git a/pom.xml b/pom.xml index 43a166573..bb46bfd89 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.igniterealtime.openfire.plugins clientControl - 2.1.11-SNAPSHOT + 2.2.1-SNAPSHOT ClientControl Plugin Controls clients allowed to connect and available features @@ -29,7 +29,7 @@ commons-fileupload commons-fileupload - 1.5 + 1.6.0 diff --git a/src/java/org/jivesoftware/openfire/plugin/ClientControlPlugin.java b/src/java/org/jivesoftware/openfire/plugin/ClientControlPlugin.java index 6f1629195..b58af77be 100644 --- a/src/java/org/jivesoftware/openfire/plugin/ClientControlPlugin.java +++ b/src/java/org/jivesoftware/openfire/plugin/ClientControlPlugin.java @@ -45,6 +45,7 @@ public ClientControlPlugin() { // Plugin Interface + @Override public void initializePlugin(PluginManager manager, File pluginDirectory) { taskEngine = TaskEngine.getInstance(); sparkManager = new SparkManager(taskEngine); @@ -56,13 +57,13 @@ public void initializePlugin(PluginManager manager, File pluginDirectory) { fileTransferFilterManager = new FileTransferFilterManager(); fileTransferFilterManager.start(); - } public FileTransferFilterManager getFileTransferFilterManager() { return fileTransferFilterManager; } + @Override public void destroyPlugin() { if (sparkManager != null) { sparkManager.stop(); diff --git a/src/java/org/jivesoftware/openfire/plugin/spark/SparkManager.java b/src/java/org/jivesoftware/openfire/plugin/spark/SparkManager.java index f5b61588d..433e2b8b3 100644 --- a/src/java/org/jivesoftware/openfire/plugin/spark/SparkManager.java +++ b/src/java/org/jivesoftware/openfire/plugin/spark/SparkManager.java @@ -114,10 +114,12 @@ public SparkManager(TaskEngine taskEngine) { } + @Override public String getName() { return "Features Component"; } + @Override public String getDescription() { return "Allows for discovery of certain features."; } @@ -129,6 +131,7 @@ public String getDescription() { * * @param packet the packet */ + @Override public void processPacket(Packet packet) { if (packet instanceof IQ) { IQ iqPacket = (IQ)packet; @@ -241,10 +244,12 @@ private void handleClientVersion(IQ iq) { } } + @Override public void initialize(JID jid, ComponentManager componentManager) throws ComponentException { // Do nothing. } + @Override public void start() { // Do nothing. } @@ -270,6 +275,7 @@ public void stop() { * Remove any resources SparkManager was using. This will allow * for a clean reload. */ + @Override public void shutdown() { // Cleanup SessionEventDispatcher.removeListener(sessionEventListener); @@ -614,6 +620,7 @@ private class SparkSessionListener implements SessionEventListener { * * @param session the newly created session. */ + @Override public void sessionCreated(final Session session) { // Check to see if Spark is required. String clientsAllowed = JiveGlobals.getProperty("clients.allowed", "all"); @@ -636,18 +643,22 @@ public void run() { * * @param session the session destroyed. */ + @Override public void sessionDestroyed(Session session) { } + @Override public void resourceBound(Session session) { // Do nothing. } + @Override public void anonymousSessionCreated(Session session) { // Ignore. } + @Override public void anonymousSessionDestroyed(Session session) { // Ignore. } diff --git a/src/java/org/jivesoftware/openfire/plugin/spark/SparkUtil.java b/src/java/org/jivesoftware/openfire/plugin/spark/SparkUtil.java deleted file mode 100644 index 74084c5ff..000000000 --- a/src/java/org/jivesoftware/openfire/plugin/spark/SparkUtil.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (C) 1999-2008 Jive Software. 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.openfire.plugin.spark; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -/** - * Utility methods frequently used by data classes and design-time - * classes. - */ -public final class SparkUtil { - - private SparkUtil() { - // Prevent instantiation. - } - - /** - * This is a utility method that compares two objects when one or - * both of the objects might be null The result of - * this method is determined as follows: - *
    - *
  1. If o1 and o2 are the same object - * according to the == operator, return - * true. - *
  2. Otherwise, if either o1 or o2 is - * null, return false. - *
  3. Otherwise, return o1.equals(o2). - *
- *

- * This method produces the exact logically inverted result as the - * {@link #areDifferent(Object, Object)} method.

- *

- * For array types, one of the equals methods in - * {@link java.util.Arrays} should be used instead of this method. - * Note that arrays with more than one dimension will require some - * custom code in order to implement equals properly. - */ - public static final boolean areEqual(Object o1, Object o2) { - if (o1 == o2) { - return true; - } - else if (o1 == null || o2 == null) { - return false; - } - else { - return o1.equals(o2); - } - } - - /** - * This is a utility method that compares two Booleans when one or - * both of the objects might be null The result of - * this method is determined as follows: - *

    - *
  1. If b1 and b2 are both TRUE or - * neither b1 nor b2 is TRUE, - * return true. - *
  2. Otherwise, return false. - *
- *

- * This method produces the exact logically inverted result as the - * areDifferent(Boolean, Boolean) method.

- */ - public static final boolean areBooleansEqual(Boolean b1, Boolean b2) { - // !jwetherb treat NULL the same as Boolean.FALSE - return (b1 == Boolean.TRUE && b2 == Boolean.TRUE) || - (b1 != Boolean.TRUE && b2 != Boolean.TRUE); - } - - /** - * This is a utility method that compares two objects when one or - * both of the objects might be null. The result - * returned by this method is determined as follows: - *

    - *
  1. If o1 and o2 are the same object - * according to the == operator, return - * false. - *
  2. Otherwise, if either o1 or o2 is - * null, return true. - *
  3. Otherwise, return !o1.equals(o2). - *
- *

- * This method produces the exact logically inverted result as the - * {@link #areEqual(Object, Object)} method.

- *

- * For array types, one of the equals methods in - * {@link java.util.Arrays} should be used instead of this method. - * Note that arrays with more than one dimension will require some - * custom code in order to implement equals properly. - */ - public static final boolean areDifferent(Object o1, Object o2) { - return !areEqual(o1, o2); - } - - - /** - * This is a utility method that compares two Booleans when one or - * both of the objects might be null The result of - * this method is determined as follows: - *

    - *
  1. If b1 and b2 are both TRUE or - * neither b1 nor b2 is TRUE, - * return false. - *
  2. Otherwise, return true. - *
- *

- * This method produces the exact logically inverted result as the - * {@link #areBooleansEqual(Boolean, Boolean)} method.

- */ - public static final boolean areBooleansDifferent(Boolean b1, Boolean b2) { - return !areBooleansEqual(b1, b2); - } - - - /** - * Returns true if the specified array is not null - * and contains a non-null element. Returns false - * if the array is null or if all the array elements are null. - */ - public static final boolean hasNonNullElement(Object[] array) { - if (array != null) { - final int n = array.length; - for (int i = 0; i < n; i++) { - if (array[i] != null) { - return true; - } - } - } - return false; - } - - /** - * Returns a single string that is the concatenation of all the - * strings in the specified string array. A single space is - * put between each string array element. Null array elements - * are skipped. If the array itself is null, the empty string - * is returned. This method is guaranteed to return a non-null - * value, if no expections are thrown. - */ - public static final String concat(String[] strs) { - return concat(strs, " "); //NOTRANS - } - - /** - * Returns a single string that is the concatenation of all the - * strings in the specified string array. The strings are separated - * by the specified delimiter. Null array elements are skipped. If - * the array itself is null, the empty string is returned. This - * method is guaranteed to return a non-null value, if no expections - * are thrown. - */ - public static final String concat(String[] strs, String delim) { - if (strs != null) { - final StringBuffer buf = new StringBuffer(); - final int n = strs.length; - for (int i = 0; i < n; i++) { - final String str = strs[i]; - if (str != null) { - buf.append(str).append(delim); - } - } - final int length = buf.length(); - if (length > 0) { - // Trim trailing space. - buf.setLength(length - 1); - } - return buf.toString(); - } - else { - return ""; // NOTRANS - } - } - - /** - * Returns true if the specified {@link String} is not - * null and has a length greater than zero. This is - * a very frequently occurring check. - */ - public static final boolean hasLength(String s) { - return (s != null && s.length() > 0); - } - - - /** - * Returns null if the specified string is empty or - * null. Otherwise the string itself is returned. - */ - public static final String nullifyIfEmpty(String s) { - return hasLength(s) ? s : null; - } - - /** - * Returns null if the specified object is null - * or if its toString() representation is empty. - * Otherwise, the toString() representation of the - * object itself is returned. - */ - public static final String nullifyingToString(Object o) { - return o != null ? nullifyIfEmpty(o.toString()) : null; - } - - /** - * Determines if a string has been changed. - * - * @param oldString is the initial value of the String - * @param newString is the new value of the String - * @return true If both oldString and newString are null or if they are - * both not null and equal to each other. Otherwise returns false. - */ - public static boolean hasStringChanged(String oldString, String newString) { - if (oldString == null && newString == null) { - return false; - } - else if ((oldString == null && newString != null) - || (oldString != null && newString == null)) { - return true; - } - else { - return !oldString.equals(newString); - } - } - - /** - * Returns a formatted String from time. - * - * @param diff the amount of elapsed time. - * @return the formatte String. - */ - public static String getTimeFromLong(long diff) { - final String HOURS = "h"; - final String MINUTES = "min"; - //final String SECONDS = "sec"; - - final long MS_IN_A_DAY = 1000 * 60 * 60 * 24; - final long MS_IN_AN_HOUR = 1000 * 60 * 60; - final long MS_IN_A_MINUTE = 1000 * 60; - final long MS_IN_A_SECOND = 1000; - //Date currentTime = new Date(); - //long numDays = diff / MS_IN_A_DAY; - diff = diff % MS_IN_A_DAY; - long numHours = diff / MS_IN_AN_HOUR; - diff = diff % MS_IN_AN_HOUR; - long numMinutes = diff / MS_IN_A_MINUTE; - diff = diff % MS_IN_A_MINUTE; - //long numSeconds = diff / MS_IN_A_SECOND; - diff = diff % MS_IN_A_SECOND; - //long numMilliseconds = diff; - - StringBuffer buf = new StringBuffer(); - if (numHours > 0) { - buf.append(numHours + " " + HOURS + ", "); - } - - if (numMinutes > 0) { - buf.append(numMinutes + " " + MINUTES); - } - - //buf.append(numSeconds + " " + SECONDS); - - String result = buf.toString(); - - if (numMinutes < 1) { - result = "< 1 minute"; - } - - return result; - } - - - /** - * Build a List of all elements in an Iterator. - */ - public static List iteratorAsList(Iterator i) { - ArrayList list = new ArrayList(10); - while (i.hasNext()) { - list.add(i.next()); - } - return list; - } - - /** - * Creates an Iterator that is the reverse of a ListIterator. - */ - public static Iterator reverseListIterator(ListIterator i) { - return new ReverseListIterator(i); - } -} - -/** - * An Iterator that is the reverse of a ListIterator. - */ -class ReverseListIterator implements Iterator { - private ListIterator listIterator; - - ReverseListIterator(ListIterator i) { - listIterator = i; - while (listIterator.hasNext()) listIterator.next(); - } - - public boolean hasNext() { - return listIterator.hasPrevious(); - } - - public E next() { - return listIterator.previous(); - } - - public void remove() { - listIterator.remove(); - } -} - - - - - - - - - - diff --git a/src/java/org/jivesoftware/openfire/plugin/spark/TaskEngine.java b/src/java/org/jivesoftware/openfire/plugin/spark/TaskEngine.java index df437339a..5b045bdec 100644 --- a/src/java/org/jivesoftware/openfire/plugin/spark/TaskEngine.java +++ b/src/java/org/jivesoftware/openfire/plugin/spark/TaskEngine.java @@ -68,7 +68,7 @@ private TaskEngine() { * * @param task the task to submit. * @return a Future representing pending completion of the task, - * and whose get() method will return null + * and whose get() method will return null * upon completion. * @throws java.util.concurrent.RejectedExecutionException if task cannot be scheduled * for execution. @@ -83,8 +83,8 @@ public Future submit(Runnable task) { * * @param task task to be scheduled. * @param delay delay in milliseconds before task is to be executed. - * @throws IllegalArgumentException if delay is negative, or - * delay + System.currentTimeMillis() is negative. + * @throws IllegalArgumentException if delay is negative, or + * delay + System.currentTimeMillis() is negative. * @throws IllegalStateException if task was already scheduled or * cancelled, or timer was cancelled. */ @@ -98,7 +98,7 @@ public void schedule(TimerTask task, long delay) { * * @param task task to be scheduled. * @param time time at which task is to be executed. - * @throws IllegalArgumentException if time.getTime() is negative. + * @throws IllegalArgumentException if time.getTime() is negative. * @throws IllegalStateException if task was already scheduled or * cancelled, timer was cancelled, or timer thread terminated. */ @@ -117,7 +117,7 @@ public void schedule(TimerTask task, Date time) { * background activity), subsequent executions will be delayed as well. * In the long run, the frequency of execution will generally be slightly * lower than the reciprocal of the specified period (assuming the system - * clock underlying Object.wait(long) is accurate). + * clock underlying Object.wait(long) is accurate). * *

Fixed-delay execution is appropriate for recurring activities * that require "smoothness." In other words, it is appropriate for @@ -131,8 +131,8 @@ public void schedule(TimerTask task, Date time) { * @param task task to be scheduled. * @param delay delay in milliseconds before task is to be executed. * @param period time in milliseconds between successive task executions. - * @throws IllegalArgumentException if delay is negative, or - * delay + System.currentTimeMillis() is negative. + * @throws IllegalArgumentException if delay is negative, or + * delay + System.currentTimeMillis() is negative. * @throws IllegalStateException if task was already scheduled or * cancelled, timer was cancelled, or timer thread terminated. */ @@ -153,7 +153,7 @@ public void schedule(TimerTask task, long delay, long period) { * background activity), subsequent executions will be delayed as well. * In the long run, the frequency of execution will generally be slightly * lower than the reciprocal of the specified period (assuming the system - * clock underlying Object.wait(long) is accurate). + * clock underlying Object.wait(long) is accurate). * *

Fixed-delay execution is appropriate for recurring activities * that require "smoothness." In other words, it is appropriate for @@ -167,7 +167,7 @@ public void schedule(TimerTask task, long delay, long period) { * @param task task to be scheduled. * @param firstTime First time at which task is to be executed. * @param period time in milliseconds between successive task executions. - * @throws IllegalArgumentException if time.getTime() is negative. + * @throws IllegalArgumentException if time.getTime() is negative. * @throws IllegalStateException if task was already scheduled or * cancelled, timer was cancelled, or timer thread terminated. */ @@ -188,7 +188,7 @@ public void schedule(TimerTask task, Date firstTime, long period) { * activity), two or more executions will occur in rapid succession to * "catch up." In the long run, the frequency of execution will be * exactly the reciprocal of the specified period (assuming the system - * clock underlying Object.wait(long) is accurate). + * clock underlying Object.wait(long) is accurate). * *

Fixed-rate execution is appropriate for recurring activities that * are sensitive to absolute time, such as ringing a chime every @@ -203,8 +203,8 @@ public void schedule(TimerTask task, Date firstTime, long period) { * @param task task to be scheduled. * @param delay delay in milliseconds before task is to be executed. * @param period time in milliseconds between successive task executions. - * @throws IllegalArgumentException if delay is negative, or - * delay + System.currentTimeMillis() is negative. + * @throws IllegalArgumentException if delay is negative, or + * delay + System.currentTimeMillis() is negative. * @throws IllegalStateException if task was already scheduled or * cancelled, timer was cancelled, or timer thread terminated. */ @@ -225,7 +225,7 @@ public void scheduleAtFixedRate(TimerTask task, long delay, long period) { * activity), two or more executions will occur in rapid succession to * "catch up." In the long run, the frequency of execution will be * exactly the reciprocal of the specified period (assuming the system - * clock underlying Object.wait(long) is accurate). + * clock underlying Object.wait(long) is accurate). * *

Fixed-rate execution is appropriate for recurring activities that * are sensitive to absolute time, such as ringing a chime every @@ -240,7 +240,7 @@ public void scheduleAtFixedRate(TimerTask task, long delay, long period) { * @param task task to be scheduled. * @param firstTime First time at which task is to be executed. * @param period time in milliseconds between successive task executions. - * @throws IllegalArgumentException if time.getTime() is negative. + * @throws IllegalArgumentException if time.getTime() is negative. * @throws IllegalStateException if task was already scheduled or * cancelled, timer was cancelled, or timer thread terminated. */ diff --git a/src/java/org/jivesoftware/openfire/plugin/spark/manager/SparkDownloadServlet.java b/src/java/org/jivesoftware/openfire/plugin/spark/manager/SparkDownloadServlet.java index 4286845e4..6c291861f 100644 --- a/src/java/org/jivesoftware/openfire/plugin/spark/manager/SparkDownloadServlet.java +++ b/src/java/org/jivesoftware/openfire/plugin/spark/manager/SparkDownloadServlet.java @@ -33,9 +33,8 @@ import java.util.List; /** - * Provides support for downloading the Jive Spark IM client. - * (Spark).

- *

+ * Provides support for downloading the Spark IM client. + * (Spark). * * @author Derek DeMoro */ @@ -49,7 +48,7 @@ public void init(ServletConfig config) throws ServletException { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - // Handle Version Request. Only handle windows and mac version at this time. + // Handle Version Request final String clientBuild = request.getParameter("client"); final String os = request.getParameter("os"); @@ -90,8 +89,8 @@ else if(clientFile.getName().endsWith(".tar.gz") && "linux".equals(os)){ } private void sendClientBuild(HttpServletResponse resp, final String clientBuild) throws IOException { - // Determine release location. All builds should be put into the document_root/releases directory - // and be named appropriatly (ex. spark_1_0_0.exe, spark_1_0_1.dmg) + // Determine release location. All builds should be put into the C:\Program files\Openfire\enterprise\spark or /usr/share/enterprise/spark directory + // and be named appropriately (ex. spark_1_0_0.exe, spark_1_0_1.dmg) Path clientFile = JiveGlobals.getHomePath().resolve("enterprise").resolve("spark").resolve(clientBuild); // Set content size diff --git a/src/java/org/jivesoftware/openfire/plugin/spark/manager/SparkVersionManager.java b/src/java/org/jivesoftware/openfire/plugin/spark/manager/SparkVersionManager.java index 0e30b4aff..97a689a0a 100644 --- a/src/java/org/jivesoftware/openfire/plugin/spark/manager/SparkVersionManager.java +++ b/src/java/org/jivesoftware/openfire/plugin/spark/manager/SparkVersionManager.java @@ -37,12 +37,11 @@ /** * Provides support for server administrators to control the global updating of the Jive Spark IM client. - * (Spark).

- *

+ * (Spark). + *

* The basic functionality is to query the server for the latest client * version and return that information. The version comparison is left to * the client itself, so as to keep the SparkVersionManager simple. - *

* * @author Derek DeMoro */ @@ -66,6 +65,7 @@ public SparkVersionManager() { * * @return the name of this plugin. */ + @Override public String getName() { return "Spark Version Manager"; } @@ -75,10 +75,12 @@ public String getName() { * * @return a brief description of this plugin. */ + @Override public String getDescription() { return "Allow admins to control the updating of the Spark IM Client."; } + @Override public void processPacket(Packet packet) { if (packet instanceof IQ) { IQ iqPacket = (IQ)packet; @@ -121,33 +123,31 @@ private void handleSparkIQ(IQ packet) { Element iq = packet.getChildElement(); // Define default values - String os = iq.element("os").getText(); + Element osElement = iq.element("os"); + String os = osElement != null ? osElement.getText() : null; reply = IQ.createResultIQ(packet); // Handle Invalid Requests if (os == null || (!os.equals("windows") && !os.equals("mac") && !os.equals("linux"))) { reply.setChildElement(packet.getChildElement().createCopy()); - reply.setError(new PacketError(PacketError.Condition.not_acceptable)); + reply.setError(new PacketError(PacketError.Condition.not_acceptable, PacketError.Type.modify, "Invalid OS")); sendPacket(reply); return; } Element sparkElement = reply.setChildElement("query", "jabber:iq:spark"); String client = null; - - // Handle Windows clients - if (os.equals("windows")) { - client = JiveGlobals.getProperty("spark.windows.client"); - } - // Handle Mac clients. - else if (os.equals("mac")) { - client = JiveGlobals.getProperty("spark.mac.client"); - } - - // Handle Linux Client. - else if (os.equals("linux")) { - client = JiveGlobals.getProperty("spark.linux.client"); + switch (os) { + case "windows": // Handle Windows clients + client = JiveGlobals.getProperty("spark.windows.client"); + break; + case "mac": // Handle Mac clients. + client = JiveGlobals.getProperty("spark.mac.client"); + break; + case "linux": // Handle Linux Client. + client = JiveGlobals.getProperty("spark.linux.client"); + break; } if (client != null) { @@ -158,7 +158,7 @@ else if (os.equals("linux")) { int indexOfPeriod = versionNumber.indexOf("."); versionNumber = versionNumber.substring(0, indexOfPeriod); - versionNumber = versionNumber.replaceAll("_", "."); + versionNumber = versionNumber.replace("_", "."); sparkElement.addElement("version").setText(versionNumber); @@ -166,7 +166,7 @@ else if (os.equals("linux")) { Path clientFile = JiveGlobals.getHomePath().resolve("enterprise").resolve("spark").resolve(client); if (!Files.exists(clientFile)) { reply.setChildElement(packet.getChildElement().createCopy()); - reply.setError(new PacketError(PacketError.Condition.item_not_found)); + reply.setError(new PacketError(PacketError.Condition.item_not_found, PacketError.Type.cancel, "Client package not found")); sendPacket(reply); return; } @@ -190,7 +190,7 @@ else if (os.equals("linux")) { } else { reply.setChildElement(packet.getChildElement().createCopy()); - reply.setError(new PacketError(PacketError.Condition.item_not_found)); + reply.setError(new PacketError(PacketError.Condition.item_not_found, PacketError.Type.cancel, "OS client unsupported")); sendPacket(reply); return; } @@ -219,14 +219,17 @@ private void handleDiscoInfo(IQ packet) { sendPacket(replyPacket); } + @Override public void initialize(JID jid, ComponentManager componentManager) throws ComponentException { // Do nothing. } + @Override public void start() { // Do nothing } + @Override public void shutdown() { // Do nothing. } diff --git a/src/web/images/client-icon_atalk.png b/src/web/images/client-icon_atalk.png new file mode 100644 index 000000000..153c12430 Binary files /dev/null and b/src/web/images/client-icon_atalk.png differ diff --git a/src/web/images/client-icon_conversations.png b/src/web/images/client-icon_conversations.png new file mode 100644 index 000000000..23006f8d9 Binary files /dev/null and b/src/web/images/client-icon_conversations.png differ diff --git a/src/web/images/client-icon_exodus.gif b/src/web/images/client-icon_exodus.gif deleted file mode 100644 index 9a2a34505..000000000 Binary files a/src/web/images/client-icon_exodus.gif and /dev/null differ diff --git a/src/web/images/client-icon_gajim.png b/src/web/images/client-icon_gajim.png new file mode 100644 index 000000000..35090592a Binary files /dev/null and b/src/web/images/client-icon_gajim.png differ diff --git a/src/web/images/client-icon_ichat.gif b/src/web/images/client-icon_ichat.gif deleted file mode 100644 index 0fb1bda0e..000000000 Binary files a/src/web/images/client-icon_ichat.gif and /dev/null differ diff --git a/src/web/images/client-icon_jbother.gif b/src/web/images/client-icon_jbother.gif deleted file mode 100644 index d67a74bb0..000000000 Binary files a/src/web/images/client-icon_jbother.gif and /dev/null differ diff --git a/src/web/images/client-icon_kaidan.png b/src/web/images/client-icon_kaidan.png new file mode 100644 index 000000000..17d66b829 Binary files /dev/null and b/src/web/images/client-icon_kaidan.png differ diff --git a/src/web/images/client-icon_pandion.gif b/src/web/images/client-icon_pandion.gif deleted file mode 100644 index 7a71da5f7..000000000 Binary files a/src/web/images/client-icon_pandion.gif and /dev/null differ diff --git a/src/web/permitted-clients.jsp b/src/web/permitted-clients.jsp index 5c40775c8..527a1cb10 100644 --- a/src/web/permitted-clients.jsp +++ b/src/web/permitted-clients.jsp @@ -17,15 +17,15 @@ * Enumeration of possible clients. */ enum Clients { - Spark("Spark", "spark", "http://www.igniterealtime.org/projects/spark/index.jsp", "images/client-icon_spark.gif"), - Adium("Adium", "libgaim", "http://www.adiumx.com/", "images/client-icon_adium.gif"), - Exodus("Exodus", "exodus", "http://exodus.jabberstudio.org/", "images/client-icon_exodus.gif"), - Pidgin("Pidgin", "pidgin", "http://www.pidgin.im/", "images/client-icon_pidgin.gif"), - IChat("IChat", "ichat", "http://www.mac.com/1/ichat.html", "images/client-icon_ichat.gif"), - JBother("JBother", "jbother", "http://www.jbother.org/", "images/client-icon_jbother.gif"), - Pandion("Pandion", "pandion", "http://www.pandion.be/", "images/client-icon_pandion.gif"), - PSI("PSI", "psi", "http://psi-im.org", "images/client-icon_psi.gif"), - Trillian("Trillian", "trillian", "http://www.ceruleanstudios.com/", "images/client-icon_trillian.gif"); + Spark("Spark", "spark", "https://igniterealtime.org/projects/spark/", "images/client-icon_spark.gif"), + Adium("Adium", "libgaim", "https://adium.im/", "images/client-icon_adium.gif"), + Atalk("aTalk", "atalk", "https://cmeng-git.github.io/atalk/", "images/client-icon_atalk.png"), + Conversations("Conversations", "conversations", "https://conversations.im/", "images/client-icon_conversations.png"), + Gajim("Gajim", "gajim", "https://gajim.org/", "images/client-icon_gajim.png"), + Kaidan("Kaidan", "kaidan", "https://kaidan.im/", "images/client-icon_kaidan.png"), + Pidgin("Pidgin", "pidgin", "https://pidgin.im/", "images/client-icon_pidgin.gif"), + PSI("PSI", "psi", "https://psi-im.org", "images/client-icon_psi.gif"), + Trillian("Trillian", "trillian", "https://www.trillian.im/", "images/client-icon_trillian.gif"); private String name; private String version; diff --git a/src/web/spark-form.jsp b/src/web/spark-form.jsp index 998b59055..96fb0c836 100644 --- a/src/web/spark-form.jsp +++ b/src/web/spark-form.jsp @@ -240,7 +240,7 @@ <% for (Path clientFile : list) { Date buildDate = Date.from(Files.getLastModifiedTime(clientFile).toInstant()); - Boolean isSelected = clientFile.getFileName().toString().equals(windowClient); + Boolean isSelected = clientFile.getFileName().toString().equals(macClient); request.setAttribute("fileName", clientFile.getFileName().toString()); request.setAttribute("selected", isSelected); request.setAttribute("buildDate", buildDate); @@ -286,7 +286,7 @@ <% for (Path clientFile : list) { Date buildDate = Date.from(Files.getLastModifiedTime(clientFile).toInstant()); - Boolean isSelected = clientFile.getFileName().toString().equals(windowClient); + Boolean isSelected = clientFile.getFileName().toString().equals(linuxClient); request.setAttribute("fileName", clientFile.getFileName().toString()); request.setAttribute("selected", isSelected); request.setAttribute("buildDate", buildDate);