Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
a202faf
docs(macos): la regla «en macOS, la API de macOS, salvo el DNIe» y el…
Oct 19, 2026
6ac3fde
feat(macos): el PIN de una tarjeta por PKCS#11 se pide con un diálogo…
Oct 19, 2026
e51ccf5
Merge pull request #2026 from sgomez/agent/developer/issue-2011
sgomez Oct 19, 2026
9a44539
Merge pull request #2027 from sgomez/agent/developer/issue-2001
sgomez Oct 19, 2026
908de12
feat(identity): el Almacén de macOS lista los certificados del llavero
Oct 19, 2026
a82ee3e
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
Oct 19, 2026
a1a474d
Merge pull request #2028 from sgomez/agent/developer/issue-2004
sgomez Oct 19, 2026
1642727
feat(macos): la CA local se instala en la confianza de la persona usu…
Oct 19, 2026
d77a6f7
feat(macos): el aviso de arranque es una alerta nativa
Oct 19, 2026
fb0319d
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
Oct 19, 2026
4a6b7cb
Merge pull request #2029 from sgomez/agent/developer/issue-2019
sgomez Oct 19, 2026
0458fa8
Merge pull request #2030 from sgomez/agent/developer/issue-2014
sgomez Oct 19, 2026
ec83b92
ci(macos): la entrega vuelve a publicar el paquete de macOS
Oct 19, 2026
69bd77d
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
Oct 19, 2026
48bc41d
feat(macos): rFirma sabe quién abre afirma:// en macOS y deja elegirse
Oct 19, 2026
c17eecf
Merge pull request #2031 from sgomez/agent/developer/issue-2021
sgomez Oct 19, 2026
5b8b59c
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
Oct 19, 2026
68f9af8
feat(identity): firmar con un certificado del Almacén de macOS
Oct 19, 2026
77b7660
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
Oct 19, 2026
80d9213
Merge pull request #2033 from sgomez/agent/developer/issue-2005
sgomez Oct 19, 2026
1c9023d
fix(macos): el bloque inseguro del aviso de LaunchServices dice por q…
Oct 19, 2026
4dd323d
Merge pull request #2034 from sgomez/agent/developer/issue-2017
sgomez Oct 19, 2026
1bd243e
feat(sede): APPLE y -store apple acotan al Almacén de macOS
Oct 19, 2026
5120c4a
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
Oct 19, 2026
17b2514
Merge pull request #2035 from sgomez/agent/developer/issue-2006
sgomez Oct 19, 2026
29ddafc
feat(identity): la interfaz rotula el Almacén de macOS en la lista, e…
Oct 19, 2026
7ffcbd7
feat(identity): «Instalar certificado» lleva el .p12 al llavero de in…
Oct 19, 2026
019803e
feat(identity): el vigilante de lectores corre en macOS
Oct 19, 2026
82e2114
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
Oct 19, 2026
9c52aab
Merge pull request #2036 from sgomez/agent/developer/issue-2015
sgomez Oct 19, 2026
3c40137
feat(dev): just dev-handler funciona en macOS
Oct 19, 2026
63274a6
docs(scripts): el mapa dice cómo registra dev-handler en macOS
Oct 19, 2026
0a53b57
Merge pull request #2038 from sgomez/agent/developer/issue-2018
sgomez Oct 19, 2026
f109ac9
Merge origin/agent/developer/spec-2000 into fix-pr-2037
Oct 19, 2026
7d08399
Merge pull request #2037 from sgomez/agent/developer/issue-2007
sgomez Oct 19, 2026
2e1e083
feat(macos): rFirma se actualiza sola en macOS
Oct 19, 2026
ac35ee8
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
Oct 19, 2026
7b0b664
Merge pull request #2039 from sgomez/agent/developer/issue-2024
sgomez Oct 19, 2026
ad11eca
Merge pull request #2040 from sgomez/agent/developer/issue-2009
sgomez Oct 19, 2026
6350a59
feat(signing): la línea del lector ilegible en macOS ofrece OpenSC y …
Oct 19, 2026
bc8a973
Merge pull request #2041 from sgomez/agent/developer/issue-2016
sgomez Oct 19, 2026
d1f821b
docs(adr): el ADR-0040 deja las tarjetas y el DNIe de macOS pendiente…
sgomez Oct 19, 2026
98d0a70
Merge pull request #2047 from sgomez/agent/developer/issue-2046
sgomez Oct 19, 2026
7ab5d70
fix(identity): en macOS no se vigilan los lectores ni aparece su línea
sgomez Oct 19, 2026
2a175a3
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
sgomez Oct 19, 2026
889c328
Merge pull request #2048 from sgomez/agent/developer/issue-2044
sgomez Oct 19, 2026
8103ad3
feat(identity): el Almacén de macOS solo lista certificados con clave…
sgomez Oct 19, 2026
9f293bc
Merge remote-tracking branch 'origin/agent/developer/spec-2000' into …
sgomez Oct 19, 2026
8d69955
Merge pull request #2049 from sgomez/agent/developer/issue-2008
sgomez Oct 19, 2026
39d5bcb
feat(debug-info): almacén de macOS y controladores de tarjeta
sgomez Oct 19, 2026
84765fa
Merge pull request #2050 from sgomez/agent/developer/issue-2020
sgomez Oct 19, 2026
c849330
fix(pr): Preferencias solo quita del llavero lo que instaló rFirma, l…
sgomez Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 41 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -242,16 +242,50 @@ jobs:
if-no-files-found: error
retention-days: 1

