You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2012/05/20 00:28:53 UTC

svn commit: r1340582 - in /mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd: ./ server/ server/session/ server/x11/

Author: gnodet
Date: Sat May 19 22:28:52 2012
New Revision: 1340582

URL: http://svn.apache.org/viewvc?rev=1340582&view=rev
Log:
[SSHD-121] Add Factories to create IoAcceptors for TcpipForwardSupport & X11ForwardSupport

Added:
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ForwardingAcceptorFactory.java
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/DefaultForwardingAcceptorFactory.java
Modified:
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ServerFactoryManager.java
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/TcpipForwardSupport.java
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java?rev=1340582&r1=1340581&r2=1340582&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java Sat May 19 22:28:52 2012
@@ -68,7 +68,9 @@ import org.apache.sshd.common.util.OsUti
 import org.apache.sshd.common.util.SecurityUtils;
 import org.apache.sshd.server.Command;
 import org.apache.sshd.server.CommandFactory;
+import org.apache.sshd.server.session.DefaultForwardingAcceptorFactory;
 import org.apache.sshd.server.FileSystemFactory;
+import org.apache.sshd.server.ForwardingAcceptorFactory;
 import org.apache.sshd.server.ForwardingFilter;
 import org.apache.sshd.server.PasswordAuthenticator;
 import org.apache.sshd.server.PublickeyAuthenticator;
@@ -134,6 +136,8 @@ public class SshServer extends AbstractF
     protected PublickeyAuthenticator publickeyAuthenticator;
     protected GSSAuthenticator gssAuthenticator;
     protected ForwardingFilter forwardingFilter;
+    protected ForwardingAcceptorFactory x11ForwardingAcceptorFactory;
+    protected ForwardingAcceptorFactory tcpipForwardingAcceptorFactory;
     protected ScheduledExecutorService executor;
     protected boolean shutdownExecutor;
 
@@ -260,6 +264,22 @@ public class SshServer extends AbstractF
     public ForwardingFilter getForwardingFilter() {
         return forwardingFilter;
     }
+    
+    public ForwardingAcceptorFactory getTcpipForwardingAcceptorFactory() {
+        return tcpipForwardingAcceptorFactory;
+    }
+	
+    public void setX11ForwardNioSocketAcceptorFactory(ForwardingAcceptorFactory f) {
+        x11ForwardingAcceptorFactory = f;
+    }
+
+    public ForwardingAcceptorFactory getX11ForwardingAcceptorFactory() {
+        return x11ForwardingAcceptorFactory;
+    }
+	
+    public void setTcpipForwardNioSocketAcceptorFactory(ForwardingAcceptorFactory f) {
+        tcpipForwardingAcceptorFactory = f;
+    }
 
     public void setForwardingFilter(ForwardingFilter forwardingFilter) {
         this.forwardingFilter = forwardingFilter;
@@ -326,6 +346,12 @@ public class SshServer extends AbstractF
         if (getFileSystemFactory() == null) {
             throw new IllegalArgumentException("FileSystemFactory not set");
         }
+        if (getTcpipForwardingAcceptorFactory() == null) {
+            throw new IllegalArgumentException("TcpipForwardingAcceptorFactory not set");
+        }
+        if (getX11ForwardingAcceptorFactory() == null) {
+            throw new IllegalArgumentException("X11ForwardingAcceptorFactory not set");
+        }
     }
 
     /**
@@ -461,6 +487,11 @@ public class SshServer extends AbstractF
                 new SignatureDSA.Factory(),
                 new SignatureRSA.Factory()));
         sshd.setFileSystemFactory(new NativeFileSystemFactory());
+        
+        ForwardingAcceptorFactory faf = new DefaultForwardingAcceptorFactory();
+        sshd.setTcpipForwardNioSocketAcceptorFactory(faf);
+        sshd.setX11ForwardNioSocketAcceptorFactory(faf);
+        
         return sshd;
     }
 

Added: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ForwardingAcceptorFactory.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ForwardingAcceptorFactory.java?rev=1340582&view=auto
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ForwardingAcceptorFactory.java (added)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ForwardingAcceptorFactory.java Sat May 19 22:28:52 2012
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd.server;
+
+import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
+import org.apache.sshd.server.session.ServerSession;
+
+/**
+ * A factory for creating NioSocketAcceptor objects for Port & X11 forwarding
+ */
+public interface ForwardingAcceptorFactory {
+
+    /**
+     * Creates the NioSocketAcceptor to be used for forwards for this
+     * ServerSession.
+     *
+     * @param session the ServerSession the connections are forwarded through
+     * @return the NioSocketAcceptor that will listen for connections
+     */
+    public NioSocketAcceptor createNioSocketAcceptor(ServerSession session);
+
+}

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ServerFactoryManager.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ServerFactoryManager.java?rev=1340582&r1=1340581&r2=1340582&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ServerFactoryManager.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/ServerFactoryManager.java Sat May 19 22:28:52 2012
@@ -140,7 +140,22 @@ public interface ServerFactoryManager ex
      *         or <code>null</code> if subsystems are not supported on this server
      */
     List<NamedFactory<Command>> getSubsystemFactories();
