Skip to content

feat(macos): rFirma sabe quién abre afirma:// en macOS y deja elegirse - #2034

Merged
sgomez merged 3 commits into
agent/developer/spec-2000from
agent/developer/issue-2017
Oct 19, 2026
Merged

sgomez merged 3 commits into
agent/developer/spec-2000from
agent/developer/issue-2017

Conversation

@sgomez

@sgomez sgomez commented Oct 19, 2026

Copy link
Copy Markdown
Owner

Closes #2017

What changed

  • desktop/adapters/registry/launch_services.rs: el registro de manejadores de macOS sobre LaunchServices, detrás de la costura Workspace. rFirma sale con el id rfirma.desktop, como en Windows, para que el panel de estado y la elección funcionen sin cambios; las demás aplicaciones, con la ruta de su .app y el nombre que da el Finder.
  • launch_services/ns_workspace.rs: SystemWorkspace sobre NSWorkspace (URLsForApplicationsToOpenURL, URLForApplicationToOpenURL, setDefaultApplicationAtURL:toOpenURLsWithScheme:). La elección espera la confirmación del sistema hasta 120 s.
  • Sale PendingMacosLaunchServices y su fila de la tabla del ADR-0040. Se activan las features NSWorkspace de objc2-app-kit y NSArray/NSError/NSFileManager/NSURL de objc2-foundation; Cargo.lock no cambia.

Decisiones donde la spec no decía nada:

  • Retirar en macOS. LaunchServices no deja un esquema sin aplicación. Si rFirma lo abre, remove_for se lo pasa a la primera otra aplicación que lo declare (AutoFirma, si está). Si no hay ninguna, no toca nada: el sistema lo olvida al borrar el .app. Si lo abre otra aplicación, no se escribe nada.
  • Qué .app es rFirma. Es el .app que contiene el ejecutable en marcha. Fuera de un bundle (desarrollo), es el propio ejecutable; just dev-handler en macOS es otro sub-issue.

Test plan

  • El caso de uso de manejadores respeta a AutoFirma, con un Workspace doble (launch_services/tests.rs, pasando por who_handles, chosen y withdrawn):

    • with_autofirma_chosen_both_are_listed_and_autofirma_is_current
    • choosing_rfirma_makes_it_the_one_that_opens_the_scheme
    • choosing_autofirma_again_gives_the_scheme_back_to_it
    • choosing_an_application_that_does_not_declare_the_scheme_fails_without_writing
    • withdrawing_rfirma_hands_the_scheme_back_to_autofirma

    Todas se vieron en rojo contra un stub.

  • reading_who_handles_the_scheme_never_takes_it y withdrawing_while_autofirma_is_chosen_leaves_it_untouched pasaban ya contra el stub, que no escribía nada. Se vieron en rojo contra una versión rota a propósito (leer escribe, retirar no mira de quién es el esquema) y luego se restauró la buena.

  • rfirma_is_the_bundle_that_holds_the_running_executable, vista en rojo. outside_a_bundle_rfirma_is_the_executable_itself fija el caso por defecto, y el stub ya lo cumplía.

  • Guardas estructurales en verde. El nuevo módulo no lleva ningún cfg de sistema: cuelga del #[cfg(target_os = "macos")] de registry.rs, que ya está en AUTHORISED_SITES.

  • Sin hacer: hay que probarlo a mano con el .app real. Elegir rFirma, pulsar «Firmar» en una sede con rFirma cerrada y atender el trámite en frío. Volver a AutoFirma. SystemWorkspace no tiene prueba automática (TD-135): en esta ejecución no lo arranqué contra LaunchServices de verdad, ni para leer ni para escribir.

  • Clippy (just check-rust) no corrió en el pre-push de este worktree. El veredicto es del CI.

Merge de origin/agent/developer/spec-2000 antes de publicar. Hubo dos conflictos:

  • La tabla del ADR-0040: la otra rama quitaba la fila de la CA y esta, la de los manejadores; se quitan las dos.
  • Las dependencias de macOS en Cargo.toml: se juntan las features de esta rama con security-framework.

Después del merge corrí otra vez las pruebas de desktop:: y salieron en verde. Al elegir rFirma, choose_site_signature_handler instala además la CA local con el adaptador de confianza de macOS de la otra rama, así que en la prueba manual aparecerá el diálogo de contraseña del sistema.

Sergio Gómez Bachiller added 3 commits October 19, 2026 16:10
Implements #2017: rFirma sabe quién abre afirma:// en macOS y deja elegirse
- LaunchServices tras la costura Workspace; NSWorkspace la implementa y se prueba a mano
- Leer nunca escribe; retirar rFirma devuelve el esquema a otra aplicación que lo declare
- Sale PendingMacosLaunchServices y su fila de la tabla del ADR-0040
…agent/developer/issue-2017

# Conflicts:
#	docs/adr/0040-macos-en-apple-silicon-como-tercera-plataforma.md
#	rfirma-app/src-tauri/Cargo.toml
@sgomez
sgomez marked this pull request as ready for review October 19, 2026 14:17
@sgomez
sgomez merged commit 4dd323d into agent/developer/spec-2000 Oct 19, 2026
@sgomez
sgomez deleted the agent/developer/issue-2017 branch October 19, 2026 14:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant