// Copyright 2011-2013 The Apache Software Foundation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package org.apache.tapestry5.kaptcha.components; import org.apache.tapestry5.BindingConstants; import org.apache.tapestry5.FieldValidator; import org.apache.tapestry5.MarkupWriter; import org.apache.tapestry5.annotations.Import; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.SupportsInformalParameters; import org.apache.tapestry5.corelib.base.AbstractField; import org.apache.tapestry5.internal.TapestryInternalUtils; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.kaptcha.KaptchaSymbolConstants; import org.apache.tapestry5.services.FieldValidatorSource; /** * Field paired with a {@link KaptchaImage} to ensure that the user has provided * the correct value. Renders a class attribute of "form-control", which can be extended * via the class informal attribute. * * @since 5.3 * @tapestrydoc */ @SupportsInformalParameters @Import(stylesheet = "kaptcha.css") public class KaptchaField extends AbstractField { /** * The image output for this field. The image will display a distorted text * string. The user must decode the distorted text and enter the same value. */ @Parameter(required = true, defaultPrefix = BindingConstants.COMPONENT) private KaptchaImage image; /** * Controls whether the field is rendered like a password field (false) * or like a normal text field (true, the factory default). * * @see KaptchaSymbolConstants#KAPTCHA_DEFAULT_VISIBLE * @since 5.3 */ @Parameter("symbol:" + KaptchaSymbolConstants.KAPTCHA_DEFAULT_VISIBLE) private boolean visible; @Inject private Messages messages; @Inject private FieldValidatorSource fieldValidatorSource; /** * Always required. */ @Override public boolean isRequired() { return true; } @Override protected void processSubmission(String controlName) { String userValue = request.getParameter(controlName); validationTracker.recordInput(this, userValue); if (TapestryInternalUtils.isEqual(image.getCaptchaText(), userValue)) return; validationTracker.recordError(this, messages.get("tapestry-incorrect-captcha")); } @SuppressWarnings("rawtypes") boolean beginRender(MarkupWriter writer) { writer.element("input", "type", visible ? "text" : "password", "id", getClientId(), "class", "form-control", "name", getControlName(), "value", visible ? validationTracker.getInput(this) : ""); resources.renderInformalParameters(writer); FieldValidator fieldValidator = fieldValidatorSource.createValidator(this, "required", null); fieldValidator.render(writer); writer.end(); return false; } }