Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
dc3711a
feat(identity): los intentos restantes exactos en el aviso del PIN
sgomez Oct 21, 2026
6a4e829
Merge pull request #2078 from sgomez/agent/developer/issue-2070
sgomez Oct 21, 2026
1517bc7
feat(identity): el DNIe aparece en la lista en macOS, leído con rdnie
sgomez Oct 21, 2026
324e0dc
Merge remote-tracking branch 'origin/agent/developer/spec-2069' into …
sgomez Oct 21, 2026
b1db6cf
chore(flatpak): sello de las fuentes de cargo con rdnie en Cargo.lock
sgomez Oct 21, 2026
f76f6d5
Merge pull request #2079 from sgomez/agent/developer/issue-2071
sgomez Oct 21, 2026
b263281
feat(identity): la línea ilegible de macOS ya no remite a OpenSC ni a…
sgomez Oct 21, 2026
013df1a
Merge pull request #2080 from sgomez/agent/developer/issue-2072
sgomez Oct 21, 2026
71e6dc8
feat(identity): la fusión de copias prefiere la del DNIe a la de un m…
sgomez Oct 21, 2026
013078b
Merge remote-tracking branch 'origin/agent/developer/spec-2069' into …
sgomez Oct 21, 2026
0bd726a
Merge pull request #2081 from sgomez/agent/developer/issue-2073
sgomez Oct 21, 2026
ed418ee
feat(identity): el DNIe firma en macOS con los intentos restantes
sgomez Oct 21, 2026
1204693
Merge remote-tracking branch 'origin/agent/developer/spec-2069' into …
sgomez Oct 21, 2026
49f800b
feat(identity): --debug-info y plantilla de issue del DNIe en macOS
sgomez Oct 21, 2026
8b05d4d
test(identity): MacosToken firma por rdnie la copia del DNIe
sgomez Oct 21, 2026
836ac46
Merge remote-tracking branch 'origin/agent/developer/spec-2069' into …
sgomez Oct 21, 2026
4f63d45
style(identity): las pruebas del DNIe sin avisos de clippy
sgomez Oct 21, 2026
1795127
Merge pull request #2082 from sgomez/agent/developer/issue-2075
sgomez Oct 21, 2026
4d857ee
docs(web): el manual y la web explican el DNIe en macOS y RFIRMA_PKCS…
sgomez Oct 21, 2026
edfc6fe
Merge pull request #2084 from sgomez/agent/developer/issue-2077
sgomez Oct 21, 2026
47db8a0
feat(identity): el DNIe guarda el PIN aceptado mientras dura el login…
sgomez Oct 21, 2026
aa0ef45
Merge remote-tracking branch 'origin/agent/developer/spec-2069' into …
sgomez Oct 21, 2026
b1ffa22
Merge remote-tracking branch 'origin/agent/developer/spec-2069' into …
sgomez Oct 21, 2026
c1af742
Merge pull request #2085 from sgomez/agent/developer/issue-2076
sgomez Oct 21, 2026
68b3d76
Merge pull request #2083 from sgomez/agent/developer/issue-2074
sgomez Oct 21, 2026
f67052e
fix(pr): atiende la revisión de #2086
sgomez Oct 21, 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
24 changes: 24 additions & 0 deletions .github/ISSUE_TEMPLATE/dnie-macos.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
name: El DNIe en macOS
about: El DNIe no aparece o no firma en macOS
title: ''
labels: needs-triage
assignees: ''
---

**No pegues certificados ni datos personales** (nombre, número del documento, número de soporte). Lo que sale de `--debug-info` no los lleva; revisa que lo que pegues tampoco.

## Qué hacías

## Qué pasó

## Entorno

- Versión de rFirma:
- Versión de macOS:
- Lector (marca y modelo):

## Salida de `--debug-info`

