/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.web.portal.captcha;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.enonic.cms.core.Path;
import com.enonic.cms.core.captcha.CaptchaRepository;
import com.enonic.cms.web.portal.PortalWebContext;
import com.enonic.cms.web.portal.handler.WebHandlerBase;
@Component
public final class CaptchaHandler
extends WebHandlerBase
{
private CaptchaRepository captchaRepository;
@Override
protected boolean canHandle( final Path localPath )
{
return localPath.containsSubPath( "_captcha" );
}
@Override
protected void doHandle( final PortalWebContext context )
throws Exception
{
final HttpServletRequest request = context.getRequest();
final HttpServletResponse response = context.getResponse();
try
{
byte[] captchaChallengeAsJpeg;
ByteArrayOutputStream imageOutputStream = new ByteArrayOutputStream();
HttpSession session = request.getSession();
BufferedImage challenge = captchaRepository.createCaptcha( session ).getImage();
ImageIO.write( challenge, "png", imageOutputStream );
captchaChallengeAsJpeg = imageOutputStream.toByteArray();
// flush it in the response
response.setHeader( "Cache-Control", "no-store" );
response.setHeader( "Pragma", "no-cache" );
response.setDateHeader( "Expires", 0 );
response.setContentType( "image/png" );
ServletOutputStream responseOutputStream = response.getOutputStream();
responseOutputStream.write( captchaChallengeAsJpeg );
responseOutputStream.flush();
responseOutputStream.close();
}
catch ( IllegalArgumentException e )
{
response.sendError( HttpServletResponse.SC_NOT_FOUND );
}
}
@Autowired
public void setCaptchaRepository( CaptchaRepository captchaRepository )
{
this.captchaRepository = captchaRepository;
}
}