Commit 3e1aa057 authored by Thiago Camargo's avatar Thiago Camargo Committed by thiago

Multiple STUN Servers Support

git-svn-id: http://svn.igniterealtime.org/svn/repos/wildfire/trunk@7647 b35dd754-fafc-0310-a699-88a17e54d16e
parent d0159f47
...@@ -2124,5 +2124,14 @@ stun.settings.secondaryaddress = Sekund\u00e1rn\u00ed adresa ...@@ -2124,5 +2124,14 @@ stun.settings.secondaryaddress = Sekund\u00e1rn\u00ed adresa
stun.settings.primaryport = Prim\u00e1rn\u00ed port stun.settings.primaryport = Prim\u00e1rn\u00ed port
stun.settings.secondaryport = Sekund\u00e1rn\u00ed stun.settings.secondaryport = Sekund\u00e1rn\u00ed
stun.settings.enabled = Povoleno stun.settings.enabled = Povoleno
stun.settings.change = Zm\u011bna stun.settings.change = Zm\u011bna\
stun.external.title = External Stun Servers
stun.external.comment = Server will also send the following address(es) to client.
stun.external.server = Server
stun.external.port = Port
stun.external.error = You must inform Server and Port.
stun.external.add = Add
stun.external.delete = Delete
index.certificate-warning=Found RSA certificate that is not valid for the server domain. index.certificate-warning=Found RSA certificate that is not valid for the server domain.
\ No newline at end of file
...@@ -2043,6 +2043,14 @@ stun.settings.primaryport = Primary Port Value ...@@ -2043,6 +2043,14 @@ stun.settings.primaryport = Primary Port Value
stun.settings.secondaryport = Secondary Port Value stun.settings.secondaryport = Secondary Port Value
stun.settings.enabled = Enabled stun.settings.enabled = Enabled
stun.settings.change = Change stun.settings.change = Change
stun.external.title = External Stun Servers
stun.external.comment = Server will also send the following address(es) to client.
stun.external.server = Server
stun.external.port = Port
stun.external.error = You must inform Server and Port.
stun.external.add = Add
stun.external.delete = Delete
admin.console.restarting=Restarting admin console... admin.console.restarting=Restarting admin console...
global.click_test=Click to test... global.click_test=Click to test...
global.day=day global.day=day
......
...@@ -2340,7 +2340,15 @@ stun.settings.secondaryaddress = Secondary Address ...@@ -2340,7 +2340,15 @@ stun.settings.secondaryaddress = Secondary Address
stun.settings.primaryport = Primary Port Value stun.settings.primaryport = Primary Port Value
stun.settings.secondaryport = Secondary Port Value stun.settings.secondaryport = Secondary Port Value
stun.settings.enabled = Enabled stun.settings.enabled = Enabled
stun.settings.localenabled = Local Server Enabled
stun.settings.change = Change stun.settings.change = Change
stun.external.title = External Stun Servers
stun.external.comment = Server will also send the following address(es) to client.
stun.external.server = Server
stun.external.port = Port
stun.external.error = You must inform Server and Port.
stun.external.add = Add
stun.external.delete = Delete
# Import signed certificate page # Import signed certificate page
......
...@@ -2123,4 +2123,12 @@ stun.settings.primaryport = Puerto Primario ...@@ -2123,4 +2123,12 @@ stun.settings.primaryport = Puerto Primario
stun.settings.secondaryport = Puerto Secundario stun.settings.secondaryport = Puerto Secundario
stun.settings.enabled = Habilitado stun.settings.enabled = Habilitado
stun.settings.change = Cambiar stun.settings.change = Cambiar
stun.external.title = External Stun Servers
stun.external.comment = Server will also send the following address(es) to client.
stun.external.server = Server
stun.external.port = Port
stun.external.error = You must inform Server and Port.
stun.external.add = Add
stun.external.delete = Delete
index.certificate-warning=Se ha encontrado un certificado RSA que no es v\u00e1lido para el dominio del servidor. index.certificate-warning=Se ha encontrado un certificado RSA que no es v\u00e1lido para el dominio del servidor.
\ No newline at end of file
...@@ -1710,6 +1710,14 @@ stun.settings.primaryport = Primary Port Value ...@@ -1710,6 +1710,14 @@ stun.settings.primaryport = Primary Port Value
stun.settings.secondaryport = Secondary Port Value stun.settings.secondaryport = Secondary Port Value
stun.settings.enabled = Enabled stun.settings.enabled = Enabled
stun.settings.change = Change stun.settings.change = Change
stun.external.title = External Stun Servers
stun.external.comment = Server will also send the following address(es) to client.
stun.external.server = Server
stun.external.port = Port
stun.external.error = You must inform Server and Port.
stun.external.add = Add
stun.external.delete = Delete
httpbind.settings.enabled.legend=Service Enabled httpbind.settings.enabled.legend=Service Enabled
httpbind.settings.info=HTTP binding allows clients using the HTTP protocol to connect to Wildfire. httpbind.settings.info=HTTP binding allows clients using the HTTP protocol to connect to Wildfire.
httpbind.settings.label_disable=Disabled httpbind.settings.label_disable=Disabled
......
...@@ -2050,6 +2050,14 @@ stun.settings.primaryport = Primary Port Value ...@@ -2050,6 +2050,14 @@ stun.settings.primaryport = Primary Port Value
stun.settings.secondaryport = Secondary Port Value stun.settings.secondaryport = Secondary Port Value
stun.settings.enabled = Enabled stun.settings.enabled = Enabled
stun.settings.change = Change stun.settings.change = Change
stun.external.title = External Stun Servers
stun.external.comment = Server will also send the following address(es) to client.
stun.external.server = Server
stun.external.port = Port
stun.external.error = You must inform Server and Port.
stun.external.add = Add
stun.external.delete = Delete
admin.console.restarting=Restarting admin console... admin.console.restarting=Restarting admin console...
global.click_test=Click to test... global.click_test=Click to test...
global.day=day global.day=day
......
...@@ -2025,6 +2025,14 @@ stun.settings.primaryport = Primary Port Value ...@@ -2025,6 +2025,14 @@ stun.settings.primaryport = Primary Port Value
stun.settings.secondaryport = Secondary Port Value stun.settings.secondaryport = Secondary Port Value
stun.settings.enabled = Enabled stun.settings.enabled = Enabled
stun.settings.change = Change stun.settings.change = Change
stun.external.title = External Stun Servers
stun.external.comment = Server will also send the following address(es) to client.
stun.external.server = Server
stun.external.port = Port
stun.external.error = You must inform Server and Port.
stun.external.add = Add
stun.external.delete = Delete
global.click_test=Click to test... global.click_test=Click to test...
global.day=day global.day=day
global.days=days global.days=days
......
...@@ -2123,4 +2123,12 @@ stun.settings.primaryport = Porta Prim\u00e1ria ...@@ -2123,4 +2123,12 @@ stun.settings.primaryport = Porta Prim\u00e1ria
stun.settings.secondaryport = Porta Secund\u00e1ria stun.settings.secondaryport = Porta Secund\u00e1ria
stun.settings.enabled = Habilitado stun.settings.enabled = Habilitado
stun.settings.change = Modificar stun.settings.change = Modificar
stun.external.title = External Stun Servers
stun.external.comment = Server will also send the following address(es) to client.
stun.external.server = Server
stun.external.port = Port
stun.external.error = You must inform Server and Port.
stun.external.add = Add
stun.external.delete = Delete
setup.admin.settings.username-error=Nenhum usu\u00e1rio informado, ou o usu\u00e1rio informado n\u00e3o foi encontrado. setup.admin.settings.username-error=Nenhum usu\u00e1rio informado, ou o usu\u00e1rio informado n\u00e3o foi encontrado.
\ No newline at end of file
...@@ -1903,4 +1903,12 @@ stun.settings.secondaryaddress = \u4e8c\u7ea7\u5730\u5740 ...@@ -1903,4 +1903,12 @@ stun.settings.secondaryaddress = \u4e8c\u7ea7\u5730\u5740
stun.settings.primaryport = \u4e00\u7ea7\u7aef\u53e3\u503c stun.settings.primaryport = \u4e00\u7ea7\u7aef\u53e3\u503c
stun.settings.secondaryport = \u4e8c\u7ea7\u7aef\u53e3\u503c stun.settings.secondaryport = \u4e8c\u7ea7\u7aef\u53e3\u503c
stun.settings.enabled = \u542f\u7528 stun.settings.enabled = \u542f\u7528
stun.settings.change = \u53d8\u66f4 stun.settings.change = \u53d8\u66f4\
stun.external.title = External Stun Servers
stun.external.comment = Server will also send the following address(es) to client.
stun.external.server = Server
stun.external.port = Port
stun.external.error = You must inform Server and Port.
stun.external.add = Add
stun.external.delete = Delete
...@@ -50,14 +50,14 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou ...@@ -50,14 +50,14 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou
private StunServer stunServer = null; private StunServer stunServer = null;
private String name = "stun"; private String name = "stun";
private boolean enabled = false; private boolean enabled = false;
private boolean localEnabled = false;
private String primaryAddress; private String primaryAddress;
private String secondaryAddress; private String secondaryAddress;
private int primaryPort = 3478; private int primaryPort = 3478;
private int secondaryPort = 3479; private int secondaryPort = 3479;
private String externalServerAddress = null; private List<StunServerAddress> externalServers = null;
private int externalServerPort = 3478;
public static final String NAMESPACE = "google:jingleinfo"; public static final String NAMESPACE = "google:jingleinfo";
...@@ -72,11 +72,11 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou ...@@ -72,11 +72,11 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou
* Load config using JiveGlobals * Load config using JiveGlobals
*/ */
private void loadSTUNConfig() { private void loadSTUNConfig() {
primaryAddress = JiveGlobals.getProperty("stun.address.primary"); primaryAddress = JiveGlobals.getProperty("stun.address.primary");
secondaryAddress = JiveGlobals.getProperty("stun.address.secondary"); secondaryAddress = JiveGlobals.getProperty("stun.address.secondary");
externalServerAddress = JiveGlobals.getProperty("stun.external.address"); externalServers = getStunServerAddresses(JiveGlobals.getProperty("stun.external.addresses"));
externalServerAddress = JiveGlobals.getProperty("stun.external.port");
if (primaryAddress == null || primaryAddress.equals("")) if (primaryAddress == null || primaryAddress.equals(""))
primaryAddress = JiveGlobals.getProperty("xmpp.domain", primaryAddress = JiveGlobals.getProperty("xmpp.domain",
...@@ -99,6 +99,7 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou ...@@ -99,6 +99,7 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou
} }
this.enabled = JiveGlobals.getBooleanProperty("stun.enabled", true); this.enabled = JiveGlobals.getBooleanProperty("stun.enabled", true);
this.localEnabled = JiveGlobals.getBooleanProperty("stun.local.enabled", true);
} }
...@@ -118,13 +119,15 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou ...@@ -118,13 +119,15 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou
public void start() { public void start() {
if (isEnabled()) { if (isEnabled()) {
startServer(); startService();
if (isLocalEnabled())
startLocalServer();
} else { } else {
XMPPServer.getInstance().getIQDiscoItemsHandler().removeServerItemsProvider(this); XMPPServer.getInstance().getIQDiscoItemsHandler().removeServerItemsProvider(this);
} }
} }
public void startServer() { public void startLocalServer() {
try { try {
InetAddress primary = InetAddress.getByName(primaryAddress); InetAddress primary = InetAddress.getByName(primaryAddress);
...@@ -136,34 +139,37 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou ...@@ -136,34 +139,37 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou
stunServer.start(); stunServer.start();
} else } else
setEnabled(false); setLocalEnabled(false);
} catch (SocketException e) { } catch (SocketException e) {
Log.error("Disabling STUN server", e); Log.error("Disabling STUN server", e);
setEnabled(false); setLocalEnabled(false);
} catch (UnknownHostException e) { } catch (UnknownHostException e) {
Log.error("Disabling STUN server", e); Log.error("Disabling STUN server", e);
setEnabled(false); setLocalEnabled(false);
} }
}
if (stunServer != null) { public void startService() {
routingTable.addRoute(getAddress(), this); routingTable.addRoute(getAddress(), this);
XMPPServer server = XMPPServer.getInstance(); XMPPServer server = XMPPServer.getInstance();
server.getIQDiscoItemsHandler().addServerItemsProvider(this); server.getIQDiscoItemsHandler().addServerItemsProvider(this);
}
} }
public void stop() { public void stop() {
super.stop(); super.stop();
this.enabled = false; this.enabled = false;
if (stunServer != null)
stunServer.stop();
stunServer = null;
XMPPServer.getInstance().getIQDiscoItemsHandler().removeComponentItem(getAddress().toString()); XMPPServer.getInstance().getIQDiscoItemsHandler().removeComponentItem(getAddress().toString());
if (routingTable != null) if (routingTable != null)
routingTable.removeRoute(getAddress()); routingTable.removeRoute(getAddress());
} }
public void stopLocal() {
if (stunServer != null)
stunServer.stop();
stunServer = null;
}
public String getName() { public String getName() {
return serviceName; return serviceName;
} }
...@@ -210,10 +216,19 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou ...@@ -210,10 +216,19 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou
return; return;
} else if (NAMESPACE.equals(namespace)) { } else if (NAMESPACE.equals(namespace)) {
Element stun = childElementCopy.addElement("stun"); if (isEnabled()) {
Element server = stun.addElement("server"); Element stun = childElementCopy.addElement("stun");
server.addAttribute("host", primaryAddress); if (isLocalEnabled()) {
server.addAttribute("udp", String.valueOf(primaryPort)); Element server = stun.addElement("server");
server.addAttribute("host", primaryAddress);
server.addAttribute("udp", String.valueOf(primaryPort));
}
for (StunServerAddress stunServerAddress : externalServers) {
Element server = stun.addElement("server");
server.addAttribute("host", stunServerAddress.getServer());
server.addAttribute("udp", stunServerAddress.getPort());
}
}
} else { } else {
// Answer an error since the server can't handle the requested namespace // Answer an error since the server can't handle the requested namespace
...@@ -245,6 +260,31 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou ...@@ -245,6 +260,31 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou
return new JID(null, getServiceDomain(), null); return new JID(null, getServiceDomain(), null);
} }
public List<StunServerAddress> getExternalServers() {
return externalServers;
}
public void addExternalServer(String server, String port) {
externalServers.add(new StunServerAddress(server, port));
String property = "";
for (StunServerAddress stunServerAddress : externalServers) {
if (!property.equals("")) property += ";";
property += stunServerAddress.getServer() + ":" + stunServerAddress.getPort();
}
JiveGlobals.setProperty("stun.external.addresses", property);
}
public void removeExternalServer(int index) {
externalServers.remove(index);
String property = "";
for (StunServerAddress stunServerAddress : externalServers) {
if (!property.equals("")) property += ";";
property += stunServerAddress.getServer() + ":" + stunServerAddress.getPort();
}
JiveGlobals.setProperty("stun.external.addresses", property);
}
public Iterator<DiscoServerItem> getItems() { public Iterator<DiscoServerItem> getItems() {
List<DiscoServerItem> items = new ArrayList<DiscoServerItem>(); List<DiscoServerItem> items = new ArrayList<DiscoServerItem>();
if (!isEnabled()) { if (!isEnabled()) {
...@@ -313,20 +353,46 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou ...@@ -313,20 +353,46 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou
return enabled; return enabled;
} }
/**
* Get if the local STUN Server is enabled.
*
* @return enabled
*/
public boolean isLocalEnabled() {
return localEnabled;
}
/** /**
* Set the service enable status. * Set the service enable status.
* *
* @param enabled boolean to enable or disable * @param enabled boolean to enable or disable
* @param localEnabled local Server enable or disable
*/ */
public void setEnabled(boolean enabled) { public void setEnabled(boolean enabled, boolean localEnabled) {
this.enabled = enabled; this.enabled = enabled;
this.localEnabled = localEnabled;
if (isEnabled()) { if (isEnabled()) {
startServer(); startService();
if (isLocalEnabled())
startLocalServer();
} else { } else {
stop(); stop();
} }
} }
/**
* Set the Local STUN Server enable status.
*
* @param enabled boolean to enable or disable
*/
public void setLocalEnabled(boolean enabled) {
this.localEnabled = enabled;
if (isLocalEnabled())
startLocalServer();
else
stopLocal();
}
/** /**
* Get the secondary Port used by the STUN server * Get the secondary Port used by the STUN server
* *
...@@ -378,7 +444,62 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou ...@@ -378,7 +444,62 @@ public class STUNService extends BasicModule implements ServerItemsProvider, Rou
} }
} }
} catch (Exception e) { } catch (Exception e) {
// Do Nothing
} }
return list; return list;
} }
/**
* Provides easy abstract to store STUN Server Addresses and Ports
*/
public class StunServerAddress {
private String server;
private String port;
public StunServerAddress(String server, String port) {
this.server = server;
this.port = port;
}
/**
* Get the Host Address
*
* @return Host Address
*/
public String getServer() {
return server;
}
/**
* Get STUN port
*
* @return the Server Port
*/
public String getPort() {
return port;
}
}
/**
* Abstraction method used to convert a String into a STUN Server Address List
*
* @param addresses the String representation of Server Addresses with their respective Ports (server1:port1;server2:port2)
* @return STUN Server Addresses List
*/
public List<StunServerAddress> getStunServerAddresses(String addresses) {
List<StunServerAddress> list = new ArrayList<StunServerAddress>();
if (addresses == null || addresses.equals("")) return list;
String servers[] = addresses.split(";");
for (String server : servers) {
String address[] = server.split(":");
list.add(new StunServerAddress(address[0], address[1]));
}
return list;
}
} }
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment