You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2012/05/11 21:23:46 UTC

svn commit: r1337337 - in /ofbiz/branches/release11.04: ./ framework/common/config/ framework/common/src/org/ofbiz/common/ framework/common/webcommon/WEB-INF/ specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/

Author: jacopoc
Date: Fri May 11 19:23:46 2012
New Revision: 1337337

URL: http://svn.apache.org/viewvc?rev=1337337&view=rev
Log:
Applied fix from trunk for revision: 1337057 
===

Copied the captcha image generator into a single event that streams the image to the response for a direct request rather than trying to store it during screen rendering to be served up later.

Added:
    ofbiz/branches/release11.04/framework/common/config/captcha.properties
      - copied unchanged from r1337057, ofbiz/trunk/framework/common/config/captcha.properties
Modified:
    ofbiz/branches/release11.04/   (props changed)
    ofbiz/branches/release11.04/framework/common/src/org/ofbiz/common/CommonEvents.java
    ofbiz/branches/release11.04/framework/common/webcommon/WEB-INF/common-controller.xml
    ofbiz/branches/release11.04/specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/controller.xml

Propchange: ofbiz/branches/release11.04/
------------------------------------------------------------------------------
  Merged /ofbiz/trunk:r1337057

Modified: ofbiz/branches/release11.04/framework/common/src/org/ofbiz/common/CommonEvents.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release11.04/framework/common/src/org/ofbiz/common/CommonEvents.java?rev=1337337&r1=1337336&r2=1337337&view=diff
==============================================================================
--- ofbiz/branches/release11.04/framework/common/src/org/ofbiz/common/CommonEvents.java (original)
+++ ofbiz/branches/release11.04/framework/common/src/org/ofbiz/common/CommonEvents.java Fri May 11 19:23:46 2012
@@ -18,6 +18,12 @@
  *******************************************************************************/
 package org.ofbiz.common;
 
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
@@ -28,8 +34,10 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
+import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
 
 import javolution.util.FastMap;
 import net.sf.json.JSON;
@@ -37,6 +45,8 @@ import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONSerializer;
 
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.StringUtil;
 import org.ofbiz.base.util.UtilGenerics;
@@ -370,10 +380,96 @@ public class CommonEvents {
         writeJSONtoResponse(jsonUiLabel, response);
         return "success";
     }
-}
-
-
-
-
 
+    public static String getCaptcha(HttpServletRequest request,HttpServletResponse response) {
+        try {
+            final String captchaSizeConfigName = StringUtils.defaultIfEmpty(request.getParameter("captchaSize"), "default");
+            final String captchaSizeConfig = UtilProperties.getPropertyValue("captcha.properties", "captcha." + captchaSizeConfigName);
+            final String[] captchaSizeConfigs = captchaSizeConfig.split("\\|");
+
+            final int fontSize = Integer.parseInt(captchaSizeConfigs[0]);
+            final int height = Integer.parseInt(captchaSizeConfigs[1]);
+            final int width = Integer.parseInt(captchaSizeConfigs[2]);
+            final int charsToPrint = UtilProperties.getPropertyAsInteger("captcha.properties", "captcha.code_length", 6);
+            final char[] availableChars = UtilProperties.getPropertyValue("captcha.properties", "captcha.characters").toCharArray();
+
+            //It is possible to pass the font size, image width and height with the request as well
+            Color backgroundColor = Color.gray;
+            Color borderColor = Color.DARK_GRAY;
+            Color textColor = Color.ORANGE;
+            Color circleColor = new Color(160, 160, 160);
+            Font textFont = new Font("Arial", Font.PLAIN, fontSize);
+            int circlesToDraw = 6;
+            float horizMargin = 20.0f;
+            double rotationRange = 0.7; // in radians
+            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+            Graphics2D g = (Graphics2D) bufferedImage.getGraphics();
+
+            g.setColor(backgroundColor);
+            g.fillRect(0, 0, width, height);
+
+            //Generating some circles for background noise
+            g.setColor(circleColor);
+            for (int i = 0; i < circlesToDraw; i++) {
+                int circleRadius = (int) (Math.random() * height / 2.0);
+                int circleX = (int) (Math.random() * width - circleRadius);
+                int circleY = (int) (Math.random() * height - circleRadius);
+                g.drawOval(circleX, circleY, circleRadius * 2, circleRadius * 2);
+            }
+            g.setColor(textColor);
+            g.setFont(textFont);
+
+            FontMetrics fontMetrics = g.getFontMetrics();
+            int maxAdvance = fontMetrics.getMaxAdvance();
+            int fontHeight = fontMetrics.getHeight();
+
+            String captchaCode = RandomStringUtils.random(6, availableChars);
+
+            float spaceForLetters = -horizMargin * 2 + width;
+            float spacePerChar = spaceForLetters / (charsToPrint - 1.0f);
+
+            for (int i = 0; i < captchaCode.length(); i++) {
+
+                // this is a separate canvas used for the character so that
+                // we can rotate it independently
+                int charWidth = fontMetrics.charWidth(captchaCode.charAt(i));
+                int charDim = Math.max(maxAdvance, fontHeight);
+                int halfCharDim = (charDim / 2);
+
+                BufferedImage charImage =
+                    new BufferedImage(charDim, charDim, BufferedImage.TYPE_INT_ARGB);
+                Graphics2D charGraphics = charImage.createGraphics();
+                charGraphics.translate(halfCharDim, halfCharDim);
+                double angle = (Math.random() - 0.5) * rotationRange;
+                charGraphics.transform(AffineTransform.getRotateInstance(angle));
+                charGraphics.translate(-halfCharDim, -halfCharDim);
+                charGraphics.setColor(textColor);
+                charGraphics.setFont(textFont);
+
+                int charX = (int) (0.5 * charDim - 0.5 * charWidth);
+                charGraphics.drawString("" + captchaCode.charAt(i), charX,
+                        ((charDim - fontMetrics.getAscent()) / 2 + fontMetrics.getAscent()));
+
+                float x = horizMargin + spacePerChar * (i) - charDim / 2.0f;
+                int y = ((height - charDim) / 2);
+
+                g.drawImage(charImage, (int) x, y, charDim, charDim, null, null);
+
+                charGraphics.dispose();
+            }
+            // Drawing the image border
+            g.setColor(borderColor);
+            g.drawRect(0, 0, width - 1, height - 1);
+            g.dispose();
+            response.setContentType("image/jpeg");
+            ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
+            HttpSession session = request.getSession();
+            session.setAttribute("_CAPTCHA_CODE_", captchaCode);
+        } catch (Exception ioe) {
+            Debug.logError(ioe.getMessage(), module);
+        }
+        return "success";
+    }
 
