martes, 22 de agosto de 2017

Imagen tipo blob desde una imagen agregada en Genexus

Buenas con todos.

Bueno después del respectivo saludo, explico un poco a que debe el nombre de la entrada. Estoy mostrando en un web panel los registros ingresados que tienen una imagen tipo blob en uno de sus campos, adicionalmente necesito mostrar una imagen por defecto para aquellos que no tenían configurada una.

Bueno entonces lo que necesito es poder cargar una imagen tipo blob ya no desde los campos de mi base sino con una imagen que yo decida. Tuve algunos inconvenientes, por ejemplo use la función FromBase64String y convertí mi imagen a este formato, peno no funcionó.

Así que la solución fue usar la función FromString que recibe la Url de la imagen, y para ello utilice una imagen ya cargada en el IDE de Genexus y la Función Link, quedando de este modo.

&ImageVarBlob.FromString(MyGenexusImage.Link())

viernes, 23 de junio de 2017

Encrypt URL parameters: Cifrado Manual de Parámetros con Site Key

Bueno en la anterior entrada revisamos la configuración para Cifrar los parámetros de la URL mediante Site Key y una forma automática de generar dichos enlaces. Para los que no, revisen el enlace aquí.

Pero si les paso lo que a mí, se deben de haber topado con la necesidad de generar esta URL de forma manual.

Bueno aquí corresponde una breve explicación de como Genexus realiza este cifrado de la URL.

Genexus utiliza el algoritmo TwoFish el cual está contenido en las funciones:

GetEncryptionKey, para obtener una llave o key de cifrado válida.
Encrypt64, para el cifrado en base a dicha llave.
Decrypt64, para el descifrado en base a una llave.

Genexus no solo cifra los parámetros sino que arma un string específico para el cifrado de los parámetros de la URL unido a un CheckSum de seis cifras, en el enlace pueden ver la documentación respectiva, aunque es del 2004, por lo que no ayudó mucho ya que ha habido un pequeño cambio en como se arma el String a cifrar.

Como vieron en la entrada anterior se mostró cómo configurar el Application.Key para administrar nuestras propias llaves. Gracias a esto se puede descifrar una URL y ver como está armada. Para mi caso actual usando Genexus Evolution 3 Upgrade 9. El cifrado de la URL corresponde a:

?objeto.aspxParametrosCheckSum

Siendo:

Objeto, nombre del web panel o transacción en minúsculas.
Parametros, los parámetros necesarios recibidos por el objeto separados por coma.
CheckSum, check sum del string formado por el objeto y los parámetros.

Entonces para cifrar correctamente de forma manual los parámetros de la url necesitamos armar dicho string y cifrarlo con las funciones ya mencionadas.

El código sería:

//cifrar parametros de url con Site Key
CSHARP [!&tempkey!] = Crypto.GetSiteKey( );
&toEnc = "webpanel" + '.aspx' + "param1" + ',' + "param2"
CSHARP [!&chkSum!] = Crypto.CheckSum( [!&toEnc!], 6);
&URL= &DominioSitio + '/webpanel.aspx?' + encrypt64(&toEnc+&chkSum, &tempkey)


Nótese que debemos usar las funciones Crypto.GetSiteKey() para obtener la llave usada en el cifrado y CryptoCheckSum() para generar el check sum de seis dígitos (por ello el parámetro de 6) con código Nativo C#.

Encrypt URL Parameters: Site Key para compartir enlaces con parámetros cifrados basados en Web Panel

Bueno hoy el objetivo fue cifrar los parámetros usados en los Web Panels de Genexus para evitar la manipulación de los mismos y adicionalmente poder compartir estos enlaces (Ej: Por un correo electrónico como un enlace).

Así que a buscar y probar. Basándonos en la Wiki de Genexus (enlace) respecto a este tema tenemos que existen dos formas de cifrar los parámetros:
  1. Basado en Web Session (Session Key): es decir que se usan características de la sesión del usuario para cifrar los parámetros. En la wiki recalca que es el más seguro pero ya que depende de los valores de la sesión y cookies del usuario el cifrado es diferente para cada sesión.
  2. Basado en una key por el sitio (Site Key): menos segura pero permite poder compartir los enlaces generados ya que el mismo cifrado es usado en todo la aplicación Web.
Para cifrar los parámetros use la segunda opción configurándola de la siguiente manera:
  1. En las propiedades del Ambiente de la KB se usa la propiedad Encrypt URL Parameters usando la opción Site Key.


  2. Rebuild de toda la KB para que se compile el uso de parámetros cifrados en todos los objetos pertinentes.
Para generar mi propia "key" y brindar mayor seguridad y administración a mi site y no usar la key por defecto de Genexus se usó los siguientes pasos:
  1. Generar un llave o dos (según la documentación de Genexus, ver SAC 29369, una es usada para cifrar los parámetros de conexión a la Base de datos y la otra para el cifrado de los parámetros) mediante la función GetEncryptionKey() (ver doc respectivo de la función para más detalles). 
  2. Crear el archivo de texto plano Application.Key (ubicarla en la raiz de la KB, del proyecto, para que el archivo web.config pueda ser actualizado con los parámetros respectivos cifrados y en la carpeta Web del modelo generado para que las clases respectivas puedan descifrar los parámetros).
  3. Editar el archivo creado con las "keys" generadas.


  4. Compilar y probar, si observan el archivo web.config tendrá un nuevo cifrado ya que se alteraron las "keys respectivas" y ya no se usan las que genera Genexus por defecto.
Para generar de forma automática los enlaces cifrados para poder compartirlos, se usó el método Link del objeto recibiendo los parámetros respectivos.

&Var = &urlsite + Link(WebPanel, &param1, &param2)

o

&Var = &urlsite + WebPanel.Link(&param1, &param2)

En la captura pueden observar el cifrado de los parámetros llamando una Transacción.


Quedó pendiente para una próxima entrada el cifrado manual de los parámetros (ver enlace).

Si desean configurar una clase (dll) y no un archivo que controle las "keys" ver el SAC 29874.