log4j vulnerability – quick notes


This issue may lead to remote code execution (RCE) via use of JNDI.

  • Vendor: Apache Software Foundation
    • Product: Apache Log4j
      • <=2.14.1: affects 2.14.1 and prior versions

Fix: log4j 2.15.0

To list all JAR files on your system containing the vulnerable class file (including fat JARs), you can use:

for f in $(find . -name '*.jar' 2>/dev/null); do echo "Checking $f…"; unzip -l "$f" | grep -F org/apache/logging/log4j/core/lookup/JndiLookup.class; done

Additional details here:

https://www.cve.org/CVERecord?id=CVE-2021-44228

Enviar correo desde Sql Server utilizando cuenta de gmail / Send email from Sql Server using gmail account


Acá va el detalle de como enviar correo electrónico desde SQL Server, utilizando Stored Procedures y utilizando como servidor de salida una cuenta de gmail.

1) En el servidor Sql, debemos habilitar la opción “Ole Automation Procedures” que por defecto está deshabilitada, para que nos permita llamar aplicaciones externas al servidor. Desde la consola ejecutamos la siguiente consulta:

EXEC sp_configure 'show advanced option', 1
RECONFIGURE
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE

2) Instalamos la aplicación gratuita easendmail de emailarchitect.net que permite realizar el dialogo del servidor smtp con gmail, entre otros proveedores de correo.

3) Creamos un sp que nos permitirá llamar a esta aplicacion y enviar correo. Gracias emailarchitect.net

CREATE PROCEDURE [dbo].[usp_SendTextEmail]  @ServerAddr nvarchar(128),
@From nvarchar(128),
@To nvarchar(1024),
@Subject nvarchar(256),
@Bodytext nvarchar(max) = 'This is a test text email from MS SQL server, do not reply.',
@User nvarchar(128) = '',
@Password nvarchar(128) = '',
@SSLConnection int = 0,
@ServerPort int = 25

AS

DECLARE @hr int
DECLARE @oSmtp int
DECLARE @result int
DECLARE @description nvarchar(255)

EXEC @hr = sp_OACreate 'EASendMailObj.Mail',@oSmtp OUT 
If @hr <> 0 
BEGIN
    PRINT 'Please make sure you have EASendMail Component installed!'
    EXEC @hr = sp_OAGetErrorInfo @oSmtp, NULL, @description OUT
    IF @hr = 0
    BEGIN
        PRINT @description
    END
    RETURN
End

EXEC @hr = sp_OASetProperty @oSmtp, 'LicenseCode', 'TryIt'
EXEC @hr = sp_OASetProperty @oSmtp, 'ServerAddr', @ServerAddr
EXEC @hr = sp_OASetProperty @oSmtp, 'ServerPort', @ServerPort

EXEC @hr = sp_OASetProperty @oSmtp, 'UserName', @User
EXEC @hr = sp_OASetProperty @oSmtp, 'Password', @Password

EXEC @hr = sp_OASetProperty @oSmtp, 'FromAddr', @From

EXEC @hr = sp_OAMethod @oSmtp, 'AddRecipientEx', NULL,  @To, 0

EXEC @hr = sp_OASetProperty @oSmtp, 'Subject', @Subject 
EXEC @hr = sp_OASetProperty @oSmtp, 'BodyText', @BodyText 

If @SSLConnection > 0 
BEGIN
    EXEC @hr = sp_OAMethod @oSmtp, 'SSL_init', NULL
END

PRINT 'Start to send email ...' 

EXEC @hr = sp_OAMethod @oSmtp, 'SendMail', @result OUT 

If @hr <> 0 
BEGIN
    EXEC @hr = sp_OAGetErrorInfo @oSmtp, NULL, @description OUT
    IF @hr = 0
    BEGIN
        PRINT @description
    END
    RETURN
End

If @result <> 0 
BEGIN
    EXEC @hr = sp_OAMethod @oSmtp, 'GetLastErrDescription', @description OUT
    PRINT 'failed to send email with the following error:'
    PRINT @description
END
ELSE 
BEGIN
    PRINT 'Email was sent successfully!'
END

EXEC @hr = sp_OADestroy @oSmtp

Go

