Alarme : un code par utilisateur plutôt qu'un code unique par maison

Le besoin

Aujourd’hui, une maison a un code, et un seul. Tout le monde partage le même : les habitants, la personne qui vient arroser les plantes, l’ami à qui on a prêté les clés le temps d’un week-end. Trois conséquences :

  • on ne sait jamais qui a désarmé l’alarme ;
  • retirer l’accès à une personne oblige à changer le code pour tout le monde ;
  • il n’existe aucun moyen de donner un accès limité dans le temps.

Le code devrait appartenir à la personne, pas à la maison — et rester valable quel que soit l’endroit où on le saisit : l’app Gladys, une tablette murale, ou plus tard un clavier physique.

Ce qui est attendu

  • Un code par utilisateur, révocable individuellement.
  • Savoir qui a armé ou désarmé, et pouvoir s’en servir dans une scène ou une notification.
  • Des droits distincts : certains peuvent armer et désarmer, d’autres seulement désarmer.
  • Des codes à durée limitée, pour un accès ponctuel.

À quoi ça ressemblerait

CODES D'ACCÈS                                  + Ajouter un code

Quentin              ••••      Armer · Désarmer          actif
Camille              ••••      Armer · Désarmer          actif
Aide à domicile      ••••      Désarmer         08/09 → 15/09
Ancien locataire     ––––      —                       révoqué

Questions à trancher

  1. Faut-il un compte Gladys pour avoir un code ? Créer un compte complet pour la personne qui vient nourrir le chat une semaine, c’est lourd. Faut-il des codes « invités » sans compte associé ?
  2. Quels droits dès la première version : armer / désarmer suffisent, ou faut-il déjà « peut forcer l’armement », « peut modifier la configuration » ?
  3. Les codes à durée limitée sont-ils dans la première version, ou une suite ?
  4. Longueur imposée ? Deux personnes peuvent-elles avoir le même code (auquel cas on ne sait plus qui c’est) ?
  5. Que devient le code actuel de la maison lors de la mise à jour ? Il faut qu’il continue à fonctionner, sinon on met des installations en défaut.
  6. Que se passe-t-il après plusieurs codes faux ? Gladys limite déjà les essais — faut-il en plus une notification, voire un déclenchement ?
  7. Faut-il un code de contrainte ? Un code qui désarme normalement en apparence mais prévient discrètement — utile si on est forcé d’ouvrir. C’est un classique des centrales, à décider si c’est dans le périmètre.

Complexité et dépendances

Moyenne. Cette demande ne dépend d’aucune autre et peut se faire en parallèle du reste. Elle conditionne en revanche l’arrivée des claviers physiques, qui ont besoin que Gladys sache valider un code.

Demandes liées : les codes par utilisateur sont un prérequis des claviers physiques, et l’identité de la personne qui désarme alimente le contexte des scènes.


Cette demande fait partie d’un ensemble issu de la discussion Système d’alarme Gladys (besoin F08).

Implémentation en cours → feat(alarm): one alarm code per person, hashed with bcrypt by cicoub13 · Pull Request #3105 · GladysAssistant/Gladys · GitHub

Les hypothèses retenues pour cette première version, dans l’ordre des questions ci-dessus :

  1. Codes invités sans compte Gladys : oui. Un admin crée un code pour la personne qui vient nourrir le chat — un nom, un code, une date de fin. Aucun compte à créer.
  2. Droits : aucun droit par code pour l’instant. Tout code valide désarme. Un point s’est éclairci en cours de route : un code ne sert jamais à armer — armer reste l’action d’un utilisateur connecté, d’une scène ou de HomeKit. « Peut forcer l’armement » et « peut modifier la configuration » attendront.
  3. Codes à durée limitée : dans cette version. Le jour choisi est valable en entier ; passée l’échéance, le code est refusé exactement comme un code faux — le clavier ne dit pas à un inconnu que son code a existé.
  4. Longueur : 4 à 8 chiffres, et deux personnes ne peuvent pas avoir le même code. Un code déjà pris est refusé sans jamais dire par qui.
  5. Le code actuel de la maison continue de fonctionner. À la mise à jour il devient un code invité nommé d’après la maison, attribué à personne en particulier : c’était un code partagé, et le mettre dans le profil de quelqu’un aurait permis de le remplacer par mégarde et de couper l’accès à tous les autres. Qui veut en faire son code personnel le révoque et le saisit dans son profil.
  6. Codes faux : comportement actuel conservé. Le déclencheur de scène « trop d’essais de code » reste le seul point d’accroche — libre à chacun d’en faire une notification.
  7. Code de contrainte : hors périmètre de cette version.

Ce que ça change à l’usage :

  • Chacun règle son code depuis sa page de profil. Un code n’est plus jamais lisible : ni par un admin, ni par son propriétaire. On le remplace, on ne le consulte pas.
  • La configuration de l’alarme (délai d’armement, codes d’accès) devient réservée aux admins.
  • Le champ « code de l’alarme » de la fiche maison laisse place à la liste des codes d’accès : titulaire, échéance, révocation.
  • Les scènes savent qui a désarmé, le prénom de la personne ou le nom du code invité, directement utilisable dans une scène (et donc notification).
  • Le clavier des tablettes murales verrouillées ne change pas.
  • Au passage : le code de la maison était stocké en clair et renvoyé par l’API à n’importe quel utilisateur connecté. Les codes sont désormais hachés et ne sortent plus jamais du serveur.

Une image de test est disponible sur cicoub13/gladys:alarm-user-codes

:warning: Une migration de données est appliquée, donc n’utilisez ABSOLUMENT PAS cette image sur votre base de production !!!

Sur la page Paramètres → Maison (uniquement Admin) avec les codes invités

Sur la page Profil de chaque utilisateur

Je pense qu’il y a un souci entre Maison / Utilisateurs / Code. Peut-être qu’il faut ajouter le rattachement d’un utilisateur à une maison, mais j’aimerais en discuter avant.

Quel est le problème ?

Un seul code affecté à un utilisateur désarme toutes les maisons.