rilo
Le renard Rilo debout à côté d’un bouclier orné d’un cadenas

Passons à la technique.

Tout ce que dit la page d’accueil, écrit sous la forme de ce qui le fonde : la vraie base de données, la façon dont un contact se crée réellement, et qui d’autre touche un appel.

Vous n’avez pas besoin de cette page pour utiliser Rilo, et rien ici ne contredit la version simple. C’est le même produit, décrit précisément.

Toute la base de données

Tout ce que notre serveur sait de votre famille.

Pas un résumé. Voici les dix-sept tables du serveur, avec les colonnes qu’elles ont. Quatre concernent votre famille : qui elles sont, qui peut agir pour un enfant, les téléphones depuis lesquels elles parlent, et où les joindre. Quatre gardent quelque chose pour un téléphone qui était éteint, et toutes les quatre s’effacent d’elles-mêmes. Trois portent sur qui peut agir pour un enfant et sur le téléphone qui a cessé d’être digne de confiance. Deux sont des traces signées d’une fin : un contact coupé, ou quelqu’un parti. Elles sont conservées pour qu’un téléphone qui était hors ligne puisse les vérifier plutôt que nous croire. Une contient des numéros à usage unique déjà dépensés, balayés à leur expiration. Une est l’abonnement, et elle ne contient rien qui nomme qui que ce soit. Une est un signalement qu’un adulte nous a envoyé, et c’est la seule table ici qui existe pour faire arriver quelque chose. La dernière ne concerne pas votre famille du tout.

accounts conservé jusqu’à ce que vous le supprimiez
  • idune empreinte de la clé publique, pas un nom
  • public_keyla clé de l’appareil, qui est le compte
  • typeadulte ou enfant
  • type_certla signature qui le prouve. Un compte enfant est signé par un parent, il n’y a donc aucun indicateur à retourner
  • created_at
  • last_activela dernière fois qu’un de vos téléphones a dit bonjour
  • dormant_warned_atvide
  • consent_sealedvotre e-mail d’inscription, scellé avec une clé qui vit sur papier chez le fondateur. Aucun serveur ne peut le lire
  • uncovered_sincevide, sauf si votre abonnement ne couvre plus cet enfant — alors le jour où nous l'avons remarqué, pour que le mois avant tout arrêt commence là
Votre compte reste jusqu’à ce que vous le supprimiez, et le supprimer dans l’application emporte cette ligne et tout ce qui s’y rattache. Nous préparons un nettoyage des familles qui n’utilisent plus Rilo du tout. Tant que ce n’est pas activé, rien ne disparaît ici tout seul.
server_state conservé
  • keyce dont il se souvient
  • valueet ce que cela dit
La seule table ici qui ne parle pas du tout de votre famille. Aujourd’hui elle contient une seule chose : le moment où cette version du serveur a démarré pour la première fois. Toute question sur qui s’est tu se mesure à partir de là, pour qu’une base écrite avant que nous puissions le savoir ne soit jamais lue comme des mois de silence.
guardians conservé
  • account_id
  • guardian_keyune clé autorisée à agir pour cet enfant
  • added_at
  • removed_at
Le retrait est noté, pas effacé. Les contacts sont vérifiés d’après les personnes qui étaient responsables au moment de la signature, pour qu’un parent qui quitte le compte ne coupe pas silencieusement toutes les amitiés qu’il a approuvées.
devices conservé
  • account_id
  • device_keyla clé propre d’un téléphone. On peut parler depuis plusieurs appareils
  • agreement_keyla clé à laquelle un message est scellé, pour que seul ce téléphone puisse l’ouvrir
  • certla signature qui a admis ce téléphone, conservée mot pour mot pour que votre téléphone puisse la vérifier au lieu de nous croire
  • kindun téléphone, ou la feuille de récupération imprimée
  • added_at
  • removed_at
Les téléphones et tablettes depuis lesquels une personne parle. Cela dit combien d’appareils votre famille possède et absolument rien sur les personnes à qui vous parlez, pas plus que les deux tables au-dessus. Un téléphone est admis par la signature d’un appareil déjà sur la liste, jamais par nous, et cette signature est conservée ici pour que n’importe quel téléphone puisse la vérifier au lieu de croire la liste. Retirer un téléphone marque la ligne au lieu de l’effacer, pour la même raison que le départ d’un adulte est marqué : tout ce qu’il a signé quand il était à vous doit rester vérifiable.
push_tokens conservé
  • account_id
  • device_keylequel de vos téléphones celui-ci fait sonner
  • platformapns ou fcm
  • tokenun identifiant opaque fourni par Apple ou Google
  • updated_at
