diff --git a/core/src/main/java/org/jivesoftware/XmppProviders.java b/core/src/main/java/org/jivesoftware/XmppProviders.java
index fb69b6717..29a17ff84 100644
--- a/core/src/main/java/org/jivesoftware/XmppProviders.java
+++ b/core/src/main/java/org/jivesoftware/XmppProviders.java
@@ -17,44 +17,97 @@
package org.jivesoftware;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.jivesoftware.spark.util.log.Log;
+
import javax.swing.*;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Random;
+import static java.util.Arrays.asList;
+
public class XmppProviders {
/**
* Providers A
- * Disabled providers that requires a CAPTCHA
*/
private static final String[] providers = new String[]{
-// "07f.de",
-// "chalec.org",
-// "chapril.org",
-// "chatrix.one",
-// "draugr.de",
-// "hookipa.net",
+ "07f.de",
+ "chalec.org",
+ "chapril.org",
+ "chatrix.one",
+ "draugr.de",
+ "hookipa.net",
"jabber.fr",
-// "macaw.me",
-// "magicbroccoli.de",
-// "nixnet.services",
-// "projectsegfau.lt",
-// "redlibre.es",
-// "suchat.org",
-// "sure.im",
-// "trashserver.net",
+ "macaw.me",
+ "magicbroccoli.de",
+ "nixnet.services",
+ "projectsegfau.lt",
+ "redlibre.es",
+ "suchat.org",
+ "sure.im",
+ "trashserver.net",
"xmpp.earth",
"yax.im",
};
public static ComboBoxModel getXmppProvidersModel() {
DefaultComboBoxModel model = new DefaultComboBoxModel<>();
- for (String provider : providers) {
+ List providersList = downloadProvidersList();
+ if (providersList == null) {
+ // fallback to static list
+ providersList = asList(providers);
+ }
+ for (String provider : providersList) {
model.addElement(provider);
}
// Randomly pre-select a provider
- int randomProviderIdx = new Random().nextInt(providers.length);
- model.setSelectedItem(providers[randomProviderIdx]);
+ int randomProviderIdx = new Random().nextInt(providersList.size());
+ model.setSelectedItem(providersList.get(randomProviderIdx));
return model;
}
+
+ static List downloadProvidersList() {
+ Log.debug("Download providers");
+ try (CloseableHttpClient httpClient = HttpClients.createSystem()) {
+ HttpGet request = new HttpGet("https://data.xmpp.net/providers/v2/providers-As.json");
+ CloseableHttpResponse httpResponse = httpClient.execute(request);
+ final int statusCode = httpResponse.getCode();
+ if (statusCode == 200) {
+ String json = EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
+ return parseProvidersJson(json);
+ }
+ Log.error("Download providers: bad status " + statusCode);
+ return null;
+ } catch (Exception e) {
+ Log.error("Download providers: error", e);
+ return null;
+ }
+ }
+
+ static List parseProvidersJson(String json) {
+ // manually parse JSON array
+ json = json.trim();
+ if (json.charAt(0) != '[' || json.charAt(json.length() - 1) != ']') {
+ return null;
+ }
+ String[] lines = json.substring(1, json.length() - 1).split(",");
+ List providers = new ArrayList<>(lines.length);
+ for (String line : lines) {
+ line = line.trim();
+ if (line.charAt(0) != '"' || line.charAt(line.length() - 1) != '"') {
+ continue;
+ }
+ String provider = line.substring(1, line.length() - 1);
+ providers.add(provider);
+ }
+ return providers;
+ }
}
diff --git a/core/src/test/java/org/jivesoftware/XmppProvidersTest.java b/core/src/test/java/org/jivesoftware/XmppProvidersTest.java
new file mode 100644
index 000000000..abcb867e0
--- /dev/null
+++ b/core/src/test/java/org/jivesoftware/XmppProvidersTest.java
@@ -0,0 +1,22 @@
+package org.jivesoftware;
+
+import org.junit.Test;
+
+import java.util.List;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+
+public class XmppProvidersTest {
+
+ @Test
+ public void testParseProvidersJson() {
+ List providers = XmppProviders.parseProvidersJson("[\n" +
+ " \"07f.de\",\n" +
+ " \"404.city\",\n" +
+ " \"5222.de\"" +
+ "]");
+ assertEquals(asList("07f.de", "404.city", "5222.de"), providers);
+ }
+
+}