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


Reply via email to