-
+    
+    /**
+     * Retrieve the IoAcceptor factory to be used to accept incoming connections
+     * to port forwards.
+     * 
+     * @return A <code>ForwardNioAcceptorFactory</code>
+     */
+    ForwardingAcceptorFactory getTcpipForwardingAcceptorFactory();
+    
+    /**
+     * Retrieve the IoAcceptor factory to be used to accept incoming connections
+     * for X11 Forwards.
+     * 
+     * @return A <code>ForwardNioAcceptorFactory</code>
+     */
+    ForwardingAcceptorFactory getX11ForwardingAcceptorFactory();
 
     /**
      * Retrieve the <code>ScheduledExecutorService</code> to be used.

Added: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/DefaultForwardingAcceptorFactory.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/DefaultForwardingAcceptorFactory.java?rev=1340582&view=auto
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/DefaultForwardingAcceptorFactory.java (added)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/DefaultForwardingAcceptorFactory.java Sat May 19 22:28:52 2012
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd.server.session;
+
+import java.io.IOException;
+import java.net.Socket;
+
+import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
+import org.apache.sshd.server.ForwardingAcceptorFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A Default factory for creating NioSocketAcceptors for Port & X11 Forwarding
+ */
+public class DefaultForwardingAcceptorFactory implements ForwardingAcceptorFactory {
+
+    /** The log. */
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    public NioSocketAcceptor createNioSocketAcceptor(ServerSession s) {
+        NioSocketAcceptor nio = new NioSocketAcceptor();
+        nio.setReuseAddress(true);
+
+        configureReceiveBufferSize(nio);
+
+        return nio;
+    }
+
+    /**
+     * MINA itself forces our socket receive buffer to 1024 bytes by default,
+     * despite what the operating system defaults to. This limits us to about 3
+     * MB/s incoming data transfer. By forcing back to the operating system
+     * default we can get a decent transfer rate again.
+     * 
+     * If this method is unable to adjust the buffer size it will log a warning
+     * and return.
+     * 
+     * @param nio
+     *            The NioSocketAcceptor to fix the buffer on
+     */
+    private void configureReceiveBufferSize(NioSocketAcceptor nio) {
+        final Socket s = new Socket();
+        try {
+            try {
+                nio.getSessionConfig().setReceiveBufferSize(
+                        s.getReceiveBufferSize());
+            } finally {
+                s.close();
+            }
+        } catch (IOException e) {
+            log.warn("cannot adjust SO_RCVBUF back to system default", e);
+        }
+    }
+
+}

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/TcpipForwardSupport.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/TcpipForwardSupport.java?rev=1340582&r1=1340581&r2=1340582&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/TcpipForwardSupport.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/TcpipForwardSupport.java Sat May 19 22:28:52 2012
@@ -54,7 +54,7 @@ public class TcpipForwardSupport extends
 
     public synchronized void initialize() {
         if (this.acceptor == null) {
-            NioSocketAcceptor acceptor = new NioSocketAcceptor();
+            NioSocketAcceptor acceptor = session.getServerFactoryManager().getTcpipForwardingAcceptorFactory().createNioSocketAcceptor(session);
             acceptor.setHandler(this);
             acceptor.setReuseAddress(true);
             acceptor.getFilterChain().addLast("executor", new ExecutorFilter(EnumSet.complementOf(EnumSet.of(IoEventType.SESSION_CREATED)).toArray(new IoEventType[0])));
@@ -147,7 +147,9 @@ public class TcpipForwardSupport extends
     @Override
     public void sessionClosed(IoSession session) throws Exception {
         ChannelForwardedTcpip channel = (ChannelForwardedTcpip) session.getAttribute(ChannelForwardedTcpip.class);
-        channel.close(false);
+        if ( channel != null ){
+        	channel.close(false);
+        }
     }
 
     @Override

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java?rev=1340582&r1=1340581&r2=1340582&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java Sat May 19 22:28:52 2012
@@ -68,7 +68,7 @@ public class X11ForwardSupport extends I
 
     public synchronized void initialize() {
         if (this.acceptor == null) {
-            NioSocketAcceptor acceptor = new NioSocketAcceptor();
+            NioSocketAcceptor acceptor = session.getServerFactoryManager().getX11ForwardingAcceptorFactory().createNioSocketAcceptor(session);
             acceptor.setHandler(this);
             acceptor.setReuseAddress(true);
             acceptor.getFilterChain().addLast(
@@ -153,7 +153,9 @@ public class X11ForwardSupport extends I
     @Override
     public void sessionClosed(IoSession session) throws Exception {
         ChannelForwardedX11 channel = (ChannelForwardedX11) session.getAttribute(ChannelForwardedX11.class);
-        channel.close(false);
+        if ( channel != null ){
+        	channel.close(false);
+        }
     }
 
     @Override