rilo
A raposa mascote do Rilo de pé ao lado de um escudo com um cadeado

Vamos ao lado técnico.

Tudo o que a primeira página diz, escrito como aquilo de que foi feito. A base de dados real, como um contacto é mesmo criado, e quem mais toca numa chamada.

Não precisas desta página para usar o Rilo, e nada aqui contradiz a versão mais simples. É o mesmo produto, descrito ao pormenor.

A base de dados inteira

Tudo o que o nosso servidor sabe sobre a tua família.

Isto não é um resumo. São as dezassete tabelas que o servidor tem, com as colunas que têm. Quatro são a tua família: quem são, quem pode agir por uma criança, os telemóveis de onde falam e para onde lhes tocar. Quatro guardam alguma coisa para um telemóvel que estava desligado, e as quatro apagam-se sozinhas. Três dizem respeito a quem pode agir por uma criança e a que telemóvel deixou de ser de confiança. Duas são registos assinados de um fim, um contacto cortado ou alguém que se foi embora. Ficam guardadas para que um telemóvel que esteve sem ligação as possa verificar em vez de acreditar em nós. Uma são números de uso único já gastos, varridos assim que expiram. Uma é a subscrição, e não guarda nada que dê nome a ninguém. Uma é uma denúncia que um adulto nos enviou, e é a única tabela aqui que existe para fazer acontecer alguma coisa. A última não é sobre a tua família de todo.

accounts guardado até o apagares
  • idum hash da chave pública, não um nome
  • public_keya chave do aparelho, que é a conta
  • typeadulto ou criança
  • type_certa assinatura que o prova. Uma conta de criança é assinada por um pai ou uma mãe, por isso não há nenhum sinal para virar
  • created_at
  • last_activea última vez que um dos teus telemóveis disse olá
  • dormant_warned_atvazio
  • consent_sealedo e-mail com que te inscreveste, selado com uma chave que vive em papel com o fundador. Nenhum servidor o consegue ler
  • uncovered_sincevazio, a menos que a tua subscrição tenha deixado de cobrir esta criança — nesse caso o dia em que reparámos, para que o mês antes de algo parar comece aí
A linha da tua conta fica até a apagares, e apagá-la na app leva esta linha e tudo o que está preso a ela. Estamos a trabalhar numa limpeza das famílias que deixaram de usar o Rilo por completo. Até isso estar ligado, nada aqui desaparece sozinho.
server_state guardado
  • keyo que está a ser lembrado
  • valuee o que diz
A única tabela aqui que não é sobre a tua família de todo. Hoje guarda uma só coisa, o momento em que esta versão do servidor arrancou pela primeira vez. Todas as perguntas sobre quem ficou calado são medidas a partir daí, para que uma base de dados escrita antes de podermos saber nunca possa ser lida como meses de silêncio.
guardians guardado
  • account_id
  • guardian_keyuma chave autorizada a agir por esta criança
  • added_at
  • removed_at
A saída é anotada, não apagada. Os contactos são verificados contra quem era responsável quando o contacto foi assinado, para que um pai que deixa a conta não corte em silêncio todas as amizades que alguma vez aprovou.
devices guardado
  • account_id
  • device_keya chave do próprio telemóvel. Uma pessoa pode falar a partir de mais do que um
  • agreement_keya chave com que uma mensagem é selada, para que só esse telemóvel a consiga abrir
  • certa assinatura que deixou entrar este telemóvel, guardada palavra por palavra para que o teu telemóvel a possa verificar em vez de acreditar em nós
  • kindum telemóvel, ou a folha de recuperação impressa
  • added_at
  • removed_at
Os telemóveis e tablets a partir dos quais uma pessoa fala. Diz quantos aparelhos a tua família tem e absolutamente nada sobre com quem falas, tal como as duas tabelas acima dela. Um telemóvel entra por uma assinatura de um aparelho que já está na lista, nunca por nós, e essa assinatura fica guardada aqui para que qualquer telemóvel a possa verificar em vez de acreditar na lista. Reformar um telemóvel marca a linha em vez de a apagar, pela mesma razão por que a saída de um adulto é marcada. Tudo o que ele assinou enquanto era teu tem de continuar verificável.
push_tokens guardado
  • account_id
  • device_keyqual dos teus telemóveis é que este faz tocar
  • platformapns ou fcm
  • tokenum identificador opaco da Apple ou da Google
  • updated_at
