29 julio 2015

Controlando la entrada de datos en formularios (Form Errors)

Ahora es posible mostrar etiquetas de error, que guíen al usuario durante la introducción de valores en los campos de un formulario web, podremos hacer que (dichas etiquetas) se muestren a la derecha o debajo de los campos de entrada de un "remote form". Esta nueva característica hará más fácil a los usuarios rellenar formularios en la web y en nuestras aplicaciones móviles, de éste modo podremos realizar una validación dinámica e interactiva del formulario. Los errores aparecen en el formulario como etiquetas de texto "text field", y situados bajo un control o a su derecha, por lo que será necesario diseñar los "remote form" de modo que dejen el espacio necesario para que sea posible mostrar el texto de error. El estilo del texto, puede indicarse mediante HTML o CSS.


Descripción y uso de sus propiedades


$errortext


Todos los controles "jsClient" soportan la propiedad "$errortext", ésta propiedad es la que deberá contener el texto a mostrar cuando se produzca un error sobre el campo o control en uso. Inicialmente no contendrá valor alguno.

$errortextpos

La propiedad "$errortextpos" permite especificar la posición del texto de error. Sus posibles valores son:
  • kJSErrorTextPosUnder (El texto de error será mostrado bajo el control. Es también, su valor predeterminado.)
  • kJSErrorTextPosRight (El texto de error será mostrado a la derecha del control.)

Tenga en cuenta que Omnis deberá guardar valores para cada "$errortextpos", según los diferentes y posibles tamaños de pantalla. Durante el diseño del formulario, deberá mantener pulsada la tecla "control", para asignar un valor diferente según los tamaños de pantalla a soportar.

$errorline

La propiedad "$errorline" sólo puede ser usada en modo "tiempo de ejecución" o "runtime" y permite la asignación de "$errortext" a un objeto localizado dentro de una fila en un control "Complex Grid". Contendrá el número de la fila sobre la que aplicar el texto.

 

Eliminación de los textos mostrados


Un nuevo comando de tipo "client command", denominado "clearerrors" nos permite eliminar todos los mensajes de error mostrados sobre un formulario.

