jueves, 27 de junio de 2019

Cómo ofuscar atributos de un XML con namespace usando XSLT

Cómo ofuscar atributos de un XML con namespace usando XSLT


Hola.

Estoy intentando ocultar los valores de algunos atributos XML usando XSLT.

Para quien no ha usado este método, es muy útil para cuando necesitas ocultar cierta información sensitiva en tus aplicaciones. Generalmente en los logs que generan las aplicaciones. Estos datos pueden ser datos personales como: nombre, teléfono, email, tarjeta de crédito, etc.

El problema que tengo es que los elementos que quiero ofuscar tienen como prefijo un namespace. No tuve ningún problema para ofuscar cuando los elementos no tienen namespace.

Después de investigar un poco, la solución pareciera bastante obvia. Se tiene que definir el mismo namespace que usa el XML en el archivo XSLT.

En mi caso el namespace es xmlns:ns1="http://www.sample.com/CustomerOrder/2.0"

Abajo les dejo mi XML y mi XSLT

Mi XML se ve así:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://www.sample.com/icc/wrapper/1.0">
    <ns0:Header>       
    </ns0:Header>
    <ns0:Body>
        <Payload>
            <ns1:CustomerOrder xmlns:ns1="http://www.sample.com/CustomerOrder/2.0">
                <ns1:CustomerOrderAddresses>
                    <ns1:CustomerOrderAddress AddressLine1="aaaaaaaaaa" City="dddddd" Country="eee" EmailAddress="nada@nada.com" FirstName="nombre" LastName="apellido" />
                     </ns1:CustomerOrderAddresses>
            </ns1:CustomerOrder>
        </Payload>
    </ns0:Body>
</ns0:Envelope>


Como pueden ver abajo en negritas, mi XSLT tiene definido el namespace ns1 que está definido en el XML de arriba también en negritas.

En mi elemento template defino el parent de los atributos usando como prefijo el namespace parent::ns1:CustomerOrderAddress

Mi XSLT se ve así.

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://www.sample.com/CustomerOrder/2.0">

<xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
</xsl:template>

<xsl:template match="@AddressLine1[parent::ns1:CustomerOrderAddress]">
<xsl:attribute name="AddressLine1">
<xsl:if test="string-length(.)>'0'">
<xsl:value-of select="concat(substring(., 1 ,string-length(.)-16),'XXXXXXXXXXXXXXXX')"/>
</xsl:if>
<xsl:if test="string-length(.)&lt;'1' "></xsl:if>
</xsl:attribute>
</xsl:template>
<xsl:template match="@EmailAddress[parent::ns1:CustomerOrderAddress]">
<xsl:attribute name="EmailAddress">
<xsl:if test="string-length(.)>'0'">
<xsl:value-of select="concat(substring(., 1 ,string-length(.)-16),'XXXXXXXXXXXXXXXX')"/>
</xsl:if>
<xsl:if test="string-length(.)&lt;'1' "></xsl:if>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>


El resultado se ve así:


<ns0:Envelope xmlns:ns0="http://www.sample.com/icc/wrapper/1.0">
    <ns0:Header>       
    </ns0:Header>
    <ns0:Body>
        <Payload>
            <ns1:CustomerOrder xmlns:ns1="http://www.sample.com/CustomerOrder/2.0">
                <ns1:CustomerOrderAddresses>
                    <ns1:CustomerOrderAddress AddressLine1="XXXXXXXXXXXXXXXX"
                                         City="dddddd"
                                         Country="eee"
                                         EmailAddress="XXXXXXXXXXXXXXXX"
                                         FirstName="nombre"
                                         LastName="apellido"/>
                     </ns1:CustomerOrderAddresses>
            </ns1:CustomerOrder>
        </Payload>
    </ns0:Body>
</ns0:Envelope>


Pueden probar esto en la siguiente página: https://www.freeformatter.com/xsl-transformer.html



Espero les sirva.








