jueves, 7 de julio de 2022

Gradle-7 (11) Gradle Multiproyecto (4). ERRORES que te machacan!!

0. Antes de importar cualquier proyecto hijo al proyecto padre, hay que hacer una copia de seguridad!!, pues revertir los cambios es muy difícil, por culpa de la caché y otros cambios inesperados que hace Eclipse.

1. No se compilan los proyectos simples por un error de compilación de un proyecto que depende de estos.

Si borramos todos los jars del directorio al que volcamos los jars (para aseguranos que se vuelvan a generar correctamente), y existe un proyecto "grande" que utiliza otros proyectos, entonces no genera los jars iniciales si hay un error de compilación del proyecto "grande", por tanto, hasta que no se depuren los errores, no se volverá a generar los "jars".

Cuidado cuando importemos un proyecto

2. DESAPARECE el proyecto padre de la "Gradle Tasks" y aparecen los hijos con error. 

Suele suceder en alguno de estos casos:

a. Copiamos más de un proyecto hijo a la vez a la carpeta del padre. Es preferible solo copiar una carpeta, arreglar su "build.gradle" (del hijo), y añadir el proyecto a "settings.gradle" del padre ese proyecto. 

b. Cuando en el "build.gradle" del hijo no hemos dado bien el nombre de algún proyecto del que depende en el apartado de "dependencies", en este ejemplo, el proyecto que hace referencia no existe, pues el correcto es "A004-PDF" y no "A004-PDFS"

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation libs.junit.jupiter
        
    api(project(path: ':A001-WS_Shdw', configuration: 'shadow'))
    api(project(":A004-PDFS"))
}  

c. Cambiar los guiones "-" por puntos "." a la hora de referenciar las librerias que se han definido en el fichero "settings.gradle" del proyecto padre. En el fichero "settings.gradle" del proyecto padre, podemos definir las dependencias que utilizamos, y así tener un mayor control de las versiones que se utilizan aquí mostramos un ejemplo real de dicho fichero


rootProject.name = 'AllProjects'

include('A000-Basic', 'A002-Jackson','A003-Excel', 'A004-PDF', 'A006-CMIS' )
        
dependencyResolutionManagement {
    versionCatalogs {
        libs {
            //library('commons-lang3', 'org.apache.commons', 'commons-lang3').version {
            //    strictly '[3.8, 4.0['
            //    prefer '3.9'
            //}
            library('junit-jupiter',           'org.junit.jupiter:junit-jupiter:5.7.2')
            library('lombok',                  'org.projectlombok:lombok:1.18.20')
                       
            library('commons-beanutils',        'commons-beanutils:commons-beanutils:1.9.4')
            library('commons-io',               'commons-io:commons-io:2.11.0')
            library('commons-lang3',            'org.apache.commons:commons-lang3:3.12.0')
            library('commons-codec',            'commons-codec:commons-codec:1.15')
        }
    }
}

Por ejemplo para la librería con alias  "commons-io" , para indicarla en el fichero "build.gradle" del proyecto que la utiliza debemos indicar la referencia "commons.io" (cambiando el guión "-" por el punto ".") en la sección de "dependencies"

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation libs.junit.jupiter
    api libs.commons-io //mal hay un guión en la referencia
    api libs.commons.io //bien, se hs sustituido el guión por un punto
}

d. Cuando se borra un comentario al inicio de la dependencia, hay que comprobar que no haya caracteres residuales. Por ejemplo al borrar el símbolo de comentario "//" y no borramos "--> otros caracteres"  entonces nos desaparece el proyecto de la "Gradle Tasks"

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation libs.junit.jupiter
        
    
    //api(project(":A000-Basic"))  --> otros caracteres
    api(project(":A000-Basic"))  --> otros caracteres
    api(project(":A004-PDF"))
}

3. Test que dan "Entry properties/alba.properties is a duplicate but no duplicate handling strategy has been set"

Parece ser que es un error de gradle, veamos una clase en src/test/java que lo genera. Una referencia a unas propiedades que se encuentran en src/main/resources/properties, provoca el error

