fix: la app renueva sola el permiso de paso de Anubis #19
Loading…
Reference in a new issue
No description provided.
Delete branch "HBB:fix/anubis-clearance-refresh"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Las instancias protegidas por Anubis (entre ellas bookwyrm.social) emiten al iniciar sesión la cookie
techaro.lol-anubis-auth, que caduca a los pocos días mientras quesessioniddura un año. Cuando caduca, la instancia responde a cada petición con un 307 hacia su reto y llega la página HTML «Making sure you're not a bot!». Gson, configurado como lenient, la lee como una cadena suelta y Retrofit falla conExpected BEGIN_OBJECT but was STRING at line 1 column 1 path $. En la interfaz aparece como un error de la pantalla en la que estuviera el usuario: lo más habitual es «error al cargar los detalles» al abrir un libro desde una estantería, que no apunta a ningún sitio útil.La sesión sigue siendo válida: lo único caducado es el permiso de paso. Hasta ahora la única salida era cerrar sesión y volver a entrar, y nada en el mensaje lo sugiere.
Ahora los dos clientes HTTP reconocen el reto —tanto la redirección como haber acabado ya dentro de él— y lo resuelven en un WebView invisible. El reto es JavaScript, así que lo ejecuta el propio motor y no hay que reimplementar el protocolo de Anubis; el WebView además comparte el almacén de cookies con el del login, y usa el mismo User-Agent, que es a quien Anubis emite la cookie. La cookie recién emitida se propaga al tarro de OkHttp y a la sesión guardada, y la petición se repite una sola vez. Si no se consigue renovar, se deja pasar la respuesta y falla como antes.
Un
Mutexserializa las renovaciones: varias peticiones fallando a la vez provocan una sola resolución, y las demás reutilizan la cookie ya obtenida.Verificado en un dispositivo real invalidando el permiso de paso sin tocar la sesión: la app obtuvo una cookie nueva por su cuenta en unos segundos, la guardó y siguió funcionando sin volver a iniciar sesión. Se añaden 8 pruebas unitarias sobre el reconocimiento del reto y la lectura de la cookie.
Queda fuera a propósito: no se comprueba al arrancar si el permiso ya ha caducado. La primera petición tras la caducidad paga los pocos segundos de la renovación y se repite sola, así que comprobarlo antes solo ahorraría esa espera una vez por semana.
Pull request closed