Um por aparelho, para que uma chamada consiga fazer tocar um telemóvel adormecido. A notificação não leva nome nem conteúdo.
used_nonces varrido
  • nonce
  • expires_at
Uma lista de números de uso único já gastos, para que um pedido intercetado não possa ser repetido. Apagada assim que expira.
denied_edges varrido
  • edge_hashum hash do par, não das duas pessoas
  • denied_at
  • expires_at
Quando um adulto diz não a uma apresentação, este não fica lembrado durante três dias, para que o telemóvel do outro pai, desligado nessa altura, não a possa completar por acidente. Uma leitura nova entre as mesmas famílias limpa-o mais cedo. Sem nomes, sem chaves. Um hash e duas datas.
pending_grants varrido
  • edge_hashum hash do par, não das duas pessoas
  • grant_recorda permissão que está a ser decidida, e as assinaturas reunidas até agora
  • waiting_keyque assinatura ainda falta
  • requested_byo telemóvel que pediu, para que um telemóvel não possa inundar uma família de perguntas
  • originlido em pessoa, ou um adulto a agir pelo seu filho
  • delivered_toque telemóveis já a têm
  • declaredo nome declarado por quem pergunta, selado para que só a família que ele leu o consiga ler
  • created_at
  • expires_at
Este é o único sítio onde o servidor guarda alguma coisa parecida com um grafo social, e só a guarda enquanto uma apresentação está por terminar. Ninguém respondeu em 72 horas, caduca. Respondida, mas o telemóvel a que se destinava nunca se ligou, 30 dias. Assim que os dois telemóveis têm o contacto terminado, a linha é apagada. É por isso que não há nenhuma tabela de contactos nesta página. Não existe tabela de contactos.
messages apagado na entrega
  • id
  • recipient_ido encaminhamento precisa deste em claro
  • recipient_devicepara qual dos telemóveis dela a caixa está selada. Cada telemóvel tem a sua chave, por isso cada um recebe a sua caixa
  • sender_idpara que o telemóvel saiba que chave a abre
  • sender_devicequal dos telemóveis dele a selou, para que a cópia certa encontre a fechadura certa
  • edge_hasho par, em hash, para que isto não possa ser lido como um mapa de quem fala com quem
  • sealedtexto cifrado. Não há coluna de texto e nunca haverá
  • sent_at
  • expires_at
Um telemóvel passa a maior parte do dia desligado, e uma mensagem que desaparece em silêncio é um produto avariado. Por isso uma caixa selada espera aqui, no máximo 30 dias, e é apagada assim que quem a recebe confirma que a tem. Nós não conseguimos abrir nenhuma.
revocations guardado
  • edge_hasho par, em hash
  • revoked_at
  • recordo registo assinado, para que um telemóvel que esteve sem ligação possa verificar o corte por si mesmo em vez de acreditar na nossa palavra
A única coisa que guardamos indefinidamente. Regista que um contacto foi cortado sem ser uma lista legível de quem conhecia quem.
roster_changes guardado
  • id
  • account_idde quem é a lista de telemóveis e de adultos que está a mudar
  • kinda entrar, ou a ser retirado
  • subject_keyo telemóvel ou o adulto de que se trata
  • subject_kindqual dos dois
  • agreement_keya segunda chave de que um telemóvel precisa, vazia para o papel
  • recorda própria assinatura, guardada palavra por palavra para que um telemóvel a possa verificar em vez de acreditar em nós
  • signed_byque chave a assinou
  • by_authorityse foi uma folha de recuperação a assinar, que é o que a põe à espera
  • issued_ato momento que quem assina afirma, nunca o nosso relógio
  • reasonvazio, a não ser que quem assina tenha escrito uma
  • proposed_at
  • effective_atquando se torna verdade, duas noites depois de ter sido proposta
  • contested_at
  • contested_byquem se opôs, e a assinatura com que se opôs
  • contest_record
  • resolved_at
  • resolutionaplicada ou cancelada, assim que se resolve