@Test void isnullClassLoaderReturnFalse() throws Exception {
	Properties props = PropertyUtilsEdu.getProperties(ExecutionTypeEnum.NO_JAR, "alba");
	assertTrue(props!=null, "1. Properties are null");
}

Para solucionar esto, se ha añadido la línea

duplicatestrategy = DuplicateStrategy.EXCLUDE dentro de la tarea JAR

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    manifest {
        //attributes 'Main-Class': 'com.foo.bar.MainClass'
        attributes(
         	'Main-Class': 'Execute',
         	'Class-Path': configurations.runtimeClasspath.files.collect { 'lib/'+it.getName() }.join(' ')
        ) 
    }
    
    from {
   		sourceSets.main.allSource  //Include java sources
   	}
    
}

4. Resultados distintos al ejecutar test en un "terminal" que con la ventana "Gradle Tasks" de Eclipse.

Parece ser que la opción "build" de la carpeta "build" de la ventana "Gradle Tasks", a parte de hacer un build, realiza los tests.

Para ejecutar los tests des de un terminal, ejecutamos "./gradlew clean test". Si en eclipse, los test van bien, pero no en el terminal, hay que comprobar la versión de java que toma el terminal con "java -version".

En mi caso, en Eclipse tenia java 17 y en el terminal la versión 13. Para solucionarlo, hay que consultar este link de askubuntu , y he hecho

sudo nano /etc/enviroment

y el fichero ha quedado así:

JAVA_HOME=/home/ximo/MyPrograms/jdk-17.0.2+8.OpenJ9/bin
PATH=/home/ximo/MyPrograms/jdk-17.0.2+8.OpenJ9/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Y parece  ser que los resultados son los mismos.








jueves, 23 de junio de 2022

Encriptar contraseñas guardadas en bash script

0. Introducción

Me baso en lo que dice Linux-tech. Se va a emplear openssl, por tanto hay que verificar que openssl  esté instalado.


1. Preparativos

1. Buscamos una clave que servirá para encriptar las otras contraseñas, por ejemplo "miClave"

2. Supongamos que tenemos 3 contraseñas que queremos ocultar (contraseña1, contraseña2 y contraseña3)

3. Ejecutamos estos comandos para obtener las contraseñas encriptadas:

echo "contraseña1" | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:miClave > 1.txt

echo "contraseña2" | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:miClave > 2.txt

echo "contraseña1" | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:miClave > 3.txt

Se ha descargado el resultado a 3 ficheros (1.txt, 2.txt, 3.txt) pero no es necesario.

4. Recogemos las contraseñas encriptadas que son respectivamente:

U2FsdGVkX189KukyhKMO1tGXqFihjhflWxnNxdPZNQQ=

U2FsdGVkX1/D10iKLBm92DHcG7Diqyiqm0FkL9zHHSs=

U2FsdGVkX191qIFKp3qfRdzzImuyjiH13kmNel6HiSA=

2. Nuestro shell script (bsh) simplificado

Observar las sentencias comentadas que nos sirven de depuración


#!/bin/bash

#0. pwds
echo 'Indicar clave'
read -s myKey
#echo "$myKey"

encriptado1='U2FsdGVkX189KukyhKMO1tGXqFihjhflWxnNxdPZNQQ='
#echo "$encriptado1"
contrasena1=`echo "$encriptado1" | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000  -salt -pass pass:"$myKey"`
#echo "$contrasena1"

encriptado2='U2FsdGVkX1/D10iKLBm92DHcG7Diqyiqm0FkL9zHHSs='
#echo "$encriptado2"
contrasena2=`echo "$encriptado2" | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000  -salt -pass pass:"$myKey"`
#echo "$contrasena2"

encriptado3='U2FsdGVkX191qIFKp3qfRdzzImuyjiH13kmNel6HiSA='
#echo "$encriptado3"
contrasena3=`echo "$encriptado3" | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000  -salt -pass pass:"$myKey"`
#echo "$contrasena3"


Con esto hemos recuperado las contraseñas y además se ha protegido el código fuente del programa con respecto a sus cotraseñas guardadas internamente. 


martes, 7 de junio de 2022

