From 3803604199c30a8f4af56686d0d7fd63552a36a1 Mon Sep 17 00:00:00 2001 From: kohsuke Date: Mon, 17 Dec 2007 02:56:21 +0000 Subject: [PATCH] adding captcha for sign-up screen. git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@6325 71c3de6d-444a-0410-be80-ed276b4c234a --- core/pom.xml | 43 ++++++++++++++++++ .../security/HudsonPrivateSecurityRealm.java | 13 ++++++ .../java/hudson/security/SecurityRealm.java | 45 +++++++++++++++++++ .../HudsonPrivateSecurityRealm/signup.jelly | 15 +++++++ 4 files changed, 116 insertions(+) diff --git a/core/pom.xml b/core/pom.xml index 8c20b2eb8e..f4ca12e844 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -446,6 +446,49 @@ commons-collections 3.2 + + com.octo.captcha + jcaptcha-all + 1.0-RC6 + + + hsqldb + hsqldb + + + hsqldb + hsqldb + + + net.sf.ehcache + ehcache + + + quartz + quartz + + + xerces + xercesImpl + + + xerces + xmlParserAPIs + + + org.springframework + spring + + + commons-dbcp + commons-dbcp + + + concurrent + concurrent + + + diff --git a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java index 147244b974..85510c67ac 100644 --- a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java +++ b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java @@ -12,6 +12,10 @@ import org.acegisecurity.userdetails.UserDetails; import org.acegisecurity.userdetails.UserDetailsService; import org.acegisecurity.userdetails.UsernameNotFoundException; import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; /** * {@link SecurityRealm} that performs authentication by looking up {@link User}. @@ -30,6 +34,15 @@ public class HudsonPrivateSecurityRealm extends SecurityRealm { return DescriptorImpl.INSTANCE; } + /** + * Creates an user account. + */ + public void doCreateAccount(StaplerRequest req, StaplerResponse rsp) throws IOException { + rsp.getWriter().println( + validateCaptcha(req.getParameter("captcha")) + ); + } + // TODO private static final GrantedAuthority[] TEST_AUTHORITY = {new GrantedAuthorityImpl("authenticated")}; diff --git a/core/src/main/java/hudson/security/SecurityRealm.java b/core/src/main/java/hudson/security/SecurityRealm.java index 0380ba4724..962da6b025 100644 --- a/core/src/main/java/hudson/security/SecurityRealm.java +++ b/core/src/main/java/hudson/security/SecurityRealm.java @@ -9,8 +9,21 @@ import org.acegisecurity.Authentication; import org.acegisecurity.AuthenticationManager; import org.springframework.context.ApplicationContext; import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.QueryParameter; +import org.apache.tools.ant.types.resources.selectors.None; +import org.apache.maven.plugin.logging.Log; import java.util.Map; +import java.util.logging.Logger; +import java.util.logging.Level; +import java.io.IOException; + +import com.octo.captcha.service.image.DefaultManageableImageCaptchaService; +import com.octo.captcha.service.CaptchaServiceException; + +import javax.imageio.ImageIO; /** * Pluggable security realm that connects external user database to Hudson. @@ -66,6 +79,36 @@ public abstract class SecurityRealm implements Describable, Exten return clz.getClassLoader().getResource(clz.getName().replace('.','/')+"/signup.jelly")!=null; } + /** + * {@link DefaultManageableImageCaptchaService} holder to defer initialization. + */ + private static final class CaptchaService { + private static final DefaultManageableImageCaptchaService INSTANCE = new DefaultManageableImageCaptchaService(); + } + + /** + * Generates a captcha image. + */ + public final void doCaptcha(StaplerRequest req, StaplerResponse rsp) throws IOException { + String id = req.getSession().getId(); + rsp.setContentType("image/png"); + ImageIO.write( CaptchaService.INSTANCE.getImageChallengeForID(id), "PNG", rsp.getOutputStream() ); + } + + /** + * Validates the captcha. + */ + protected final boolean validateCaptcha(String text) { + try { + String id = Stapler.getCurrentRequest().getSession().getId(); + Boolean b = CaptchaService.INSTANCE.validateResponseForID(id, text); + return b!=null && b; + } catch (CaptchaServiceException e) { + LOGGER.log(Level.INFO, "Captcha validation had a problem",e); + return false; + } + } + /** * Picks up the instance of the given type from the spring context. * If there are multiple beans of the same type or if there are none, @@ -124,4 +167,6 @@ public abstract class SecurityRealm implements Describable, Exten HudsonPrivateSecurityRealm.DescriptorImpl.INSTANCE, LDAPSecurityRealm.DESCRIPTOR ); + + private static final Logger LOGGER = Logger.getLogger(SecurityRealm.class.getName()); } diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly index d81211adf4..4b9a4464de 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly @@ -1,5 +1,13 @@ + + +

Sign up

@@ -26,6 +34,13 @@ E-mail address: + + Enter text as shown: + +
+ + +