Un par appareil, pour qu’un appel puisse faire sonner un téléphone en veille. La notification ne contient ni nom ni contenu.
used_nonces purgé
  • nonce
  • expires_at
La liste des nombres à usage unique déjà dépensés, pour qu’une requête interceptée ne puisse pas être rejouée. Effacée à expiration.
denied_edges purgé
  • edge_hashune empreinte de la paire, pas des deux personnes
  • denied_at
  • expires_at
Quand un adulte dit non à une présentation, ce non est retenu trois jours, pour que le téléphone de l’autre parent, éteint à ce moment-là, ne puisse pas la conclure par accident. Un nouveau scan entre les mêmes familles l’efface plus tôt. Pas de noms, pas de clés : un hachage et deux dates.
pending_grants purgé
  • edge_hashune empreinte de la paire, pas des deux personnes
  • grant_recordl’autorisation en cours de décision, et les signatures recueillies jusqu’ici
  • waiting_keyla signature qui manque encore
  • requested_byle téléphone qui a demandé, pour qu’un seul téléphone ne puisse pas inonder une famille de questions
  • originscanné en personne, ou un parent agissant pour son enfant
  • delivered_toles téléphones qui l’ont déjà
  • declaredle nom que la partie demandeuse se donne, scellé pour que seule la famille scannée puisse le lire
  • created_at
  • expires_at
C’est le seul endroit où le serveur détient quelque chose qui ressemble à un graphe social, et il ne le détient que tant qu’une mise en relation est inachevée. Personne n’a répondu en 72 heures : elle expire. Réponse donnée mais le téléphone concerné n’est jamais revenu en ligne : 30 jours. Dès que les deux téléphones ont le contact terminé, la ligne est supprimée. C’est pourquoi il n’y a pas de table de contacts sur cette page. Il n’y a pas de table de contacts.
messages effacé à la remise
  • id
  • recipient_idl’acheminement a besoin de celui-ci en clair
  • recipient_devicepour lequel de leurs téléphones la boîte est scellée. Chaque téléphone a sa propre clé, donc chacun reçoit sa propre boîte
  • sender_idpour que le téléphone sache avec quelle clé l’ouvrir
  • sender_devicelequel de leurs téléphones l’a scellé, pour que la bonne copie trouve la bonne serrure
  • edge_hashla paire, hachée, pour que ceci ne se lise pas comme une carte de qui parle à qui
  • sealeddu texte chiffré. Il n’y a pas de colonne de texte et il n’y en aura jamais
  • sent_at
  • expires_at
Un téléphone est éteint la majeure partie de la journée, et un message qui disparaît en silence est un produit cassé. Une boîte scellée attend donc ici : 30 jours au maximum, et effacée dès que le destinataire confirme l’avoir reçue. Nous ne pouvons en ouvrir aucune.
revocations conservé
  • edge_hashla paire, hachée
  • revoked_at
  • recordl’enregistrement signé, pour qu’un téléphone hors ligne puisse vérifier la coupure lui-même au lieu de nous croire sur parole
La seule chose que nous gardons indéfiniment. Elle enregistre qu’un contact a été coupé, sans constituer une liste lisible de qui connaissait qui.
roster_changes conservé
  • id
  • account_idquelle liste de téléphones et d’adultes change
  • kindarrivée, ou retrait
  • subject_keyle téléphone ou l’adulte concerné
  • subject_kindlequel des deux
  • agreement_keyla deuxième clé qu’un téléphone doit avoir, vide pour le papier
  • recordla signature elle-même, gardée mot pour mot pour qu’un téléphone la vérifie au lieu de nous croire
  • signed_byquelle clé l’a signée
  • by_authoritysi une feuille de récupération l’a signée, ce qui est la raison de l’attente
  • issued_atle moment que le signataire indique, jamais notre horloge
  • reasonvide, sauf si le signataire en a écrit une
  • proposed_at
  • effective_atquand cela devient vrai, deux nuits après la proposition
  • contested_at
  • contested_byqui s’y est opposé, et avec quelle signature
  • contest_record
  • resolved_at
  • resolutionappliqué ou annulé, une fois réglé
Les deux nuits entre le moment où quelqu’un signe un changement d’adultes pour un enfant et le moment où ce changement devient vrai. Un téléphone qui rejoint une famille, ou un téléphone qu’on écarte, attend ici, là où tous les autres téléphones du compte le voient et peuvent s’y opposer. La ligne reste après le règlement, parce qu’un téléphone qui était éteint doit pouvoir vérifier ce qui s’est passé plutôt que nous croire sur parole. Elle contient le compte et les clés concernées, ce qui est plus que la plupart des tables ici.
roster_change_votes conservé
  • change_idquel changement en attente
  • voter_keyquel adulte
  • decisionlaisser passer, ou arrêter
  • recordsa signature
  • at