Do $cinst.$clientcommand(“clearerrors")


Ésta acción es equivalente a la asignación de un "$errortext" vacío para todos los controles del formulario con texto de error asignado.

 

Modificación del estilo del texto


A continuación indicamos las clases CSS que controlan la apariencia y bordes del texto. Podrá encontrarlos sobre el fichero "omnis.css".
  • div.om-error-text (Clase con lo estilos aplicables el texto de error.)
  • div.om-error-border (Configura los márgenes del "div" con el texto de error.)

22 julio 2015

Autenticación “Web Service”

A continuación describimos cómo configurar nuestro servidor web para que soporte autenticación “Web Service” basados en “REST”. (Disponible desde Omnis Studio 6.1.)

Por supuesto deberemos configurar nuestra librería Omnis, pero al margen de esto y cuando estamos utilizando un “simple” servidor Web (es decir no un servicio incorporado mediante Tomcat), podemos configurar la dirección URL del servicio web para que soporte autenticación básica (basic) o implícita (digest). También dispondremos de la opción de usar https y certificación para dar soporte a conexiones seguras.

A continuación incluimos algunas notas sobre cómo configurar Tomcat, Apache Web Server y IIS para que soporten autenticación básica (basic) o implícita (digest). Si así lo hacemos, el servidor Web será el encargado de autenticar a los clientes, a Omnis sólo pasará la solicitud una vez que cliente se ha autenticado correctamente; las cabeceras HTTP incluirán los datos con los detalles correspondientes, el llamado “Authorization header”.

Omnis Studio 6.1 posee una nueva función denominada parsehttpauth(auth) que permite examinar el contenido HTTP del “Authorization header”, ésta nos devolverá una variable de tipo “row” con la información extraída. La primera columna de la “row” con el nombre “scheme”, es el tipo de esquema (por ejemplo “basic”). El contenido del resto de las columnas, dependerá del tipo de esquema de que se trate. Por ejemplo, para las cabeceras siguientes:

Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

La “row” devuelta contendrá las siguientes 3 columnas:
  • scheme: basic
  • username: Aladdin
  • password: open sesame

Digest username="Mufasa",realm="testrealm@host.com",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",uri="/dir/index.html",qop=auth,nc=00000001,cnonce="0a4f113b",response="6629fae49393a05397450978507c4ef1",opaque="5ccc069c403ebaf9f0171e9517f40e41"


La “row” devuelta contendrá las siguientes 10 columnas:
  • scheme: digest
  • username: Mufasa
  • realm: testrealm@host.com
  • nonce: dcd98b7102dd2f0e8b11d0f600bfb0c093
  • uri: /dir/index.html
  • qop: auth
  • nc: 00000001
  • cnonce: 0a4f113b
  • response: 6629fae49393a05397450978507c4ef1
  • opaque: 5ccc069c403ebaf9f0171e9517f40e41

OAuth realm="Example",oauth_consumer_key="0685bd9184jfhq22",oauth_token="ad180jjd733klru7", oauth_signature_method="HMAC-SHA1",oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D", oauth_timestamp="137131200",oauth_nonce="4572616e48616d6d65724c61686176",oauth_version="1.0"

La “row” devuelta contendrá las siguientes 9 columnas:
  • scheme: oauth 
  • realm: Example
  • oauth_consumer_key: 0685bd9184jfhq22
  • oauth_token: ad180jjd733klru7
  • oauth_signature_method: HMAC-SHA1
  • oauth_signature: wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D
  • oauth_timestamp: 137131200
  • oauth_nonce: 4572616e48616d6d65724c61686176
  • oauth_version: 1.0

Bearer 0b79bab50daca910b000d4f1a2b675d604257e42


La “row” devuelta contendrá las siguientes 2 columnas:
  • scheme: bearer
  • token: 0b79bab50daca910b000d4f1a2b675d604257e42

Para cualquier otro tipo de “scheme”, la “row” devuelta contendrá las siguientes 2 columnas:

  • scheme: nombre del esquema en minúsculas
  • data: resto de datos de la cabecera

Tomcat


Lo descrito a continuación ha sido testado con Tomcat 7.0.42 y Windows 8.1. Será necesario reiniciar Tomcat para que los cambios tengan efecto.

 

Autenticación “basic”


Configure el/los usuarios: Editando el fichero “conf/tomcat-users.xml”:

Añada el/los perfil(es) y usuario(s) bajo el item ≤tomcat-users≥, por ejemplo:

≤role rolename="omnisrest"/≥
≤user username="bobm" password="bobm" roles="omnisrest"/≥


Edite el fichero “web.xml” del “webapp” “omnisrestservlet” (carpeta WEB-INF);

Agregue lo siguiente después del item “servlet-mapping”:

≤security-constraint≥
≤web-resource-collection≥
≤web-resource-name≥All resources≤/web-resource-name≥
≤url-pattern≥/*≤/url-pattern≥
≤/web-resource-collection≥
≤auth-constraint≥
≤role-name≥omnisrest≤/role-name≥
≤/auth-constraint≥
≤user-data-constraint≥

≤!—el “transport-guarantee” podrá ser CONFIDENTIAL, INTEGRAL, o NONE --≥
≤transport-guarantee≥NONE≤/transport-guarantee≥
≤/user-data-constraint≥
≤/security-constraint≥
≤login-config≥
≤auth-method≥BASIC≤/auth-method≥
≤realm-name≥omnisrest≤/realm-name≥
≤/login-config≥

 

Autenticación “digest”


Igual que el anterior, excepto que el “auth-method” deberá ser “DIGEST”.

Probando el servicio SSL

Sobre el fichero “conf/server.xml”:

Elimine el comentario del conector SSL y modifíquelo, para dejarlo en algo como:

≤Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="C:\apache-tomcat-7.0.42\mykeystore" keystorePass="xxxxxx"/≥

Cree el certificado auto firmado para añadirlo al “keystore” de “tomcat”:

Nota: Será necesario indicar un nombre y apellido para el “localhost” (eso nos permitirá probar el servidor localmente, con “OWEN” como cliente)

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -genkeypair -alias mycert -keyalg RSA - validity 10000 -keystore c:\apache-tomcat-7.0.42\mykeystore

Uso del cliente Omnis “OWEB” para pruebas:

Extracción del certificado:

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -exportcert -alias mycert -keystore c:\apache-tomcat-7.0.42\mykeystore -file my_root_cert

Importación del certificado al “omnisTrustStore”:

cd \secure\cacerts

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -importcert -alias my_tomcat - keystore omnisTrustStore -file c:\apache-tomcat-7.0.42\my_root_cert

Ahora podrá utilizar URLs como:

https://localhost:8443/omnisrestservlet/ws/5988/api/phase2/myapi/conTomcat

Nota: para eliminar la copia de un certificado use:

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -delete -alias my_tomcat -keystore omnisTrustStore

 

Apache Web Server


Autenticación “basic”


Cree un usuario y su contraseña:

c:\apache24\bin\htpasswd -c c:\apache24\test_passwords test

Note: -c is optional - required the first time to create the passwords file

Edite el fichero “httpd.conf”, la entrada “omnisrest” deberá ser algo como esto:

≤Location /omnisrest≥
     SetHandler omnisrest
     AuthType Basic
     AuthName "omnisrest"
     AuthBasicProvider file
     AuthUserFile c:\apache24\test_passwords
     Require user test
≤/Location≥


El “Require” podrá ser “Require user...”, “Require valid-user” o “Require group...”. Consulte la documentación de Apache para más información.

 

Autenticación “digest”


Cree un usuario y su contraseña:

c:\apache24\bin\htdigest -c c:\apache24\test_digest_passwords omnisrest test
Nota: El uso de “-c” es opcional, pero necesario para la primera vez que se crear el archivo de contraseñas.

Edite el fichero “httpd.conf”, la entrada “omnisrest” deberá ser algo como esto:

≤Location /omnisrest≥
     SetHandler omnisrest
     AuthType Digest
     AuthName "omnisrest"
     AuthDigestDomain /omnisrest/
     AuthDigestProvider file
     AuthUserFile c:\apache24\test_digest_passwords
     Require valid-user
≤/Location≥


Des comente la entrada “LoadModule auth_digest_module modules/mod_auth_digest.so” del fichero “httpd.conf”.

El “Require” podrá ser “Require user...”, “Require valid-user” o “Require group...”. Consulte la documentación de Apache para más información.

IIS


Autenticación “basic”


IIS es bastante difícil de configurar (o al menos el “IIS Express” donde ha sido probado). Para habilitar el modo de autenticación “basic”, es necesario deshabilitar la autenticación “anonymous” del archivo “AppServer\applicationhost.config” ubicado bajo el directorio de instalación de IIS Express. Búsqueda la entrada “authentication” correspondiente.

Añada el código siguiente al final del archivo “applicationhost.config”:

≤location path="Default Web Site/cgi-bin/omnisrestisapi.dll"≥
≤system.webServer≥
≤security≥
≤authentication≥
≤basicAuthentication enabled="true" /≥
≤/authentication≥
≤/security≥
≤/system.webServer≥
≤/location≥


Después, podrá utilizar cualquier usuario existente y su contraseña con las URLs protegidas – se necesita disponer de una cuenta de usuario “standard” para que funcione.

16 julio 2015

Formato del método $showurl

Sintaxis: $showurl(cURL[,cFrame,cWindowProperties])

cURL: Es la dirección de la página a presentar en una nueva ventana o el marco específico de la venta cliente en la página HTML.

cFrame: Es el nombre de un marco HTML. Si cFrame está vacío, la página se mostrará  en una nueva ventana, de lo contrario se mostrará en el marco especificado y sobre la ventana actual.

cWindowProperties: Parámetro opcional, si no existe cFrame será ignorado. De lo contrario, tiene el mismo formato que en los argumento del comando javascript equivalente el "window.open", por ejemplo, especificar "toolbar = 0, menubar = 1" indicaría que la ventana del navegador tendrá una barra de menú, pero no una barra de herramientas.

Sus posibles opciones son:

toolbar - si la ventana del navegador tendrá una barra de herramientas
status - si la ventana del navegador tendrá una barra de estado
menubar - si la ventana del navegador tendrá una barra de menú
scrollbars - si la ventana del navegador tendrá barras de desplazamiento
resizable - si la ventana del navegador es de tamaño variable
location - si la ventana del navegador tendrá una barra para direcciones
directories - si la ventana del navegador mostrará el directorio Web
width - anchura de la ventana del navegador
height - altura de la ventana del navegador
top  - coordenada superioresde la ventana del navegador
left - coordenada izquierda de la ventana del navegador

Todas las opciones son booleanas (sólo valores 0 o 1) a excepción de la width, height, top y left, que deberán contener valores expresados en píxel's.

15 julio 2015

Uso de la utilidad del sistema "ditto" de Mac OS, desde Omnis

Crear un Zip, basePath y destName son las respectivas rutas de origen y destino del archivo.


Begin text block
    Text: set dir to "[basePath]" as string (Carriage return)
    Text: set dest to "[destName]" as string (Carriage return)
    Text: set scriptText to "ditto -rsrc -c -k --sequesterRsrc --keepParent " & quoted form of the POSIX path of dir & " " & quoted form of the POSIX path of dest (Carriage return)
    Text: do shell script scriptText
End text block
Get text block script
Do $runapplescript(script,result) Returns error


Descomprimir un Zip, basePath y destName son las respectivas rutas de origen y destino del archivo.


Begin text block
    Text: set dir to "[basePath]" as string (Carriage return)
    Text: set dest to "[destName]" as string (Carriage return)
    Text: set scriptText to "ditto -rsrc -x -k " & quoted form of the POSIX path of dir & " " & quoted form of the POSIX path of dest (Carriage return)
    Text: do shell script scriptText
End text block
Get text block script
Do $runapplescript(script,result) Returns error


Esto eliminaría el archivo temporal después de la copia/descompresión.


Begin text block
    Text: set source to "[pFrom]" as string (Carriage return)
    Text: set targetdir to "[pTo]" as string (Carriage return)
    Text: tell application "Finder" (Carriage return)
    Text: duplicate source to targetdir (Carriage return)
    Text: end tell
End text block
Get text block lScript
Do $runapplescript(lScript,lResult) Returns lnError

08 julio 2015

Cómo hacer aparecer una animación durante la carga del "remote form" inicial.

Tomando como base un documento HTML entandar para la llamada a un "remote form", necesitaremos realizar lo siguiente:

1) Eliminar las líneas siguientes:


2) Reemplazarlas por:


Obviamente, deberemos substituir el fichero GIF, por el que sea más apropiado.

3) Modificar el "remote form" indicado en el HTML

Añadir (si no existe), un método de tipo "client executed" denominado "$init" que deberá incluir la línea siguiente :

    JavaScript: clearSplash();

Ha de ser así, puesto que necesitamos eliminar el "splash" después de que termine el "jOmnis.onLoad()" y el $init es ejecutado exactamente cuando eso sucede, sin embargo, debemos tener en cuenta que el "$construct" aún no se habrá ejecutado, por lo que aún habrá una demora hasta que el cliente toma el control.

Para probarlo, podemos (por ejemplo) añadir al "$construct" el código siguiente, con intención de simular un retraso durante la carga del "remote form":

Do iMegaList.$define("","","")
For i from 1 to 50000 step 1
    Do iMegaList.$add("AAA","BBB","CCC")
End For


Eso es todo, espero sus comentarios, reciban un saludo.

01 julio 2015

Función para la generación de contraseñas

La función permite ser invocada con o sin parámetro del modo siguiente:

    Do method $PassGen() Returns Password

Por ejemplo devolvería: Password = x32Vn1

o mediante la especificación un parámetro con la longitud deseada:

    Do method $PassGen(4) Returns Password

Por ejemplo devolvería: Password = 4cB3

Definición de la función:

;  autor        ;; Florent Pousserot
;  método       ;; $PassGen
;  descripción  ;; Generación aleatoria de contraseñas
;  parametros   ;; Parametro 1: Longitud de la contraseña deseada.

                   Por defecto 6 caracteres
;  devuelve     ;; La contraseña generada

Do zlCharAuthorize.$define('char')

For x from 48 to 57 step 1     ;; códigos ascii [0-9]
    Do zlCharAuthorize.$add(chr(x))
End For

For x from 97 to 122 step 1     ;; códigos ascii [a-z]
    Do zlCharAuthorize.$add(chr(x))
End For

For x from 1 to pcPassLength step 1
    Calculate zlCursor as randrealrng(1,36)     ;; devuelve un valor aleatorio entre 1 y 36 ; representa [0-9,a-z] <=> [10+26]
    If mod(x,3)     ;; modulo 3
        Calculate zcPassword as con(zcPassword,zlCharAuthorize.[zlCursor].C1)     ;; minúscula
    Else
        Calculate zcPassword as con(zcPassword,upp(zlCharAuthorize.[zlCursor].C1))     ;; mayúscula
    End If
End For

Quit method zcPassword