As duas noites entre alguém assinar uma alteração aos adultos de uma criança e essa alteração ser verdade. Um telemóvel a entrar numa família, ou um a ser posto fora, espera aqui, onde todos os outros telemóveis da conta o conseguem ver e contestar. A linha fica depois de se resolver, porque um telemóvel que estava desligado tem de conseguir verificar o que aconteceu em vez de acreditar na nossa palavra. Contém a conta e as chaves envolvidas, o que é mais do que quase todas as tabelas daqui.
roster_change_votes guardado
  • change_idque alteração à espera
  • voter_keyque adulto
  • decisiondeixar passar, ou travar
  • recorda assinatura dele
  • at
Uma linha por adulto em vez de uma contagem. A maioria dos adultos de uma criança pode acabar mais cedo com a espera de duas noites, e se há maioria é uma coisa que tem de voltar a ser perguntada contra os adultos que existem agora. Quem saiu não é um voto, e um contador não saberia disso.
device_revocations guardado
  • account_idde quem era o telemóvel
  • device_keya chave que foi roubada
  • revoked_at
  • recorda prova assinada, para que um telemóvel a possa verificar sem nos perguntar
Um telemóvel roubado, e a diferença entre isto e reformar um. Reformar quer dizer que ele deixa de poder agir daqui para a frente, que é a resposta certa para um telemóvel que alguém substituiu. Isto quer dizer desconfiar de tudo o que ele alguma vez assinou, coisa que os outros telemóveis têm de conseguir verificar sem nos perguntar. Só o roubo ganha uma linha.
retirements guardado
  • account_ida conta que já não está cá
  • retired_at
  • recorda prova assinada, feita com a chave da própria conta antes de a chave ser destruída
Uma lista de ausências, e a boa notícia é a segunda coluna. Quando alguém deixa o Rilo, os telemóveis dos amigos recebem uma assinatura feita com a chave dessa pessoa. Uma família fica a saber que alguém se foi embora por uma prova, e não porque o dizemos. Nada que possamos dizer por nossa conta consegue tirar uma cara do ecrã do teu filho. É a única tabela aqui sem ligação de volta a uma conta, porque tem de sobreviver àquela de que fala.
entitlements guardado
  • account_id
  • storeapple, google, ou por conta da casa
  • store_refum identificador opaco da loja. É a única coisa que nos deixa fazer-lhe uma pergunta mais tarde
  • store_ref_hashuma impressão digital do identificador acima. É o que impede um recibo de cobrir duas contas
  • environment
  • stateactive, grace, lapsed, lapsed_trial ou disabled
  • seatsquantas crianças cobre. Um número, nunca os nomes delas
  • expires_at
  • acts_at
  • updated_at
Nada aqui identifica uma pessoa. Sem conta de loja, sem Apple ID, sem conta Google, sem nome, sem e-mail, sem cartão. Que crianças é que um pagamento cobre é calculado a partir da tabela dos responsáveis quando alguém pergunta, e nunca fica escrito.
roster_notices varrido
  • device_keyo telemóvel a quem ainda não foi dito
  • change_idde que alteração se trata
  • whatproposta, contestada ou resolvida
  • account_idde quem é a lista de telemóveis que mudou. Quando se avisa um adulto sobre o seu filho, aqui vai o filho
  • subject_keyo telemóvel que foi acrescentado ou retirado
  • effective_at
  • created_at
  • expires_at
  • delivered_atquando conseguimos dizê-lo, ou vazio porque ainda não conseguimos
Uma fila, e a razão por que acrescentar ou retirar um telemóvel acontece em voz alta. Todos os telemóveis da família ficam a saber, e no caso de uma criança também todos os adultos responsáveis por ela, incluindo o telemóvel que acabou de ser retirado. É assim que alguém que não devia tê-lo descobre que reparaste. Um aviso não contém nada que a própria alteração não contenha, e é apagado quando expira, tenhamos conseguido entregá-lo ou não.
reports guardado
  • id
  • about_keysobre quem é a denúncia. Legível, para que alguém possa agir
  • reasonqual das seis coisas aconteceu, tal como o adulto que denuncia a escolheu
  • csa
  • sealedo que foi escrito, selado no telemóvel que a enviou com uma chave que está em papel com o fundador. Nenhum servidor o consegue ler
  • sealed_digestuma impressão digital da parte selada, para que o que for aberto mais tarde seja comprovadamente o que chegou
  • received_at
  • edge_snapshotquem tinha autorização para chegar a quem, e que adulto o permitiu, tal como estava naquele momento. Isto não pode ser reconstruído depois
  • reporter_keyquem a enviou, ou nada de nada quando foi enviada sem nome
  • source
  • sealed_key
  • receipta referência que quem envia fica a guardar. É a única maneira de podermos responder a alguém sobre uma denúncia que não conseguimos abrir
  • acknowledged_at
  • decided_at
  • actioned_at
  • escalated_at
  • decided_by
  • outcome
