1 31 32 package org.opencms.frontend.templateone.form; 33 34 import org.opencms.flex.CmsFlexController; 35 import org.opencms.i18n.CmsMessages; 36 import org.opencms.jsp.CmsJspActionElement; 37 import org.opencms.main.CmsLog; 38 import org.opencms.util.CmsStringUtil; 39 40 import java.awt.image.BufferedImage ; 41 import java.io.ByteArrayOutputStream ; 42 import java.io.IOException ; 43 import java.util.Locale ; 44 45 import javax.servlet.ServletOutputStream ; 46 import javax.servlet.http.HttpServletResponse ; 47 48 import org.apache.commons.logging.Log; 49 50 import com.octo.captcha.CaptchaException; 51 import com.octo.captcha.service.image.ImageCaptchaService; 52 import com.sun.image.codec.jpeg.JPEGCodec; 53 import com.sun.image.codec.jpeg.JPEGImageEncoder; 54 55 65 public class CmsCaptchaField extends A_CmsField { 66 67 68 public static final String C_PARAM_CAPTCHA_PHRASE = "captchaphrase"; 69 70 71 private static final Log LOG = CmsLog.getLog(CmsCaptchaField.class); 72 73 74 private static final String TYPE = "captcha"; 75 76 77 private CmsCaptchaSettings m_captchaSettings; 78 79 87 public CmsCaptchaField(CmsCaptchaSettings captchaSettings, String fieldLabel, String fieldValue) { 88 89 super(); 90 91 m_captchaSettings = captchaSettings; 92 93 setName(C_PARAM_CAPTCHA_PHRASE); 94 setValue(fieldValue); 95 setLabel(fieldLabel); 96 setMandatory(true); 97 } 98 99 105 public static String getStaticType() { 106 107 return TYPE; 108 } 109 110 114 public String buildHtml(CmsFormHandler formHandler, CmsMessages messages, String errorKey) { 115 116 StringBuffer buf = new StringBuffer (); 117 String fieldLabel = getLabel(); 118 String errorMessage = ""; 119 String mandatory = ""; 120 121 CmsCaptchaSettings captchaSettings = getCaptchaSettings(); 122 123 if (CmsStringUtil.isNotEmpty(errorKey)) { 124 125 if (CmsFormHandler.ERROR_MANDATORY.equals(errorKey)) { 126 errorMessage = messages.key("form.error.mandatory"); 127 } else if (CmsStringUtil.isNotEmpty(getErrorMessage())) { 128 errorMessage = getErrorMessage(); 129 } else { 130 errorMessage = messages.key("form.error.validation"); 131 } 132 133 errorMessage = messages.key("form.html.error.start") + errorMessage + messages.key("form.html.error.end"); 134 fieldLabel = messages.key("form.html.label.error.start") 135 + fieldLabel 136 + messages.key("form.html.label.error.end"); 137 } 138 139 if (isMandatory()) { 140 mandatory = messages.key("form.html.mandatory"); 141 } 142 143 buf.append(messages.key("form.html.row.start")).append("\n"); 145 146 buf.append(messages.key("form.html.label.start")).append(fieldLabel).append(mandatory).append( 148 messages.key("form.html.label.end")).append("\n"); 149 150 buf.append(messages.key("form.html.field.start")).append("\n"); 152 153 buf.append("<img SRC=\"").append( 155 formHandler.link("/system/modules/org.opencms.frontend.templateone.form/pages/captcha?" 156 + captchaSettings.toRequestParams(formHandler.getCmsObject()))).append("\" width=\"").append( 157 captchaSettings.getImageWidth()).append("\" height=\"").append(captchaSettings.getImageHeight()).append( 158 "\" alt=\"\">").append("\n"); 159 160 buf.append("<br>\n"); 162 163 buf.append("<input type=\"text\" name=\"").append(getName()).append("\" value=\"").append(getValue()).append( 165 "\"").append(formHandler.getFormConfiguration().getFormFieldAttributes()).append(">").append(errorMessage).append( 166 messages.key("form.html.field.end")).append("\n"); 167 168 buf.append(messages.key("form.html.row.end")).append("\n"); 170 171 return buf.toString(); 172 } 173 174 180 public CmsCaptchaSettings getCaptchaSettings() { 181 182 return m_captchaSettings; 183 } 184 185 188 public String getType() { 189 190 return TYPE; 191 } 192 193 201 public boolean validateCaptchaPhrase(CmsJspActionElement jsp, String captchaPhrase) { 202 203 boolean result = false; 204 String sessionId = jsp.getRequest().getSession().getId(); 205 206 if (CmsStringUtil.isNotEmpty(captchaPhrase)) { 207 208 ImageCaptchaService captchaService = CmsCaptchaServiceCache.getSharedInstance().getCaptchaService( 209 m_captchaSettings, 210 jsp.getCmsObject()); 211 if (captchaService != null) { 212 result = captchaService.validateResponseForID(sessionId, captchaPhrase).booleanValue(); 213 } 214 } 215 216 return result; 217 } 218 219 226 public void writeCaptchaImage(CmsJspActionElement cms) throws IOException { 227 228 ByteArrayOutputStream captchaImageOutput = new ByteArrayOutputStream (); 229 ServletOutputStream out = null; 230 BufferedImage captchaImage = null; 231 int maxTries = 10; 232 do { 233 try { 234 235 maxTries--; 236 String sessionId = cms.getRequest().getSession().getId(); 237 Locale locale = cms.getRequestContext().getLocale(); 238 239 captchaImage = CmsCaptchaServiceCache.getSharedInstance().getCaptchaService( 240 m_captchaSettings, 241 cms.getCmsObject()).getImageChallengeForID(sessionId, locale); 242 } catch (CaptchaException cex) { 243 if (LOG.isErrorEnabled()) { 244 LOG.error(cex); 245 LOG.error(Messages.get().getBundle().key( 246 Messages.LOG_ERR_CAPTCHA_CONFIG_IMAGE_SIZE_2, 247 new Object [] {m_captchaSettings.getPresetPath(), new Integer (maxTries)})); 248 } 249 m_captchaSettings.setImageHeight(m_captchaSettings.getImageHeight() + 40); 250 m_captchaSettings.setImageWidth(m_captchaSettings.getImageWidth() + 80); 251 } 252 } while (captchaImage == null && maxTries > 0); 253 try { 254 255 JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(captchaImageOutput); 256 jpegEncoder.encode(captchaImage); 257 258 CmsFlexController controller = CmsFlexController.getController(cms.getRequest()); 259 HttpServletResponse response = controller.getTopResponse(); 260 response.setHeader("Cache-Control", "no-store"); 261 response.setHeader("Pragma", "no-cache"); 262 response.setDateHeader("Expires", 0); 263 response.setContentType("image/jpeg"); 264 265 out = cms.getResponse().getOutputStream(); 266 out.write(captchaImageOutput.toByteArray()); 267 out.flush(); 268 269 } catch (Exception e) { 270 271 if (LOG.isErrorEnabled()) { 272 LOG.error(e); 273 } 274 275 cms.getResponse().sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 276 } finally { 277 278 try { 279 if (out != null) { 280 out.close(); 281 } 282 } catch (Throwable t) { 283 } 285 } 286 } 287 288 } 289 | Popular Tags |