From 44e2ee1d05a9d455ae60dd64058b31f006d551b7 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 10 Apr 2014 18:58:08 -0400
Subject: [PATCH] Revise SSH public key integration with AuthenticationManager

---
 src/main/java/com/gitblit/transport/ssh/SshSessionFactory.java |   42 +++++++++++++++++++++++++-----------------
 1 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/gitblit/transport/ssh/SshSessionFactory.java b/src/main/java/com/gitblit/transport/ssh/SshSessionFactory.java
index ef51340..ae6da3f 100644
--- a/src/main/java/com/gitblit/transport/ssh/SshSessionFactory.java
+++ b/src/main/java/com/gitblit/transport/ssh/SshSessionFactory.java
@@ -17,16 +17,15 @@
 
 import java.net.SocketAddress;
 
-import org.apache.mina.core.future.IoFuture;
-import org.apache.mina.core.future.IoFutureListener;
-import org.apache.mina.core.session.IoSession;
 import org.apache.mina.transport.socket.SocketSessionConfig;
-import org.apache.sshd.server.session.ServerSession;
+import org.apache.sshd.common.future.CloseFuture;
+import org.apache.sshd.common.future.SshFutureListener;
+import org.apache.sshd.common.io.IoSession;
+import org.apache.sshd.common.io.mina.MinaSession;
+import org.apache.sshd.common.session.AbstractSession;
 import org.apache.sshd.server.session.SessionFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
-import com.gitblit.utils.IdGenerator;
 
 
 /**
@@ -38,32 +37,41 @@
 
 	private final Logger log = LoggerFactory.getLogger(getClass());
 
-	private final IdGenerator idGenerator;
-
-	public SshSessionFactory(IdGenerator idGenerator) {
-		this.idGenerator = idGenerator;
+	public SshSessionFactory() {
 	}
 
 	@Override
-	protected ServerSession createSession(final IoSession io) throws Exception {
+	protected AbstractSession createSession(final IoSession io)
+			throws Exception {
 		log.info("connection accepted on " + io);
 
-		if (io.getConfig() instanceof SocketSessionConfig) {
-			final SocketSessionConfig c = (SocketSessionConfig) io.getConfig();
-			c.setKeepAlive(true);
+		if (io instanceof MinaSession) {
+			if (((MinaSession) io).getSession().getConfig() instanceof SocketSessionConfig) {
+				((SocketSessionConfig) ((MinaSession) io).getSession()
+						.getConfig()).setKeepAlive(true);
+			}
 		}
 
-		final ServerSession s = (ServerSession) super.createSession(io);
+		final GitblitServerSession s = (GitblitServerSession) super
+				.createSession(io);
 		SocketAddress peer = io.getRemoteAddress();
 		SshSession session = new SshSession(idGenerator.next(), peer);
 		s.setAttribute(SshSession.KEY, session);
 
-		io.getCloseFuture().addListener(new IoFutureListener<IoFuture>() {
+		// TODO(davido): Log a session close without authentication as a
+		// failure.
+		s.addCloseSessionListener(new SshFutureListener<CloseFuture>() {
 			@Override
-			public void operationComplete(IoFuture future) {
+			public void operationComplete(CloseFuture future) {
 				log.info("connection closed on " + io);
 			}
 		});
 		return s;
 	}
+
+	@Override
+	protected AbstractSession doCreateSession(IoSession ioSession)
+			throws Exception {
+		return new GitblitServerSession(server, ioSession);
+	}
 }

--
Gitblit v1.9.1