4) Ya estamos en condiciones de enviar email desde Sql Server. En una ventana nueva de la consola podemos ejecutar:

/* Gmail SMTP server address */
DECLARE @ServerAddr nvarchar(128)
Set @ServerAddr = 'smtp.gmail.com'

/* Set your Gmail email address */
DECLARE @From nvarchar(128)
Set @From = 'direccionorigen@gmail.com'

DECLARE @To nvarchar(1024)
/*You can input multiple recipients and use comma (,) to separate multiple addresses */
Set @To = 'direcciondestino@gmail.com'

DECLARE @Subject nvarchar(256)
Set @Subject = 'prueba envio de correo desde sql server'

DECLARE @Bodytext nvarchar(512)
Set @BodyText = 'Este es un mesaje de prueba. No responda.'

/* Gmail user authentication should use your Gmail email address as the user name. */
DECLARE @User nvarchar(128)
Set @User = 'direccionorigen@gmail.com'

DECLARE @Password nvarchar(128)
Set @Password = 'su password'

/* Enable SSL/TLS */
DECLARE @SSL int
Set @SSL = 1

/* If you want to use TLS, please set it to 25 or 587 */
DECLARE @Port int
Set @Port = 465

PRINT 'start to send email ...'

exec usp_SendTextEmail @ServerAddr, @From, @To, @Subject, @BodyText, @User, @Password, @SSL, @Port

Ejecutamos y listo.

 

Acceder a servidor SQL Server en Servidor Virtual Azure / Connect to SQL Server on Azure Server


Si necesitamos acceder desde un equipo cualquiera a un servidor de base de datos SQL Server hosteado en una máquina virtual Azure, debemos hacer dos cosas en el servidor virtual:

1) Mapear el puerto 1433 para tener acceso al motor de la base de datos.

Esto lo hacemos en el gestor de máquinas virtuales, seleccionando nuestra máquina virtual, luego EndPoints y agregando una nueva regla.

windowsAzure_endpoints

2) Permitir conexiones entrantes al puerto 1433 en el firewall de Windows.

Esto asumo que ya saben como hacerlo, pero basicamente es agregar una regla en Panel de Control –> Firewall, permitiendo la entrada de los paquetes entrantes por TCP al puerto 1433.

Conectar a Servidor SQL Server por puerto no standard / sql server connect to a different port


Este dato es importante (al menos para mí) porque es distinto del criterio utilizado en la mayoría de las aplicaciones.

Si necesitamos conectar a un servidor MS Sql Server a través de un puerto distinto del standard (1433), debemos hacerlo de la siguiente manera:

NOMBRE_SERVIDOR\SQLEXPRESS,14333

Es decir, nombre de servidor, nombre de instancia, coma, numero de puerto.

La intuición me decía hacer NOMBRE_SERVIDOR:1433\SQLEXPRESS. Pero NO.

Esto es aplicable para conexiones desde el SQL Management Studio y también para las cadenas de conexión o connection strings.

C# comportamiento de ComboBox enlazado a datos


Algo de lo que siempre me olvido cada vez que me pongo a tocar código en C# con VS2008.

Cuando creamos un orígen de datos desde un objeto, para luego arrastrar un ComboBox desde Data Sources hacia el formulario, deberemos setear algunas propiedades de datos enlazados a fin de evitar comportamientos extraños en el combo (por ejemplo: no libera el foco al hacer click o inmediatamente luego de cambiar el valor del combo vuelve al valor anterior).

En propiedades–>DataBindings–>Text dejamos en blanco la propiedad.

En propiedades–>DataBindings–>SelectedItem dejamos en blanco la propiedad.

En propiedades–>DataBindings–>SelectedValue establecemos la propiedad al campo del objeto a enlazar.

 

Instalar Servidor SVN en Maquina Virtual Windows Azure / Visual SVN on Windows Azure Virtual Machine


Hace unos días descubrí un servicio de Microsoft para Emprendedores, (gracias Daniel Levi), llamado BizSpark,  que puede resultarnos muy útil en entornos de desarrollo, dado que nos proporciona software para desarrollo sin costo, hosting, entre otros beneficios.