```
```
37 changes: 20 additions & 17 deletions docs/design/dialogo-pin.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,28 +121,31 @@ intento, así que no hay salto que evitar.
- **Secreto incorrecto**: el campo toma la clase `error` del tema —el borde que
el escritorio use para eso, sin glifo— y bajo el campo, en negrita, el
mensaje de fallo de la palabra del almacén. Nada más.
- **Intentos restantes**: la tarjeta da el número exacto, como el DNIe por
rdnie en macOS (ADR-0047). Sobre el campo, siempre: «Te quedan N intentos.»;
con uno, «Te queda 1 intento: si el PIN no es correcto, la tarjeta se
bloqueará.». Con uno o dos va en negrita, como el último intento. Con cero
no hay diálogo: termina con el mensaje de PIN bloqueado.
- **Último intento**: la tarjeta declara `CKF_USER_PIN_FINAL_TRY`. Sobre el
campo y en negrita: «Último intento: si el PIN no es correcto, la tarjeta se
bloqueará.» Con el DNIe esa señal solo existe tras un fallo, así que llega en
el diálogo de reintento, junto al mensaje de fallo.
bloqueará.» Con el DNIe por PKCS#11 esa señal solo existe tras un fallo, así
que llega en el diálogo de reintento, junto al mensaje de fallo.
- **Algún intento fallido**: la tarjeta declara `CKF_USER_PIN_COUNT_LOW`. Sobre
el campo, sin negrita: «Ya ha habido algún intento fallido con esta tarjeta.»

Los dos avisos son solo del PIN de una tarjeta; una contraseña no los lleva. Las
señales se vuelven a leer antes de cada diálogo, y una tarjeta que se declara
bloqueada no abre el diálogo: termina con el mensaje de PIN bloqueado
(ADR-0047). La terminal de la línea de órdenes da los mismos avisos antes de
pedir el PIN.

**No hay contador de reintentos, y no es un hueco por rellenar: es estructural**
(ID-191, ADR-0047). La información de token de PKCS#11 no trae los intentos
restantes, ni con una tarjeta real: solo las dos señales de arriba, y los avisos
no enseñan ningún número. Hasta la v0.3 esta ficha prometía enseñar los intentos que
quedaban antes de que la tarjeta se bloquease; el argumento era bueno y el dato
no existe, así que se retiran los dos. Los avisos no lo sustituyen: dicen lo que
la tarjeta declara y no cuentan nada.

Tampoco cruza: `SecretView` no lleva contador, y el ciclo vuelve a pedir el
Los avisos son solo del PIN de una tarjeta; una contraseña no los lleva. Se
vuelven a leer antes de cada diálogo, y una tarjeta que se declara bloqueada no
abre el diálogo: termina con el mensaje de PIN bloqueado (ADR-0047). La
terminal de la línea de órdenes da los mismos avisos antes de pedir el PIN.

**El número solo sale cuando el origen lo da** (ADR-0047). La información de
token de PKCS#11 no trae los intentos restantes, ni con una tarjeta real: solo
las dos señales de arriba, que no enseñan ningún número, y el Almacén de
Windows no deja leer nada. Un número calculado a partir de lo que rFirma ha
visto sería falso en cuanto la tarjeta se usara con otro programa, así que
fuera del DNIe por rdnie no se da.

Tampoco cruza: `SecretView` no lleva el número, y el ciclo vuelve a pedir el
secreto hasta que se acierta, se cancela o la tarjeta se bloquea. Un secreto
rechazado no se reenvía nunca: cada intento es un tecleo nuevo.

Expand Down
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`, `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 |
| 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 en Linux; en macOS, solo el mensaje genérico. 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
2 changes: 1 addition & 1 deletion packaging/flatpak/sources.lock
Original file line number Diff line number Diff line change
@@ -1 +1 @@
ceb2c8bd61e3bee5d942efee22001fbf6e2c4f853cc8ff2567b47f5ba216ae7e rfirma-app/src-tauri/Cargo.lock
5e12a3d773853fbb1a645685ca06c1b757007d1c3509837c70650271fdd86cb3 rfirma-app/src-tauri/Cargo.lock
26 changes: 22 additions & 4 deletions packaging/repo/site/src/content/docs/manual/firmar-un-pdf.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,29 @@ no sale del almacén.
- Con un `.p12`, la contraseña se pide al pulsar **Firmar**.
- Si el almacén no necesita sesión, no se pide nada.
- Si te equivocas, el campo se marca como erróneo y la ventana vuelve a pedirlo.
rFirma no cuenta los intentos que quedan: no los conoce.
Solo con el DNIe en macOS rFirma sabe cuántos intentos quedan y te lo dice antes de
que escribas el PIN.