Clave 2.0 Java (2) Configurar el proyecto de prueba

 Ahora que ya hemos podido arrancar la primera pantalla, hay que configurar la aplicación.

1. Configurar Tomcat con SSL

Vamos a configurar el Tomcat 8.5 para que admita protocolo https, pero vamos a utilzar el certificado que nos han suministrado.

Hay que ver los certificados que se guadan en el "KeyStore.jks" del directorio de configuración "Config". Ejecutamos:
 
keytool -list -keystore '<Ruta>/KeyStore.jks' 

le damos el password "local-demo"

y nos muestra que hay 2 entradas ("local-demo-cert-es" y "sello kit de pruebas (ac sector público)") 

Keystore type: jks

Keystore provider: SUN

Your keystore contains 2 entries

local-demo-cert-es, 16/11/2017, PrivateKeyEntry, 

Certificate fingerprint (SHA-256): B6:DD:C5:7D:A5:06:17:7A:E3:3B:9B:E9:2C:45:38:14:B7:98:3D:09:B8:A9:2E:34:3D:F5:BB:E3:3A:F3:53:44

sello kit de pruebas (ac sector público), 17/05/2022, PrivateKeyEntry, 

Certificate fingerprint (SHA-256): F3:ED:ED:01:F6:E5:C6:7B:AD:7F:26:76:3A:8E:D9:6F:1A:A1:FC:B1:CB:EB:87:86:D1:D8:36:C0:EA:BD:A3:1C

Warning:

<local-demo-cert-es> uses the SHA1withRSA signature algorithm which is considered a security risk. This algorithm will be disabled in a future update.

The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore CLAVE20_CONF/SP/KeyStore.jks -destkeystore CLAVE20_CONF/SP/KeyStore.jks -deststoretype pkcs12".

Vamos a utilizar el certificado con alias "local-demo-cert-es" como certificado del servidor.

Vamos a Servers -Tomcat v8.5 Server at localhost-config y modificamos el fichero server.xml


Añadimos las líneas que no estan comentadas sirviendo de ejemplo de las primeras que están comentadas.


<!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    -->
    
    <Connector 
        SSLEnabled="true" 
        maxThreads="150" 
        port="8443" 
        protocol="org.apache.coyote.http11.Http11NioProtocol" 
        scheme="https" 
        secure="true">
        <SSLHostConfig>
            <Certificate 
                 certificateKeyAlias="local-demo-cert-es" 
                 certificateKeystoreFile="ruta.../Config/KeyStore.jks" 
                 certificateKeystorePassword="local-demo" 
                 type="RSA"/>
        </SSLHostConfig>
    </Connector>
    

Hay que darle la ruta correcta al keystore en "certificateKeystoreFile"!!!

Ejecutamos (Run As- Run On Server) y arranca con protocolo http. Para ver si va con https abrimos una pestaña del navegador y le indicamos https://localhost:8443/SP2 y debería de arrancar, dando los problemas de siempre que no se confía en ese certificado, pero al final arranca






viernes, 3 de junio de 2022

Windows Server 2019. Ver archivos abiertos

 1. Entrar en administrador del servidor


2. En la parte superior derecha seleccionar Herramientas


3. Seleccionar Administrador de Equipos



4. Seleccionar Carpetas compartidas y luego archivos abiertos


5. Si queremos cerrar el archivo abierto pues no nos deja copiar la nueva versio ya lo podemos hacer









miércoles, 1 de junio de 2022

Clave 2.0 Java (1) Instalar el proyecto de prueba

1. Preinstalación

1. Descargar el proyecto de prueba

Vamos a la PAE y descargamos el "Paquete de integracion Java 8" del 19/5/2022

2. Creamos un Workspace (WS_CLAVE) y dentro de él, una carpeta (Por ejemplo SP2 que es el "artifactId" que se indica en el pom.xml) dentro de un Workspace Java 

3. Abrimos el fichero zip descargado y copiamios el contenido de  "Paquete_Integracion_Java_Clave_2_0" dentro de esa carpeta


4. Ahora desde Eclipse importamos (File - Import -Maven - Existing Maven Projects) Y le indicamos la carpeta SP2

5. Una vez importado , hay que seleccionar el Java 1.8 en Eclipse

