-- Leo's gemini proxy

-- Connecting to sl1200.dystopic.world:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=es-ES

Notas desde la barra de direcciones con TOTP y servidor Agate

2023-01-15

#agate #notas #journalctl #totp #bash

Objetivo:

Publicar un diario o anotaciones directamente desde la barra de direcciones de cualquier cliente gémini, con el servidor Agate y con acceso a través de un código TOTP.


Cómo funciona

El script genera un código TOTP cada minuto en el servidor, con la herramienta oathtool, debo configurar ese mismo TOTP en el móvil, por ejemplo con la app Aegis y en el PC con KeepassXC u otro software que lo permita. Para generarlo necesitas una contraseña y convertirla a base32, para ello puedes usar el comando base32 y adoptar sólo los caracteres alfanuméricos resultantes, por ejemplo:

	En el terminal:
	echo micontraseña | base32
	NVUWG33OORZGC43FYOYWCCQ=

	En el script:
	v=$(oathtool -b -d 8 -s 60 --totp 'NVUWG33OORZGC43FYOYWCCQ')

	En el móvil o PC deberás configurar tu app con ese mismo código en base32.

Para publicar escribo en el cliente detrás de la url el código TOTP y la anotación que quiero publicar. Como los clientes sólo pueden enviar caracteres ascii y por cuestiones de seguridad, los caracteres especiales y los no ascii son codificados antes de ser enviados, de forma que esos caracteres se convierten en un carácter % más un código hexadecimal. Por ejemplo, las comillas se codifican como %20, la "á" como %C3%A1 o la "\" como %5C,

El servidor Agate genera un log de error, que incluye todo el texto que yo escriba, pero es ilegible porque el cliente lo ha codificado antes de enviar la petición. Defino una función de decodificación que se aplicará a los logs filtrados.

Filtro los logs de Agate cada minuto quedándome sólo con los que incluyen "gemini" y el TOTP previamente generado.

Decodifico los logs filtrados.

El script publica en el documento gmi una línea con la fecha y hora, otra línea con el texto decodificado del log que he filtrado y una línea en blanco.

En el caso de que quiera borrar una anotación escribiré detrás de la url el código TOTP, la fecha y hora de la anotación a borrar y "/rm".


Ejemplo de sintaxis

	Para publicar: gemini://sl1200.dystopic.world/39372698/Esto es una anotación.
	Para borrar  : gemini://sl1200.dystopic.world/85426565/2023-01-10 10:35/rm

Script en Bash

#!/bin/bash

NOTAS=/home/usuario/gemini/content/diario.gmi

# Cálculo el TOTP
v=$(oathtool -b -d 8 -s 60 --totp 'clave en base32')

# Doy 59 segundos para introducir la url y que se genere el log antes de seguir con el script
sleep 59

# Función de decodificación de la url
function urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }

# Filtro el contenido de los registros del último minuto
post=$(journalctl --since "1 min ago" | grep 'gemini' | sed '1,5!d' | grep "$v" | cut -d "\"" -f 2 | \
 sed 's|gemini://usuario.dystopic.world||g' | sed "s/\/$v\///g" )

# Decodifico el contenido filtrado
post2=$( urldecode $post )

# Si post2 acaba en aaaa-mm-dd/rm, borro /rm de post2 y borro la fila de diario.gmi que incluya post2
if [[ $post2 == *"/rm" ]]; then
	post2=$( echo $post2 | sed 's/\/rm//g')
	sed -i "/$post2/{N;N;d;}" $NOTAS
    exit
	else

# Si el contenido está vacio finalizo el script para que no añada filas en blanco
if [ "$post2" = "" ];
	then exit
	else
	# Si pongo una url http o gemini el contenido se publique como un enlace con =>
	if [[ $post2 == http* || $post2 == gemini* ]]; then
	# Inserto el contenido decodificado, junto con la fecha, en la línea 6 del documento diario.gmi
	sed -i "6i \#\#\# $(date +"%Y-%m-%d %H:%M")" $NOTAS
	sed -i "7i => $post2 " $NOTAS
	# Depuro algunas cosas que no deben salir
	sed -i -e '7s/https\:\//https\:\/\//' $NOTAS
	sed -i -e '7s|\/\/\/|\/\/|' $NOTAS
	sed -i -e '7s|gemini\:\/|gemini\:\/\/|' $NOTAS
	# Inserto una fila en blanco tras el comentario recién publicado
	sed -i '8i\ ' $NOTAS
		else
		# Inserto el contenido decodificado, junto con la fecha, en la línea 6 del documento diario.gmi
		sed -i "6i \#\#\# $(date +"%Y-%m-%d %H:%M")" $NOTAS
		sed -i "7i 💬 $post2" $NOTAS
		# inserto una fila en blanco tras el comentario recién publicado
		sed -i '8i\ ' $NOTAS
	fi

# limito el número de líneas del documento a 500
sed -i '500,$d' $NOTAS
fi
fi

Finalmente programas el script con cron para que se ejecute cada minuto.



This work by SL1200 is licensed under CC BY 4.0


◄ BACK

🏠 Home

-- Response ended

-- Page fetched on Fri May 17 04:57:34 2024