From 3c401375ab990393ca54f1edf32ccf3ca210b017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez=20Bachiller?= Date: Mon, 19 Oct 2026 16:32:10 +0200 Subject: [PATCH 1/2] feat(dev): just dev-handler funciona en macOS Implements #2018: `just dev-handler` funciona en macOS - registra un .app de desarrollo por LaunchServices; off restaura el manejador previo --- scripts/dev-handler.sh | 96 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 86 insertions(+), 10 deletions(-) diff --git a/scripts/dev-handler.sh b/scripts/dev-handler.sh index 1f5c2d09..b42e8128 100755 --- a/scripts/dev-handler.sh +++ b/scripts/dev-handler.sh @@ -3,10 +3,88 @@ set -euo pipefail binario="${CARGO_TARGET_DIR:?}/debug/rfirma" lib_dir="${RFIRMA_LIB_DIR:?}" -destino="$HOME/.local/share/applications" -fichero="$destino/rfirma-dev.desktop" +sistema="$(uname -s)" + +if [ "$sistema" = "Darwin" ]; then + destino="$HOME/.local/share/rfirma-dev" + app="$destino/rfirma-dev.app" + bundle_id="es.rfirma.dev-handler" + lsregister="/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister" +else + destino="$HOME/.local/share/applications" + fichero="$destino/rfirma-dev.desktop" +fi previo="$destino/.rfirma-dev-handler-previo" +aviso_sin_binario() { + if [ ! -x "$binario" ]; then + echo + echo "AVISO: todavia no existe $binario." >&2 + echo "Arranca 'just dev' antes de pulsar el enlace de la sede." >&2 + fi +} + +# JXA es lo único de serie en macOS que llama a LaunchServices sin compilar nada. +macos_handler() { + osascript -l JavaScript -e " + ObjC.import('CoreServices'); + function run() { + try { return ObjC.unwrap(ObjC.castRefToObject(\$.LSCopyDefaultHandlerForURLScheme(\$('afirma')))); } + catch (e) { return ''; } + } + " +} + +macos_set_handler() { + osascript -l JavaScript -e " + ObjC.import('CoreServices'); + function run() { \$.LSSetDefaultHandlerForURLScheme(\$('afirma'), \$('$1')); return ''; } + " > /dev/null +} + +macos_on() { + mkdir -p "$app/Contents/MacOS" + if [ ! -f "$previo" ]; then + macos_handler > "$previo" + fi + # El ejecutable es el binario mismo y no un envoltorio: Tauri recibe afirma:// por evento de Apple. + ln -sf "$binario" "$app/Contents/MacOS/rfirma" + cat > "$app/Contents/Info.plist" < + + + + CFBundleIdentifier$bundle_id + CFBundleNamerFirma (desarrollo) + CFBundleExecutablerfirma + CFBundlePackageTypeAPPL + LSEnvironmentRFIRMA_LIB_DIR$lib_dir + CFBundleURLTypes + + CFBundleURLNameafirma + CFBundleURLSchemesafirma + + + +PLIST + "$lsregister" -f "$app" + macos_set_handler "$bundle_id" + echo + echo "manejador de afirma://: $(macos_handler)" + echo " -> $app" + aviso_sin_binario +} + +macos_off() { + "$lsregister" -u "$app" || true + rm -rf "$app" + if [ -s "$previo" ] && [ "$(cat "$previo")" != "$bundle_id" ]; then + macos_set_handler "$(cat "$previo")" || true + fi + rm -f "$previo" + echo "manejador de afirma://: $(macos_handler)" +} + on() { mkdir -p "$destino" # `off` le devuelve el esquema a quien lo tenía: con AutoFirma al lado, a su lanzador. @@ -29,11 +107,7 @@ on() { echo echo "manejador de afirma://: $(xdg-mime query default x-scheme-handler/afirma)" echo " -> $fichero" - if [ ! -x "$binario" ]; then - echo - echo "AVISO: todavia no existe $binario." >&2 - echo "Arranca 'just dev' antes de pulsar el enlace de la sede." >&2 - fi + aviso_sin_binario } off() { @@ -46,8 +120,10 @@ off() { echo "manejador de afirma://: $(xdg-mime query default x-scheme-handler/afirma || echo 'ninguno')" } -case "${1:-}" in - on) on ;; - off) off ;; +case "${1:-}:$sistema" in + on:Darwin) macos_on ;; + off:Darwin) macos_off ;; + on:*) on ;; + off:*) off ;; *) echo "uso: dev-handler.sh on|off" >&2; exit 1 ;; esac From 63274a64d5cd2690ab540faffbc6a436a145edc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez=20Bachiller?= Date: Mon, 19 Oct 2026 16:32:21 +0200 Subject: [PATCH 2/2] =?UTF-8?q?docs(scripts):=20el=20mapa=20dice=20c=C3=B3?= =?UTF-8?q?mo=20registra=20dev-handler=20en=20macOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/AGENTS.md b/scripts/AGENTS.md index 9b051729..5c2fedcd 100644 --- a/scripts/AGENTS.md +++ b/scripts/AGENTS.md @@ -12,7 +12,7 @@ Los arneses que llaman las recetas del `justfile` (ADR-0013). | `pinned-version.sh` | Imprime una clave de `versions.env` para los arranques que no pasan por `just`. | | `check-versions.sh` | La guarda de `versions.env`: ningún valor fijado escrito fuera de él y los pom con la misma AutoFirma. | | `app_version.py` | La versión de la aplicación con tres verbos: `bump` la sube en todos sus sitios, `check` comprueba que cuadran y `changelog` imprime la sección de una versión. No es la guarda de las herramientas fijadas. | -| `dev-handler.sh` | Registra o quita el binario de desarrollo como manejador de `afirma://`. | +| `dev-handler.sh` | Registra o quita el binario de desarrollo como manejador de `afirma://`: por `xdg-mime` en Linux y, en macOS, por LaunchServices con un `.app` de desarrollo. | | `isolated-store.sh` | Monta, para un cliente de la suite de conformidad y un almacén (`rsa`, `ec`, `token`, `token_apart`, `ed25519`, `several`, `expired` o `dnie`), su perfil de usar y tirar con su envoltorio y su raíz de confianza, sin lanzar el cliente. Lo llama la consola web de la suite al resolver el cliente, no una receta. | | `check-glibc.sh` | Comprueba el suelo de glibc de la librería nativa. | | `flatpak-sources.sh` | Regenera las fuentes de cargo vendorizadas del manifiesto flatpak y el sello de `Cargo.lock`. |