Adicionalmente, obtenemos una cuenta de Windows Azure, donde podemos configurar una máquina virtual con buenos recursos a nuestra disposición y sin costo.

Sin embargo, no pasará mucho tiempo, antes de preguntarnos como hacemos para instalar un servidor svn en dicha cuenta, así que acá dejo una guía de configuración de un servidor svn en un servidor virtual Windows Azure (Gracias Marco Pasin – Microsoft SW Artchitect):

windowsazure_visualsvnquickstart

Enjoy !

C#: Añadir ToolTip Text a un botón / Set ToolTip for a Button


Instanciamos un objeto ToolTip y, dentro de un evento MouseHover, establecemos el texto que queremos que aparezca al pasar por arriba del botón:

System.Windows.Forms.ToolTip ToolTip1 = new System.Windows.Forms.ToolTip();

public frmABMC() 
{
    InitializeComponent();
    this.btnCerrar.MouseHover += new EventHandler(btnCerrar_MouseHover);
}

void btnCerrar_MouseHover(object sender, EventArgs e)
{
    ToolTip1.SetToolTip(this.btnCerrar, "Cerrar");
}

Añadir búsqueda en ComboBox / ComboBox Autocomplete


Dado que no es una opción que sea muy intuitiva para el usuario y que muchas veces es necesaria, acá va un ayuda memoria de como configurar la búsqueda o autocompletar cadenas a medida que se escribe dentro de un ComboBox:

Supongamos que ya tenemos cargado un ComboBox con los datos de clientes, debemos configurar, adicionalmente, 3 propiedades que harán posible esta funcionalidad, AutoCompleteCustomSource, AutoCompleteMode, AutoCompleteSource:

AutoCompleteCustomSource

Debemos definir una fuente de datos adicional que contenga todos los strings o cadenas donde se realizará la búsqueda. En este caso, llamamos a un método que nos devuelva todas las razones sociales de los clientes en una lista de strings.

this.clienteComboBox.AutoCompleteCustomSource.AddRange(new Clientes().getListaRazonSocial().ToArray());

AutoCompleteMode

Los modos mas utilizados son suggest y suggestappend, para completado sugerido o suger y añadir.

this.clienteComboBox.AutoCompleteMode = AutoCompleteMode.Suggest;

AutoCompleteSource

Definimos la fuente de datos cargada en el CustomSource.

this.clienteComboBox.AutoCompleteSource = AutoCompleteSource.CustomSource;

El resultado es algo así:

autocompletarComboBox

Vale aclarar que la propiedad DropDownStyle debe establecerse en DropDown en vez de DropDownList.

 

Actualizar Mapas Garmin Argentina


Estos son los pasos para actualizar los mapas de Argentina en un gps Gamin:

1) De la página de Garmin descargamos el Garmin Training Center para Windows

2) Desde la página de Garmin también, descargamos el MapSource

3) Desde el proyecto mapear, descargamos la ultima versión de los mapas. Versión para MapSource. Hay que registrarse en el sitio.

4) Instalamos los programas de los puntos 1) y 2)

5) Abrimos el MapSource y seleccionamos del menú PC Base Map. Ubicamos el archivo descargado de mapear y lo seleccionamos.

6) Veremos un mapa de Argentina con todas las regiones para seleccionar. Las seleccionamos todas.

7) Conectamos el GPS con el cable USB y presionamos el botón “Send To Device”. En la opción “What to Send” debe estar seleccionado “maps”.

Una vez finalizada la carga, tendremos los mapas actualizados y listos para usar.

Registrar OCX en Windows 64 bits


Si tenemos un OCX para 32 bits que necesitamos utilizar en un Windows de 64 bits, no vamos a poder registrarlo normalmente con regsvr32.

Resulta que en los sistemas Windows de 64 bits, todo lo que necesitemos registrar de 32 bits debe ir en la carpeta windowssyswow64 (en vez de windowssystem32)

Una vez copiado el ocx a esta carpeta, ejecutamos el regsvr32 como siempre. Por ejemplo, para el ocx de las impresoras fiscales Hasar:

regsvr32 c:windowssyswow64Fiscal051122.ocx

Recordar siempre ejecutar el cmd como Administrador, sinó el regsvr32 dará error.