package com.evolveum.midpoint.gui.api.component.captcha;
import java.util.Random;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.markup.html.captcha.CaptchaImageResource;
import org.apache.wicket.feedback.ContainerFeedbackMessageFilter;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.PropertyModel;
import com.evolveum.midpoint.gui.api.component.BasePanel;
public class CaptchaPanel extends BasePanel<Void> {
private static final long serialVersionUID = 1L;
/**
* The text provided by the user
*/
private String captchaText;
private final CaptchaImageResource captchaImageResource;
/**
* Constructor.
*
* @param id
* The component id
*/
public CaptchaPanel(String id) {
super(id);
FeedbackPanel feedback = new FeedbackPanel("feedback",
new ContainerFeedbackMessageFilter(CaptchaPanel.this));
add(feedback);
captchaImageResource = createCaptchImageResource();
final Image captchaImage = new Image("image", captchaImageResource);
captchaImage.setOutputMarkupId(true);
add(captchaImage);
AjaxLink<Void> changeCaptchaLink = new AjaxLink<Void>("changeLink") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
captchaImageResource.invalidate();
target.add(captchaImage);
}
};
add(changeCaptchaLink);
add(new RequiredTextField<String>("text",
new PropertyModel<String>(CaptchaPanel.this, "captchaText"), String.class) {
private static final long serialVersionUID = 1L;
@Override
protected final void onComponentTag(final ComponentTag tag) {
super.onComponentTag(tag);
// clear the field after each render
tag.put("value", "");
}
});
}
protected CaptchaImageResource createCaptchImageResource() {
return new CaptchaImageResource(randomString(), 48, 30) {
private static final long serialVersionUID = 1L;
@Override
protected byte[] render() {
String randomText = randomString();
getChallengeIdModel().setObject(randomText);
return super.render();
}
};
}
public void invalidateCaptcha() {
captchaImageResource.invalidate();
}
static int randomInt(int min, int max)
{
return (int)(Math.random() * (max - min) + min);
}
static String randomString()
{
return new Integer(randomInt(1000, 9999)).toString();
// for (int i = 0; i< length; i++){
//
// }
//
// int num = randomInt(min, max);
// byte b[] = new byte[num];
// for (int i = 0; i < num; i++)
// b[i] = (byte)randomInt('a', 'z');
// return new String(b);
}
public String getCaptchaText() {
return captchaText;
}
public String getRandomText() {
return captchaImageResource.getChallengeId();
}
}