# El .dmg de Apple Silicon compila su propia .dylib, como el instalador de Windows (ADR-0040).
macos:
name: DMG de macOS
runs-on: macos-14
timeout-minutes: 90
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ inputs.ref }}

- uses: ./.github/actions/setup-runner
with:
rust: release
node: true
java: graalvm
save-cache: false

- name: Libreria nativa
Comment thread
sgomez marked this conversation as resolved.
Dismissed
run: just native

- name: Empaqueta la .app y el .dmg
run: just bundle

- name: Sube el .dmg y la actualizacion
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bundle-macos
path: |
rfirma-app/src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/*.dmg
rfirma-app/src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/*.app.tar.gz
if-no-files-found: error
retention-days: 1

collect-packages:
name: Reune y verifica paquetes
needs: [native-bridge, test-native, flatpak, bundle, windows]
needs: [native-bridge, test-native, flatpak, bundle, windows, macos]
if: |
always() &&
!cancelled() &&
needs.native-bridge.result == 'success' &&
needs.test-native.result == 'success' &&
needs.flatpak.result == 'success' &&
needs.windows.result == 'success' &&
needs.macos.result == 'success' &&
(needs.bundle.result == 'success' || needs.bundle.result == 'skipped')
runs-on: ubuntu-latest
timeout-minutes: 10
Expand Down Expand Up @@ -285,6 +319,12 @@ jobs:
name: bundle-windows
path: ${{ runner.temp }}/paquetes

- name: Descarga el .dmg y la actualizacion de macOS
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: bundle-macos
path: ${{ runner.temp }}/paquetes

- name: Descarga bundles nativos (.deb y .rpm)
if: needs.native-bridge.outputs.native-packages == 'true'
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/platforms.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ jobs:
rust: lint
node: true
java: graalvm
tools: llvm-cov crap
save-cache: ${{ inputs.save-cache }}

- name: Cache de librfirma_crypto.dylib
Expand All @@ -119,5 +120,6 @@ jobs:
- name: rustfmt y clippy
run: just lint-rust

- name: Pruebas de --lib y del canal local
# Los adaptadores de macOS solo compilan aqui: Linux los oculta de su puerta CRAP (ADR-0014, ADR-0040).
- name: Pruebas de --lib y del canal local, y CRAP de los adaptadores de macOS
run: just test-macos
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ jobs:
packaging/verify-packages.sh paquetes --against "${{ runner.temp }}/SHA256SUMS.construccion"

# Despues de comparar con la construccion y antes del `SHA256SUMS`, que cubre el `.sig` (ADR-0015).
- name: Firma de actualizacion de cada -setup.exe
- name: Firma de actualizacion de cada -setup.exe y .app.tar.gz
if: ${{ env.IS_PRERELEASE != 'true' }}
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/warm-release-cache.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(github.event.schedule == '37 2 * * *' && '[{"runner":"ubuntu-24.04","timeout":60,"apt":"tauri","java":"none","native":false,"recipe":"build-rust"}]' || github.event_name == 'schedule' && '[{"runner":"windows-latest","timeout":90,"apt":"none","java":"graalvm","native":true,"recipe":"bundle"}]' || '[{"runner":"ubuntu-24.04","timeout":60,"apt":"tauri","java":"none","native":false,"recipe":"build-rust"},{"runner":"windows-latest","timeout":90,"apt":"none","java":"graalvm","native":true,"recipe":"bundle"}]') }}
include: ${{ fromJSON(github.event.schedule == '37 2 * * *' && '[{"runner":"ubuntu-24.04","timeout":60,"apt":"tauri","java":"none","native":false,"recipe":"build-rust"}]' || github.event_name == 'schedule' && '[{"runner":"windows-latest","timeout":90,"apt":"none","java":"graalvm","native":true,"recipe":"bundle"},{"runner":"macos-14","timeout":90,"apt":"none","java":"graalvm","native":true,"recipe":"bundle"}]' || '[{"runner":"ubuntu-24.04","timeout":60,"apt":"tauri","java":"none","native":false,"recipe":"build-rust"},{"runner":"windows-latest","timeout":90,"apt":"none","java":"graalvm","native":true,"recipe":"bundle"},{"runner":"macos-14","timeout":90,"apt":"none","java":"graalvm","native":true,"recipe":"bundle"}]') }}
runs-on: ${{ matrix.runner }}
timeout-minutes: ${{ matrix.timeout }}
defaults:
Expand Down
10 changes: 8 additions & 2 deletions CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,8 @@ y se abren por separado, así que uno que no cargue no deja sin certificados a
los demás. El mismo certificado —mismo emisor y número de serie— en varios
almacenes se muestra una vez, con la lista de almacenes donde está; se firma con
la copia recordada o, si no la hay, con la del primer almacén por este orden:
tarjeta, Almacén de Windows, Almacén de rFirma, NSS del sistema, familia Firefox,
familia Chromium; dentro de cada familia, nativo, snap y flatpak.
tarjeta, Almacén de Windows o Almacén de macOS, Almacén de rFirma, NSS del sistema,
familia Firefox, familia Chromium; dentro de cada familia, nativo, snap y flatpak.
No hay **almacén activo**: la persona elige un certificado, nunca un almacén.
_Avoid_: keystore, repositorio de certificados, llavero, «el conjunto de
certificados de la máquina», almacén activo
Expand All @@ -217,6 +217,12 @@ una tarjeta criptográfica que Windows copia ahí no son suyos, sino de la
tarjeta. Windows pide su contraseña o su PIN con su propio diálogo.
_Avoid_: almacén del sistema, almacén CNG, almacén MY

**Almacén de macOS** (Rust `StoreClass::Macos`):
Los certificados con clave privada de software del llavero de la persona usuaria en macOS. Los
que tienen la clave en una tarjeta o un token del sistema no salen. macOS pide su contraseña o
su PIN con su propio diálogo. «Llavero» sigue reservado para lo que guarda secretos.
_Avoid_: almacén del sistema, llavero, Keychain

**Almacén NSS** (Rust `StoreClass::Nssdb`):
El almacén de un navegador —el perfil de Firefox, la base de datos de Chrome—,
que es a la vez de donde salen certificados para firmar y **donde la aplicación
Expand Down
3 changes: 2 additions & 1 deletion docs/adr/0015-canal-de-distribucion-propio.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,10 @@ nunca.
| `/apt/` | con `dists/stable/main/binary-amd64/` |
| `/rpm/` | con `repodata/` |
| `/windows/` | el `-setup.exe` y su `.sig` de cada versión, y `latest.json` |
| `/macos/` | el `.app.tar.gz` y su `.sig` de cada versión que lo trae, y `latest.json` |

Estas rutas van dentro del `.flatpakref` y del `.flatpakrepo`, de las órdenes de alta publicadas y del *endpoint*
del *updater* embebido en cada instalación de Windows, así que se fijan aquí.
del *updater* embebido en cada instalación de Windows y de macOS, así que se fijan aquí.

**apt con una sola suite**, no repositorio plano: el plano es más barato y **no admite
`Suites:`/`Components:` en un fichero `.sources` deb822**, que es el formato obligado para
Expand Down
62 changes: 48 additions & 14 deletions docs/adr/0040-macos-en-apple-silicon-como-tercera-plataforma.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,36 @@ como fallaría Linux sin el servicio y dice en su nombre qué falta.
| --- | --- |
| OpenSSL del sistema | `openssl` con `vendored`, como en Windows: el binario no depende del de Homebrew y compila en cruzado. |
| Canal TLS local con `native-tls` | rustls, como en Windows (ADR-0036). |
| Token PKCS#11 y sus almacenes | El mismo `RealToken` de Linux; solo encuentra módulo si `RFIRMA_PKCS11_MODULE` lo nombra. |
| Token PKCS#11 y sus almacenes | `MacosToken`: el llavero por Security.framework para el Almacén de macOS, que firma el resumen con la clave del llavero, y el `RealToken` de Linux para los módulos, que solo encuentra si `RFIRMA_PKCS11_MODULE` lo nombra. |
| `mlock` del secreto | `mlock`; `MADV_DONTDUMP` es solo de Linux. |
| Cerrojos (Firefox, carpeta de paso) | Los de Unix, sin cambios. |
| Diálogo GTK del PIN | `PendingMacosPinDialog`: falla con un mensaje en castellano. |
| Llavero `oo7` (ADR-0034) | `PendingMacosKeychain`: responde que no hay llavero. |
| Manejadores de `afirma://` por GIO | `PendingMacosLaunchServices`: la lista no está disponible y elegir falla. |
| CA local en los almacenes NSS (ADR-0005) | `PendingMacosKeychainTrust`, sin perfiles: la CA consta como no instalada. |
| Diálogo GTK de fallo de arranque | El texto sale por la salida de error. |

La firma trifásica (ADR-0001) funciona de extremo a extremo con una clave en memoria: PAdES,
CAdES y XAdES pasan por el puente y el validador de AutoFirma da por válidas las PAdES. Lo que
falta para firmar con una tarjeta es el diálogo del PIN; para el almacén del sistema, un adaptador
del llavero de macOS como el de CNG en Windows.
CAdES y XAdES pasan por el puente y el validador de AutoFirma da por válidas las PAdES. El PIN
de una tarjeta por PKCS#11 lo pide una alerta de AppKit con campo seguro, modal sobre la ventana
que lo pidió (ADR-0047).

## En macOS, la API de macOS siempre que se pueda

Como en Windows (ADR-0035), para certificados, PIN y confianza rFirma usa lo que macOS ofrece
(Security.framework y LaunchServices): es lo que la persona ya conoce y evita mantener un camino
propio. De la regla salen:

- **Los certificados con clave de software del llavero** salen como «Almacén de macOS» y se firman
por la API del sistema: Rust calcula el resumen y macOS lo firma (ADR-0001). La contraseña o el
permiso los pide macOS con su diálogo. Una identidad con la clave en un token del sistema no sale.
- **«Instalar certificado» importa el `.p12` al llavero de inicio de sesión** (ADR-0034); en macOS
no hay Almacén de rFirma.
- **La CA local va a la confianza de la persona usuaria** (ADR-0005), con el diálogo de contraseña
del sistema, y `afirma://` se gestiona por LaunchServices.

Las tarjetas y el DNIe en macOS quedan fuera de la regla: están pendientes de #2043, sin decidir, y
mientras tanto el Almacén de macOS solo lista certificados con clave de software. En macOS no se
vigilan los lectores ni aparece la línea del lector.

El orden de almacenes pasa a ser: tarjeta, Almacén de Windows o de macOS, Almacén de rFirma,
NSS del sistema, familia Firefox, familia Chromium.

## `afirma://` llega como evento, no como argumento

Expand Down Expand Up @@ -64,6 +81,24 @@ equipo, porque todo Mac con Apple Silicon puede actualizar a ella.
El `.dmg` pasa por la misma puerta del contenido que los demás paquetes
(`packaging/verifica-contenido.sh`): una sola `librfirma_crypto.dylib` y ningún auxiliar de AWT.

## Sin cuenta de Apple Developer: tap de Homebrew y actualizador propio

No hay cuenta de Apple Developer: el paquete no se firma con Developer ID ni se notariza, y
mantiene la firma ad hoc y el *hardened runtime* apagado, que además deja cargar módulos PKCS#11
de terceros. Con firma ad hoc, cada versión es otra identidad de código para macOS, y el
«Permitir siempre» del llavero puede volver a pedirse tras cada actualización.

- **Distribución:** un tap de Homebrew propio del proyecto, con un cask que instala el `.app`
publicado en la Release; se actualiza en cada versión. Las instrucciones de instalación,
incluido `xattr -c /Applications/rFirma.app` para abrir la aplicación ante el aviso de
Gatekeeper la primera vez, van en la documentación del tap y en la de rFirma.
- **Actualización:** rFirma se actualiza sola con el canal de Windows: la entrega publica el
paquete de actualización firmado con minisign y su entrada en `latest.json`. El cask declara
`auto_updates: true`, así que `brew upgrade` no lo toca, y rFirma no trata una instalación por
Homebrew como gestionada por paquete. La descarga del actualizador no lleva la marca de
cuarentena, así que el aviso de Gatekeeper solo sale en la primera instalación; está por
verificar con la firma ad hoc.

## GraalVM: la 25.0.2 en el CI, la 25.0.1 en un Mac Intel

El CI construye con la 25.0.2 fijada (ADR-0035) en `macos-14`, que es Apple Silicon. La 25.0.2 no
Expand All @@ -82,8 +117,8 @@ GraalVM se busca en `GRAALVM_HOME`, después en `JAVA_HOME` y por último con
25.0.1 en un runner Intel. Los Mac Intel son una plataforma que Apple ya no vende.

**Notarizar con un Developer ID**: quita el aviso de Gatekeeper, pero exige una cuenta de pago de
Apple y secretos de firma en el CI. Queda para cuando haya quien la mantenga; el instalador de
Windows tampoco está firmado.
Apple y secretos de firma en el CI. No hay cuenta de Apple Developer; el instalador de Windows tampoco
está firmado.

**Instalar la `.dylib` en `Contents/Resources`**: funciona igual para `dlopen`, pero
`Frameworks` es donde macOS espera el código cargable y donde `codesign` lo firma al sellar el
Expand All @@ -102,11 +137,10 @@ dependencia en todas las plataformas para algo que en Linux y Windows ya resuelv
- El CI tiene un job `macos` en `platforms.yml` que compila la `.dylib`, pasa `rustfmt`, `clippy`
y `just test-macos`. Corre en un PR solo si toca algo que solo compila macOS o que cambia cómo
se compila allí, o lleva `ci-macos` o `ci-full`, y en `main` en la nocturna (ADR-0014).
- El `.dmg` no se publica en la entrega: `build.yml` no lo construye mientras los adaptadores de
firma estén pendientes, porque un paquete que no puede firmar no sirve a quien lo descarga.
La entrega (`build.yml`) construye el `.dmg` con firma ad hoc y el *hardened runtime* desactivado.
- `lib.rs` genera el contexto de Tauri una sola vez en `run` y `event_loop.rs` lo construye: en macOS `generate_context!()` define
el `Info.plist` embebido, y llamarla dos veces falla al enlazar.
- Los códigos con que macOS rechaza un certificado de sede no reconocido (ADR-0039) se añaden a
los de OpenSSL y Schannel, sin condicional de sistema.
- Sin diálogo del PIN, llavero ni CA local, un trámite de sede en macOS no puede todavía firmar
con tarjeta ni el navegador confía en el canal local sin instalar la CA a mano.
- La CA local (ADR-0005) se confía en el dominio de la persona usuaria, con el diálogo de
contraseña de macOS; Safari, Chrome y Firefox 120 o posterior la leen de ahí, sin perfiles NSS.
2 changes: 1 addition & 1 deletion docs/design/panel-de-firma.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ Cada uno tiene su historia en «Flujos/Firma/SigningPanel», salvo que se diga o
| Sin certificados | `NoCertificates` | El selector se queda en su sitio, desactivado y diciendo «Sin certificados»; debajo, «Añadir un certificado…» (primario, el ancho que sobra) y «Volver a buscar» (secundario); el pie deja solo «Firmar», desactivado |
| Sin certificados, con lector | `NoCertificatesWithReader` | La misma forma, con la línea del lector entre el selector desactivado y las salidas |
| Búsqueda fallida | `SearchFailed` | La misma forma, con el error clasificado debajo de las salidas; la caja dice que no se pudo buscar, no que no haya ninguno |
| Lector sin tarjeta, leyendo, tarjeta lista e ilegible | `ReaderWithoutCard`, `ReadingTheCard`, `DnieReady`, `CardReady`, `UnreadableCardOnWindows`, `UnreadableCardOnLinux` | La línea del lector bajo el selector; sin lector (`Ready`), no hay línea. Ilegible, añade la ayuda de la plataforma: Windows Update o la página de la DGP en Windows, OpenSC en Linux. Mientras se lee, los demás certificados se siguen pudiendo elegir |
| Lector sin tarjeta, leyendo, tarjeta lista e ilegible | `ReaderWithoutCard`, `ReadingTheCard`, `DnieReady`, `CardReady`, `UnreadableCardOnWindows`, `UnreadableCardOnMacos`, `UnreadableCardOnLinux` | La línea del lector bajo el selector; sin lector (`Ready`), no hay línea. Ilegible, añade la ayuda de la plataforma: Windows Update o la página de la DGP en Windows, OpenSC o la página de la DGP en macOS, OpenSC en Linux. Mientras se lee, los demás certificados se siguen pudiendo elegir |
| Varios certificados | `SeveralCertificates` | El desplegable los lista todos al abrirse |
| Certificados abiertos | `Open` de «Dominio/Firma/CertificateSelect» | El buscador en lugar de la caja y la lista flotando |
| Firma visible | `VisibleSignature*` | Una página, varias, todas, otra página a la vista y sin colocar |
Expand Down
20 changes: 17 additions & 3 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,11 @@ ffi_allow := "src/signing/adapters/ffi.rs"
# carril de Windows lo mide con `just test-windows` (ADR-0014, ADR-0035).
windows_allow := "src/identity/adapters/windows_store/cng.rs"

# Los adaptadores que solo compila macOS: el carril rapido de Linux los oculta y
# el carril de macOS los mide con `just test-macos` (ADR-0014, ADR-0040).
macos_store_allow := "src/identity/adapters/macos_store"
macos_trust_allow := "src/site/adapters/macos_trust.rs"

autoscript_url := "https://raw.githubusercontent.com/ctt-gob-es/clienteafirma/v" + autofirma_version + "/afirma-ui-miniapplet-deploy/src/main/webapp/js/autoscript.js"

# Librerias -dev del WebView que necesita Tauri; lista canonica que instala
Expand Down Expand Up @@ -402,10 +407,13 @@ smoke-console: build-ts
cd {{ tauri }} && {{ no_debuginfo }} cargo build --features console --bin rfirma --bin rfirma-console
{{ root }}/scripts/console-smoke.sh "$CARGO_TARGET_DIR/debug"

# Pruebas de --lib y del canal local en macOS, sin grada B ni C (ADR-0040).
# Pruebas de --lib y del canal local en macOS, sin grada B ni C, y la puerta CRAP de sus adaptadores (ADR-0040).
[group('ci')]
test-macos: build-ts
cd {{ tauri }} && cargo test --all-features --lib --test channel_client --test channel_operations --test service_acknowledgement
mkdir -p "{{ coverage_out }}/macos"
cd {{ tauri }} && {{ no_debuginfo }} cargo llvm-cov --all-features --lib --test channel_client --test channel_operations --test service_acknowledgement --lcov --output-path "{{ coverage_out }}/macos/lcov.info"
cd {{ tauri }} && cargo crap --path '{{ macos_store_allow }}' --lcov "{{ coverage_out }}/macos/lcov.info" --threshold 30 --fail-above
cd {{ tauri }} && cargo crap --path '{{ macos_trust_allow }}' --lcov "{{ coverage_out }}/macos/lcov.info" --threshold 30 --fail-above

# ---------------------------------------------------------------------------
# CRAP: solo en Rust (ADR-0014)
Expand All @@ -428,7 +436,8 @@ coverage: (certs "install") build-ts llvm-cov-tag
[private]
crap: coverage
cd {{ tauri }} && cargo crap --lcov "{{ coverage_out }}/coverage/lcov.info" --threshold 30 --fail-above \
--allow '{{ ffi_allow }}' --allow '{{ windows_allow }}'
--allow '{{ ffi_allow }}' --allow '{{ windows_allow }}' \
--allow '{{ macos_store_allow }}/**' --allow '{{ macos_trust_allow }}'

# Cobertura del diff contra origin/main (ADR-0014): reutiliza el lcov.info que
# ya dejo `coverage` (dependencia de `check-rust`) en disco, sin volver a
Expand Down Expand Up @@ -608,6 +617,11 @@ bundle: check-native build-ts
exit 1
fi
echo "dmg: $dmg ($(du -h "$dmg" | cut -f1))"
# La actualización que baja el updater: la .app sola, sin firmar aquí (ADR-0015).
rm -f "$salida"/dmg/*.app.tar.gz
archivo="$salida/dmg/$(basename "$dmg" .dmg).app.tar.gz"
COPYFILE_DISABLE=1 tar -czf "$archivo" -C "$salida/macos" rfirma.app
echo "actualizacion: $archivo ($(du -h "$archivo" | cut -f1))"

# Regenera cargo-sources.json y el sello de Cargo.lock.
[group('release')]
Expand Down
2 changes: 1 addition & 1 deletion packaging/flatpak/sources.lock
Original file line number Diff line number Diff line change
@@ -1 +1 @@
dd9acf8e7da3e17ce767cd7430561d6277abce093f7003f29ca5fab6e360134b rfirma-app/src-tauri/Cargo.lock
9520c54cf8146264ea9d8112d3a7cd6cef9d43e9255e24bee8cedd7993e83e11 rfirma-app/src-tauri/Cargo.lock
6 changes: 6 additions & 0 deletions packaging/macos/tauri.macos.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,11 @@
"signingIdentity": "-",
"hardenedRuntime": false
}
},
"plugins": {
"updater": {
"endpoints": ["https://rfirma.sgomez.me/macos/latest.json"],
"pubkey":"dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDQ0RjFGMDhEMEQyMUY4RjkKUldUNStDRU5qZkR4Ukx5VlNSZWR2aGl2VVJlSzhUSEMvZGVrVDBIc09Va01lYzN3Um1sVGdHYnMK"
}
}
}
Loading
Loading