lunes, 24 de junio de 2019

TIBCO EMS Cómo saber el host de los consumers de una queue

TIBCO EMS Cómo saber el host de los consumers de una queue


Hola.

Por increíble que parezca, el consumidor de una queue  me acaba de pedir que si puedo eliminar los consumers de una queue porque no sabe en dónde está su aplicación!

Bueno estas cosas pasan y como siempre es bueno saber quién es el consumidor de una queue en particular.

Investigué un poco y di con este método fácil.

Lo que hago es primero listar los consumers de la queue para ver las conexiones de cada consumer. Con esto obtengo el id de todas las conexiones.

show consumers queue=miqueue

El resultado será algo así

tcp://server:7222> show consumers queue=miqueue
                                                           Msgs Sent
       Id      Conn User     T Queue                   SASB Sent Size   Uptime
251172286 121196809 miusuario Q miqueue +T--    0    0 1298:14:13
251172288 121196809 miusuario Q miqueue +T--    0    0 1298:14:13
251172290 121196809 miusuario Q miqueue +T--    0    0 1298:14:13

Con esta información obtienen el id de la conexión y el nombre del usuario EMS que se usa para crear el consumidor.

Ahora ejecutamos la instrucción para ver todas las conexiones de ese usuario

show connections user=miusuario

El resultado se verá así

tcp://server:7222> show connections user=miusuario
L  ID        FSXT  S  Host                     User     ClientID                  Sess     Uptime Processor
J  119448740 +--Q  +  hostname1                miusuario                              8 1130:16:58         8
J  121196809 +--Q  +  hostname2                miusuario                              3 1130:16:58         6

Con esta información se puede determinar que los consumers se conectan desde hostname2 relacionando ambos resultados a través de la conexión id. Osea hagan el join de las tablas de resultados con los campos conn y ID


Espero les sirva.






lunes, 3 de junio de 2019

TIBCO EMS ejemplos de comandos

Ejemplos de comandos de TIBCO EMS


Hola.

Si están aquí es porque, al igual que yo, en algún momento han necesitado conocer la sintaxis básica de alguna instrucción de TIBCO EMS. Ya sea para conectar, crear objetos, eliminarlos, asignar permisos, etc.

Les pongo aquí las instrucciones de TIBCO EMS que más he utilizado.

Cómo conectar a TIBCO EMS server


connect tcp://localhost:7222

Comandos de queues


Mostrar la lista de queues

show queues

Crear una queue

create queue miqueue

Detalles de una queue

show queue miqueue

Limpiar una queue

purge queue miqueue

Eliminar una queue

delete queue miqueue

Ver permisos de una queue

showacl queue miqueue

Limitar el número de mensajes en una queue

addprop queue miqueue maxMsgs=1000,overflowPolicy=discardOld

Comandos de topics


Mostrar la lista de topics

show topics

Crear un topic

create topic mitopic

Detalles de un topic

show topic mitopic

Eliminar un topic

delete topic mitopic

Ver permisos de un topic

showacl topic mitopic

Comandos de bridges


Crear bridge de topic a queue

create bridge source=topic:mitopic target=queue:miqueue

Crear bridge de topic a queue con selector

create bridge source=topic:mitopic target=queue:miqueue selector="Header1 IS NULL"

create bridge source=topic:mitopic target=queue:miqueue selector="Header1<>'CA'"

create bridge source=topic:mitopic target=queue:miqueue selector="Header1 NOT IN ('CA')"

Borrar bridge de topic a queue

delete bridge source=topic:mitopic target=queue:miqueue

Comandos de usuarios


Crear usuario

create user user_name ["user_description"] [password=password] 

Cambiar password de usuario

set password <user-name> [<password>]

Guardar cambios


Para guardar los cambios realizados correctamente

commit

Estas son las que más utilizo en el día a día. Si necesitan saber alguna otra menciónenlas en los comentarios.

Espero les sirva.