<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog sobre Administración de Contenidos (CMS) para Portales, Diarios, Revistas y Comunidades &#187; java</title>
	<atom:link href="http://blog.tfsla.com/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tfsla.com</link>
	<description>Software de Administración de Contenidos, Facebook Apps, TV Widgets y tecnologías Internet</description>
	<lastBuildDate>Thu, 02 Feb 2012 20:02:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Cómo crear un archivo XML de configuración para módulos de OpenCms?</title>
		<link>http://blog.tfsla.com/2009/09/como-crear-un-archivo-xml-de-configuracion-para-modulos-de-opencms/</link>
		<comments>http://blog.tfsla.com/2009/09/como-crear-un-archivo-xml-de-configuracion-para-modulos-de-opencms/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 21:07:36 +0000</pubDate>
		<dc:creator>vpod</dc:creator>
				<category><![CDATA[OpenCms]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.tfsla.com/?p=153</guid>
		<description><![CDATA[Al crear un módulo en OpenCms es probable que tengamos parámetros configurables. Por lo general, estas configuraciones son almacenadas a nivel de cada módulo en archivos de propiedades.  Por cada módulo tendremos dentro del mismo configuraciones específicas. Este artículo explica como generar un archivo XML de configuración centralizado que nos permitirá acelerar los tiempos de [...]]]></description>
			<content:encoded><![CDATA[<address><img class="alignnone size-full wp-image-157" title="xmllogo" src="http://blog.tfsla.com/wp-content/uploads/2009/09/xmllogo.jpg" alt="xmllogo" width="454" height="145" /></address>
<p>Al crear un módulo en OpenCms es probable que tengamos parámetros configurables. Por lo general, estas configuraciones son almacenadas a nivel de cada módulo en archivos de propiedades.  Por cada módulo tendremos dentro del mismo configuraciones específicas.</p>
<p>Este artículo explica como generar un archivo XML de configuración centralizado que nos permitirá acelerar los tiempos de desarrollo y tener un LOG de eventos consolidado. OpenCms tiene un mecanismo interno para cargar la configuración de sus módulos que podemos aprovechar reduciendo la cantidad de trabajo.</p>
<p><span id="more-153"></span>A efectos prácticos, utilizaremos como ejemplo durante todo el artículo un MODULO DE COMENTARIOS. A nivel configuración, este módulo podría tener un parámetro para definir si debe estar activo o inactivo y otro parámetro para la cantidad de entradas que tiene que mostrar por página. </p>
<h1>Qué necesitamos saber?</h1>
<ul>
<li><strong>Formato XML</strong>: conjunto de reglas para codificar documentos</li>
<li><strong>Definición de DTD</strong>: formato que define la descripción de estructura y sintaxis de un documento XML</li>
<li><strong>Digester de Apache Commons</strong>: componente que permite definir un conjunto de reglas para procesar un archivo XML</li>
</ul>
<p> </p>
<h1>Construcción de archivo de configuración</h1>
<p>Cada vez que se inicia OpenCms se configuran las clases propias y de sus módulos utilizando información almacenada en archivos XML. Cuando creamos un módulo con clases que requieren cierta configuración, podemos aprovechar este comportamiento extendiendo ciertas clases provistas por OpenCms.</p>
<p>La construcción de la carga de configuración de un módulo se puede dividir en 3 partes:</p>
<h2>1. Creación de archivo con la configuración</h2>
<p>Los archivos de configuración de OpenCms se guardan dentro de la carpeta <strong>&#8216;/WEB-INF/config&#8217; </strong>de la carpeta raíz de la aplicación. Al ver su contenido, notaremos que son simples archivos XML. Por ejemplo: opencms-modules.xml, opencms-search.xml, etc.</p>
<p>Utilizando nuestro ejemplo del MODULO DE COMENTARIOS, asignamos el parámetro de configuración ESTADO y otro parámetro NUMERO a un archivo de configuración <strong>comentariosConfiguration.XML </strong>y lo almacenamos en la carpeta <strong>config </strong>con un formato similar al detallado a continuación.</p>
<p>- ESTADO : un valor booleano que determina si se deberá permitir ingresar o no comentarios a un recurso.</p>
<p>- NÚMERO: un entero que determina cuantos comentarios por vez se mostrarán en cada página.</p>
<p><span style="color: #ff0000;">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;</span></p>
<p><span style="color: #ff0000;">&lt;opencms&gt;</span></p>
<p><span style="color: #ff0000;">&lt;comentarios&gt;</span></p>
<p><span style="color: #ff0000;">&lt;estado&gt;true&lt;/estado&gt;</span></p>
<p><span style="color: #ff0000;">&lt;numero&gt;20&lt;/numero&gt;</span></p>
<p><span style="color: #ff0000;">&lt;/comentarios&gt;</span></p>
<p><span style="color: #ff0000;">&lt;/opencms&gt;</span></p>
<h2>2. Creación de clase de carga de configuración.</h2>
<p>El siguiente paso es crear la estructura necesaria para que se cargue la configuración. Por un lado necesitamos un DTD, comentariosConfig.DTD,  que defina la organizacion del XML:</p>
<p><span style="color: #ff0000;">&lt;!&#8211; # The root configuration node is called &lt;opencms&gt; for all OpenCms configurations. &#8211;&gt; </span></p>
<p><span style="color: #ff0000;">&lt;!ELEMENT opencms (comentarios)&gt; </span></p>
<p><span style="color: #ff0000;">&lt;!ELEMENT comentarios ( estado, numero )&gt; </span></p>
<p><span style="color: #ff0000;">&lt;!ELEMENT estado (#PCDATA)&gt; </span></p>
<p><span style="color: #ff0000;">&lt;!ELEMENT numero (#PCDATA)&gt;</span></p>
<p>Luego, crearemos la clase que leerá el archivo de configuracion. Para eso utilizaremos una herencia de la clase <strong>org.opencms.configuration.A_CmsXmlConfiguration</strong>. Dentro del mismo, definimos que archivo XML leeremos, el DTD con la estructura y el conjunto de reglas a ejecutar al leer la configuración.</p>
<p>Esta deberá ser creada dentro de un paquete, incluyendo el DTD en la misma ubicación.</p>
<p><span style="color: #ff0000;">package org.opencms.configuration;</span></p>
<p><span style="color: #ff0000;">public class ComentariosConfiguration extends A_CmsXmlConfiguration {</span></p>
<p><span style="color: #ff0000;">public static final String CONFIGURATION_DTD_NAME = &#8220;comentariosConfiguration.dtd&#8221;;</span></p>
<p><span style="color: #ff0000;">public static final String DEFAULT_XML_FILE_NAME = &#8220;comentariosConfiguration.xml&#8221;;</span></p>
<p><span style="color: #ff0000;">public ComentariosConfiguration() {</span></p>
<p><span style="color: #ff0000;">// Retornamos que dtd se usa para controlar el xml.</span></p>
<p><span style="color: #ff0000;">setXmlFileName(DEFAULT_XML_FILE_NAME);</span></p>
<p><span style="color: #ff0000;">}</span></p>
<p><span style="color: #ff0000;">// Configuramos las reglas a utilizar al leer el xml.</span></p>
<p><span style="color: #ff0000;">public void addXmlDigesterRules(Digester digester) {</span></p>
<p><span style="color: #ff0000;"> </span></p>
<p><span style="color: #ff0000;">// Agregamos una regla que al encontrar el tag estado, llame al metodo &#8220;setEstado&#8221; pasandole por parámetro el contenido del mismo.</span></p>
<p><span style="color: #ff0000;">digester.addCallMethod(&#8220;*/comentarios/estado&#8221;, &#8220;setEstado&#8221;, 1);</span></p>
<p><span style="color: #ff0000;">digester.addCallParam(&#8220;*/comentarios/estado&#8221;, 0);</span></p>
<p><span style="color: #ff0000;">// Agregamos una regla que al encontrar el tag numero, llame al metodo &#8220;setNumero&#8221; pasandole por parámetro el contenido del mismo.</span></p>
<p><span style="color: #ff0000;">digester.addCallMethod(&#8220;*/comentarios/numero&#8221;, &#8220;setNumero&#8221;, 1);</span></p>
<p><span style="color: #ff0000;">digester.addCallParam(&#8220;*/comentarios/numero&#8221;, 0);</span></p>
<p><span style="color: #ff0000;">}</span></p>
<p><span style="color: #ff0000;">public String getDtdFilename() {</span></p>
<p><span style="color: #ff0000;">return CONFIGURATION_DTD_NAME;</span></p>
<p><span style="color: #ff0000;">}</span></p>
<p><span style="color: #ff0000;">// Metodo llamado al parsear el xml que supone que existe una clase singleton &#8220;valorConfiguracion&#8221; a la que se le pasa la configuración leida.</span></p>
<p><span style="color: #ff0000;">public void setEstado(String value) {</span></p>
<p><span style="color: #ff0000;">String valueLower = value.toLowerCase();</span></p>
<p><span style="color: #ff0000;">if (valueLower.equals(&#8220;yes&#8221;) || valueLower.equals(&#8220;true&#8221;))</span></p>
<p><span style="color: #ff0000;">valorConfiguracion.getInstance().setEstado(Boolean.TRUE);</span></p>
<p><span style="color: #ff0000;">else</span></p>
<p><span style="color: #ff0000;">valorConfiguracion.getInstance().setEstado(Boolean.FALSE);</span></p>
<p><span style="color: #ff0000;">}</span></p>
<p><span style="color: #ff0000;">// Metodo llamado al parsear el xml que supone que existe una clase singleton &#8220;valorConfiguracion&#8221; a la que se le pasa la configuración leida.</span></p>
<p><span style="color: #ff0000;">public void setNumero(String value) {</span></p>
<p><span style="color: #ff0000;">int numero = Integer.parseInt(value);</span></p>
<p><span style="color: #ff0000;">valorConfiguracion.getInstance().setNumero(numero);</span></p>
<p><span style="color: #ff0000;">}</span></p>
<p><span style="color: #ff0000;">}</span></p>
<p>Para utilizar este mecanismo, tendremos que definir en la misma carpeta que la clase anterior la clase &#8220;MessagesComentarios&#8221; que hereda de &#8220;A_CmsMessageBundle&#8221; y  defina los mensajes a mostar en el <strong>opencms.log</strong>. También deberemos crear la clase properties con el texto de los mensajes a mostrar.</p>
<h2>3. Agregado de la nueva configuración</h2>
<p>Una vez que tengamos definidas las clases y los archivos de configuración deberemos indicar al OpenCms que al iniciar debe ejecutar nuestra clase y tomar la configuración. Esto se realiza agregando una nueva entrada al archivo <strong>opencms.xml</strong> ubicado en el directorio <strong>/WEB-INF/config</strong>.</p>
<p><span style="color: #ff0000;">&lt;config class=&#8221;org.opencms.configuration.ComentariosConfiguration&#8221;/&gt;</span></p>
<p>Finalizado este paso, en el próximo inicio del sistema se levantará la configuración del archivo XML y la misma podrá ser utilizada por nuestras clases y aplicaciones.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tfsla.com/2009/09/como-crear-un-archivo-xml-de-configuracion-para-modulos-de-opencms/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilización de captcha para aumentar la seguridad en los formularios de Opencms</title>
		<link>http://blog.tfsla.com/2009/05/utilizacion-de-captcha-para-aumentar-la-seguridad-en-los-formularios-de-opencms/</link>
		<comments>http://blog.tfsla.com/2009/05/utilizacion-de-captcha-para-aumentar-la-seguridad-en-los-formularios-de-opencms/#comments</comments>
		<pubDate>Sat, 16 May 2009 15:17:58 +0000</pubDate>
		<dc:creator>vpod</dc:creator>
				<category><![CDATA[OpenCms]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tfsla]]></category>

		<guid isPermaLink="false">http://blog.tfsla.com/?p=27</guid>
		<description><![CDATA[El componente CAPTCHA está pensado para impedir que un robot (programa generador por un usuario mal intencionado) se aproveche de un formulario web para el envío masivo de mensajes o solicitudes: formulario de comentarios funcionalidad de envío por e-mail votaciones en encuestas reporte de abuso ingresos de &#8216;posts&#8217; en un foro o blog etc. El [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-30" title="captcha" src="http://blog.tfsla.com/wp-content/uploads/2009/05/captcha.jpg" alt="captcha" width="467" height="281" />El componente <strong>CAPTCHA </strong>está pensado para impedir que un robot (programa generador por un usuario mal intencionado) se aproveche de un formulario web para el envío masivo de mensajes o solicitudes:</p>
<ul>
<li>
<address>formulario de comentarios</address>
</li>
<li>
<address>funcionalidad de envío por e-mail</address>
</li>
<li>
<address>votaciones en encuestas</address>
</li>
<li>
<address>reporte de abuso</address>
</li>
<li>
<address>ingresos de &#8216;posts&#8217; en un foro o blog</address>
</li>
<li>
<address>etc.</address>
</li>
</ul>
<p>El presente artículo, presenta una visión de alto nivel sobre como implementar esta tecnología para impedir que un sitio sea víctima de un robot.</p>
<p><span id="more-27"></span></p>
<h2>Cómo funciona un formulario Web estándar?</h2>
<p>Un formulario web está formado por un conjunto de campos que se envían una dirección URL específica. El navegador es quién muestra el formulario, permite la carga de información y permite el envío de los datos. En la URL de destino se procesan los datos recibidos y se realiza un procesamiento de acuerdo a lo que específica la aplicación.</p>
<h2>Cómo funcionan los robots?</h2>
<p>Un <strong>robot programado </strong>por lo general toma el papel del navegador y genera el formulario cargando datos específicos que envía a la URL de proceso. De esa forma puede lograr en un lapso breve de tiempo un ingreso y proceso vulnerando el sitio Web.</p>
<p>Para evitar esto, se creó un método conocido como <strong>CAPTCHA</strong>. El mismo, agrega en el formulario una imagen conformada por letras con cierta distorsión. Estas letras solo pueden ser interpretadas por un ser humano y no por un robot. Para la utilización del formulario con <strong>CAPTCHA </strong>el usuario debe ingresar los datos del formulario y las letras que se le muestra en la imagen.</p>
<h2>Cómo funciona el mecanismo CAPTCHA?</h2>
<p>Cada vez que se ingresa al formulario se genera en forma aleatoria una imagen con distintas letras y una clave propia que identifica esa imagen con su valor de texto. Esta clave y texto se guarda en el servidor.<br />
Cuando el servidor recibe el envío del formulario verifica que el valor ingresado en el campo captcha coincida con el almacenado en el servidor para la clave utilizada. Cuando hay coincidencia se permite el procesamiento normal. De lo contrario, se lo impide.</p>
<p>Es importante aclarar que una vez utilizado el par de claves y valor el mismo se marca como utilizada. De esta forma, su uso es denegado si se quiere enviar el mismo formulario con el mismo par valor-clave.</p>
<h2>Cómo agregar CAPTCHA a un sitio?</h2>
<p>Para agregar captcha a un sitio Opencms se pueden usar implementaciones existentes. En la práctica, nosotros hemos utilizado <strong>JCAPTCHA </strong>por ser OpenSource, estar escrito en JAVA y tener un buen desempeño a nivel seguridad. La dirección del proyecto es la siguiente: <a href="http://jcaptcha.sourceforge.net/">http://jcaptcha.sourceforge.net/</a></p>
<p>Para su utilización en <strong>Tomcat </strong>debemos realizar los pasos descriptos a continuación. Muchos de los comportamientos requeridos son provistos por JCAPTCHA pero se presentan de todas formas para mejorar la compresión del funcionamiento.</p>
<p><strong>1. Generar una clase en JAVA que implemente un servicio (servlet) que en base al framework genera el captcha.</strong></p>
<p>La clase debe generar la imagen y registrar para una clave (que puede recibir por parámetro) el valor que contendrá el CAPTCHA.</p>
<p><strong>2. Generar la clase en JAVA que verifique dado la clave y el valor si se corresponden y si fue utilizado.</strong> Luego de la consulta el clave-valor se marca como utilizado para no permitir su uso nuevamente.</p>
<p><strong>3. Registrar el servlet en el web.xml de la aplicación para que responda a una URL.</strong></p>
<p><strong>4.  En el formulario a utilizar el mecanismo CAPTCHA:<br />
</strong>- Generar una clave aleatoria (random). <br />
- Agregar al llamado al servlet dentro  de una imagen (img) pasándolo como querystring la clave.<br />
- Guardar la clave en un campo oculto (hidden).<br />
- Agregar un campo para que el usuario escriba las letras que ve en la imagen.</p>
<p><strong>5.  Al momento de verificar el formulario obtener la clave y el valor que escribió el usuario. </strong>Utilizar la clase de verificación y ver si coincide con el almacenado en el servidor. En caso de no corresponderse, no permitir continuar con la ejecución del formulario.</p>
<address>Para más información, ver:<br />
<a href="http://forge.octo.com/jcaptcha/confluence/display/general/5+minutes+application+integration+tutorial">http://forge.octo.com/jcaptcha/confluence/display/general/5+minutes+application+integration+tutorial</a></address>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tfsla.com/2009/05/utilizacion-de-captcha-para-aumentar-la-seguridad-en-los-formularios-de-opencms/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