rFirma no admite todavía las tarjetas criptográficas, entre ellas el DNIe: hoy se firma
con los certificados de los almacenes del sistema, los de los navegadores, los de un
módulo PKCS#11 que ya tengas configurado y los `.p12`.
### El DNIe en macOS

En macOS, rFirma lee el DNIe 3.0 y 4.0 **por contacto**, en un lector de tarjetas,
sin instalar ningún controlador ni programa más. Al meter el DNIe, sus certificados
aparecen en la lista. No funciona por NFC ni con el DNIe 1.0 o 2.0.

El diálogo del PIN dice cuántos intentos te quedan. Si no te queda ninguno, rFirma no
pide el PIN y avisa de que el DNIe está bloqueado: se desbloquea en un punto de
actualización del DNIe.

### Otras tarjetas en macOS

Para firmar con otra tarjeta, instala el módulo PKCS#11 de su fabricante y nómbralo
en la variable de entorno `RFIRMA_PKCS11_MODULE`, con la ruta completa del módulo:

```bash
RFIRMA_PKCS11_MODULE=/ruta/al/modulo-pkcs11.dylib open -a rfirma
```

Sin ella, rFirma solo avisa de que no puede leer esa tarjeta.

## 5. Firmar y encontrar el documento

Expand Down
2 changes: 1 addition & 1 deletion packaging/repo/site/src/i18n/ca.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ export const ca: Dictionary = {
"comparison.pin.rfirma": "Diàleg del sistema i memòria protegida",
"comparison.dnie.label": "Signatura amb DNIe",
"comparison.dnie.autofirma": "Sí, amb jMulticard",
"comparison.dnie.rfirma": "Sí, el detecta en inserir-lo",
"comparison.dnie.rfirma": "Sí, el detecta en inserir-lo, també a macOS",
"comparison.store.label": "Certificats <code>.p12</code>",
"comparison.store.autofirma": "Tries el fitxer en un diàleg",
"comparison.store.rfirma": "Magatzem xifrat propi",
Expand Down
2 changes: 1 addition & 1 deletion packaging/repo/site/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ export const en: Dictionary = {
"comparison.pin.rfirma": "Native dialogue and protected memory",
"comparison.dnie.label": "Signing with your DNIe",
"comparison.dnie.autofirma": "Yes, with jMulticard",
"comparison.dnie.rfirma": "Yes, detected as soon as you insert it",
"comparison.dnie.rfirma": "Yes, detected as soon as you insert it, on macOS too",
"comparison.store.label": "<code>.p12</code> certificates",
"comparison.store.autofirma": "You pick the file in a dialogue",
"comparison.store.rfirma": "Its own encrypted store",
Expand Down
2 changes: 1 addition & 1 deletion packaging/repo/site/src/i18n/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ export const es = {
"comparison.pin.rfirma": "Diálogo nativo y memoria protegida",
"comparison.dnie.label": "Firma con DNIe",
"comparison.dnie.autofirma": "Sí, con jMulticard",
"comparison.dnie.rfirma": "Sí, con autodetección en caliente",
"comparison.dnie.rfirma": "Sí, con autodetección en caliente, también en macOS",
"comparison.store.label": "Certificados <code>.p12</code>",
"comparison.store.autofirma": "Eliges el fichero en un diálogo",
"comparison.store.rfirma": "Almacén cifrado propio",
Expand Down
2 changes: 1 addition & 1 deletion packaging/repo/site/src/i18n/eu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ export const eu: Dictionary = {
"comparison.pin.rfirma": "Sistemaren leihoa eta memoria babestua",
"comparison.dnie.label": "DNIe-arekin sinatzea",
"comparison.dnie.autofirma": "Bai, jMulticard bidez",
"comparison.dnie.rfirma": "Bai, txartela sartu bezain laster antzematen du",
"comparison.dnie.rfirma": "Bai, txartela sartu bezain laster antzematen du, macOS-en ere",
"comparison.store.label": "<code>.p12</code> ziurtagiriak",
"comparison.store.autofirma": "Fitxategia leiho batean aukeratzen duzu",
"comparison.store.rfirma": "Biltegi zifratu propioa",
Expand Down
2 changes: 1 addition & 1 deletion packaging/repo/site/src/i18n/gl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ export const gl: Dictionary = {
"comparison.pin.rfirma": "Diálogo nativo e memoria protexida",
"comparison.dnie.label": "Sinatura co DNIe",
"comparison.dnie.autofirma": "Si, con jMulticard",
"comparison.dnie.rfirma": "Si, con detección automática en quente",
"comparison.dnie.rfirma": "Si, con detección automática en quente, tamén en macOS",
"comparison.store.label": "Certificados en ficheiro <code>.p12</code>",
"comparison.store.autofirma": "Eliges o ficheiro nun diálogo",
"comparison.store.rfirma": "Almacén propio e cifrado",
Expand Down
3 changes: 0 additions & 3 deletions rfirma-app/po/ca.po
Original file line number Diff line number Diff line change
Expand Up @@ -533,9 +533,6 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Instal·la OpenSC perquè l'rFirma la pugui llegir."

msgid "panel.certificate.reader.unreadableHelp.macos"
msgstr "Instal·la OpenSC o el mòdul de la DGP perquè l'rFirma la pugui llegir."

#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Emès per {{issuer}}"
Expand Down
3 changes: 0 additions & 3 deletions rfirma-app/po/en.po
Original file line number Diff line number Diff line change
Expand Up @@ -533,9 +533,6 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Install OpenSC so that rFirma can read it."

msgid "panel.certificate.reader.unreadableHelp.macos"
msgstr "Install OpenSC or the DGP module so that rFirma can read it."

#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Issued by {{issuer}}"
Expand Down
3 changes: 0 additions & 3 deletions rfirma-app/po/es.po
Original file line number Diff line number Diff line change
Expand Up @@ -533,9 +533,6 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Instala OpenSC para que rFirma pueda leerla."

msgid "panel.certificate.reader.unreadableHelp.macos"
msgstr "Instala OpenSC o el módulo de la DGP para que rFirma pueda leerla."

#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Emitido por {{issuer}}"
Expand Down
3 changes: 0 additions & 3 deletions rfirma-app/po/eu.po
Original file line number Diff line number Diff line change
Expand Up @@ -534,9 +534,6 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Instalatu OpenSC rFirmak txartela irakur dezan."

msgid "panel.certificate.reader.unreadableHelp.macos"
msgstr "Instalatu OpenSC edo DGPren modulua rFirmak txartela irakur dezan."

#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Jaulkitzailea: {{issuer}}"
Expand Down
3 changes: 0 additions & 3 deletions rfirma-app/po/gl.po
Original file line number Diff line number Diff line change
Expand Up @@ -531,9 +531,6 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Instala OpenSC para que rFirma poida lela."

msgid "panel.certificate.reader.unreadableHelp.macos"
msgstr "Instala OpenSC ou o módulo da DGP para que rFirma poida lela."

#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Emitido por {{issuer}}"
Expand Down
3 changes: 0 additions & 3 deletions rfirma-app/po/messages.pot
Original file line number Diff line number Diff line change
Expand Up @@ -521,9 +521,6 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr ""

msgid "panel.certificate.reader.unreadableHelp.macos"
msgstr ""

#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr ""
Expand Down
Loading
Loading