6.a. Establecemos la variable de entorno CLAVE_SP2_CONFIG_REPOSITORY que apunte donde se encuentra la carpeta Config. En este caso es: /home/ximo/MyWorkspaces/WS_CLAVE/SP2/Config/. Para ello editamos el fichero ~/.profile y le añadimos esta línea

export CLAVE_SP2_CONFIG_REPOSITORY="$HOME/MyWorkspaces/WS_CLAVE/SP2/Config/"

Para asegurar que ha cogido las variables de entorno, en una ventana de shell escribimos

source ~/.profile

NOTA: Para no tener problemas con la localización de la carpeta "Config", se podría copiar dicha carpeta a un ruta que no dependiera del proyecto como /home/ximo/CLAVE20_CONF, de esta manera si quisiéramos tener una segunda versión del proyecto, no tendríamos que tocar nada.


6.b. Alternativamente a la opción a), podemos modificar el fichero src/main/resources/spEnvironmentContext y cambiar

<constructor-arg value="#{ systemProperties['CLAVE_SP2_CONFIG_REPOSITORY'] ?: systemEnvironment['CLAVE_SP2_CONFIG_REPOSITORY'] }" />

por

<constructor-arg value="/home/ximo/MyWorkspaces/WS_CLAVE/SP2/Config/" />

7. A veces puede dar problemas que no encuentra algunas dependencias que se enuentran en la carpeta local "Dependencias"; si es el caso hay que modificar el pom.xml, casi al final del archivo, en la zona de <repositories> pues es incapaz de encontrar las dependencias, para ello cambiamos 

<url>file://Dependencias</url>  por

<url>file://${project.basedir}/Dependencias  </url>


y guardamos el fichero pom.xml

7. Ahora clicamos con el boton derecho sobre el proyecto Maven - Update Project  y deberian de desaparecer los problemas de compilación

8. Abrir la ventana de Servers (si no esta hay que añadirla en Window -Show View -Other - Servers ) y añadir un servidor Tomcat 8.5 y en  

9. Clicamos con el boton derecho sobre el proyecto Run As - Run on Server, seleccionar el Tomcat 8.5 que hemos instalado y al menos arranca:

10. Comprobamos que tengamos esta estructura de ficheros



Y desde el sistema operativo


Ahora viene la parte difícil de entender lo que hace.

2. Posibles problemas (si no ha arrancado)

1. Si sale este error:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'placeholderConfig' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'securityConfigFileWithPath' while setting bean property 'locations' with key [0]; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1021E: A problem occurred whilst attempting to access the property 'spConfigRepository': 'Error creating bean with name 'spConfigRepository' defined in class path resource [spEnvironmentContext.xml]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.lang.String]: Constructor threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "java.lang.StringBuffer.toString()" because "buffer" is null'

Hay que vigilar en la "Console" a ver si aparece un a referencia a un JDK que no sea el 1.8

INFORMACIÓN: Java Home:                         /home/edu/MyPrograms/eclipse2022-03/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_17.0.2.v20220201-1208/jre

Como se puede ver hace referencia a java 17. Por tanto hay que arreglar el Java Build path para que apunte donde toca (jdk o jre 8).

2. Si sale este error:

org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: /home/edu/MyWorkspaces/WS_CLAVE/SP2/ConfigsecurityConf.xml (No existe el archivo o el directorio)

Es que nos hemos olvidado de de indicar en el punto 6.a o 6.b la barra final (/) del path
/home/ximo/MyWorkspaces/WS_CLAVE/SP2/Config/

A veces parece que está bien escrito la ruta anterior y no lo está. Vale la pena entrar en un navegador de archivos y copiar la ruta y pegarla. Estos errores dan mucha guerra y son difíciles de encontrar

lunes, 30 de mayo de 2022

MS SQL Server Express 2019. Instalación

Procedimiento

1. Descargar el programa  MS SQL Server Express 2019 desde la web de Microsoft

2. Instalar la opción básica.

3. Descargar el MS QL management console (MSMC)

4. Ejecutar MSMC

5. Desativar en primera instancia el perfil de dominio y el prefil privado



6. entrar en MS