Une ligne par adulte plutôt qu’un compteur. Une majorité des adultes d’un enfant peut abréger l’attente de deux nuits, et la question de la majorité doit être reposée face aux adultes qu’il y a maintenant. Quelqu’un qui est parti n’est pas une voix, et un compteur ne saurait pas le dire.
device_revocations conservé
  • account_idà qui appartenait le téléphone
  • device_keyla clé qui a été volée
  • revoked_at
  • recordla preuve signée, pour qu’un téléphone la vérifie sans nous le demander
Un téléphone volé, et la différence entre cela et la mise hors service d’un téléphone. Mettre hors service veut dire qu’il ne peut plus agir à partir de maintenant, ce qui est la bonne réponse pour un téléphone que quelqu’un a remplacé. Ceci veut dire : se méfier de tout ce qu’il a jamais signé, ce que les autres téléphones doivent pouvoir vérifier sans nous le demander. Seul un vol donne une ligne.
retirements conservé
  • account_idle compte qui a disparu
  • retired_at
  • recordla preuve signée, faite avec la clé propre de ce compte avant que cette clé soit détruite
Une liste d’absences, et la bonne nouvelle est la deuxième colonne. Quand quelqu’un quitte Rilo, les téléphones de ses amis reçoivent une signature faite avec la clé propre de cette personne. Une famille apprend donc qu’il manque quelqu’un par une preuve, et non parce que nous le disons. Rien que nous puissions dire de nous-mêmes ne peut retirer un visage de l’écran de votre enfant. C’est la seule table ici sans lien vers un compte, parce qu’elle doit survivre à celui dont elle parle.
entitlements conservé
  • account_id
  • storeapple, google, ou offert
  • store_refune référence opaque fournie par le store. C’est la seule chose qui nous permet de lui poser une question plus tard
  • store_ref_hashune empreinte de la référence ci-dessus. C’est ce qui empêche un même achat de couvrir deux comptes
  • environment
  • stateactive, grace, lapsed, lapsed_trial ou disabled
  • seatsle nombre d’enfants couverts. Un nombre, jamais leurs noms
  • expires_at
  • acts_at
  • updated_at
Rien ici n’identifie une personne : pas de compte store, pas d’identifiant Apple, pas de compte Google, pas de nom, pas d’e-mail, pas de carte. Les enfants couverts par un paiement sont déduits de la table des responsables au moment de la question, et jamais consignés.
roster_notices purgé
  • device_keyle téléphone qui n’a pas encore été prévenu
  • change_idde quel changement il s’agit
  • whatproposé, contesté ou réglé
  • account_idà qui appartient la liste de téléphones qui a changé. Quand un adulte est prévenu au sujet de son enfant, c’est l’enfant
  • subject_keyle téléphone qui a été ajouté ou retiré
  • effective_at
  • created_at
  • expires_at
  • delivered_atquand nous avons réussi à le dire, ou vide parce que ce n’est pas encore fait
Une file d’attente, et la raison pour laquelle ajouter ou retirer un téléphone se fait à voix haute. Tous les téléphones de la famille l’apprennent, et pour un enfant tous les adultes qui en sont responsables aussi, y compris le téléphone qui vient d’être retiré. C’est ainsi que quelqu’un qui ne devrait pas l’avoir découvre que vous l’avez remarqué. Un avis ne contient rien de plus que le changement lui-même, et il est supprimé à son expiration, que nous ayons réussi à le remettre ou non.
reports conservé
  • id
  • about_keyde qui parle le signalement. Lisible, pour que quelqu’un puisse agir
  • reasonlequel des six cas s’est produit, tel que l’adulte qui signale l’a choisi
  • csa
  • sealedce qui a été écrit, scellé sur le téléphone qui l’envoie avec une clé qui repose sur papier chez le fondateur. Aucun serveur ne peut le lire
  • sealed_digestune empreinte de la partie scellée, pour prouver que ce qui sera ouvert est bien ce qui est arrivé
  • received_at
  • edge_snapshotqui avait le droit de joindre qui, et quel adulte l’avait permis, tel que c’était à cet instant. Cela ne peut pas être reconstitué plus tard
  • reporter_keyqui l’a envoyé, ou rien du tout lorsqu’il a été envoyé sans nom
  • source
  • sealed_key
  • receiptla référence que garde l’expéditeur. C’est le seul moyen de répondre à quelqu’un au sujet d’un signalement que nous ne pouvons pas ouvrir
  • acknowledged_at
  • decided_at
  • actioned_at
  • escalated_at
  • decided_by
  • outcome
