From 48bf33b2ebf58d501d5745a64a76d7b47c85c407 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Wed, 10 Dec 2014 12:10:21 +0900 Subject: [PATCH] Revert "SSH: Simplify CachingPublicKeyAuthenticator implementation" This change is not compatible with SSHD 0.9.0 which is being brought into master by merges from stable-2.9 This reverts commit 64d12ce359c0ea69bb1249577374e5e781f7d7b3. Change-Id: Ib0ae8603c5d6d04f8df76775566418f12a0fc7c1 --- .../sshd/CachingPublicKeyAuthenticator.java | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java index 0471af8d44..f315cff3b8 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java @@ -17,12 +17,56 @@ package com.google.gerrit.sshd; import com.google.inject.Inject; import com.google.inject.Singleton; +import org.apache.sshd.common.Session; +import org.apache.sshd.common.SessionListener; +import org.apache.sshd.server.PublickeyAuthenticator; +import org.apache.sshd.server.session.ServerSession; + +import java.security.PublicKey; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + @Singleton -public class CachingPublicKeyAuthenticator - extends org.apache.sshd.server.auth.CachingPublicKeyAuthenticator { +public class CachingPublicKeyAuthenticator implements PublickeyAuthenticator, + SessionListener { + + private final PublickeyAuthenticator authenticator; + private final Map> sessionCache; @Inject public CachingPublicKeyAuthenticator(DatabasePubKeyAuth authenticator) { - super(authenticator); + this.authenticator = authenticator; + this.sessionCache = new ConcurrentHashMap<>(); + } + + @Override + public boolean authenticate(String username, PublicKey key, + ServerSession session) { + Map m = sessionCache.get(session); + if (m == null) { + m = new HashMap<>(); + sessionCache.put(session, m); + session.addListener(this); + } + if (m.containsKey(key)) { + return m.get(key); + } + boolean r = authenticator.authenticate(username, key, session); + m.put(key, r); + return r; + } + + @Override + public void sessionCreated(Session session) { + } + + @Override + public void sessionEvent(Session sesssion, Event event) { + } + + @Override + public void sessionClosed(Session session) { + sessionCache.remove(session); } }