From 4a490499f9edca82be25100d9bb40c94b3a86694 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 7 Jan 2011 11:57:15 +0100 Subject: [PATCH] added AuthenticationListener --- .../AbstractAuthenticationManager.java | 115 ++++++++++++++++++ .../web/security/AuthenticationListener.java | 64 ++++++++++ .../web/security/AuthenticationManager.java | 4 +- .../sonia/scm/BindingExtensionProcessor.java | 29 +++++ .../java/sonia/scm/ScmContextListener.java | 7 +- .../security/ChainAuthenticatonManager.java | 5 +- 6 files changed, 221 insertions(+), 3 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/web/security/AbstractAuthenticationManager.java create mode 100644 scm-core/src/main/java/sonia/scm/web/security/AuthenticationListener.java diff --git a/scm-core/src/main/java/sonia/scm/web/security/AbstractAuthenticationManager.java b/scm-core/src/main/java/sonia/scm/web/security/AbstractAuthenticationManager.java new file mode 100644 index 0000000000..080d36c62e --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/web/security/AbstractAuthenticationManager.java @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.web.security; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.user.User; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author Sebastian Sdorra + */ +public abstract class AbstractAuthenticationManager + implements AuthenticationManager +{ + + /** + * Method description + * + * + * @param listener + */ + @Override + public void addListener(AuthenticationListener listener) + { + listeners.add(listener); + } + + /** + * Method description + * + * + * @param listeners + */ + @Override + public void addListeners(Collection listeners) + { + listeners.addAll(listeners); + } + + /** + * Method description + * + * + * @param listener + */ + @Override + public void removeListener(AuthenticationListener listener) + { + listeners.remove(listener); + } + + /** + * Method description + * + * + * @param request + * @param response + * @param user + */ + protected void fireAuthenticationEvent(HttpServletRequest request, + HttpServletResponse response, User user) + { + for (AuthenticationListener listener : listeners) + { + listener.onAuthentication(request, response, user); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Set listeners = + new HashSet(); +} diff --git a/scm-core/src/main/java/sonia/scm/web/security/AuthenticationListener.java b/scm-core/src/main/java/sonia/scm/web/security/AuthenticationListener.java new file mode 100644 index 0000000000..301ac48a8d --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/web/security/AuthenticationListener.java @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.web.security; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.plugin.ExtensionPoint; +import sonia.scm.user.User; + +//~--- JDK imports ------------------------------------------------------------ + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author Sebastian Sdorra + */ +@ExtensionPoint +public interface AuthenticationListener +{ + + /** + * Method description + * + * + * @param request + * @param response + * @param user + */ + public void onAuthentication(HttpServletRequest request, + HttpServletResponse response, User user); +} diff --git a/scm-core/src/main/java/sonia/scm/web/security/AuthenticationManager.java b/scm-core/src/main/java/sonia/scm/web/security/AuthenticationManager.java index 566d227358..d0abd7b69a 100644 --- a/scm-core/src/main/java/sonia/scm/web/security/AuthenticationManager.java +++ b/scm-core/src/main/java/sonia/scm/web/security/AuthenticationManager.java @@ -36,6 +36,7 @@ package sonia.scm.web.security; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.Initable; +import sonia.scm.ListenerSupport; import sonia.scm.user.User; //~--- JDK imports ------------------------------------------------------------ @@ -49,7 +50,8 @@ import javax.servlet.http.HttpServletResponse; * * @author Sebastian Sdorra */ -public interface AuthenticationManager extends Initable, Closeable +public interface AuthenticationManager + extends Initable, Closeable, ListenerSupport { /** diff --git a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java index 174565abbc..05764efb2b 100644 --- a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java @@ -50,6 +50,7 @@ import sonia.scm.repository.RepositoryListener; import sonia.scm.security.EncryptionHandler; import sonia.scm.user.UserListener; import sonia.scm.web.security.AuthenticationHandler; +import sonia.scm.web.security.AuthenticationListener; import sonia.scm.web.security.XmlAuthenticationHandler; //~--- JDK imports ------------------------------------------------------------ @@ -162,6 +163,19 @@ public class BindingExtensionProcessor implements ExtensionProcessor repositoryListeners.add(listener); } + else if (AuthenticationListener.class.isAssignableFrom(extensionClass)) + { + if (logger.isInfoEnabled()) + { + logger.info("bind AuthenticaitonListener {}", + extensionClass.getName()); + } + + AuthenticationListener listener = + (AuthenticationListener) extensionClass.newInstance(); + + authenticationListeners.add(listener); + } else { if (logger.isInfoEnabled()) @@ -206,6 +220,17 @@ public class BindingExtensionProcessor implements ExtensionProcessor //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + public Set getAuthenticationListeners() + { + return authenticationListeners; + } + /** * Method description * @@ -307,6 +332,10 @@ public class BindingExtensionProcessor implements ExtensionProcessor private Set repositoryListeners = new HashSet(); + /** Field description */ + private Set authenticationListeners = + new HashSet(); + /** Field description */ private Set userListeners = new HashSet(); diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index a31dc4c244..11a883ae07 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -144,7 +144,12 @@ public class ScmContextListener extends GuiceServletContextListener groupManager.init(context); // init Authenticator - injector.getInstance(AuthenticationManager.class).init(context); + AuthenticationManager authenticationManager = + injector.getInstance(AuthenticationManager.class); + + authenticationManager.init(context); + authenticationManager.addListeners( + bindExtProcessor.getAuthenticationListeners()); return injector; } diff --git a/scm-webapp/src/main/java/sonia/scm/web/security/ChainAuthenticatonManager.java b/scm-webapp/src/main/java/sonia/scm/web/security/ChainAuthenticatonManager.java index b56bf93b9b..df08016332 100644 --- a/scm-webapp/src/main/java/sonia/scm/web/security/ChainAuthenticatonManager.java +++ b/scm-webapp/src/main/java/sonia/scm/web/security/ChainAuthenticatonManager.java @@ -60,7 +60,7 @@ import javax.servlet.http.HttpServletResponse; * @author Sebastian Sdorra */ @Singleton -public class ChainAuthenticatonManager implements AuthenticationManager +public class ChainAuthenticatonManager extends AbstractAuthenticationManager { /** the logger for ChainAuthenticatonManager */ @@ -124,6 +124,9 @@ public class ChainAuthenticatonManager implements AuthenticationManager { user = result.getUser(); user.setType(authenticator.getType()); + + // notify authentication listeners + fireAuthenticationEvent(request, response, user); } break;