+}

Modified: ofbiz/branches/release11.04/framework/common/webcommon/WEB-INF/common-controller.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/release11.04/framework/common/webcommon/WEB-INF/common-controller.xml?rev=1337337&r1=1337336&r2=1337337&view=diff
==============================================================================
--- ofbiz/branches/release11.04/framework/common/webcommon/WEB-INF/common-controller.xml (original)
+++ ofbiz/branches/release11.04/framework/common/webcommon/WEB-INF/common-controller.xml Fri May 11 19:23:46 2012
@@ -202,6 +202,13 @@ under the License.
         <response name="success" type="view" value="main"/>
     </request-map>
 
+    <!-- Common captcha image request, the captcha code is stored in the session using _CAPTCHA_CODE_ as the key -->
+    <request-map uri="captcha.jpg">
+        <security https="false" auth="false"/>
+        <event type="java" path="org.ofbiz.common.CommonEvents" invoke="getCaptcha"/>
+        <response name="success" type="none"/>
+    </request-map>
+
     <!-- Lookup requests -->
     <request-map uri="LookupGeo"><security https="true" auth="true"/><response name="success" type="view" value="LookupGeo"/></request-map>
     <request-map uri="LookupGeoName"><security https="true" auth="true"/><response name="success" type="view" value="LookupGeoName"/></request-map>

Modified: ofbiz/branches/release11.04/specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/controller.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/release11.04/specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/controller.xml?rev=1337337&r1=1337336&r2=1337337&view=diff
==============================================================================
--- ofbiz/branches/release11.04/specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/controller.xml (original)
+++ ofbiz/branches/release11.04/specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/controller.xml Fri May 11 19:23:46 2012
@@ -1938,7 +1938,13 @@ under the License.
         <response name="success" type="view" value="ProductUomDropDownOnly" save-last-view="true"/>
     </request-map>
     
-    <!-- Captcha -->
+    <!-- Captcha: Image request, the captcha code is stored in the session using _CAPTCHA_CODE_ as the key -->
+    <request-map uri="captcha.jpg">
+        <security https="true" auth="false"/>
+        <event type="java" path="org.ofbiz.common.CommonEvents" invoke="getCaptcha"/>
+        <response name="success" type="none"/>
+    </request-map>
+    
     <request-map uri="reloadCaptchaImage">
         <security https="true" auth="false"/>        
         <response name="success" type="view" value="reloadCaptchaImage"/>