From 436bd3f0ecdee282c503a9eb0f7a240b7a68ff49 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 11 Apr 2014 14:51:50 -0400
Subject: [PATCH] Merged #6 "Support serving repositories over the SSH transport"

---
 src/main/java/com/gitblit/transport/ssh/SshServerSessionFactory.java |   72 ++++++++++++++++++++++++++++++++++++
 1 files changed, 72 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/gitblit/transport/ssh/SshServerSessionFactory.java b/src/main/java/com/gitblit/transport/ssh/SshServerSessionFactory.java
new file mode 100644
index 0000000..0c018f0
--- /dev/null
+++ b/src/main/java/com/gitblit/transport/ssh/SshServerSessionFactory.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2014 gitblit.com.
+ *
+ * Licensed 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 com.gitblit.transport.ssh;
+
+import java.net.SocketAddress;
+
+import org.apache.mina.transport.socket.SocketSessionConfig;
+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;
+
+/**
+ *
+ * @author James Moger
+ *
+ */
+public class SshServerSessionFactory extends SessionFactory {
+
+	private final Logger log = LoggerFactory.getLogger(getClass());
+
+	public SshServerSessionFactory() {
+	}
+
+	@Override
+	protected AbstractSession createSession(final IoSession io) throws Exception {
+		log.info("creating ssh session from {}", io.getRemoteAddress());
+
+		if (io instanceof MinaSession) {
+			if (((MinaSession) io).getSession().getConfig() instanceof SocketSessionConfig) {
+				((SocketSessionConfig) ((MinaSession) io).getSession().getConfig()).setKeepAlive(true);
+			}
+		}
+
+		final SshServerSession session = (SshServerSession) super.createSession(io);
+		SocketAddress peer = io.getRemoteAddress();
+		SshDaemonClient client = new SshDaemonClient(peer);
+		session.setAttribute(SshDaemonClient.KEY, client);
+
+		// TODO(davido): Log a session close without authentication as a
+		// failure.
+		session.addCloseSessionListener(new SshFutureListener<CloseFuture>() {
+			@Override
+			public void operationComplete(CloseFuture future) {
+				log.info("closed ssh session from {}", io.getRemoteAddress());
+			}
+		});
+		return session;
+	}
+
+	@Override
+	protected AbstractSession doCreateSession(IoSession ioSession) throws Exception {
+		return new SshServerSession(server, ioSession);
+	}
+}

--
Gitblit v1.9.1