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); + } + +}