La seule table ici qui existe pour provoquer quelque chose. L’essentiel d’un signalement est scellé sur le téléphone qui l’a envoyé et nous ne pouvons pas l’ouvrir. Ce qui reste lisible, c’est de qui il parle, car un signalement sur lequel personne ne peut agir n’est pas une protection. Il survit au compte dont il parle. Sinon, n’importe qui pourrait s’en effacer. Il ne contient aucun enregistrement d’appel, ni ici ni ailleurs, car il n’en est jamais fait.

Colonnes qui n’existent pas

  • e-mail
  • nom
  • âge
  • photo
  • texte des messages
  • contenu des appels
  • historique d’appels
  • liste de contacts
  • localisation
  • modèle d’appareil

Votre e-mail est vérifié une fois à l’inscription puis scellé dans le même mouvement, avec une clé qui vit sur papier chez le fondateur et n’a jamais touché un serveur. La loi nous demande de pouvoir prouver qu’un adulte a consenti. Nous ne pourrions pas le relire même si nous le voulions. Les noms et les photos se règlent sur chaque téléphone et passent directement à l’autre téléphone. Ils ne nous parviennent jamais, et c’est aussi pour cela que vous pouvez renommer grand-père « Papy » sans que nous le sachions jamais. Nous ne pourrions rien montrer de tout cela à personne, même si nous le voulions, et on ne pourrait pas nous y contraindre.

Cette section est générée à partir du schéma du serveur lui-même, dans accounts.ts et roster-changes.ts, les deux fichiers qui créent la base de données. En cas de désaccord, ce sont les fichiers qui ont raison et cette page qui est en tort.

Contacts

Comment un contact se crée réellement.

Le téléphone de quelqu’un fabrique une invitation à usage unique. L’autre téléphone la lit, scannée sur un écran dans la même pièce ou ouverte depuis un lien envoyé par cet adulte. Cette lecture lance la mise en relation et, dans le même mouvement, enregistre la clé publique de l’autre téléphone, si bien que les deux appareils savent dès lors exactement quelle clé appartient à quelle personne. C’est ce qui empêche quiconque de s’installer plus tard au milieu d’un appel, nous compris. Rien n’est mis en relation avant qu’un adulte de l’autre côté ait dit oui.

Toujours pas de contact. Un adulte responsable doit signer le contact sur son propre téléphone, derrière une vérification biométrique faite à cet instant. Ce qui est signé, c’est l’ensemble. Qui, avec qui, et dans quel sens. C’est cette signature que le serveur vérifie avant d’acheminer quoi que ce soit. Le serveur ne détient aucune clé capable de signer. Il ne peut donc pas créer un contact, et celui qui volerait la base ne le pourrait pas davantage.

Quand les deux téléphones détiennent le contact terminé, la ligne est supprimée et le contact n’existe plus que sur les deux appareils. Le couper plus tard écrit une révocation signée, la seule chose conservée indéfiniment. Elle est stockée sous forme d’empreinte de la paire, et elle dit donc qu’un contact a pris fin sans dire qui connaissait qui.

Qui d’autre intervient

Trois entreprises touchent un appel. Aucune ne peut l’entendre.

Six autres entreprises touchent au service, et la politique de confidentialité les nomme. Trois d’entre elles interviennent pour qu’un appel sonne. Voici ce que chacune de ces trois peut et ne peut pas voir.

  • Apple & Google

    Les notifications push, pour qu’un appel fasse sonner un téléphone en veille. Inévitables sur les deux plateformes. Elles transportent un identifiant opaque et rien d’autre. Pas de nom, pas de numéro, pas de contenu.

  • Cloudflare

    Environ un appel sur six ne parvient pas à relier les deux téléphones directement, sur le Wi-Fi d’un hôtel ou sur certains réseaux mobiles, et passe par un relais. Le relais transmet des paquets chiffrés qu’il ne peut pas ouvrir, mais il voit que deux identifiants anonymes ont été mis en relation, quand, pendant combien de temps et depuis quelles adresses. Ce sont des métadonnées que nous ne gardons pas, détenues par quelqu’un d’autre.

  • Nous

    Le tableau ci-dessus. Un petit serveur aux Pays-Bas qui présente deux téléphones l’un à l’autre, puis s’efface.