Me han hackeado el Spotify!

Bueno, realmente a mi no, ha sido a mi hija, ¿pero qué leche? si lo estoy pagando yo también es mío, ¿no?… Como soy un poco vago os reproduzco el hilo de twitter que mandé ayer para que os hagáis una idea:

Ejemplo práctico, de ahora mismo, de porqué es tan malo poner la misma contraseña en sitios distintos… Dentro hilo..

Esta mañana mi hija me ha mandado un whatsapp diciendo que alguien estaba cambiando la música de su spotify y que no podía oir nada de lo que ella ponía… raro.

Al rato me manda pantallazo del correo que ha recibido

Eso ya es indicio claro de que alguien ha entrado en su cuenta y ha cambiado el correo y, obviamente, la contraseña… En este momento estamos pagando el servicio a una persona que no conocemos.

Y que tiene unos gustos musicales pésimos además.

Después de momentos de desconcierto acertamos a dar con el chat de soporte de spotify que, tras pedirnos copia de los justificantes de pago y alguna cosilla más nos devuelve la cuenta. Bien por @SpotifySpain

Para saber lo que ha pasado, le pregunto si usaba la misma contraseña en otros sitios, me dice que si, compruebo en https://haveibeenpwned.com si su email estaba comprometido y… bingo.

Había otros cuatro sitios en internet donde se registro con la misma contraseña que habían sido comprometidos y, probablemente, de uno de ellos haya salido la contraseña que han usado.

Remedio inmediato: usar @nomorepass_ para generar nuevas contraseñas diferentes y cambiarlas en todas partes.

Por eso, amiguitos, nunca debéis usar la misma contraseña (ni ninguna variación simplona de la misma) en ningún sitio… Y, por supuesto, como no vas a poder recordar las contraseñas, usa nomorepass

¿Qué pasa con Correos?

Desde que su revolucionario cambio de imagen decidió quitar las bolitas de la corona Correos ya no es lo que era. Al menos en mi caso, dejadme que os cuente la última que me ha hecho:

La verdad es que compro muchas cosas en Aliexpress, generalmente porque no las encuentro en proveedores locales, otras veces porque el precio en estos proveedores es varias órdenes de magnitud más grande que en Aliexpress, siempre me fastidia tener que esperar, pero hasta el momento, siempre he elegido que me lo enviasen por correos – los de DHL ya me intentaron robar más de una vez con sus «tramitaciones aduaneras» innecesarias-. En este último pedido no fue diferente, lo hice para mi empresa y, como tal, aparece el nombre de la empresa como destinatario.

El pedido lo hice el 20 de Agosto y Aliexpress me va informando de su evolución, de hecho, estaba muy contento porque el día 28 ya estaba en Madrid tras pasar aduanas y demás… 8 días es muy buena marca para Aliexpress, así que me dispuse a esperar a que Correos llamase a mi puerta el día siguiente… Y no llegó.

A las 20:30 de la noche recibí un sms diciendome que no estaba en la oficina y que habían intentado entregar el paquete sin éxito y que lo volverían a intentar al día siguiente… Obviamente todo esto es un sinsentido. ¿Quien entrega un paquete a una empresa a las 20:30 de la noche? En fin, era jueves y quería tener el paquete para el fin de semana, así que esperé toda la mañana del viernes y el cartero no apareció, así que supuse que la sinrazón se volvía a repetir y me lo entregarían por la tarde. Cerré la oficina, me fui a comer y volví escopetado para esperar al cartero… Esperé hasta las 21:00 dentro de la oficina, y tampoco llegó. Bueno, supuse que habrían tenido algún problema en el reparto y tendría que esperar al lunes… Pero mi sorpresa vino al ir a ver el estado del envío en su aplicación:

Sin ninguna verguenza afirman que vinieron a las 19:37 y que yo no estaba ¡MENTIRA COCHINA! y que tendría que irlo a recoger el siguiente día hábil a la oficina (también comprobé que no habían dejado notificación en l buzón, así que 100% que por aquí no habían pasado).

