[
http://jira.jboss.com/jira/browse/JBSEAM-865?page=comments#action_12360129 ]
Christian Bauer commented on JBSEAM-865:
----------------------------------------
I had a look at jCaptcha and man, this is a great example of over-engineering. We
don't need all that stuff it is doing, it has its own abstraction of where the captcha
value is stored! We have our contexts for that, so writing a captcha is as simple as this
(unless you store view/PAGE state on the client, then it breaks):
@Name("org.jboss.seam.captcha.captcha")
@Scope(ScopeType.PAGE)
@Install(precedence = Install.DEPLOYMENT)
public class WikiCaptcha implements Serializable {
private String question;
private transient String response;
private transient Random myRamdom = new SecureRandom();
public String getQuestion() {
int one = myRamdom.nextInt(50);
int two = myRamdom.nextInt(50);
question = String.valueOf(one + two);
return one + " + " + two;
}
@WikiCaptchaResponse
public String getResponse() {
return response;
}
public void setResponse(String input) {
this.response = input;
}
public boolean validateResponse(String response) {
return question.equals(response);
}
public static WikiCaptcha instance() {
if (!Contexts.isPageContextActive()) {
throw new IllegalStateException("No page context active");
}
return (WikiCaptcha) Component.getInstance(WikiCaptcha.class, ScopeType.PAGE);
}
}
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.METHOD)
@ValidatorClass(WikiCaptchaResponseValidator.class)
public @interface WikiCaptchaResponse {
String message() default "Your answer was not correct, please try again.";
}
public class WikiCaptchaResponseValidator implements Validator {
public void initialize(Annotation captchaResponse) {
}
public boolean isValid(Object response) {
return WikiCaptcha.instance().validateResponse((String) response);
}
}
<s:validateAll>
<s:div styleClass="entry">
<div class="label">Verification question:</div>
<div class="output">
What is the result of <h:outputText
value="#{captcha.question}"/>?
</div>
</s:div>
<s:decorate>
<s:div styleClass="entry">
<div class="label">Enter response:</div>
<div class="input">
<h:inputText tabindex="7" size="15"
id="verifyCaptcha" value="#{captcha.response}"
required="true"/>
</div>
</s:div>
</s:decorate>
</s:validateAll>
This works and I'm using this from now-on forward. If we would make the Seam built-in
WikiCaptchaResponse more flexible - the isValid() method should not use instance() but
execute a component lookup by name! - I could even remove the two extra classes and have a
math captcha in 5 lines.
Allow customisation of Captcha images
-------------------------------------
Key: JBSEAM-865
URL:
http://jira.jboss.com/jira/browse/JBSEAM-865
Project: JBoss Seam
Issue Type: Feature Request
Components: Security
Affects Versions: 1.1.6.GA
Reporter: Shane Bryzak
Assigned To: Shane Bryzak
Priority: Minor
Original Estimate: 2 hours
Remaining Estimate: 2 hours
We should allow configuration of the captcha service to use a different engine.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira