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