Pero como yo ya estaba encabezonado, me decido a pasar el sábado por la mañana por la oficina de correos a ver qué había pasado… Después de esperar hasta las 9:30 me indican en la oficina que el reparto de ayer todavía no les ha llegado y no me pueden antender ¡¿?!

Espero mañana (lunes) ir a la oficina a media mañana a ver si, por azares del destino, puedo recoger mi paquete, pero ya habrían pasado 5 días más de los que debían haber pasado… ¡Que alguien me lo explique! ¿tan dificil es hacer que en la página de seguimiento te permitan decir que quieres que te entreguen el paquete por la mañana en lugar de por la tarde? ¿en qué cabeza cabe que si vas a una empresa que esta cerrada a una hora cuando vuelvas al día siguiente a la misma hora estará abierta?

Un poquito de sentido común, please.

ACTUALIZACIÓN 1: Esta semana me ha vuelto a pasar dos veces, el cartero dice que pasa a una hora y no es verdad (a las 12:30 es dificil que no haya nadie en la oficina), luego deja el papel del envío en el buzón al día siguiente, por lo que retrasa 3 días la recepción del paquete (teniendo en cuenta que vayamos a recogerlo ese mismo día y que no haya festivos por medio…) . El caso es que entregas de paquetes certificados NUNCA llegan a nuestra oficina y tenemos que ir a recogerlos aunque se haya pagado por que te los lleven… ¡Algo no funciona!

Subir a maven central una librería propia

Ahora que ya acabas de construir una librería interesante en Java, la has hecho pública (en github, por ejemplo) y quieres que todo el mundo la use… Queda una tarea pendiente, subirla a un repositorio maven para ponerla a disposición de los que utilicen este sistema (o gradle, que hoy en día ya son casi todos).

Vamos a verlo con un ejemplo que he subido esta mañana… Hay cosas que todavía no entiendo del todo, pero el resultado ha sido bueno, por lo que, al menos, podremos usar esta receta como guía para próximas veces.

El código que intento subir es una librería simple que tengo alojada en github con su pom.xml básico y que si te descargas el proyecto podrías compilar e instalar en tu maven con mvn install. La dirección es esta:

https://github.com/yoprogramo/nomorepass-java/

Ahora, para que todo el mundo pueda descargárselo como dependencia y no tenga que hacer el mvn install del proyecto, tenemos que subirlo a un repositorio público, podemos ver una guía en esta página: Guide to Public Maven Repositories. Tal como explican en la página, lo más sencillo para publicar en Maven Central es usar el repositorio Sonatype. Dicho y hecho… Lo intentamos por aquí.

Lo primero es crear una cuenta en el Jira de Sonatype aquí. Lo siguiente, y esto es un poco «tricky» es crear un ticket solicitando un nuevo id de grupo en esta dirección. No se puede pedir cualquier id de grupo (en mi caso quería pedir com.nomorepass) y generalmente se pedirá alguna prueba de que el dominio es tuyo. En mi caso este es el ticket que creé: https://issues.sonatype.org/browse/OSSRH-49426, para demostrar que el dominio era mío cambié el DNS e incluí una entrada TXT con el identificador del ticket:

Una vez autorizado (tarda un poco, es un proceso manual) hay que modificar nuestro código y prepararlo para la subida, pero, antes de eso, tenemos que generar nuestras claves gpg para poder firmar el código. eso se hace con este comando:

gpg --gen-key

Una vez generada podremos acceder a la lista de claves con el comando:

gpg --list-keys

Toma nota del id de la clave y recuerda la contraseña que usaste para generarla, porque tendrás que recordarla. Además, tendrás que publicarla en algún servidor de claves públicas para que pueda ser comprobada.

gpg --keyserver hkp://keys.gnupg.net --send-keys <el-id-de-la-clave>

