macOS en la práctica
Lo que hay que implementar, lo que hay que probar y las cinco incidencias que van a llegar. El cierre operativo del llavero de macOS.
Lo que se implementa
Las cuatro operaciones del nivel 34.1, cada una con su caso incómodo:
// guardar — actualiza si ya existe con el mismo servicio y cuentapub fn guardar(cuenta: &str, secreto: &str) -> Result<(), Error> { Entry::new(SERVICIO, cuenta)?.set_password(secreto)?; Ok(())}// leer — tres resultados, no dospub fn leer(cuenta: &str) -> Result<Option<String>, Error> { match Entry::new(SERVICIO, cuenta)?.get_password() { Ok(s) => Ok(Some(s)), Err(keyring::Error::NoEntry) => Ok(None), // normal: primera vez, o borrado Err(e) if es_denegado(&e) => Ok(None), // el usuario dijo que no: igual que ausente Err(e) => Err(e.into()), // esto sí es un fallo }}// borrar — al cerrar sesión, y tolerando que no estépub fn borrar(cuenta: &str) -> Result<(), Error> { match Entry::new(SERVICIO, cuenta)?.delete_credential() { Ok(()) | Err(keyring::Error::NoEntry) => Ok(()), Err(e) => Err(e.into()), }}Las dos decisiones del fragmento son las que importan: que leer devuelva tres resultados y no dos, y que denegado se trate como ausente. Con eso, el camino de «no hay secreto» está escrito una sola vez y sirve para las tres razones por las que puede no haberlo.
Lo que se prueba
No lo obvio —guardar y leer funciona siempre en la máquina de quien lo escribe— sino lo que se rompe:
La tercera fila es la que más se olvida y no es del llavero: un secreto guardado puede haber dejado de valer. Si tu aplicación no borra el testigo cuando el servidor lo rechaza, el usuario entra en un ciclo de intentos fallidos con un secreto muerto que nadie limpia.
Las cinco incidencias, por su descripción
Lo que un usuario escribe, y qué es en realidad:
| lo que dice el usuario | qué es |
|---|---|
| «me pide permiso para acceder a mi contraseña» | la identidad cambió · nivel 35.3 |
| «me lo pide cada vez que abro la app» | pulsó «permitir» en vez de «permitir siempre» · nivel 35.2 |
| «después de actualizar tengo que iniciar sesión otra vez» | la identidad cambió y no hubo migración |
| «mi contraseña vieja vuelve» | otro llavero con el mismo servicio y cuenta · nivel 35.1 |
| «en mi otro Mac no está» | no hay sincronización con el llavero clásico · nivel 35.4 |
Las cinco se diagnostican con dos preguntas: ¿ha actualizado la aplicación hace poco? y ¿cuántas entradas de tu servicio hay en su aplicación de llaveros? Con eso se cierra la mayoría sin pedir registros.
Lo que se traslada y lo que no
Antes de Windows, qué de todo esto sobrevive:
- Se traslada: la forma de las cuatro operaciones, los tres resultados de leer, el diseño de identificadores, que el secreto no cruza el puente, y que un secreto guardado puede haber caducado.
- No se traslada: el diálogo, la lista de acceso por elemento y la identidad de firma. Windows no comprueba quién pregunta más allá del usuario — y eso lo hace más silencioso y más permisivo a la vez, que es el tema del nivel 36.