Author: andygumbrecht
Date: Thu Jun 28 11:04:33 2012
New Revision: 1354915
URL: http://svn.apache.org/viewvc?rev=1354915&view=rev
Log:
Enhanced multicast to only respond if the service is public - A service may be
published on localhost, so remote clients should not be able to see it.
Modified:
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastConnectionFactory.java
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastPulseClient.java
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastSearch.java
openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastDiscoveryAgent.java
openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastSearch.java
Modified:
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastConnectionFactory.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastConnectionFactory.java?rev=1354915&r1=1354914&r2=1354915&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastConnectionFactory.java
(original)
+++
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastConnectionFactory.java
Thu Jun 28 11:04:33 2012
@@ -52,14 +52,14 @@ public class MulticastConnectionFactory
Set<String> schemes = getSet(params, "schemes", defaultSchemes);
String group = getString(params, "group", "default");
- long timeout = getLong(params, "timeout", 5000);
+ long timeout = getLong(params, "timeout", 1500);
MulticastSearch search = new MulticastSearch(uri.getHost(),
uri.getPort());
URI serviceURI = search.search(new Filter(group, schemes), timeout,
TimeUnit.MILLISECONDS);
if (serviceURI == null) {
- throw new IllegalArgumentException("Unable to find an ejb server
via the multicast URI: " + uri);
+ throw new IllegalArgumentException("Unable to find a public ejb
server via the multicast URI: " + uri);
}
try {
Modified:
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastPulseClient.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastPulseClient.java?rev=1354915&r1=1354914&r2=1354915&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastPulseClient.java
(original)
+++
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastPulseClient.java
Thu Jun 28 11:04:33 2012
@@ -236,7 +236,7 @@ public class MulticastPulseClient extend
final String serviceHost =
serviceUri.getHost();
if
(MulticastPulseClient.isLocalAddress(serviceHost, false)) {
if
(!MulticastPulseClient.isLocalAddress(serverHost, false)) {
- //A local service is only
available to a local clients
+ //A local service is only
available to a local client
continue;
}
}
Modified:
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastSearch.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastSearch.java?rev=1354915&r1=1354914&r2=1354915&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastSearch.java
(original)
+++
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/MulticastSearch.java
Thu Jun 28 11:04:33 2012
@@ -16,15 +16,16 @@
*/
package org.apache.openejb.client;
-import java.net.URI;
-import java.net.MulticastSocket;
-import java.net.InetAddress;
+import java.io.IOException;
import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.MulticastSocket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
+import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.TimeUnit;
-import java.io.IOException;
/**
* @version $Rev$ $Date$
@@ -66,7 +67,7 @@ public class MulticastSearch {
byte[] buf = new byte[BUFF_SIZE];
DatagramPacket packet = new DatagramPacket(buf, 0, buf.length);
- while (timeout == 0 || waited < timeout){
+ while (timeout == 0 || waited < timeout) {
long start = System.currentTimeMillis();
try {
multicast.receive(packet);
@@ -75,6 +76,17 @@ public class MulticastSearch {
try {
URI service = new URI(str);
if (service != null && filter.accept(service)) {
+
+ final String callerHost = ((InetSocketAddress)
packet.getSocketAddress()).getAddress().getHostAddress();
+ final String serviceHost = service.getHost();
+
+ if
(MulticastPulseClient.isLocalAddress(serviceHost, false)) {
+ if
(!MulticastPulseClient.isLocalAddress(callerHost, false)) {
+ //A local service is only available to a
local client
+ continue;
+ }
+ }
+
return service;
}
} catch (URISyntaxException e) {
@@ -82,6 +94,7 @@ public class MulticastSearch {
}
}
} catch (SocketTimeoutException e) {
+ //Ignore
} catch (SocketException e) {
System.out.println(e.getClass().getName() + ": " +
e.getMessage());
} finally {
@@ -98,6 +111,7 @@ public class MulticastSearch {
}
public static class DefaultFilter implements Filter {
+ @Override
public boolean accept(URI service) {
return true;
}
Modified:
openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastDiscoveryAgent.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastDiscoveryAgent.java?rev=1354915&r1=1354914&r2=1354915&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastDiscoveryAgent.java
(original)
+++
openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastDiscoveryAgent.java
Thu Jun 28 11:04:33 2012
@@ -16,14 +16,14 @@
*/
package org.apache.openejb.server.discovery;
+import org.apache.openejb.loader.Options;
+import org.apache.openejb.server.DiscoveryAgent;
+import org.apache.openejb.server.DiscoveryListener;
import org.apache.openejb.server.SelfManaging;
import org.apache.openejb.server.ServerService;
import org.apache.openejb.server.ServiceException;
-import org.apache.openejb.server.DiscoveryAgent;
-import org.apache.openejb.server.DiscoveryListener;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
-import org.apache.openejb.loader.Options;
import org.apache.openejb.util.OptionsLog;
import java.io.IOException;
@@ -61,6 +61,7 @@ public class MulticastDiscoveryAgent imp
private Tracker tracker;
private Multicast multicast;
+ @Override
public void init(Properties props) {
Options options = new Options(props);
@@ -84,30 +85,37 @@ public class MulticastDiscoveryAgent imp
tracker = builder.build();
}
+ @Override
public String getIP() {
return host;
}
+ @Override
public String getName() {
return "multicast";
}
+ @Override
public int getPort() {
return port;
}
+ @Override
public void setDiscoveryListener(DiscoveryListener listener) {
this.tracker.setDiscoveryListener(listener);
}
+ @Override
public void registerService(URI serviceUri) throws IOException {
tracker.registerService(serviceUri);
}
+ @Override
public void unregisterService(URI serviceUri) throws IOException {
tracker.unregisterService(serviceUri);
}
+ @Override
public void reportFailed(URI serviceUri) {
tracker.reportFailed(serviceUri);
}
@@ -120,6 +128,7 @@ public class MulticastDiscoveryAgent imp
*
* @throws Exception
*/
+ @Override
public void start() throws ServiceException {
try {
if (running.compareAndSet(false, true)) {
@@ -139,22 +148,25 @@ public class MulticastDiscoveryAgent imp
*
* @throws Exception
*/
+ @Override
public void stop() throws ServiceException {
if (running.compareAndSet(true, false)) {
multicast.close();
}
}
+ @Override
public void service(InputStream in, OutputStream out) throws
ServiceException, IOException {
}
+ @Override
public void service(Socket socket) throws ServiceException, IOException {
}
class Multicast {
private static final int BUFF_SIZE = 8192;
-
+
private final Tracker tracker;
private final MulticastSocket multicast;
private Timer timer;
@@ -186,6 +198,7 @@ public class MulticastDiscoveryAgent imp
}
class Listener implements Runnable {
+ @Override
public void run() {
byte[] buf = new byte[BUFF_SIZE];
DatagramPacket packet = new DatagramPacket(buf, 0, buf.length);
@@ -207,12 +220,13 @@ public class MulticastDiscoveryAgent imp
}
}
}
-
+
}
class Broadcaster extends TimerTask {
private IOException failed;
+ @Override
public void run() {
if (running.get()) {
heartbeat();
@@ -234,7 +248,8 @@ public class MulticastDiscoveryAgent imp
failed = e;
log.error("Failed to advertise our service: " +
uri, e);
- if ("Operation not
permitted".equals(e.getMessage())) {
+ final String message = e.getMessage();
+ if (null != message &&
message.toLowerCase().contains("operation not permitted")) {
log.error("The 'Operation not permitted' error
has been know to be caused by improper firewall/network setup. "
+ "Please make sure that the OS is
properly configured to allow multicast traffic over: " +
multicast.getLocalAddress());
}
@@ -261,6 +276,7 @@ public class MulticastDiscoveryAgent imp
public void setLoopbackMode(boolean loopbackMode) {
this.loopbackMode = loopbackMode;
}
+
public int getTimeToLive() {
return timeToLive;
}
Modified:
openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastSearch.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastSearch.java?rev=1354915&r1=1354914&r2=1354915&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastSearch.java
(original)
+++
openejb/trunk/openejb/server/openejb-multicast/src/main/java/org/apache/openejb/server/discovery/MulticastSearch.java
Thu Jun 28 11:04:33 2012
@@ -16,12 +16,13 @@
*/
package org.apache.openejb.server.discovery;
-import java.net.URI;
-import java.net.MulticastSocket;
-import java.net.InetAddress;
+import java.io.IOException;
import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.MulticastSocket;
+import java.net.URI;
import java.util.concurrent.TimeUnit;
-import java.io.IOException;
/**
* @version $Rev$ $Date$
@@ -63,7 +64,7 @@ public class MulticastSearch {
byte[] buf = new byte[BUFF_SIZE];
DatagramPacket packet = new DatagramPacket(buf, 0, buf.length);
- while (timeout == 0 || waited < timeout){
+ while (timeout == 0 || waited < timeout) {
long start = System.currentTimeMillis();
try {
multicast.receive(packet);
@@ -71,6 +72,17 @@ public class MulticastSearch {
String str = new String(packet.getData(),
packet.getOffset(), packet.getLength());
URI service = URI.create(str);
if (service != null && filter.accept(service)) {
+
+ final String callerHost = ((InetSocketAddress)
packet.getSocketAddress()).getAddress().getHostAddress();
+ final String serviceHost = service.getHost();
+
+ if (MulticastPulseAgent.isLocalAddress(serviceHost,
false)) {
+ if
(!MulticastPulseAgent.isLocalAddress(callerHost, false)) {
+ //A local service is only available to a local
client
+ continue;
+ }
+ }
+
return service;
}
}
@@ -88,6 +100,7 @@ public class MulticastSearch {
}
public static class DefaultFilter implements Filter {
+ @Override
public boolean accept(URI service) {
return true;
}