Ahora empezamos a modificar el pom.xml para que cumpla con los requisitos para el repositorio Maven Central. En nuestro caso pusimos esto:

<groupId>com.nomorepass</groupId>
  <artifactId>nomorepass</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <name>Nomorepass java library</name>
  <description>NoMorePass protocol 2 implemented on Java.</description>
  <url>https://nomorepass.com</url>

  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <developers>
    <developer>
      <name>Jose Antonio Espinosa</name>
      <email>[email protected]</email>
      <organization>Nomorepass</organization>
      <organizationUrl>https://nomorepass.com</organizationUrl>
    </developer>
  </developers>

  <scm>
    <connection>scm:git:git://github.com/yoprogramo/nomorepass-java.git</connection>
    <developerConnection>scm:git:ssh://github.com:yoprogramo/nomorepass-java.git</developerConnection>
    <url>https://github.com/yoprogramo/nomorepass-java/tree/master</url>
</scm>

Y, una vez informado de todo esto, hay que incluir los plugins que nos permitirán hacer el despliegue directamente. Yo añadí esto:

<distributionManagement>
    <snapshotRepository>
      <id>ossrh</id>
      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
    <repository>
      <id>ossrh</id>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>

Y puse en mi directorio de maven settings.xml los datos de mi usuario

<settings>
  <servers>
    <server>
      <id>ossrh</id>
      <username>xxxxxxxxxx</username>
      <password>xxxxxxxxxx</password>
    </server>
  </servers>
</settings>

Por último, toda la sección de build (que no tenía) la sustituí por esto:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <executions>
          <execution>
            <id>sign-artifacts</id>
            <phase>verify</phase>
            <goals>
              <goal>sign</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <version>1.6.7</version>
        <extensions>true</extensions>
        <configuration>
          <serverId>ossrh</serverId>
          <nexusUrl>https://oss.sonatype.org/</nexusUrl>
          <autoReleaseAfterClose>true</autoReleaseAfterClose>
        </configuration>
      </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
          <version>2.2.1</version>
          <executions>
            <execution>
              <id>attach-sources</id>
              <goals>
                <goal>jar-no-fork</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>2.9.1</version>
          <executions>
            <execution>
              <id>attach-javadocs</id>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
    </plugins>
</build>

Y ya, finalmente, pude ejecutar el mágico:

mvn clean deploy

Si todo ha ido bien, el artefacto estará subido a un repositorio que tendremos que promocionar a «Release» para que se sincronice con el repositorio central… Pero al final ya lo tendremos disponible para todo el mundo…

Aquí podéis encontrar lo que acabo de subir: https://search.maven.org/artifact/com.nomorepass/nomorepass/1.0/jar

No puedo con la burocracia

Hay cosas en la vida que te persiguen como una mascota con hambre… Y hoy me he dado cuenta que una de las que me ha estado molestando a todas horas es la burocracia. Y no, no estoy hablando solo de la administración pública.

Empecemos por lo más reciente… El sinsentido de no proporcionarte TU información.

El caso es que mi hijo está en un proceso de consultas y pruebas en el hospital y hacía un par de meses que nos dijeron que nos enviarían cita para las pruebas que faltaban. Generalmente te mandan un sms o te llaman por teléfono, pero esta vez no había sido así y cabía la posibilidad de que no se hubiesen pedido las pruebas o que se nos hubiese pasado la fecha sin saberlo… Al intentar usar la app de citas de la comunidad de madrid nos pide un número de cita para consultar sus datos ¿porqué? Ese dato no lo teníamos porque la cita la había pedido el mismo especialista y solo él sabía el número. ¿no sería más sencillo mostrarte la lista de todas tus citas? En fin…

