-- Leo's gemini proxy
-- Connecting to sl1200.dystopic.world:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini;lang=es-ES
2023-01-15
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.
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".
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
#!/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.
-- Response ended
-- Page fetched on Fri May 17 04:57:34 2024