A única tabela aqui que existe para fazer acontecer alguma coisa. A maior parte de uma denúncia está selada no telemóvel que a enviou e nós não a conseguimos abrir. O que fica legível é sobre quem ela é, porque uma denúncia sobre a qual ninguém pode agir não protege nada. Sobrevive à conta de que fala. De outro modo, qualquer pessoa se podia apagar de uma. Não tem gravação nenhuma de nenhuma chamada, nem aqui nem em lado nenhum, porque nunca se faz nenhuma.

Colunas que não existem

  • e-mail
  • nome
  • idade
  • foto
  • texto das mensagens
  • conteúdo das chamadas
  • histórico de chamadas
  • lista de contactos
  • localização
  • modelo do aparelho

O teu e-mail é verificado uma vez quando te inscreves e selado no mesmo gesto, com uma chave que vive em papel com o fundador e que nunca tocou num servidor. A lei pede-nos que consigamos provar que um adulto concordou. Nós próprios não o conseguiríamos voltar a ler. Os nomes e as fotos são definidos em cada telemóvel e entregues diretamente ao outro telemóvel. Nunca chegam até nós, que é também por isso que podes mudar o nome do avô para “Vô” e nós nunca saberemos. Não conseguiríamos mostrar nada disto a ninguém mesmo que quiséssemos, e também não nos podem obrigar.

Esta secção é gerada a partir do próprio esquema do servidor, em accounts.ts e roster-changes.ts, os dois ficheiros que criam a base de dados. Se alguma vez discordarem, os ficheiros é que estão certos e esta página é que tem um erro.

Contactos

Como é que um contacto é mesmo criado.

O telemóvel de alguém faz um convite de uso único. O outro telemóvel lê-o, de um ecrã na mesma sala ou abrindo um link que esse adulto enviou. Lê-lo começa a apresentação e, no mesmo momento, regista a chave pública do outro telemóvel, para que os dois telemóveis saibam exatamente que chave pertence a que pessoa daí em diante. É essa a parte que torna impossível alguém sentar-se no meio de uma chamada mais tarde, nós incluídos. Nada disto se liga enquanto um adulto do outro lado não disser que sim.

Continua a não ser um contacto. Um adulto responsável tem de assinar o contacto no seu próprio telemóvel, atrás de uma verificação biométrica feita nesse momento. O que ele assina é a coisa toda. Quem, com quem e em que direção. É a assinatura dele que o servidor verifica antes de encaminhar seja o que for. O servidor não guarda nenhuma chave capaz de assinar, por isso não consegue criar um contacto, e quem roubar a base de dados também não.

Quando os dois telemóveis têm o contacto terminado, a linha é apagada e o contacto passa a existir só nos dois aparelhos. Cortá-lo mais tarde escreve uma revogação assinada, que é o único registo guardado indefinidamente. Fica gravada como um hash do par, por isso diz que um contacto acabou sem dizer quem conhecia quem.

Quem mais está envolvido

Três empresas tocam numa chamada. Nenhuma delas a consegue ouvir.

Outras seis empresas tocam no serviço, e estão todas na política de privacidade. Três delas ajudam a fazer tocar uma chamada, e isto é o que cada uma dessas três consegue e não consegue ver.

  • Apple & Google

    As notificações push, para que uma chamada faça tocar um telemóvel adormecido. Inevitáveis nas duas plataformas. Levam um identificador opaco e mais nada. Sem nome, sem número, sem conteúdo.

  • Cloudflare

    Mais ou menos uma chamada em cada seis não consegue ligar os dois telemóveis diretamente, no Wi-Fi de um hotel ou em algumas redes móveis, e é desviada por um retransmissor. O retransmissor reencaminha pacotes cifrados que não consegue abrir, mas vê que dois identificadores anónimos estiveram ligados, quando, durante quanto tempo e a partir de que endereços. São metadados que não guardamos, na mão de outra pessoa.

  • Nós

    A tabela acima. Um servidor pequeno nos Países Baixos que apresenta dois telemóveis um ao outro e depois sai da frente.