El caso es que decidimos presentarnos en admisiones del hospital y, tras casi dos horas de espera (¿realmente esto no se puede mejorar?), nos dicen que para darnos estos datos necesitamos una autorización por parte de nuestro hijo (que acaba de cumplir los 18) y fotocopias del dni y la tarjeta sanitaria… Evidentemente la tarjeta la teníamos, pero el DNI lo tenía él y parece que una foto en el móvil tiene menos valor que una fotocopia (sigh)… Repito, ¿no sería más sencillo darnos esa información telemáticamente?

El siguiente sin sentido, que está a punto de mandar a pique a mi empresa, es el de la burocracia empresarial «envenenada»…

Cuanto más grande es la empresa, más complejos son los procesos de gestión, eso lo asumimos todos, pero, lo que no es asumible es que los retrasos, ineficiencias o descuidos en los niveles de gestión de la empresa afecten de manera mortal a proveedores o colaboradores como es el caso.

Llevamos trabajando con una gran empresa, colaborando de manera decisiva en uno de sus proyectos más novedosos y estratégicos desde hace año y medio. El primer año tuvimos dos contratos y con la última extensión del contrato se nos indicó que funcionaríamos mediante órdenes de trabajo y facturas contra esas órdenes. Eso es mucho papeleo y, para que os hagáis una idea, de enero a marzo nos genero 17 facturas. En teoría con un plazo de pago de 45 días.

Cuando vencieron las primeras de enero (en marzo) vimos que los pagos no llegaban. Preguntamos y nos dicen que hay un problema «administrativo» y que ya cobraremos en abril. En abril (hemos seguido trabajando para ellos en marzo y abril) nos indican que hay más problemas y que hay que firmar un nuevo contrato para los trabajos nuevos y otro para poder pagar las facturas viejas ¡¡¡¡¡¡¡¡!!!!!!!!! WTF?

Llega finales de abril y tampoco pagan, en mayo no me dan muchas esperanzas (tiene que firmar el CEO y, claro, debe ser que los asuntos de la empresa no le parecen lo suficientemente importantes como para estar disponible)… Y yo, mientras tanto, pagando el IVA, las nóminas, los gastos de estar trabajando para una gran empresa con dinero propio. Si le pido a los bancos ya me han dicho que tengo que avalar con mis bienes (y cualquiera se fia de nadie hoy en día)… Pero para la gran empresa es solo «un problema administrativo interno».

Ninguna empresa puede vivir seis meses sin ingresos, ninguna que no sea una startup y hay recibido financiación para ello. Y menos trabajando y dejándose la piel día a día haciendo lo que mejor sabemos… Si en un mes esto sigue así tendremos que cerrar «por un problema administrativo de una empresa ajena».

Cordova + Android con docker

Si, suena a chino, pero todos los que desarrollamos aplicaciones hibridas para móviles con cordova nos hemos encontrado con este problema tarde o temprano.. Las versiones son una pesadilla, la versión de node, de nmp, de cordova, de cada uno de los plugins… Y como estoy experimentando con docker para algunos de mis servicios pues quiero experimentar también a ver si puedo tener una versión de contenedor para compilar siempre sobre seguro… Estos son mis resultados:

docker pull beevelop/cordova:latest
docker run --name=cordova -v /home/espinosa/code:/mnt -it beevelop/cordova bash

Luego entro a mi proyecto y simplemente, compilo…

cordova platform add android
cordova build android

Y ya está…

Pero tiene algunos «problemillas» como que el usuario que se utiliza para la compilación es root… Y mientras no encuentre una manera de evitarlo (en el contenedor todo está preparado para hacerlo con root) lo que tengo que hacer es cambiar el propietario del directorio en el que estoy (en el host) después de realizar la compilación.

chmod -R espinosa:espinosa .

O, si lo hacemos desde dentro del contendor:

chmod -R 1000:1000 .

Estoy seguro de que puedo utilizar este sistema para automatizar las generaciones de los apk de las apps (ojala pudiera hacerlo igual en ios), pero todavía me faltan algunos detalles… Por cierto, una vez creado el docker, para volver a ejecutarlo solo hace falta escribir esto:

docker start -ai cordova