Return-Path: Delivered-To: apmail-cocoon-cvs-archive@www.apache.org Received: (qmail 29801 invoked from network); 22 May 2005 08:55:50 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 22 May 2005 08:55:50 -0000 Received: (qmail 42197 invoked by uid 500); 22 May 2005 08:55:49 -0000 Delivered-To: apmail-cocoon-cvs-archive@cocoon.apache.org Received: (qmail 42060 invoked by uid 500); 22 May 2005 08:55:49 -0000 Mailing-List: contact cvs-help@cocoon.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@cocoon.apache.org list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list cvs@cocoon.apache.org Received: (qmail 42044 invoked by uid 99); 22 May 2005 08:55:48 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Sun, 22 May 2005 01:55:46 -0700 Received: (qmail 29754 invoked by uid 65534); 22 May 2005 08:55:45 -0000 Message-ID: <20050522085545.29753.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Subject: svn commit: r171293 - in /cocoon: blocks/core/forms/trunk/java/org/apache/cocoon/forms/binding/ blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/ blocks/core/forms/trunk/java/org/apache/cocoon/forms/generation/ blocks/core/forms/trunk/java/org/apache/cocoon/forms/resources/js/ blocks/core/forms/trunk/java/org/apache/cocoon/forms/validation/impl/ blocks/core/forms/trunk/samples/ blocks/core/forms/trunk/samples/messages/ blocks/core/forms/trunk/samples/resources/ trunk/ Date: Sun, 22 May 2005 08:55:43 -0000 To: cvs@cocoon.apache.org From: sylvain@apache.org X-Mailer: svnmailer-1.0.0-dev X-Virus-Checked: Checked X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: sylvain Date: Sun May 22 01:55:42 2005 New Revision: 171293 URL: http://svn.apache.org/viewcvs?rev=3D171293&view=3Drev Log: sync captcha Added: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/C= aptchaDefinitionBuilder.java (with props) cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/C= aptchaField.java (with props) cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/C= aptchaFieldDefinition.java (with props) cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/validation/= impl/CaptchaValidator.java (with props) cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/validation/= impl/CaptchaValidatorBuilder.java (with props) Modified: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/binding/Jav= aScriptJXPathBinding.java cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/F= orm.java cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/generation/= jx-macros.xml cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/resources/j= s/cforms.js cocoon/blocks/core/forms/trunk/samples/messages/FormsMessages.xml cocoon/blocks/core/forms/trunk/samples/messages/FormsMessages_it_IT.xml cocoon/blocks/core/forms/trunk/samples/resources/forms-field-styling.xsl cocoon/blocks/core/forms/trunk/samples/sitemap.xmap cocoon/blocks/core/forms/trunk/samples/welcome.xml cocoon/trunk/status.xml Modified: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/bindi= ng/JavaScriptJXPathBinding.java URL: http://svn.apache.org/viewcvs/cocoon/blocks/core/forms/trunk/java/org/= apache/cocoon/forms/binding/JavaScriptJXPathBinding.java?rev=3D171293&r1=3D= 171292&r2=3D171293&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/binding/Jav= aScriptJXPathBinding.java (original) +++ cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/binding/Jav= aScriptJXPathBinding.java Sun May 22 01:55:42 2005 @@ -58,8 +58,9 @@ =20 // Set parent on child bindings for(Iterator iter =3D childBindings.values().iterator(); iter.hasN= ext(); ) { - ((Binding)iter.next()).setParent(this); + ((Binding)iter.next()).setParent(this); } + this.childBindings =3D new ScriptableMap(childBindings); } =20 Added: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmode= l/CaptchaDefinitionBuilder.java URL: http://svn.apache.org/viewcvs/cocoon/blocks/core/forms/trunk/java/org/= apache/cocoon/forms/formmodel/CaptchaDefinitionBuilder.java?rev=3D171293&vi= ew=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/C= aptchaDefinitionBuilder.java (added) +++ cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/C= aptchaDefinitionBuilder.java Sun May 22 01:55:42 2005 @@ -0,0 +1,57 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + *=20 + * 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 + *=20 + * http://www.apache.org/licenses/LICENSE-2.0 + *=20 + * 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.cocoon.forms.formmodel; + +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.thread.ThreadSafe; +import org.apache.cocoon.forms.util.DomHelper; +import org.w3c.dom.Element; + +/** + * Builds {@link CaptchaFieldDefinition}s. + * + * @see http://www.captcha.net/ + * @version $Id$ + */ +public class CaptchaDefinitionBuilder extends AbstractDatatypeWidgetDefini= tionBuilder implements Contextualizable, ThreadSafe { + =20 + private Context avalonContext; + =20 + public void contextualize(Context context) throws ContextException { + this.avalonContext =3D context; + } + + public WidgetDefinition buildWidgetDefinition(Element widgetElement) t= hrows Exception { + FieldDefinition definition =3D new CaptchaFieldDefinition(avalonCo= ntext); + setupDefinition(widgetElement, definition); + definition.makeImmutable(); + return definition; + } + + protected void setupDefinition(Element widgetElement, FieldDefinition = definition) throws Exception { + super.setupDefinition(widgetElement, definition); + =20 + // parse "@required" + boolean required =3D DomHelper.getAttributeAsBoolean(widgetElement= , "required", false); + definition.setRequired(required); + =20 + // parse "@length" + int length =3D DomHelper.getAttributeAsInteger(widgetElement, "len= gth", 7); + ((CaptchaFieldDefinition) definition).setLength(length); + } +} Propchange: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/for= mmodel/CaptchaDefinitionBuilder.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Propchange: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/for= mmodel/CaptchaDefinitionBuilder.java ---------------------------------------------------------------------------= --- svn:keywords =3D Id Added: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmode= l/CaptchaField.java URL: http://svn.apache.org/viewcvs/cocoon/blocks/core/forms/trunk/java/org/= apache/cocoon/forms/formmodel/CaptchaField.java?rev=3D171293&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/C= aptchaField.java (added) +++ cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/C= aptchaField.java Sun May 22 01:55:42 2005 @@ -0,0 +1,120 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + *=20 + * 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 + *=20 + * http://www.apache.org/licenses/LICENSE-2.0 + *=20 + * 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.cocoon.forms.formmodel; + +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Locale; +import java.util.Map; + +import org.apache.avalon.framework.CascadingRuntimeException; +import org.apache.avalon.framework.context.Context; +import org.apache.cocoon.components.ContextHelper; +import org.apache.cocoon.environment.ObjectModelHelper; +import org.apache.cocoon.environment.Session; +import org.apache.cocoon.forms.Constants; +import org.apache.cocoon.xml.AttributesImpl; +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; + + +/** + * A {@link Field} for CAPTCHA validation. Upon generation, a secret rando= m string is stored + * in a session attribute having a randomly generated name, for use by a=20 + * {@link org.apache.cocoon.forms.validation.impl.CaptchaValidator}. + *
+ * Usage sample: + *
+    <fd:captcha id=3D"f1" required=3D"true">
+      <fd:label>Copy the number shown into the input field</fd:label>
+      <fd:datatype base=3D"string"/>
+      <fd:validation>
+        <fd:captcha/>
+      </fd:validation>
+    </fd:captcha>
+ * 
+ *=20 + * @see http://www.captcha.net/ + * @version CVS $Id$ + */ +public class CaptchaField extends Field { + + public static final String SESSION_ATTR_PREFIX =3D "captcha-"; + + private static final String IMAGE_EL =3D "captcha-image"; + private static final String SECRET_CHARS =3D "abcdefghijkmnopqrstuvwxy= zABCDEFGHIJKLMNPQRSTUVWXYZ123456789"; + private static final int SESSION_ATTR_NAME_LENGTH =3D 6; + =20 + private Context avalonContext; + private int length; + + /** + * Random number generator used to create session attribute name. + */ + protected static SecureRandom random; + + static { + try { + random =3D SecureRandom.getInstance("SHA1PRNG"); + } catch(java.security.NoSuchAlgorithmException nsae) { + // Maybe we are on IBM's SDK + try { + random =3D SecureRandom.getInstance("IBMSecureRandom"); + } catch (NoSuchAlgorithmException e) { + throw new CascadingRuntimeException("No random number gene= rator available", e); + } + } + random.setSeed(System.currentTimeMillis()); + } + + public CaptchaField(CaptchaFieldDefinition fieldDefinition, Context av= alonContext) { + super(fieldDefinition); + this.avalonContext =3D avalonContext; + this.length =3D fieldDefinition.getLength(); + } + =20 + private String generateSecret() { + StringBuffer secret =3D new StringBuffer(length); + for (int n =3D 0 ; n < length ; n++) { + int randomnumber =3D random.nextInt(SECRET_CHARS.length()); + secret.append(SECRET_CHARS.charAt(randomnumber));=20 + } + return secret.toString(); + } + + public void generateItemSaxFragment(ContentHandler contentHandler, Loc= ale locale) throws SAXException { + super.generateItemSaxFragment(contentHandler, locale); + byte[] bytes =3D new byte[SESSION_ATTR_NAME_LENGTH]; + char[] result =3D new char[bytes.length * 2]; + random.nextBytes(bytes); + for (int i =3D 0; i < SESSION_ATTR_NAME_LENGTH; i++) { + byte ch =3D bytes[i]; + result[2 * i] =3D Character.forDigit(Math.abs(ch >> 4), 16); + result[2 * i + 1] =3D Character.forDigit(Math.abs(ch & 0x0f), = 16); + } + String id =3D new String(result); + Map objectModel =3D ContextHelper.getObjectModel(this.avalonContex= t); + Session session =3D ObjectModelHelper.getRequest(objectModel).getS= ession(true); + String secret =3D generateSecret(); + session.setAttribute(SESSION_ATTR_PREFIX + id, secret); + this.setAttribute("secret", secret); + AttributesImpl attrs =3D new AttributesImpl(); + attrs.addAttribute("", "id", "id", "PCDATA", id); + contentHandler.startElement(Constants.INSTANCE_NS, IMAGE_EL, Const= ants.INSTANCE_PREFIX_COLON + IMAGE_EL, attrs); + contentHandler.endElement(Constants.INSTANCE_NS, IMAGE_EL, Constan= ts.INSTANCE_PREFIX_COLON + IMAGE_EL); + } + =20 +} Propchange: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/for= mmodel/CaptchaField.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Propchange: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/for= mmodel/CaptchaField.java ---------------------------------------------------------------------------= --- svn:keywords =3D Id Added: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmode= l/CaptchaFieldDefinition.java URL: http://svn.apache.org/viewcvs/cocoon/blocks/core/forms/trunk/java/org/= apache/cocoon/forms/formmodel/CaptchaFieldDefinition.java?rev=3D171293&view= =3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/C= aptchaFieldDefinition.java (added) +++ cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/C= aptchaFieldDefinition.java Sun May 22 01:55:42 2005 @@ -0,0 +1,49 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + *=20 + * 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 + *=20 + * http://www.apache.org/licenses/LICENSE-2.0 + *=20 + * 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.cocoon.forms.formmodel; + +import org.apache.avalon.framework.context.Context; + +/** + * A {@link FieldDefinition} for {@link CaptchaField}s. + *=20 + * @see http://www.captcha.net/ + * @version CVS $Id$ + */ +public class CaptchaFieldDefinition extends FieldDefinition { + =20 + private Context avalonContext; + private int length; + + public CaptchaFieldDefinition(Context avalonContext) { + this.avalonContext =3D avalonContext; + } + + public Widget createInstance() { + CaptchaField field =3D new CaptchaField(this, avalonContext); + return field; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + checkMutable(); + this.length =3D length; + } + +} Propchange: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/for= mmodel/CaptchaFieldDefinition.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Propchange: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/for= mmodel/CaptchaFieldDefinition.java ---------------------------------------------------------------------------= --- svn:keywords =3D Id Modified: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formm= odel/Form.java URL: http://svn.apache.org/viewcvs/cocoon/blocks/core/forms/trunk/java/org/= apache/cocoon/forms/formmodel/Form.java?rev=3D171293&r1=3D171292&r2=3D17129= 3&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/F= orm.java (original) +++ cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/formmodel/F= orm.java Sun May 22 01:55:42 2005 @@ -59,7 +59,6 @@ // Widgets that need to be updated in the client when in AJAX mode private Set updatedWidgets; =20 - public Form(FormDefinition definition) { super(definition); this.definition =3D definition; Modified: cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/gener= ation/jx-macros.xml URL: http://svn.apache.org/viewcvs/cocoon/blocks/core/forms/trunk/java/org/= apache/cocoon/forms/generation/jx-macros.xml?rev=3D171293&r1=3D171292&r2=3D= 171293&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/generation/= jx-macros.xml (original) +++ cocoon/blocks/core/forms/trunk/java/org/apache/cocoon/forms/generation/= jx-macros.xml Sun May 22 01:55:42 2005 @@ -1,3 +1,4 @@ + + + + + Modified: cocoon/blocks/core/forms/trunk/samples/sitemap.xmap URL: http://svn.apache.org/viewcvs/cocoon/blocks/core/forms/trunk/samples/s= itemap.xmap?rev=3D171293&r1=3D171292&r2=3D171293&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- cocoon/blocks/core/forms/trunk/samples/sitemap.xmap (original) +++ cocoon/blocks/core/forms/trunk/samples/sitemap.xmap Sun May 22 01:55:42= 2005 @@ -530,8 +530,8 @@ =20 =20 - - =20 + =20 + Modified: cocoon/blocks/core/forms/trunk/samples/welcome.xml URL: http://svn.apache.org/viewcvs/cocoon/blocks/core/forms/trunk/samples/w= elcome.xml?rev=3D171293&r1=3D171292&r2=3D171293&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- cocoon/blocks/core/forms/trunk/samples/welcome.xml (original) +++ cocoon/blocks/core/forms/trunk/samples/welcome.xml Sun May 22 01:55:42 = 2005 @@ -48,6 +48,7 @@ A simple form using the HTML= editor widget. Aggregate field ex= amples A multipage= wizard, using widget states and actions to move between pages. + CAPTCHA validation= (requires Batik block) =20 Modified: cocoon/trunk/status.xml URL: http://svn.apache.org/viewcvs/cocoon/trunk/status.xml?rev=3D171293&r1= =3D171292&r2=3D171293&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- cocoon/trunk/status.xml (original) +++ cocoon/trunk/status.xml Sun May 22 01:55:42 2005 @@ -443,6 +443,11 @@ + + CForms block: add automatic AJAX features. When <ft:form-te= mplate> + has an ajax=3D"true" attribute, partial page updates ar= e performed rather + than full page reloads. + SearchGenerator return has-previous false when meet the no. 2 page.