Le service OP des "opérations" d'accès à la base
Spécifications Fonctionnelles Détaillées du service OP des opérations de mise à jour / consultation de la base de données et du storage des fichiers.
Concepts structurants : espaces, comptes, GC
Espaces
Une base de données / service OP, héberge plusieurs espaces étanches entre eux. Un espace est identifié par org
, un code d’organisation.
Tous les documents comportent:
- soit une colonne / attribut
id
de la formeorg@idd
identifiant unique du document, où:org
est le code de l’organisation détentrice du document: ce code préfixe donc toutes les id.idd
est l’identifiant du document dans son organisation.- pour les documents
espaces
etsyntheses
, l’id est simplementorg
.
- soit un couple de colonnes / attributs
id / ids
identifiant un sous-documentids
d’un documentid
.
Les documents
espaces syntheses
ont par convention un string vide une id de document (ce sont des singletons pour une organisation donnée).
Tous les autres documents ont une colonne / propriété
id
de document string NON vide, et le cas échéant une colonne / propriétéids
string NON vide.
Code organisation attaché à un espace
A la déclaration d’un espace, l’administrateur technique du site déclare un code organisation:
- ce code ne peut plus changer: lors d’une exportation d’un espace on peut définir un autre code d’espace pour la cible de l’importation.
- le Storage de fichiers comporte un folder racine portant ce code d’organisation ce qui partitionne le stockage de fichiers.
- les connexions aux comptes citent ce code organisation.
Comptes
L’administrateur technique N’A PAS de compte
Il a pour rôle majeur de gérer les espaces:
- les créer / les détruire,
- définir leurs quotas à disposition du Comptable de chaque espace: il existe trois quotas,
qn
: nombre maximal autorisé des notes, chats, participations aux groupes,qv
: volume total autorisé des fichiers attachés aux notes.qc
: quota de calcul mensuel total en unités monétaires.
- ces quotas sont indicatifs sans blocage opérationnel et servent de prévention à un crash technique pour excès de consommation de ressources.
Ses autres rôles fonctionnels sont :
- la gestion d’une notification / blocage par espace,
- soit pour information technique importante,
- soit pour figer un espace avant sa migration vers un autre (ou sa destruction).
- l’export de la base d’un espace vers une autre,
- l’export des fichiers d’un espace d’un Storage à un autre.
- il peut lire pour chaque espace un fichier CSV relevé mensuel de consommation des comptes (mais sans leur ID) pour comparer ses coûts d’hébergement et ce qu’a reçu le Comptable.
LE Comptable de chaque espace
Pour chaque espace, il existe un compte d’id 300000000000
qui est le Comptable de l’espace.
Comptes standard
Il existe deux catégories de comptes:
- les comptes “O”, de l’organisation, bénéficient de ressources gratuites attribuées par la Comptable et ses délégués. En contrepartie de cette gratuité un compte “O” peut être bloqué par le Comptable et ses délégués (par exemple en cas départ de l’organisation).
- les comptes “A”, autonomes, achètent des ressources sous la forme d’un abonnement et d’une consommation. Tant qu’il est créditeur un compte “A” ne peut pas être bloqué.
Les abonnements et consommations sont exprimées in fine en unité monétaire virtuelle, le centime (c), dont l’ordre de grandeur est voisin d’un centime d’euro ou de dollar (le cours exact étant fixé par chaque organisation).
Comptes “O” : partitions
Le Comptable dispose des quotas globaux de l’espace attribués par l’administrateur technique.
- Il définit un certain nombre de partitions de quotas.
- Il confie la gestion de chaque partition à des comptes délégués qui peuvent distribuer des quotas de ressources aux comptes “O” affectés à leur partition.
Un compte “O”,
- est attaché à un instant donné, à une seule partition: ses quotas
qc q1 q2
sont prélevés sur ceux de sa partition. - est créé par sponsoring,
- soit d’un compte “O” existant délégué,
- soit du Comptable qui a choisi de quelle partition il relève.
Les comptes “0” délégués d’une partition peuvent:
- sponsoriser la création de nouveaux comptes “O”, délégués eux-mêmes ou non de cette partition.
- gérer la répartition des quotas entre les comptes “O” attachés à cette partition.
- gérer une notification / blocage pour les comptes “O” attachés à leur partition.
Comptes “A”
Un compte “A” est créé par sponsoring,
- soit d’un compte “A” existant qui à cette occasion fait un don au compte sponsorisé d’un montant de son choix prélevé sur son solde monétaire.
- soit par un compte “O” délégué ou par le Comptable: un don de bienvenue peut aussi être effectué.
Un compte “A” définit lui-même ses quotas qn
et qv
(il les paye en tant qu’abonnement) et n’a pas de quotas qc
(il paye sa consommation).
Rôles du Comptable
Le rôle principal d’un Comptable est,
- de partitionner les quotas globaux attribuables aux comptes “O” et d’ajuster les quotas de chaque partition,
- de désigner les délégués de chaque partition, le cas échéant de retirer ou d’ajouter la qualité de délégué a un compte “O” de la partition.
- de changer un compte “O” de partition.
- de gérer des notifications / blocages s’appliquant à des comptes “O” spécifiques ou à tous les comptes d’une partition.
- d’enregistrer les paiements des comptes.
- de sponsoriser directement la création de nouveaux comptes.
Le Comptable est un compte “O” qui:
- ne peut pas se résilier lui-même,
- ne peut pas changer de partition de quotas, il est rattaché à la première partition de son espace qui ne peut pas être supprimée.
- ne peut pas supprimer son propre attribut délégué,
- accepte l’ouverture de chats avec n’importe quel compte “O” ou “A” qui en prend l’initiative.
GC garbage collector**
C’est un traitement de nettoyage qui est lancé une fois par jour. Il a plusieurs fonctionnalités techniques:
- suppression de rows / documents obsolètes,
- détection des comptes à détruire par inutilisation,
- détection des groupes non hébergés depuis un certain temps et suppression de ceux-ci,
- nettoyage des fichiers fantômes sur Storage,
- calcul de rapports / archivages mensuels pouvant conduire à purger des données vivantes de la base.
C’est un service externe de CRON qui envoie journellement une requête de GC à une instance de service OP.
Base de données accédée par le service OP
L’organisation diffère entre bases SQL (SQLite, PostgrSQL ultérieurement) et NOSQL (Firestore).
- SQL - Les données sont distribuées dans des tables
espaces avatars versions notes ...
contenant des rows, chacun ayant plusieurs colonnes. - NOSQL - Chaque table SQL correspond à une collection de documents, chaque document est équivalent à un row de la table SQL de même nom que la collection.
Les colonnes d’une table SQL correspondent aux attributs / propriétés d’un document.
- en SQL la clé primaire est une colonne
id
ou un couple de colonnesid / ids
, - en Firestore le path d’un document contient cette propriété
id
ou couple de propriétésid / ids
.
Attributs des tables / documents
Ils sont listés dans un objet de configuration:
static _attrs = {
espaces: ['id', 'v', 'dpt', '_data_'],
fpurges: ['id', '_data_'],
partitions: ['id', 'v', '_data_'],
syntheses: ['id', 'v', '_data_'],
comptes: ['id', 'v', 'hk', '_data_'],
comptis: ['id', 'v', '_data_'],
invits: ['id', 'v', '_data_'],
comptas: ['id', 'v', 'dlv', '_data_'],
versions: ['id', 'v', 'dlv'],
avatars: ['id', 'v', 'vcv', 'hk', '_data_'],
notes: ['id', 'ids', 'v', '_data_'],
transferts: ['id', 'dlv', '_data_'],
sponsorings: ['id', 'ids', 'v', 'dlv', 'hk', '_data_'],
chats: ['id', 'ids', 'v', '_data_'],
tickets: ['id', 'ids', 'v', 'dlv', '_data_'],
groupes: ['id', 'v', 'dfh', '_data_'],
membres: ['id', 'ids', 'v', '_data_'],
chatgrs: ['id', 'ids', 'v', '_data_']
}
Remarques
id
ethk
sont préfixés parorg
en base (org@id
etorg@hk
). Pourespaces
etsyntheses
simplement c’estorg
(id
étant vide).hk
: clés d’accès externes, hash de phrase secrète ou de contact / sponsoring.ids
sont des clés secondaires relatives à la clé majeureid
.v vcv
: sont des entiers, numéros de versions en séquence continue croissante.dpt dlv dfh
: sont entiers représentant des datesaaaammjj
(20250301
)._data_
: sont des objets Javascript sérialisés contenant les données du documents, dont ses attributs externalisés ci-avant.versions
n’a pas de_data_
en base, celui-ci étant reconstruit à la lecture de ses attributs externes{id, v, dlv}
.
Cryptage en base
Les attributs _data_
sont toujours cryptés en base, ce n’est pas optionnel.
Les autres attributs sont externalisés de data,
- soit parce que servant de clé primaire ou de path d’accès (
id ids
), - soit parce que servant de clé alternative d’accès (
hk
), - soit parce que nécessaire comme valeur de filtrage (
v vcv dpt dlv dfh
).
Pour chaque choix d’un site:
org
peut être crypté ou non.id
peut être crypté ou non.ids
peut être crypté ou non.
Le cryptage de
org@id
estcorg@cid
, les deux termesorg
/id
étant ou non cryptés séparément encorg
/cid
.
Les attributs v vcv dpt dlv dfh
ne sont PAS cryptés, étant utilisés par comparaison d’ordre et pas seulement d’égalité. L’utilisation d’un cryptage respectant l’ordre (OPE: Order Preserving Encryption) ne semble pas pertinent en raison du faible nombre de valeurs possibles.
Aucun meta-lien n’est accessible à la lecture d’une base cryptée, les codes des organisations hébergés comme les id des comptes / avatars / groupes … étant également obfusqués.
Tables / collections techniques de nettoyage du Storage
L’écriture et la suppression de fichiers du Storage ne sont pas soumises à la gestion transactionnelle du commit de la base. En conséquence, elles peuvent être,
- marqués dans la base comme en écriture sur Storage, puis une fois vraiment écrits, enregistrés comme tels dans la base. Mais si un problème technique intervient au mauvais moment, ils peuvent ne pas être marqués écrits dans la base et être cependant présents dans le Storage: il faut périodiquement nettoyer ces fichiers fantômes dont l’upload n’a pas été enregistré en base. C’est l’objet des documents
transferts
. - considérés comme logiquement détruits dans la base, mais n’ayant pas encore été physiquement purgés du Storage. Il faudra, un jour, achever d’effectuer ces purges physiques du Storage. C’est l’objet des documents
fpurges
.
Documents transferts
id
:-
dlv
: _data_
: sérialisation de:id
:avgrid + '_' + idf
,avgrid
: id de l’avatar / groupe propriétaire du fichier.idf
: identifiant du fichier.dlv
: date-limite de validité, lendemain du jour d’écriture (début de l’upload).
Ces documents ne sont jamais mis à jour une fois créés, ils sont supprimés,
- en général quasi instantanément dès que l’upload est physiquement terminé,
- sinon par le GC qui considère qu’un upload ne peut pas techniquement être encore en cours à j+2 de son jour de début.
Documents fpurges
-
id
: id aléatoire générée à la création, -
_data_
: liste encodée,avgrid
d’un avatar ou d’un groupe, correspondant à un folder du Storage à supprimer,lidf
: array des idf des fichiers à purger.
Ces documents ne sont jamais mis à jour une fois créés, ils sont supprimés par le prochain GC après qu’il ait purgé du Storage tous les fichiers cités dans data.
Table / documents entête d’un espace: espaces syntheses
Pour un espace donné, A
, ce sont des singletons:
espaces
:id
est un string vide. Contient les données de l’espace.syntheses
:id
est est un string vide. Le document contient des données statistiques sur la distribution des quotas aux comptes “O” (par partition) et l’utilisation de ceux-ci.
Leur clé d’accès en base est donc
org
, leur organisation.
Tables / collections majeures : partitions comptes comptis invits comptas avatars groupes
Chaque collection a un document par id
(clé primaire en SQL, second terme du path en Firestore).
partitions
Un document par partition de quotas décrivant la distribution des quotas entre les comptes “O” attachés à cette partition.
id
est un id aléatoire2...
.- Clé primaire :
org@2...
. Path :partitions/org@2...
comptes
Un document par compte donnant les clés majeures du compte, la liste de ses avatars et des groupes auxquels un de ses avatars participe. id
, le numéro du compte, est un string aléatoire commençant par 3
:
300000000000
: pour le Comptable.3...
: pour les autres comptes.- Clé primaire :
org@3...
. Path :comptes/org@3...
comptis
Un document complémentaire de comptes
(même id
) qui donne des commentaires et hashtags attachés par le comptes aux avatars et groupes de sa connaissance.
invits
Un document complémentaire de comptes
(même id
) qui donne la liste des invitations aux groupes pour les avatars du compte et en attente d’acceptation ou de refus.
comptas
Un document complémentaire de comptes
(même id
) donnant ses compteurs de consommation et les quotas.
avatars
Un document par avatar donnant les informations d’entête d’un avatar.
id
est un string aléatoire commençant par 3
- Clé primaire :
org@3...
. Path :comptes/org@3...
avatars/org@3...
groupes
Un document par groupe donnant les informations d’entête d’un groupe.
id
est un string aléatoire commençant par 4
.
- Clé primaire :
org@4...
. Path :groupes/org@4...
Tables / sous-collections d’un avatar ou d’un groupe
- chaque avatar a 4 sous-collections de documents:
notes sponsorings chats tickets
(seul l’avatar Comptable a des tickets). - chaque groupe a 3 sous-collections de documents:
notes membres chatgrs
.
Dans chaque sous-collection, ids
est un identifiant relatif à id
.
- en SQL les clés primaires sont
org@id ids
- en Firestore les paths sont (par exemple pour la sous-collection
notes
) :versions/org@id/notes/ids
,id
est le second terme du path,ids
le quatrième.
notes
Un document représente une note d’un avatar ou d’un groupe. L’identifiant relatif ids
est un string aléatoire.
sponsorings
Un document représente un sponsoring d’un avatar. Son identifiant relatif ids
est hash de la phrase de sponsoring entre le sponsor et son sponsorisé. ids
est dédoublé en hk
afin d’être utilisé comme clé alternative d’accès.
chats
Un chat entre 2 avatars I et E se traduit en deux documents :
- l’un sous-document de I a pour identifiant secondaire
ids
un string aléatoire. - l’autre sous-document de E a pour identifiant secondaire
ids
un string aléatoire. - chacun des deux chats a connaissance de
id / ids
de l’autre.
membres
Un document par membre avatar participant à un groupe. L’identifiant secondaire ids
est l’indice membre 1..N
, ordre d’enregistrement dans le groupe.
chatgrs
Un seul document par groupe. id
est celui du groupe et ids
vaut toujours 1
.
tickets
Un document par ticket de crédit généré par un compte A. ids
est un nombre aléatoire tel qu’il puisse s’éditer sous forme d’un code à 6 lettres majuscules (de 1 à 308,915,776).
Phrases secrètes et clés de cryptage
Phrases
Phrase de création du comptable
- CC : PBKDF de la phrase complète - hCC son hash.
- CR : PBKDF d’un extrait de la phrase - hCR son hash.
Phrase secrète d’accès à un compte
- XC : PBKDF de la phrase complète - hXC son hash.
- XR : PBKDF d’un extrait de la phrase - hXR son hash.
Phrase de sponsoring
- YC : PBKDF de la phrase complète - hYC son hash
- YR : PBKDF d’un extrait de la phrase - hYR son hash.
Phrase de contact d’un avatar
- ZC : PBKDF de la phrase complète - hZC son hash.
- ZR : PBKDF d’un extrait de la phrase - hZR son hash.
Clés
S : clé du site
Elle est fixée dans la configuration de déploiement des services OP et PUBSUB par l’administrateur technique.
- elle crypte a minima les data des documents (voir ci-avant), c’est à dire l’ensemble des propriétés d’un document.
E : clé d’un espace
- attribuée à la création de l’espace par l’administrateur.
- clé partagée entre l’administrateur et le Comptable de l’espace.
- crypte les rapports générés par le GC de ce fait lisibles pour l’administrateur et le Comptable.
K : clé principale d’un compte.
- attribuée à la création du compte par
AccepterSponsoring
ouCreerEspace
pour le Comptable. - propriété exclusive du compte.
- crypte ses notes et d’autres clés.
A : clé d’un avatar
- attribuée à la création de l’avatar (du compte pour l’avatar principal).
- crypte les photo et texte de sa carte de visite.
- crypte la clé G d’un groupe auquel l’avatar est invité.
C : clé d’un chat
- attribuée aléatoirement à la création du chat.
- crypte les textes du chat.
G : clé d’un groupe
- attribuée à la création du groupe.
- crypte les photo et texte de sa carte de visite, ses notes, les textes du chat du groupe.
- crypte les clés A des membres du groupe.
P : clé d’une partition
- attribuée à la création de la partition par le Comptable et à la création de l’espace pour la partition primitive.
- crypte les textes des notifications de la partition et les clés A des avatars principaux des comptes de la partition.
Clé RSA d’un avatar
La clé de cryptage (publique) et celle de décryptage (privée) sont de longueurs différentes.
Le résultat d’un cryptage a une longueur fixe de 256 bytes. Deux cryptages RSA avec la même clé d’un même texte donnent deux valeurs cryptées différentes.
Chaque avatar a un couple de clés privée / publique:
- la clé privée est stockée cryptée par la clé K du compte dans le document
avatars
et pour l’avatar principal seulement elle est redondée dans le documentcomptes
. - la clé publique est stockée en clair dans le document
avatars
.
Documents stockant les clés, phrases et hash de phrases
espaces
cleES
: clé E cryptée par la clé S.
comptes
hXC
: hash du PBKDF de la phrase secrète complète.hk
:hXR
hash du PBKDF d’un extrait de la phrase secrète.cleKXC
: clé K cryptée par XC.cleEK
: Comptable seulement. Clé E cryptée par sa clé K.privK
: clé privée RSA de son avatar principal cryptée par la clé K du compte.cleAK
: pour chaque avatar du compte: clé A de l’avatar cryptée par la clé K du compte.cleGK
: pour chaque groupe où un avatar est actif: clé G du groupe cryptée par la clé K du compte.- Comptes “O” seulement:
clePK
: clé P de la partition cryptée par la clé K du compte. Toutefois si cette clé a une longueur de 256, la clé P peut être décryptée parprivK
, ayant été cryptée par la clé publique de l’avatar principal du compte suite à une affectation à une partition APRÈS sa création (changement de partition, passage de compte A à O).
invits
cleGA
: pour chaque groupe où l’avatar est invité.
avatars
cleAZC
: clé A cryptée par ZC.pcK
: phrase de contact cryptée par la clé K du compte.hZC
: hash du PBKDF de la phrase de contact complète.hk
:hZR
hash du PBKDF d’un extrait de la phrase de contact.pub privK
: couple des clés publique / privée RSA de l’avatar.
sponsorings
ids
:hYR
hash du PBKDF de la phrase secrète réduite.hk
: redondance de ids permettant un cryptage en baseorg@id
.pspK
: phrase de sponsoring cryptée par la clé K du sponsor.YCK
: PBKDF de la phrase de sponsoring cryptée par la clé K du sponsor.hYC
: hash du PBKDF de la phrase de sponsoring,cleAYC
: clé A du sponsor crypté par le PBKDF de la phrase de sponsoring.clePYC
: clé P de la partition (si c’est un compte “O”) cryptée par le PBKDF de la phrase de sponsoring.
chats
cleCKP
: clé C du chat cryptée,- si elle a une longueur inférieure à 256 bytes par la clé K du compte de I.
- sinon cryptée par la clé RSA publique de I.
cleEC
: clé A de l’avatar E cryptée par la clé du chat.
Périmètre d’un compte
Le périmètre d’un compte délimite un certain nombre de documents:
- un compte n’a la visibilité dans l’application Web que des documents de son périmètre.
- la plupart d’entre eux sont synchronisés: une session d’un compte reçoit des avis de changement (pas le contenu) de ces documents qui permettent à l’opération
Sync
de tirer les contenus des documents ayant changé.
Documents synchronisés du périmètre
- 1 espace : racine et seul document de son sous-arbre, un document
espaces
. - 1 compte : ce sous-arbre identifié par l’id du compte comporte trois documents:
comptes comptis invits
. - N avatars: il y un sous-arbre avatar par avatar du compte. Le sous-arbre est identifié par l’id de l’avatar racine et comporte les documents
avatars notes sponsorings chats tickets
- N groupes: il y un sous-arbres groupe par groupe dans lequel un des avatars du compte est actif. Le sous-arbre est identifié par l’id du groupe racine et comporte les documents
groupes notes membres chatgrs
Documents NON synchronisés du périmètre
Ces documents ne sont pas utiles à jour en permanence dans une session. Ils sont lus à la demande en fonction de la phase de dialogue en cours dans la session.
syntheses
: id vide (singleton pour l’espaceorg
du compte).partitions
: pour un compte “O”, LE document dont l’ID est donnée paridp
ducomptes
.- Seule une session du Comptable peut accéder, successivement, à tous les documents
partitions
de son espace.
- Seule une session du Comptable peut accéder, successivement, à tous les documents
comptas
identifié par l’id du compte.- Le Comptable pour tous les comptes, les délégués pour les comptes de leurs partitions, peuvent accéder successivement aux
comptas
des autres comptes. - tout compte peut accéder à sa
comptas
.
- Le Comptable pour tous les comptes, les délégués pour les comptes de leurs partitions, peuvent accéder successivement aux
Les documents d’un périmètre sont sujet à des évolutions en cours de session suite aux effets des opérations soumises au serveur,
- soit par la session elle-même,
- soit par n’importe quelle autre,
- du même compte ou de n’importe quel autre,
- marginalement par le GC.
- les changements sont notifiés par PUBSUB aux sessions UI quand ils concernent des documents synchronises du périmètre courant des comptes.
Disponibilité dans l’application Web
Une session connectée à un compte dispose en mémoire de tous les documents synchronisés de son compte:
- chargement initial en début de session,
- puis à réception des avis de changements, rechargement incrémental sélectif des documents ayant changé.
Avis de changements des avatars
et groupes
: document versions
Un document versions
trace une mise à jour, un changement de version d’un document ou plusieurs documents d’UN sous-arbre d’un avatar ou d’un groupe:
- (A) un ou plusieurs documents d’UN sous-arbre avatar:
avatars
et ses sous-documentsnotes sponsorings chats tickets
.- l’id du document
versions
est l’id du documentavatars
racine du sous-arbre.
- l’id du document
- (G) un ou plusieurs documents d’UN sous-arbre groupe:
groupes
et ses sous-documentsnotes membres chatgrs
.- l’id du document
versions
est l’id du documentgroupes
racine du sous-arbre.
- l’id du document
Exemple
- mise à jour d’un chat #5 de l’avatar #13;
- le numéro de version associé au sous-arbre A#13 est incrémenté et passe par exemple de 123 à 124;
- le chat #5 prend pour version 124;
- si une session UI était synchronisée pour l’avatar #13 sur la version 112 par exemple, elle va obtenir tous les sous-documents de cet avatar (lui même inclus) de versions supérieure à 112 -qui ont donc changé depuis 112-. Désormais la session sera synchronisée sur la version 126 (la plus récente) pour cet avatar #13.
- elle n’a pas reçu les très nombreux sous-documents ayant une version antérieure à 112 (n’ayant donc pas changé par rapport à l’état connu en mémoire).
Tracking des créations et mises à jour
Remarque: il n’y a pas à proprement parlé de suppressions:
- un document
sponsorings
a une date limite de validité: le document est logiquement supprimé dès que cette date est dépassée. - un document
notes
peut être vide, n’a plus de contenu et n’apparaît plus dans les vues, mais son document existe toujours en zombi.
Les documents devenus inutiles parce que non référencés par personne sont purgés, physiquement détruits.
Les documents versions
sont chargés du tracking des mises à jour des sous-documents de avatars
et de groupes
. Propriétés:
id
: ID du groupe ou de l’avatar du document.v
: version, incrémentée de 1 à chaque mise à jour, soit du document maître, soit de ses sous-documentsnotes sponsorings chats tickets membres chatgrs
dlv
: jour de suppression de l’avatar ou du groupe (considérés comme zombi)
Remarque: Afin d’éviter de conserver pour toujours la trace de très vielles suppressions, le GC lit les
versions
supprimées depuis plus de N mois (filtre surdlv
) pour les purger. Les sessions ont toutes eu le temps d’intégrer les disparitions correspondantes.
La constante IDBOBS / IDBOBSGC
de api.mjs
donne le nombre de jours de validité d’une micro base locale IDB sans resynchronisation. Celle-ci devient obsolète (à supprimer avant connexion) IDBOBS
jours après sa dernière synchronisation. Ceci s’applique à tous les espaces avec la même valeur.
Les documents
versions
sont purgés par le GCIDBOBSGC
jours après leur jour de suppressiondlv
.
Détail des tables / collections majeures et leurs sous-collections
Ce sont les documents faisant partie d’un périmètre d’un compte: partitions comptes comptas comptis invits avatars groupes notes sponsorings chats tickets membres chatgrs versions
En base de données, les colonnes / propriétés suivantes sont lisibles:
id
: l’ID du document précédée duns
de l’espace.ids
: pour les sous-documents leur ID secondaireids
précédée duns
de l’espace.v
: la version du document.- quelques propriétés devant être indexées, spécifiquement quand elles existent dans la classe du document:
hk
: la propriétéhk
du document précédée duns
de l’espace.vcv dlv dfh dpt
: valeur de la propriété correspondante du document.
_data_
: sérialisation cryptée des propriétés du document.
_data_
Tous les documents, ont en base une propriété _data_
qui porte toutes les informations sérialisées du document. _data_
est crypté:
- en base centrale par la clé du site qui a été générée par l’administrateur technique et qu’il conserve en lieu protégé comme quelques autres données sensibles (token d’autorisation d’API, identifiants d’accès aux comptes d’hébergement …).
- en base locale par la clé K du compte.
- pour
versions
, le data est reconstruit depuis les 3 propriétés externes { id, v, dlv } ce qui évite de stocker un attribut data en base.
Lors de la lecture des documents par l’opération Sync
, le data d’un document est sérialisé et transmis en retour de la requête POST en HTTPS. Par défaut, toutes les propriétés sont transmises. Toutefois, selon la classe du document et le compte concerné, certaines propriétés non transmises en session sont omises dans la sérialisation du data qui remonte en session.
id
et ids
quand il existe
Ces propriétés sont externalisées et font partie de la clé primaire (en SQL) ou du path (en Firestore).
Pour un sponsorings
la propriété hk
est le hash de la phrase de reconnaissance :
- elle est indexée.
- en Firestore l’index est
collection_group
afin de rendre un sponsorings accessible par index sans connaître son parent le sponsor.
v
: version d’un document
La version de 1..n est incrémentée de 1 à chaque mise à jour,
- soit de son document lui-même:
espaces syntheses partitions comptas
, - soit du document
versions
de leurs sous-collections.avatars notes sponsorings chats tickets
groupes chatgrs notes membres
dlv
d’un transferts
Elle permet au GC de détecter les transferts en échec et de nettoyer le storage.
- en Firestore l’index est
collection_group
afin de s’appliquer aux fichiers des notes de tous les avatars et groupe.
dlv
d’un comptas
La dlv
d’un compte désigne le dernier jour de validité du compte:
- c’est le dernier jour d’un mois.
- cas particulier: quand c’est le premier jour d’un mois, la
dlv
réelle est le dernier jour du mois précédent. Dans ce cas elle représente la date de fin de validité fixée par l’administrateur pour l’ensemble des comptes “O”. En gros il a un financement des frais d’hébergement pour les comptes de l’organisation jusqu’à cette date (par défaut la fin du siècle).
La dlv
d’un compte est inscrite dans le document comptas
du compte: elle est externalisée pour que le GC puisse récupérer tous les comptes obsolètes à détruire.
dlv
d’un sponsorings
- jour au-delà duquel le sponsoring n’est plus applicable ni pertinent à conserver. Les sessions suppriment automatiquement à la connexion les sponsorings ayant dépassé leur
dlv
. - dès dépassement du jour de
dlv
, un sponsorings est purgé (du moins peut l’être). - elles sont indexées pour que le GC puisse purger les sponsorings. En Firestore l’index est
collection_group
afin de s’appliquer aux sponsorings de tous les avatars.
vcv
: version de la carte de visite. avatars
Cette propriété est la version v
du document au moment de la dernière mise à jour de la carte de visite: elle est indexée afin de pouvoir filter un avatar et n’accéder à son contenu que si la version de sa carte de visite est plus récente que celle déjà détenue en session UI.
dfh
: date de fin d’hébergement. groupes
La date de fin d’hébergement sur un groupe permet de détecter le jour où le groupe sera considéré comme disparu. A dépassement de la dfh
d’un groupe, le GC fait disparaître le groupe inscrivant une dlv
du jour dans son document versions
.
hk
: hash d’un extrait de la phrase de contact. avatars
Cette propriété de avatars
est indexée de manière à pouvoir accéder à un avatar en connaissant sa phrase de contact. En base la propriété est précédée du ns
de l’espace.
hk
: hash d’un extrait de la phrase secrète. comptes
Cette propriété de comptes
est indexée de manière à pouvoir accéder à un compte en connaissant le hXR
issu de sa phrase secrète. En base la propriété est précédée du ns
de l’espace.
Mémoires caches globale d’une instance de service et de chaque opération
Cache locale des espaces partitions comptes comptis invits comptas avatars groupes versions
dans une instance du service OP
Ces instances ont une mémoire cache des documents compilés:
comptes
accédés pour vérifier si les listes des avatars et groupes du compte ont changé.comptis
accédés pour avoir les commentaires et hashtags attachés à ses avatars et groupes par un compte.invits
accédé pour avoir les invitations en attente pour un compte.comptas
accédés à chaque changement de volume ou du nombre de notes / chats / participations aux groupes.versions
accédés par l’opérationSync
.avatars groupes partitions
également fréquemment accédés.
Les conserver en cache par leur id
est une solution naturelle: mais il peut y avoir plusieurs instances s’exécutant en parallèle.
- Il faut en conséquence interroger la base pour savoir s’il y a une version postérieure et ne pas la charger si ce n’est pas le cas en utilisant un filtrage par
v
. - Ce filtrage se faisant sur l’index n’est pas décompté comme une lecture de document quand le document n’a pas été trouvé parce que de version déjà connue.
La mémoire cache est gérée par LRU (tous types de documents confondus) afin de limiter sa taille en mémoire.
Classe GD
: Gestionnaire de Documents
Les bases NOSQL (Firestore, DynamoDB, CosmoDB) ont des contraintes vis à vis de la mise à jour transactionnelle (ACID).
Firestore a un concept de transaction marqué par begin / commit mais aucune lecture de document ne peut être effectuée après la première écriture dans une transaction. Bref les écritures doivent être exécutées en un batch à la fin de la transaction.
CosmoDB et DynamoDB n’assurent la propriété ACID que dans un batch d’updates et se protègent de mises à jour concurrentes (update / delete):
- CosmoDB: en vérifiant que la propriété
Etag
d’un document mis à jour est bien la même que celle du même document avant mise à jour / suppression. - DynamoDB: en ayant un filtre conditionnel sur la valeur d’une propriété.
GD
va en conséquence:
- accumuler les insert / update / delete et demander au provider courant le
bulkUpdates
de celles-ci en une fois. - pour chaque document mis à jour, conserve la propriété
_vav
(version avant) du document ce qui est équivalent auEtga
de CosmoDB et peut servir de filtre pour DynamoDB.
Un objet gestionnaire de document instance de la classe GD
est en charge de gérer une mémoire cache des documents lus et modifiés au cours d’une opération:
- chaque demande d’un document le lit de la base s’il n’est pas trouvé dans cette cache et l’y inscrit.
- chaque modification d’un document est une modification de l’exemplaire en cache, marqué mis à jour.
- à la fin de l’opération,
- tous les documents créés / mis à jour sont mis à jour en base. La propriété
_vav
(version avant) était disponible dans le document lu avant sa mise à jour. - les documents majeurs mis à jour sont retournés pour mise à jour à la cache de l’instance de service (avec contrôle de la croissance de leur version).
- tous les documents créés / mis à jour sont mis à jour en base. La propriété
Ce protocole n’est pas contraignant, plutôt une facilité, par rapport à un usage classique, typiquement avec une base relationnelle.
Clés et identifiants
Le hash SHA256
Son résultat fait 32 bytes. Il est rapide à calculer. Il est utilisé par hash court (voir ci-dessous).
Le hash PBKDF
Son résultat fait 32 bytes. Long à calculer, son algorithme ne le rend pas susceptible d’être accéléré par usage de CPU graphiques. Il est considéré comme incassable par force brute.
Les clés AES
Ce sont des bytes de longueur 32. Un texte crypté a une longueur variable :
- quand le cryptage est spécifié libre le premier byte du texte crypté est le numéro du salt choisi au hasard dans une liste pré-compilée : un texte donné ‘AAA’ ne donnera donc pas le même texte crypté à chaque fois ce qui empêche de pouvoir tester l’égalité de deux textes cryptés au vu de leurs valeurs cryptées.
- quand le cryptage est fixe le numéro de salt est 1 : l’égalité de valeurs cryptées traduit l’égalité de leur valeurs sources.
Les clés RSA
La clé de cryptage (publique) et celle de décryptage (privée) sont de longueurs différentes.
Le résultat d’un cryptage a une longueur fixe de 256 bytes. Deux cryptages RSA avec la même clé d’un même texte donnent deux valeurs cryptées différentes.
Le cryptage / décryptage est long et le texte à crypter doit avoir une longueur maximale de 256 bytes.
Hash court
Le hash court d’un bytes (ou d’un string) est un hash SHA256, replié sur 9 bytes et encodé en base64 où les caractères +
et /
sont replacés par 0
et 1
(les signes =
sont supprimés).
Le résultat est un string de 12 signes 0-9 a-z A-Z
.
Un entier sur 53 bits est intègre en Javascript
Le maximum 9,007,199,254,740,991 fait 16 chiffres décimaux si le premier n’est pas 9. Il peut être issu de 6 bytes aléatoires.
Dates et date-heures
Les date-heures sont exprimées en millisecondes depuis le 1/1/1970, un entier intègre en Javascript (ce serait d’ailleurs aussi le cas pour une date-heure en micro-seconde).
Les dates sont exprimées en aaaammjj
sur un entier (géré par la class AMJ
). Ce sont des dates UTC, mais elles peuvent s’afficher en date locale.
Clés des documents
Les clés sont des 32 bytes aléatoires dont le premier byte est surchargé à:
1
pour une clé d’espace,2
pour une clé de partition,3
pour une clé d’avatar,4
pour une clé de groupe.
Exception pour le Comptable: sa clé est formée d’un byte à 3 et de 31 bytes à 0.
IDs des documents
Les ID des documents ci-dessus sont calculés ainsi:
- un hash court de leur clé est calculé (donc 12 signes, le base64 d’un hash de 9 bytes).
- le premier caractère est remplacé par
1
à4
selon la classe de document.
Exception pour le Comptable: son ID est 300000000000
.
Remarque: en présence d’un id on sait donc la classe du document correspond (donnée par son premier caractère). En affichage des IDs, les 4 derniers signes sont utilisés.
Authentification
L’administrateur technique
Il a une phrase de connexion dont le SHA256 de son PBKDF (shax
) est enregistré dans la configuration d’installation.
- Il n’a pas d’id, ce n’est PAS un compte.
- Une opération de l’administrateur est repérée parce que son token contient son
shax
.
Quelques opérations ne sont pas authentifiées:
- L’opération de création d’un compte
AccepterSponsorings
: par principe le compte n’est pas encore enregistré. - Les opérations du GC,
- des opérations de nature ping tests d’écho, tests d’erreur fonctionnelle.
sessionId
: pageId.nc
pageId
est générée au hasard (c’est un hash court sur 12 lettres / chiffres) au chargement de l’application.
A chaque nouvelle connexion à un compte, un numéro de connexion nc
est incrémenté de 1.
L’identifiant d’une connexion est sessionId
: pageId.nc
.
Token d’authentification
Toute opération ayant à authentifier son émetteur porte un token
sérialisation encodée en base 64 URL de { sessionId, org, shax, hXR, hXC }
:
- Pour l’administrateur technique:
org
:admin
shax
: SHA256 du PBKDF de sa phrase secrète en base64.
- Pour un compte connecté:
org
: le code l’organisation.sessionId
,hXR
: hash -court du PBKDF des 12 premiers caractères de la phrase secrète.hXC
: hash court du PBKDF de la phrase secrète complète.
Le service OP recherche le document comptes
par org@hXR
(propriété hk
indexée de comptes
):
- vérifie que
hXC
est bien celui enregistré danscomptes
. - enregistre dans le contexte de l’opération
sessionId, org
.
Textes humainement interprétables
Les photos des cartes de visites sont assimilées par la suite par simplification à des textes.
Ces textes humainement interprétables sont toujours cryptés par des clés qu’un compte obtient,
- indirectement par sa clé K cryptée par sa phrase secrète,
- par des contacts qui lui ont communiqué leur clé de carte de visite (contacts directs ou membre d’un groupe).
- par la clé d’un groupe dont la clé a été transmise lors de l’invitation.
On les trouvent en propriétés:
ph
: photo d’une carte de visite encodée en base64 URL.tx
: texte d’une carte de visite: le début de la première ligne donne un nom, le reste est un complément d’information.tx
: texte d’un échange sur unchats
ouchatgrs
.tx
: commentaire personnel d’un compte attaché à un avatar contact (chat ou membre d’un groupe) ou à un groupe.ht
: hashtags, suite de mots attachés par un compte à,- un avatar (chat ou membre d’un groupe),
- un groupe dont il est ou a été membre ou au moins invité,
- une note, personnelle ou d’un des groupes où il est actif et a accès aux notes.
texte
d’une note personnelle ou d’un groupe.
Les texte / tx
sont gzippés ou non avant cryptage: c’est automatique dès que le texte a une certaine longueur.
Remarque: Les services OP et PUBSUB ne voient jamais en clair, aucun texte, ni aucune clé susceptible de crypter un texte, ni la clé K des comptes, ni les phrase secrètes ou phrases de contacts / sponsorings.
Les textes sont cryptés / décryptés par l’application Web. Si celle-ci est malicieuse / boguée, les textes sont illisibles mais finalement pas plus que ceux qu’un utilisateur qui les écrirait en idéogrammes pour un public occidental ou qui inscrirait des textes absurdes.
Sous-objet Notification
Un objet notification est immuable, en cas de mise à jour il est remplacé par un nouveau.
Type des notifications:
- E : de l’espace. Elle concerne tous les comptes et est déclarée par l’administrateur du site.
- P : d’une partition. Elles concernent chacune tous les comptes “O” d’une partition. Elles sont déclarées, soit par le Comptable, soit par un de ses délégués sur cette partition.
- C : d’un compte. Elles concernent chacune un seul compte “O”.
Une notification a les propriétés suivantes:
nr
: restriction d’accès:- 1 : aucune restriction. La notification est informative (le texte peut annoncer une restriction imminente).
- 2 : restriction réduite
- E : espace figé
- P : accès en lecture seule
- C : accès en lecture seule
- 3 : restriction forte
- E : espace clos
- P : accès minimal
- C : accès minimal
dh
: date-heure de création.texte
: il porte l’information explicative.- type E: en clair.
- types P et C: crypté par la clé P de la partition.
idDel
: id du délégué ayant créé cette notification pour un type P ou C quand ce n’est pas le Comptable.
Remarque: une notification { dh: ... }
correspond à la suppression de la notification antérieure (ni restriction, ni texte).
Sous-objet CV
carte de visite
Une carte de visite a 4 propriétés { id, v, ph, tx }
:
id
: de l’avatar ou du groupe.v
: version de la carte de visite, version du groupe ou de l’avatar au moment de sa dernière mise à jour.ph
: photo cryptée par la clé A de l’avatar ou G du groupe propriétaire.tx
: texte (gzippé) crypté par la clé A de l’avatar ou G du groupe propriétaire.
nom
: il correspond aux 16 premiers caractères de la première ligne du texte et est affiché partout ou l’avatar / groupe apparaît, suivi des 4 derniers chiffres de son id.
Les cartes de visite des avatars sont hébergées dans le document avatars
, celles des groupes dans leurs documents groupes
.
Les cartes de visites des avatars sont dédoublées dans d’autres documents:
membres
: chaque membre y dispose de sa carte de visite.chats
: chaque interlocuteur dispose de la carte de visite de l’autre.
Mises à jour des cartes de visite des membres
- la première inscription se fait à l’ajout de l’avatar comme contact du groupe.
- le rafraîchissement peut être demandé pour un groupe donné.
- pour chaque membre, l’opération compare la version détenue dans le membre et la version détenue dans l’avatar. Cette vérification ne fait intervenir que des filtres sur les index si la version dans
membres
est à jour. - si la version de
membres
n’est pas à jour, elle est mise à jour.
- pour chaque membre, l’opération compare la version détenue dans le membre et la version détenue dans l’avatar. Cette vérification ne fait intervenir que des filtres sur les index si la version dans
- en session, lorsque la page listant les membres d’un groupe est ouverte, elle peut envoyer une requête de rafraîchissement des cartes de visite.
Mise à jour dans les chats
- à la mise à jour d’un chat, les cartes de visite des deux côtés sont rafraîchies si nécessaire.
- le rafraîchissement peut être demandé pour tous les chats d’un avatar donné.
- pour chaque chat, l’opération compare la version détenue dans le chat et la version détenue dans l’avatar. Cette vérification ne fait intervenir que des filtres sur les index si la version dans chat est à jour.
- si la version dans chat n’est pas à jour, elle est mise à jour.
- en session, lorsque la page listant les chats d’un avatar est ouverte, elle peut envoyer une requête de rafraîchissement des cartes de visite.
Documents versions
Un document versions
donne la plus haute version d’un sous-arbre:
- avatar:
avatars notes sponsorings chats tickets
, - groupe:
groupes notes membres
.
data :
id
: ID du document.v
: 1..N, plus haute version attribuée aux documents du sous-arbre.dlv
: jour de suppression, ou 0 s’il est actif.
Quand un document, un chats
par exemple est mis à jour, l’opération,
- lit le document
versions
de son sous-arbre: - incrémente de 1
v
deversions
, - l’inscrit comme version
v
dechats
, - met à jour
versions
etchats
.
La version v
est celle de tout le sous-arbre, la plus haute attribuée à un document du sous-arbre.
Documents espaces
Ces documents sont créés par l’administrateur technique à l’occasion de la création de l’espace et du Comptable correspondant.
Il est synchronisé par l’application Web: un avis de changement (avec la nouvelle valeur de sa version) est poussé par le service PUBSUB à toutes les sessions en cours du même espace org
.
Clé de l’espace cleES / cleET
cleES
ne sert qu’à crypter les rapports statistiques des comptes et des tickets: comme c’est le traitement GC qui les génère il faut bien qu’il puisse la lire en clair.
- c’est la seule clé détenue en clair dans la base (mais data est cryptée).
cleES
est cryptée encleET
par le PBKDF de la phrase complète de sponsorings du Comptable:- à la création du compte du Comptable,
cleET
peut être décryptée (le Comptable ayant saisi sa phrase de sponsorings) et elle est ré-encryptée encleEK
dans le documentcomptes
du Comptable par sa clé K. cleET
ne sert donc que peu de temps, entre la création de l’espace par l’administrateur technique et la création du compte du Comptable.
- à la création du compte du Comptable,
La lecture effective du document vérifie l’habilitation à sa lecture et ne transmet que les propriétés autorisées.
- la propriété
org
est récupérée par le service OP depuis la propriété id externalisée (org@id
) et inscrite à la lecture depuis la base dans le document mais n’y est pas stockée: on peut migrer une organisation sous un autre code sans intervention dans le contenu même du document. - Administrateur technique : toutes les propriétés, quelque soit l’espace, sauf
tnotifP
. - Comptable : toutes les propriétés (pour son espace, il ne peut pas lire les autres), sauf
hTC
qui ne lui sert à rien.. - autres comptes “O” : pour leur espace seulement,
- toutes les propriétés sauf
moisStat moisStatT cleES hTC
. tnotifP
: ne contient QUE la seule notification de leur partition.
- toutes les propriétés sauf
Les sessions des application Web sont synchronisées à leur espace. et sont ainsi informées à tout instant d’un changement des notifications,
- E de l’espace lui-même,
- de leur partition (pour un compte “O”).
Remarque: les notifications C (de compte) sont portées par les documents
partitions
etcomptes
et sont synchronisées par lui.
data :
id
: string vide.v
: 1..N-
dpt
: date du prochain traitement (mensuel). -
org
: code de l’organisation propriétaire, récupérée par le service OP, mais pas stockée dans data. creation
: date de création.hTC
: hash court du PBKDF de la phrase de sponsoring du Comptable par l’administrateur technique.moisStat
: dernier mois de calcul de la statistique des comptas.moisStatT
: dernier mois de calcul de la statistique des tickets.quotas
:{ qn, qv, qc }
: quotas maximum globaux attribués par l’administrateur technique.dlvat
:dlv
déclarée par l’administrateur technique.-
cleES
: clé de l’espace générée à la création de l’espace. notifE
: notification pour l’espace de l’administrateur technique. Le texte n’est pas crypté.opt
: option des comptes autonomes.- 0: Pas de comptes “autonomes”,
- 1: Comptes autonomes autorisés.
nbmi
: nombre de mois d’inactivité acceptable pour un compte “O” fixé par le comptable. Ce changement n’a pas d’effet rétroactif.tnotifP
: map des notifications de niveau partition.- clé : ID de la partition.
- valeur : notification (ou
null
), texte crypté par la clé P de la partition.
Remarques:
opt nbmi
: sont mis à jour par le Comptable.opt
:tnotifP
: mise à jour par le Comptable et les délégués des partitions.
Au début de chaque opération, l’espace est lu afin de vérifier la présence de notifications E et P (éventuellement restrictives) de l’espace et de leur partition (pour un compte “O”):
- c’est une lecture lazy : si l’espace a été trouvé en cache et relu depuis la base depuis peu de temps (3s :
Cache.LAZY_MS
), on l’estime à jour, ce qui évite des lectures trop rapprochées en cas de pic de requêtes d’opération. - en conséquence, quand il y a plusieurs instances en parallèle, la prise en compte de ces notifications n’est certaine qu’au bout de quelques secondes.
dlvat nbmi
L’administrateur technique gère une dlvat
pour l’espace :
- c’est la date à laquelle l’administrateur technique détruira les comptes. Par défaut elle est fixée à la fin du siècle.
- l’administrateur ne peut pas (re)positionner une
dlvat
à moins denbmi
mois du jour courant afin d’éviter les catastrophes de comptes supprimés sans que leurs titulaires n’aient eu le temps de se reconnecter.
Le maintien en vie d’un compte en l’absence de connexion a le double inconvénient,
- d’immobiliser des ressources peut-être pour rien,
- d’augmenter les coûts d’avance sur les frais d’hébergement.
Le Comptable fixe en conséquence un nbmi
(de 3, 6, 12, 18, 24 mois),
- évitant de contraindre les comptes à des connexions fréquentes rien que pour maintenir le compte en vie,
- évitant que les comptes oublient de le faire et se voient automatiquement résiliés après un délai trop bref de non utilisation de leur compte.
- l’usage d’un
nbmi
à 3 mois se justifie par exemple pour un site de démonstration où les comptes sont fictifs et s’auto-détruisent rapidement.
Il n’y a aucun moyen dans l’application pour contacter le titulaire d’un compte dans la vraie vie, aucun identifiant de mail / téléphone, etc.
Protocole de création d’un espace et de son Comptable
Par l’Administrateur Technique: création d’un espace:
- choix du code de l’organisation
org
- acquisition de la phrase de sponsoring du comptable T ->
TC
(son PBKDF) ->hTC
(son hash court) - Opération
CreationEspace
- Arguments:
org TC hTC
- Traitement:
- OK si:
- soit espace n’existe pas,
- soit espace existe et a un
hTC
: re-création avec une nouvelle phrase de sponsoring.
- génération de la
cleE
de l’espace: ->cleET
(par TC) etcleES
(par clé système). - stocke dans l’espace:
hTC cleES cleET
. Il est à demi créé, son Comptable n’a pas encore créer son compte.
- OK si:
- Arguments:
Par le Comptable: création de son compte
- saisie de la phrase de sponsoring T ->
hTC TC
- saisie phrase secrète du compte: X ->
XC
->hXR hXC
- génération de la clé K: ->
cleKXC
->cleEK
- génération pub/priv: ->
privK pub
- génération de la clé P de la partition 1:
clePK
->ck
{cleP, code}
crypté par clé K - Opération
CreationComptable
:- création de
compte compti compta
du Comptable, - création de la première
partition
ne comprenant que le Comptable, - création de son
avatar
principal (et pour toujours unique), - dans son
espace
: suppression dehTC
qui ne sert plus à rien.
- création de
Document syntheses
d’un espace
Ces documents sont des singletons de leur espace. Ils ne sont PAS synchronisés, les sessions des applications Web les demandent explicitement,
- pour l’administrateur technique,
- pour le Comptable.
data:
id
: string vide.v
: version, numéro d’ordre de mise à jour.qA
:{ qc, qn, qv }
- quotas maximum disponibles pour les comptes A.-
qtA
:{ qc, qn, qv }
- quotas effectivement attribués aux comptes A. En conséquenceqA.qn - qtA.qn
est le quotasqn
encore attribuable aux compte A. tsp
: map des synthèses des partitions.- clé: id de la partition.
- valeur :
synth
, objet des compteurs de synthèse calculés de la partition.id nbc nbd
ntfp[1,2,3]
q
:{ qc, qn, qv }
qt
:{ qc qn qv c2m n v }
ntf[1,2,3]
pcac pcan pcav pcc pcn pcv
Une agrégation des synth[i]
est compilé en tsp['0']
.
q
:{qc, qn, qv}
sont les quotas totaux maximum pour l’ensemble des partitions.
Le document syntheses
est mis à jour à chaque fois qu’un document partitions
l’est: le synth
de la partition est reporté dans l’élément correspondant de tsp
. En cas de suppression d’une partition son entrée est supprimée.
Documents partitions
des partitions d’un espace
Une partition est créée par le Comptable qui peut la supprimer quand il n’y a plus de comptes attachés à elle. L’identifiant d’une partition est aléatoire attribué par le Comptable à sa création.
La clé P d’une partition sert uniquement à crypter les textes des notifications de niveau P partition ou C relatif à un compte.
- elle est générée à la création de la partition,
- elle est transmise aux comptes rattachés qui la détiennent dans la propriété
clePK
,- soit à leur création par sponsoring : elle est cryptée par la clé K du compte créé.
- soit quand le compte change de partition (par le Comptable) ou passe de compte “A” à compte “O” par un délégué ou le Comptable: elle est cryptée par la clé publique RSA du compte.
Un document partition NON synchronisé, est explicitement demandé par les sessions des applications Web,
- soit du Comptable,
- soit d’un délégué.
- soit d’un compte “O” non délégué. Dans ce cas:
- dans la map
mcpt
, seules les entrées des délégués sont présentes. - les compteurs de quotas / consommation d’un délégué sont à 0.
- la
cleAP
est disponible ce qui permet de contacter les délégués pour un chat d’urgence.
- dans la map
Principales opérations
- attachement / détachement d’un compte à une partition.
- attribution / retrait de son statut de délégué.
- pose / retrait d’une notification de niveau P ou C (pour un seul compte). La notification C est redondée dans le compte.
- modification des quotas globaux de la partition.
- modification des quotas attribués à un compte.
Incorporation des consommations des comptes
Les compteurs de consommation d’un compte extraits de comptas
sont recopiés à l’occasion de la fin d’une opération:
- pour un compte “O” dans les compteurs
q: { qc qn qv nn nc ng v cjm }
de son entrée dansmcpt
.- en conséquence la ligne de synthèse de sa partition est reportée dans l’élément correspondant de son document
syntheses
.
- en conséquence la ligne de synthèse de sa partition est reportée dans l’élément correspondant de son document
- afin d’éviter des mises à jour trop fréquentes, la procédure de report n’est engagée qui si les compteurs ont une variation significative depuis le dernier report.
Remarque: la modification d’un compteur de quotas
qc qn qv
provoque cette procédure de reportcomptas -> partitions -> syntheses
à chaque évolution et sans effet de seuil.
data:
id
: ID de la partition attribué par le Comptable à sa création.-
v
: 1..N nrp
: niveau de restriction de la notification (éventuelle) de niveau partition mémorisée dansespaces
et dont le texte est crypté par la clé P de la partition.q
:{ qc, qn, qv }
quotas globaux attribués à la partition par le Comptable.mcpt
: map des comptes “O” attachés à la partition.- clé: id du compte.
- valeur:
{ notif, cleAP, del, q }
notif
: notification du compte cryptée par la clé P de la partition (redonde celle dans compte).cleAP
: clé A du compte crypté par la clé P de la partition.del
:true
si c’est un délégué.q
:qc qn qv nn nc ng v cjm
extraits du documentcomptas
du compte.cjm
est le compteurconso2M
de compteurs, montant moyen mensualisé de consommation de calcul observé sur M/M-1.
mcpt
compilé en session des applications Web - Ajout à q
:
pcc
: pourcentage d’utilisation de la consommation journalièrecjm / qc
pcn
: pourcentage d’utilisation effective de qn :nn + nc + ng / qn
pcv
: pourcentage d’utilisation effective de qc :v / qv
Un objet synth
est calculable (en application Web ou dans le serveur):
lqv
:['qn', 'qv', 'qc', 'nn', 'nc', 'ng', 'v', 'cjm']
qt
: les totaux des compteurs delqv
de tous les comptes,ntf
: [1, 2, 3] - le nombre de comptes ayant des notifications de niveau de restriction 1 / 2 / 3.nbc nbd
: le nombre total de comptes et le nombre de délégués.- recopiés de la racine dans
synth
:id nrp q
- plus, calculés localement :
pcac
: pourcentage d’affectation des quotas :qt.qc / q.qc
pcan
: pourcentage d’affectation des quotas :qt.qn / q.qn
pcav
: pourcentage d’affectation des quotas :qt.qv / q.qv
pcc
: pourcentage d’utilisation de la consommation journalièreqt
.cjm / q.qc
pcn
: pourcentage d’utilisation effective deqn
:qt.n / q.qn
pcv
: pourcentage d’utilisation effective deqc
:qt.v / q.qv
Documents comptes
Un document comptes
est identifié par l’id du compte: il est synchronisé en session par son rds
et y est toujours disponible à jour. Sa lecture ne se fait que par l’opération Sync
.
data :
id
: ID du compte = ID de son avatar principal.v
: 1..N.-
hk
:hXR
, hash court du PBKDF du début de la phrase secrète (en baseorg@hk
). vpe
: version du périmètrevci
: version decomptis
-
vin
: version deinvits
hXC
: hash court du PBKDF de la phrase secrète complète.cleKXC
: clé K cryptée par XC (PBKDF de la phrase secrète complète).cleEK
: pour le Comptable seulement, clé de l’espace cryptée par sa clé K à la création de l’espace. Permet au comptable de lire les reports créés sur le serveur et cryptés par cette clé E.-
privK
: clé privée RSA de son avatar principal cryptée par la clé K du compte. lmut
: liste desids
des chats pour lesquels le compte (son avatar principal) a une demande de mutation (mutI
!= 0)
Comptes “O” seulement:
clePK
: clé P de la partition cryptée par la clé K du compte. Si cette clé a une longueur de 256, la clé P a été cryptée par la clé publique de l’avatar principal du compte suite à une affectation à une partition APRÈS sa création (changement de partition, passage de compte A à O)idp
: ID de sa partition.del
:true
si le compte est délégué de la partition.-
notif
: notification de niveau compte dont le texte est crypté par la clé P de la partition (null
s’il n’y en a pas). mav
: map des avatars du compte.- clé : ID de l’avatar.
- valeur :
claAK
: clé A de l’avatar crypté par la clé K du compte.
mpg
: map des participations aux groupes:- clé : ID du groupe
- valeur:
{ cleGK, lav }
cleGK
: clé G du groupe cryptée par la clé K du compte.lav
: liste de ses avatars participant au groupe.
Comptable seulement:
tpK
: map des partitions cryptée par la clé K du Comptable[ {cleP, code }]
. Son index est le numéro de la partition.cleP
: clé P de la partition.code
: code / commentaire court de convenance attribué par le Comptable.
vci vin
: synchronisation des comptis invits
A chaque mise à jour du comptis
(resp. invits
) du compte, la version courante du compte est inscrite,
- comme
v
decomptis
(resp. deinvits
), - dans
vci
(resp.vin
).
Lors de l’appel Sync
une application Web peut savoir à la réception d’un avis de changement du compte, si comptis
(resp. invits
) est hors date ou non et doit ou non être rechargé.
Périmètre du compte, vpe
Le périmètre d’un compte est la liste ordonnée sans doublon (un Set ordonné) des IDs des avatars trouvés dans mav
et des groupes trouvés dans mpg
.
A la fin de chaque opération, le service OP compare, pour tous les comptes mis à jour par l’opération, les périmètres avant et après l’opération: la liste des périmètres changés [[ID du compte, nouveau périmètre [id1 ... ]] ... ]
est transmise à PUBSUB afin d’re mis à jour et de pouvoir notifier les futurs changements.
Si le périmètre d’un compte a changé, la propriété vpe
est mise à jour dans le compte avec la valeur courante de la version du compte. Ceci permet de savoir quand un compte a changé, si son périmètre a changé ou non depuis la version précédente et à PUBSUB de mettre à jour ou non le périmètre d’un compte.
Documents comptis
Ils sont identifiés pat l’ID de leur compte, créé et purgé avec lui. C’est une prolongation du document comptes
portant des informations personnelles (texte et hashtags) à propos des avatars et groupes connus du compte.
Ils sont synchronisés: la lecture par une application Web ne s’effectue que par l’opération Sync
.
data:
id
: id du compte.-
v
: version. mc
: map des contacts (des avatars) et des groupes connus du compte,- cle:
id
de l’avatar ou du groupe, - valeur :
{ ht, tx }
. Hashtags et texte attribués par le compte.ht
: suite des hashtags séparés par un espace et cryptée par la clé K du compte.tx
: commentaire gzippé et crypté par la clé K du compte.
- cle:
Documents invits
Ils sont identifiés pat l’ID de leur compte, créé et purgé avec lui. C’est une prolongation du document comptes
portant la liste des invitations à des groupes adressées à un des avatars du compte.
Ils sont synchronisés: la lecture en session ne s’effectue que par l’opération Sync
.
data:
id
: id du compte.-
v
: version. invits
: liste des invitations en cours:- valeur:
{idg, ida, cleGA, cvG, ivpar, dh}
idg
: id du groupe,ida
: id de l’avatar invitécleGA
: clé du groupe crypté par la clé A de l’avatar.cvG
: carte de visite du groupe (photo et texte sont cryptés par la clé G du groupe).flags
: d’invitation.invpar
:[{ cleAG, cvA }]
cleAG
: clé A de l’avatar invitant crypté par la clé G du groupe.cvA
: carte de visite de l’invitant (photo et texte sont cryptés par la clé G du groupe).
msgG
: message de bienvenue / invitation émis par l’invitant.
- valeur:
Pour un simple contact:
flags
est à 0.msgG
est null.invpar
reflète dans le cas des invitations unanimes, la liste des votants pour à cet instant.
Un contact peut se faire effacer des contacts du groupe et s’inscrire en liste noire.
Documents comptas
Ces documents de même id que leur compte est lu à chaque début d’opération et mis à jour par l’opération.
Les documents ne sont PAS synchronisés. La lecture est à la demande par les sessions des applications Web, ce qui permet de vérifier qui le demande: compte lui-même, Comptable, un délégué de sa partition pour un compte “O”.
Synthèse adq
: Alertes Date-limite-validité Quotas-volume
Le record adq
est une synthèse mémorisée dans le document comptas d’un compte qui donne une synthèse de l’état courant du compte:
- des flags d’alertes résultant de la situation des compteurs:
ARSN
: accès restreint pour solde négatif.RAL
: ralentissement des opérations pour excès de consommation de calcul par rapport au quota.NRED
: restriction d’augmentation du nombre de documents (notes, chats, groupes), le nombre actuel excédant le quota.VRED
: restriction d’augmentation de volume des fichiers attachés aux notes, le volume actuel excédant le quota.
- de la
dlv
date limite de validité du compte. - des compteurs qv (quotes / volumes).
A chaque retour d’une opération sollicité par une session d’une application Web, un résultat adq
est retourné lui transmettant les données suivantes:
nl ne vm vd
: le nombre de lectures, écritures, volumes montant et descendant de l’opération.qv
:{qc, qn, qv, nn, nc, ng, v, cjm}
des compteurs.dh
: la date-heure de calcul des compteurs.v
: la version du documentcomptas
.dlv
: la dlv du compte.flags
: les flags de restriction du compte détectés par l’opération.
A la fin de chaque opération le changement de adq par rapport à la version précédente stockée dans comptas est évalué:
- changement de
dlv flags qv.qc qv.qn, qv.qc
.adq
est envoyé à PUBSUB pour notification à toutes les sessions en ligne du compte. Ceci n’arrive pas souvent. - changement significatif des compteurs
qv. {nn, nc, ng, v, cjm}
: la changement est de plus propagé pour les comptes “O” àpartitions
etsyntheses
.
data
id
: numéro du compte = id de son avatar principal.v
: 1..N. Sa version lui est spécifique.-
dlv
: date limite de validité du compte. dhdc
: date-heure de la dernière connexion du compte.dharc
: date-heure de la notification d’accès restreint signifiée au compte.dharp
: date-heure de la notification d’accès restreint signifiée à la partition du compte.dlv
: date limite de validité du compte.flags
: des restrictions lors de la dernière opération.-
adq
: dernières valeurs transmise enadq
:dlv, flgs, qv
serialCompteurs
: sérialisation des quotas, volumes et coûts. Voir la description détaillée des compteurs en annexe.tickets
: map des tickets:- clé:
ids
- valeur:
{dg, dr, ma, mc, refa, refc}
- clé:
dons
: liste des dons effectués / reçus[{ dh, m, iddb }]
dh
: date-heure du donm
: montant du don (positif ou négatif)iddb
: id du donateur / bénéficiaire (selon le signe dem
).
Documents avatars
Un compte a un avatar principal de même ID que lui et peut avoir des avatars secondaires ayant chacun leur propre ID.
data:
id
: ID de l’avatar.v
: 1..N.vcv
: version de la carte de visite afin qu’une opération puisse détecter (sans lire le document) si la carte de visite est plus récente que celle qu’il connaît.-
hk
:hZR
hash court du PBKDF de la phrase de contact réduite (org@hk
en base). idc
: id du compte de l’avatar (égal à son id pour l’avatar principal).cleAZC
: clé A cryptée par ZC (PBKDF de la phrase de contact complète).pcK
: phrase de contact complète cryptée par la clé K du compte.hZC
: hash du PBKDF de la phrase de contact complète.cvA
: carte de visite de l’avatar{id, v, ph, tx}
. photo et texte (possiblement gzippé) cryptés par la clé A de l’avatar.pub privK
: couple des clés publique / privée RSA de l’avatar.
Documents tickets
Ce sont des sous-documents de avatars
qui n’existent que pour l’avatar principal du Comptable.
Il y a un document tickets
par ticket de crédit généré par un compte annonçant l’arrivée d’un paiement correspondant. Chaque ticket est dédoublé:
- un exemplaire dans la sous-collection
tickets
du Comptable, - un exemplaire dans le document
comptas
du compte, dans la listetickets
cryptée par la clé K du compte A{ids, dg, dr, ma, mc, refa, refc, di }
.
data:
id
: ID du Comptable.ids
: l’ids d’un ticket est un string de la forme :aammrrrrrrrr
aa
: année de génération,mm
: mois de génération,r...r
: aléatoire.
-
v
: version du ticket. dg
: date de génération.dr
: date de réception. Si 0 le ticket est en attente.ma
: montant déclaré émis par le compte A.mc
: montant déclaré reçu par le Comptable.refa
: code court (32c) facultatif du compte A à l’émission.refc
: code court (32c) facultatif du Comptable à la réception.disp
: true si le compte était disparu lors de la réception.idc
: id du compte générateur. Cette donnée n’est pas transmise aux sessions.
Cycle de vie
Génération d’un ticket (annonce de paiement) par le compte A
- un compte déclare,
- un montant
ma
celui qu’il affirme avoir payé / viré. - une référence
refa
textuelle libre facultative à un éventuel dossier de litige, typiquement un avoir correspondant à une erreur d’enregistrement antérieure.
- un montant
- le ticket est généré et enregistré en deux exemplaires:
- un dans le document
comptas
du compte, - un comme document
tickets
du Comptable..
- un dans le document
Effacement d’un de ses tickets par le compte
En cas d’erreur, un ticket peut être effacé par son émetteur, à condition d’être toujours en attente (ne pas avoir de date de réception). Le ticket est physiquement effacé de tickets
et de la liste comptas.tickets
.
Réception d’un paiement par le Comptable
- le Comptable ne peut que compléter un ticket en attente (n’ayant pas de date de réception) dans le mois d’émission du ticket ou les deux précédents. Au delà le ticket est auto-détruit.
- sur le ticket correspondant le Comptable peut remplir:
- le montant
mc
du paiement reçu, sauf indication contraire par défaut égal au montantma
. - une référence textuelle libre
refc
justifiant une différence entrema
etmc
. Ce peut être un numéro de dossier de litige qui pourra être repris ensuite entre le compte et le Comptable.
- le montant
- la date de réception
dr
est inscrite, le ticket est réceptionné. - le ticket est mis à jour dans
tickets
et dans la listecomptas.tickets
du compte A: le compte A est crédité.
Lorsque le compte va sur sa page de gestion de ses crédits
- les tickets dont il possède une version plus ancienne que celle détenue dans
tickets
du Comptable sont mis à jour. - les tickets émis un mois M toujours non réceptionnés avant la fin de M+2 sont supprimés.
- les tickets de plus de 2 ans sont supprimés.
Remarques:
- de facto dans
tickets
un document ne peut avoir qu’au plus deux versions. - la version de création qui créé le ticket, lui donne son identifiant secondaire et inscrit les propriétés
ma
et éventuellementrefa
désormais immuables. - la version de réception par le Comptable qui inscrit les propriétés
dr mc
et éventuellementrefc
. Le ticket devient immuable danstickets
. - les propriétés sont toutes immuables.
Listes disponibles en session
Un compte dispose de la liste de ses tickets sur une période de 2 ans, quelque soit leur statut, y compris ceux obsolètes parce que non réceptionnés avant fin M+2 de leur génération.
Le Comptable dispose en session de la liste des tickets détenus dans tickets. Cette liste est synchronisée (comme pour tous les sous-documents).
Arrêtés mensuels
Le GC effectue des arrêtés mensuels consultables par le Comptable. Chaque arrêté mensuel,
- récupère tous les tickets générés à M-3 (par exemple
202407
) et les efface de la listetickets
, - les stocke dans un fichier CSV
T_202407
du Comptable. Ces fichiers sont cryptés par la clé E de l’espace connue de l’administrateur technique (et du GC) et du Comptable.
Pour rechercher un ticket particulier, par exemple pour traiter un litige ou vérifier s’il a bien été réceptionné, le Comptable,
- dispose de l’information en ligne pour tout ticket de M M-1 M-2,
- dans le cas contraire, ouvre l’arrêté mensuel correspondant au mois du ticket cherché qui est un fichier CSV basique.
Numérotation des tickets
Un code à 6 lettres majuscules en est extrait afin de le joindre comme référence de paiement.
- la première lettre donne le mois de génération du ticket :
- A-L pour les mois de janvier à décembre si l’année est paire,
- M-X pour les mois de janvier à décembre si l’année est impaire.
- les autres lettres correspondent à
r...r
deids
.
Le Comptable sait ainsi dans quel arrêté mensuel il doit chercher un ticket au delà de M+2 de sa date de génération à partir d’un code à 6 lettres désigné par un compte pour audit éventuel de l’enregistrement.
Personne, pas même le Comptable, ne peut savoir quel compte a généré quel ticket. Cette information n’est accessible qu’au compte lui-même et est cryptée par sa clé K (la base connaît cette information mais elle est cryptée par la clé du site).
Documents chats
Un chat est une suite d’items de texte communs à deux avatars I et E:
- vis à vis d’une session :
- I est l’avatar interne,
- E est un avatar externe connu comme contact.
- un item est défini par :
- le côté qui l’a écrit (I ou E),
- sa date-heure d’écriture qui l’identifie pour son côté,
- sa date-heure de suppression s’il a été supprimé.
- son texte crypté par la clé de cryptage du chat connue seulement par I et E.
Un chat est dédoublé avec un exemplaire I et un exemplaire E:
- à son écriture, un item est ajouté des deux côtés.
- le texte d’un item écrit par I peut être effacé par I des deux côtés (mais pas modifié).
- I (resp. E) peut effacer tous les items I comme E de son côté: ceci n’impacte pas l’existence de ceux de l’autre côté.
- de chaque côté la taille totale des textes de tous les items est limitée à 5000c. Les plus anciens items sont effacés afin de respecter cette limite.
Pour ajouter un item sur un chat, I doit connaître la clé de E : membre d’un même groupe, chat avec un autre avatar du compte, ou l’ayant obtenu depuis la phrase de contact de E.
Clé d’un chat
La clé C du chat est générée à la création du chat et l’ajout du premier item:
- côté I, cryptée par la clé K de I,
- côté E, cryptée par la clé
pub
de E.
Décompte des nombres de chats par compte
- un chat est compté pour 1 pour I quand la dernière opération qu’il a effectuée est un ajout: si cette dernière opération est un classement en indésirable, le chat est compte pour 0.
- ce principe de gestion évite de pénaliser ceux qui reçoivent des chats non sollicités et qui les déclare indésirables.
Résiliation / disparition de E
Quand un avatar ou un compte s’auto-résilie ou quand le GC détecte la disparition d’un compte par dépassement de sa date limite de validité, il résilie tous ses avatars, puis le compte lui-même.
A la résiliation d’un avatar,
- tous ses chats sont accédés et l’exemplaire de E l’est aussi:
- s’il était indésirable, il devient zombi, n’a plus de data.
- sinon, son statut
st
passe à 2. E conserve le dernier état de l’échange, mais,- il ne pourra plus le changer, la carte de visite de I reste dans le dernier état connu,
- il ne pourra plus qu’effectuer un classement en indésirable, ce qui rendra l’exemplaire de son chat zombi.
data d’un chat
L’id
d’un exemplaire d’un chat est le couple id, ids
.
data (de l’exemplaire I):
id
: id de I,ids
: aléatoire.v
: 1..N.-
vcv
: version de la carte de visite de E. st
: deux chiffresI E
- I : 0:indésirable, 1:actif
- E : 0:indésirable, 1:actif, 2:disparu
mutI
:- 1 - I a demandé à E de le muter en compte “O”
- 2 - I a demandé à E de le muter en compte “A”
mutE
:- 1 - E a demandé à I de le muter en compte “O”
- 2 - E a demandé à I de le muter en compte “A”
idE idsE
: identifiant de l’autre chat.cvE
:{id, v, ph, tx}
carte de visite de E au moment de la création / dernière mise à jour du chat (textes cryptés par sa clé A).cleCKP
: clé C du chat cryptée,- si elle a une longueur inférieure à 256 bytes par la clé K du compte de I.
- sinon cryptée par la clé RSA publique de I.
cleEC
: clé A de l’avatar E cryptée par la clé du chat.items
: liste des items[{a, dh, l t}]
a
: 0:écrit par I, 1: écrit par Edh
: date-heure d’écriture.dhx
: date-heure de suppression.t
: texte crypté par la clé C du chat (vide s’il a été supprimé).
Création d’un chat
Sur création d’un compte par sponsoring
- vérification qu’il existe un sponsoring créé par
idE
et qu’il accepte le chat. - si le sponsorisé l’a souhaité.
- le chat est créé avec deux items: a) le mot de bienvenue du sponsor, b) la réponse du sponsorisé.
Quand E est délégué de la partition de I
- vérification que E est bien un délégué de la partition citée.
- I demande la clé RSA publique de E pour crypter la clé générée du chat.
- création avec un item.
Quand E est membre d’un groupe G cité et I aussi
- vérification que I accède aux membres de G et que E y est membre actif.
- I demande la clé RSA publique de E pour crypter la clé générée du chat.
- création avec un item.
Quand I connaît la phrase de contact de E
- vérification que E a bien cette phrase de contact et récupération de la cleA de E.
- I a calculé les hash des phrases de contact complète et réduite de E et obtenu en retour la clé A de E cryptée par le PBKDF de cette phrase de contact complète.
- I demande la clé RSA publique de E pour crypter la clé générée du chat.
- création avec un item.
Le nombre de chats dans la compta de I est incrémenté.
Actions possibles (par I)
- ajout d’un item
- l’item apparaît dans
items
de E (sona
est inversé).
- l’item apparaît dans
- effacement du texte d’un item de I
- le texte de l’item est effacé des deux côtés.
- il n’est pas possible pour I d’effacer le texte d’un item écrit par E.
- déclarer indésirable : effacement total de l’historique des items (du côté I)
items
est vidée du côté I.st
de I vaut01
etst
de E vaut10
ou00
.- le chat devient indésirable du côté I.
- faire un don:
Un compte “A” donateur peut faire un don à un autre compte “A” bénéficiaire en utilisant un chat.
- le chat avec don ne peut intervenir que si le chat est défini entre les deux avatars principaux des comptes.
- le montant du don est dans une liste préétablie.
- le solde du donateur (dans sa
comptas
) doit être supérieur au montant du don. - sauf spécification contraire du donateur, le texte de l’item ajouté dans le chat à cette occasion mentionne le montant du don.
- le donateur est immédiatement débité.
- le bénéficiaire est immédiatement crédité dans
solde
de sacomptas
.
Un chat indésirable pour un avatar reste un chat écouté, les items écrits par E arrivent, mais sur lequel I n’écrit pas. Il redevient actif pour I dès que I écrit un item et ne redevient indésirable que quand il fait une déclaration d’indésirable.
Mutation des comptes O<->AR
Compte “O”
Le compte doit donner son autorisation à un ou plusieurs comptes Comptable / délégués de sa partition. Pour chacun:
- le chat avec lui est marqué
mutI / mutE
1 (autorisation de mutation en compte A). - l’
ids
du chat est ajouté àlmut
de son compte.
Compte “A”
Le compte doit donner son autorisation à un ou plusieurs comptes Comptable / délégués d’une partition. Pour chacun:
- le chat avec lui est marqué
mutI / mutE
2 (autorisation de mutation en compte “O”). - l’
ids
du chat est ajouté àlmut
de son compte.
Pour les Comptable / délégués (d’une partition)
Les actions de mutation sont accessibles depuis un chat ayant un mutE
à 1 ou 2. L’action de mutation, en plus de muter le compte,
- liste tous les chats de
lmut
du compte, - efface les
mutI
de ces chats, - supprime
lmut
.
L’opération d’auto-mutation d’un délégué en compte A est plus simple.
Documents sponsorings
P est le parrain-sponsor, F est le filleul-sponsorisé.
data:
id
: id de l’avatar sponsor.ids
: hash court du PBKDF de la phrase réduite de parrainage,v
: 1..N.dlv
: date limite de validité.-
hk
:ids
, en baseorg@hk
. Deux organisations peuvent utiliser des phrases de sponsorings identiques sans collision. st
: statut. 0: en attente réponse, 1: refusé, 2: accepté, 3: détruit / annulépspK
: texte de la phrase de sponsoring cryptée par la clé K du sponsor.YCK
: PBKDF de la phrase de sponsoring cryptée par la clé K du sponsor.hYC
: hash court du PBKDF de la phrase de sponsoring,dh
: date-heure du dernier changement d’état.cleAYC
: clé A du sponsor crypté par le PBKDF de la phrase complète de sponsoring.partitionId
: id de la partition si compte “O”clePYC
: clé P de sa partition (si c’est un compte “O”) cryptée par le PBKDF de la phrase complète de sponsoring (donne le numéro de partition).nomYC
: nom du sponsorisé, crypté par le PBKDF de la phrase complète de sponsoring.del
:true
si le sponsorisé est délégué de sa partition.cvA
:{ id, v, ph, tx }
du sponsor, textes cryptés par sa cle A.quotas
:[qc, q1, q2]
quotas attribués par le sponsor.don
: montant du don éventuel par le sponsor.dconf
: le sponsor a demandé à rester confidentiel. Si oui, aucun chat ne sera créé à l’acceptation du sponsoring.dconf2
: le sponsorisé a demandé à rester confidentiel. Si oui, aucun chat ne sera créé à l’acceptation du sponsoring (ignoré en session UI).ardYC
: ardoise de bienvenue du sponsor / réponse du sponsorisé cryptée par le PBKDF de la phrase de sponsoring.
Remarques
- la
dlv
d’un sponsoring peut être modifiée tant que le statut est en attente. - Le sponsor peut annuler son
sponsoring
avant acceptation, en cas de remord son statut passe à 3.
Si le sponsorisé refuse le sponsoring :
- Il écrit dans
ardYC
la raison de son refus et met le statut dusponsorings
à 1.
Si le sponsorisé ne fait rien à temps :
sponsorings
finit par être purgé pardlv
.
Si le sponsorisé accepte le sponsoring :
- Le sponsorisé crée son compte:
- donne les hXR et hXC issus de sa phrase secrète,
- génère ses clés K et celle de son avatar principal,
- donne le texte de carte de visite.
- pour un compte “O”, l’identifiant de la partition à la quelle le compte est associé est obtenu de
clePYC
. - la
comptas
du sponsorisé est créée et créditée des quotas attribués par le sponsor et d’un don éventuel. - pour un compte “O” le document
partitions
est mis à jour (quotas attribués), le sponsorisé est mis dans la liste des comptestcpt
departitions
. - un mot de remerciement est écrit par le sponsorisé au sponsor sur
ardYC
ET ceci est dédoublé dans un chat sponsorisé / sponsor créé à ce moment et comportant l’item de réponse. Si le sponsor ou le sponsorisé ont requis la confidentialité, le chat n’est pas créé. - le statut du
sponsoring
est 2.
Documents notes
La clé de cryptage d’une note est selon le cas :
- note personnelle d’un avatar A : la clé K de l’avatar.
- note d’un groupe G : la clé du groupe G.
Pour une note de groupe, le droit de mise à jour d’une note d’un groupe est contrôlé par im
qui indique quel membre (son im
) a l’exclusivité d’écriture (sinon tous).
data:
id
: id de l’avatar ou du groupe.ids
: identifiant aléatoire universel.-
v
: 1..N. im
: exclusivité dans un groupe. L’écriture est restreinte au membre du groupe d’indiceim
.vf
: volume total des fichiers attachés.ht
: liste des hashtags personnels cryptée par la clé K du compte.- En session d’une application Web, pour une note de groupe,
ht
est le terme dehtm
relatif au compte de la session.
- En session d’une application Web, pour une note de groupe,
htg
: note de groupe : liste des hashtags cryptée par la clé du groupe.htm
: note de groupe seulement, hashtags des membres. Map:- clé : id du compte de l’auteur,
- valeur : liste des hashtags cryptée par la clé K du compte.
- non transmis en session.
l
: liste des auteurs (leursim
) pour une note de groupe.d
: date-heure de dernière modification du texte.texte
: texte (gzippé) crypté par la clé de la note.mfa
: map des fichiers attachés.pid pids
: référence de sa note parent.
Une note peut être logiquement supprimée. Afin de synchroniser cette forme particulière de mise à jour le document est conservé zombi (sa data est null
). La note sera purgée un jour avec son avatar / groupe.
Pour une note de groupe, la propriété htm
n’est pas transmise en session: l’item correspondant au compte est copié dans ht
.
Map des fichiers attachés
- clé
idf
: identifiant aléatoire (absolu) généré à la création. - valeur :
{ idf, lg, ficN, pic }
ficN
:{ nom, info, dh, type, gz, lg, sha, thn }
crypté par la clé de la note.pic
: true si le fichier est une photo et a un thumbnail.thn
: pour un fichier photo, la miniature 96x96 de la photo.
Identifiant de storage : org/id/idf
org
: code de l’organisation.id
: id de l’avatar / groupe auquel la note appartient.idf
: identifiant du fichier.
Selon le paramétrage du site, org id idf
sont ou non cryptés par la clé du site.
En imaginant un stockage sur file-system,
- l’application a un répertoire racine par espace portant le code de l’organisation,
- il y un répertoire par avatar / groupe ayant des notes ayant des fichiers attachés,
- pour chacun, un fichier par fichier attaché.
Un nouveau fichier attaché est stocké sur support externe avant d’être enregistré dans son document notes
. Ceci est noté dans un document transferts
.
Les fichiers créés par anticipation et non validés dans un document notes
comme ceux qui n’y ont pas été supprimés après validation de la note, sont retrouvés par le GC.
La purge d’un avatar / groupe s’accompagne de la suppression de son répertoire.
La suppression d’une note s’accompagne de la suppressions de N fichiers dans un seul répertoire.
Note rattachée à une autre
Le rattachement d’une note à une autre permet de définir un arbre des notes.
- une note d’un avatar A1 peut être rattachée:
- soit à la racine A1, en fait elle n’est pas rattachée,
- soit à une autre note de A1,
- soit à un groupe G1: A1 peut ainsi commenter un groupe par des notes qu’il sera seul à voir.
- soit à une note de G1: A1 peut ainsi commenter des notes d’un groupe par des notes qu’il sera seul à voir.
- une note d’un groupe G1 ne peut être rattachée qu’à une autre note du même groupe.
Les cycles (N1 rattachée à N2 rattachée à N3 rattachée à N1 par exemple) sont détectés et bloqués.
A propos de [pid, pids]
:
- Pour un note de groupe:
[null, null]
: rattachement virtuel au groupe lui-même.[pid, pids]
:pid
: ID du groupe lui-même (id
de la note),ids
: de la note du groupe à laquelle elle est rattachée (possiblement supprimée).
- Pour un note personnelle:
[null, null]
: rattachement virtuel à l’avatar de la note.[pid null]
:pid
: ID d’UN GROUPE,- rattachement virtuel au groupe lui-même, possiblement disparu / radié.
[pid, pids]
:- SI
pid
est ID de l’avatar (de la note),ids
: de la note de l’avatar à laquelle elle est rattachée (possiblement supprimée).
- SI
pid
: est l’ID d’UN GROUPE, possiblement disparu / radié.ids
: de la note de ce groupe à laquelle elle est rattachée (possiblement supprimée).
- SI
Documents groupes
Un groupe est caractérisé par :
- son entête : un document
groupes
. - son (unique) sous-document
chatgrs
(dontids
est1
). - ses membres: des documents de sa sous-collection
membres
.
Droits d’accès d’un membre.
Um membre peut se restreindre lui-même les accès suivants:
- [AM] : accès aux membres et au chat du groupe.
- [AN] : accès aux notes du groupe.
Il peut avoir les deux (cas général) ou n’en avoir aucun ce qui:
- limite son accès au groupe à la lecture de la carte de visite du groupe.
- pour un un animateur il peut être hébergeur.
Des droits d’accès sont conférés par un animateur (indépendamment de [AM] / [AN]):
- [DM] d’accès à la liste des membres.
- [DN] d’accès en lecture aux notes du groupe.
- [DE] droits d’écriture sur les notes du groupe (ce qui implique DN).
L’accès [AM] ([AN]):
- vrai: DES QUE le membre a le droit [DM], il accède aux membres.
- faux: il n’accède pas aux membres même s’il en le droit par [DM].
L’historique synthétique est consigné par:
- [HM] a eu un jour accès aux membres
- [HN] a eu un jour accès aux notes
- [HE] a eu un jour la possibilité d’écrire une note
Statut d’un membre dans le groupe: tables st tid flags
Ces trois tables sont synchrones: l’indice im
d’un membre est le même pour les trois:
tid
: table des ids des membres.st
: statut de ce membre.flags
: accès et droits d’accès de ce membre.
Ces tables s’étendent, les indices devenus inutiles ne sont pas réutilisés.
Statut st
:
- 0 : radié: c’est un ex-membre désormais inconnu, peut-être disparu, son id est perdu (
tid[im]
vaut null). - 1 : contact proposé pour une éventuelle invitation future par un membre ayant un droit d’accès aux membres.
- l’avatar ne peut rien faire dans le groupe mais il est informé (par
invits
). Il peut se désinscrire des contacts du groupe. - les membres du groupe peuvent voir sa carte de visite.
- un animateur peut le faire passer en état invité ou le radier (avec ou sans inscription en liste noire groupe).
- l’avatar ne peut rien faire dans le groupe mais il est informé (par
- 2 / 3 : pré-invité / invité:
- 2 : pré-invité : en attente de votes quand un vote unanime est requis. Un ou plusieurs animateurs ont voté pour inviter le contact, mais pas tous.
- l’avatar ne peut rien faire dans le groupe mais il est informé (par
invits
). Il peut se désinscrire des contacts du groupe. - les membres du groupe peuvent voir sa carte de visite.
- les animateurs peuvent:
- voter pour, effacer leur vote, changer les conditions d’invitation. Quand tous les animateurs ont voté pour, l’avatar devient invité.
- le radier (avec ou sans inscription en liste noire groupe) ou annuler l’invitation et le conserver comme simple contact.
- l’avatar ne peut rien faire dans le groupe mais il est informé (par
- 3 : invité: en attente de réponse quand le dernier animateur a voté (ou le premier pour les groupes à invitation simple), l’invitation a été transmise à l’avatar invité.
- l’avatar proposé est au courant, il a une invitation dans son compte (
invits
). - les membres du groupe peuvent voir sa carte de visite et les droits d’accès qui seront appliqués si l’avatar accepte l’invitation.
- un animateur peut:
- changer ses droits d’accès futurs.
- le radier (avec inscription en liste noire groupe) ou annuler l’invitation et le conserver comme simple contact.
- l’avatar peut,
- accepter l’invitation: il passera en état actif ou animateur.
- refuser l’invitation et s’auto-radier (avec ou sans inscription en liste noire compte) ou redevenir simple contact.
- l’avatar proposé est au courant, il a une invitation dans son compte (
- 2 : pré-invité : en attente de votes quand un vote unanime est requis. Un ou plusieurs animateurs ont voté pour inviter le contact, mais pas tous.
- 4 / 5 : actif
- 4 : non animateur
- l’avatar a le groupe enregistré dans son compte (
mpg
). - il peut:
- changer son accès aux membres et aux notes (mais pas ses droits).
- s’auto-radier (avec on sans inscription en liste noire compte) ou redevenir simple contact.
- un animateur peut:
- changer ses droits d’accès (mais pas ses accès effectifs qui sont du ressort du membre).
- le radier, avec ou sans inscription en en liste noire groupe ou simplement le ramener en statut contact.
- l’avatar a le groupe enregistré dans son compte (
- 5 : animateur. actif avec privilège d’animation.
- un autre animateur ne peut ni changer ses droits, ni le radier, ni lui retirer son statut d’animateur (mais lui-même peut le faire).
- 4 : non animateur
Le nombre de groupes pris en compte dans la comptabilité du compte:
- est incrémenté de 1 quand il accepte une invitation,
- est décrémenté de 1 quand il est radié ou redevient simple contact.
Dès qu’un membre a un statut:
- un indice
im
lui est attribué en séquence du dernier attribué (taille detid
). - ses accès et droits sont consignés dans la table
flags
à l’indiceim
. - il a un document
membres
associé:ids
, l’identification relative du membre dans le groupe est son indiceim
.
Radiations et inscriptions en liste noires lng lnc
La liste noire lng
est la liste des ID des membres que l’animateur ne veut plus voir réapparaître dans le groupe après leur radiation.
La liste noire lnc
est la liste des ID des membres qui se sont auto-radiés en indiquant ne jamais vouloir être connu du groupe à l’avenir.
Un animateur peut radier un membre, sauf les autres animateurs.
Un membre actif peut s’auto-radier:
- il ne verra plus le groupe dans sa liste des groupes.
- sans inscription en liste noire, il pourra ultérieurement être réinscrit comme contact ou réinvité comme s’il n’avait jamais participé au groupe.
- avec inscription en liste noire il ne pourra plus jamais ultérieurement être réinscrit comme contact ou réinvité.
A la radiation d’un membre d’indice im
:
- son document
membres
est mis à jour, ou détruit si inscription en liste noire. - il peut être inscrit dans les listes noires
lng lnc
. - ses entrées dans
tid st flags
sont ànull 0 0
.
Un membre actif peut décider de redevenir simple contact:
- il ne verra plus le groupe dans sa liste des groupes.
- une trace historique simplifiée de son existence subsiste:
- dans ses flags (HM HN HE),
- dans les dates importantes dans son document membre.
Quand le GC découvre la disparition du compte d’un avatar membre, il s’opère l’équivalent d’une radiation sans mise en liste noire (mais l’avatar ne reviendra jamais).
Création d’un membre
Le membre fondateur du groupe a un indice im
1 et est créé au moment de la création du groupe:
- dans la table
flags
à l’indiceim
:DM DN DE AM AN HM HN HE
- il a droit d’accès aux membres et aux notes en écriture,
- ses accès aux membres et notes sont ouverts,
- il a pour statut
st[1]
5 : animateur.
- son id figure en
tid[1]
.
Les autres membres sont créés, lorsqu’ils sont soit proposés comme contact, soit invités.
- un indice
im
est pris en séquence,tid[im]
contient leur ID. - leur document
membres
est créé. - proposition de contact: leurs flags sont à 0, son statut est à 1.
- invitation:
- des flags donnent les droits futurs DM DN DE et animateur selon le choix de l’animateur.
- une invitation est insérée dans leur avatar.
Réapparition d’un membre après radiation sans liste noire par un animateur. Un animateur peut radier un avatar sans le mettre en liste noire. L’avatar peut être réinscrit comme contact / réinvité plus tard et aura un nouvel indice et un nouveau document
membres
, son historique est vierge.
Modes d’invitation
- simple : dans ce mode (par défaut) un contact du groupe peut-être invité par UN animateur (un seul suffit).
- unanime : dans ce mode il faut que TOUS les animateurs aient validé l’invitation (le dernier ayant validé provoquant l’invitation).
- pour passer en mode unanime il suffit qu’un seul animateur le demande.
- pour revenir au mode simple depuis le mode unanime, il faut que TOUS les animateurs aient validé ce retour.
Une invitation est enregistrée dans la liste invits
du compte de l’avatar invité:
invits
du documentinvits
:[{idg, ida, cleGA, cvG, invpar, txtG}]
idg
: id du groupe,ida
: id de l’avatarcleGA
: clé du groupe crypté par la clé A de l’avatar.cvG
: carte de visite du groupe (photo et texte sont cryptés par la clé G du groupe).flags
: d’invitation. Animateur DM DN DE.invpar
:[{ cleAG, cvA }]
cleAG
: clé A de l’avatar invitant crypté par la clé G du groupe.cvA
: carte de visite de l’invitant (photo et texte sont cryptés par la clé G du groupe).
msgG
: message de bienvenue / invitation émis par l’invitant.
Ces données permettent à l’invité de voir en session les cartes de visite du groupe et du ou des invitants ainsi que le texte d’invitation (qui figure également dans le chat du groupe). Le message de remerciement en cas d’acceptation ou de refus sera également inscrit dans le chat du groupe.
Invitations en cours: invits
Cette map de groupes
a une entrée par invitation ouverte et pas encore ni acceptée ni refusée ni même totalement votée: { fl, li[] }
fl
: flags d’invitation. Droits futurs DM DN DE et pouvoir d’animation.li
:- liste des
im
des animateurs ayant voté l’invitation pour un mode unanime. - pour un mode d’invitation simple, il n’y a qu’un terme.
- liste des
Quand l’invitation a été acceptée ou refusée, l’entrée correspondante dans invits
est détruite.
Quand l’invitation est encore en vote (statut 2), les listes li
sont remises à jour quand un des animateurs cités n’est plus actif animateur.
Un membre peut avoir plusieurs périodes d’activité
- il est inscrit une fois comme contact puis est invité.
- il accepte l’invitation et devient actif.
- il décide de redevenir simple contact (sans se radier): sa période d’activité se termine.
- il est à nouveau invité et accepte son invitation: sa deuxième période d’activité commence.
Tant que le membre,
- ne s’est pas auto-radié,
- n’a pas été radié par un animateur,
- il conserve son indice
im
, son documentmembres
et une trace des périodes d’activité:- ses flags
HM HN HE
indiquent sommairement s’il a eu un jour accès aux membres, accès aux notes en lecture ou en écriture. - dans son document
membres
, les couples de dates de début de la première période et de fin de la dernière période d’activité, d’accès aux membres et aux notes en lecture ou écriture.
- ses flags
Hébergement par un membre actif
L’hébergement d’un groupe est noté par :
imh
: indice membre de l’avatar hébergeur.idh
: id du compte de l’avatar hébergeur. Cette donnée n’est pas transmise aux sessions des application Web.dfh
: date de fin d’hébergement qui vaut 0 tant que le groupe est hébergé. Les notes ne peuvent plus être mises à jour en croissance quanddfh
existe.
Prise d’hébergement
- un hébergeur peut transmettre l’hébergement à un autre de ses avatars.
- en l’absence d’hébergeur, c’est possible pour tout compte actif.
- s’il y a déjà un hébergeur animateur, seul un autre animateur peut se substituer à l’hébergeur actuel.
Fin d’hébergement par l’hébergeur
dfh
est mise la date du jour + 90 jours.- le nombre de notes
ng
et le volumev
decomptas
sont décrémentés de ceux du groupe.
Au dépassement de dfh
, le GC détruit le groupe.
Data
data:
id
: id du groupe.v
: 1..N-
dfh
: date de fin d’hébergement. nn qn vf qv
: nombres de notes actuel et maximum autorisé par l’hébergeur, volume total actuel des fichiers des notes et maximum autorisé par l’hébergeur.idh
: id du compte hébergeur (pas transmise aux sessions).imh
: indiceim
du membre dont le compte est hébergeur.msu
: mode simple ou unanime.null
: mode simple.[im]
: mode unanime : liste des indices des animateurs ayant voté pour le retour au mode simple. La liste peut être vide mais existe.
invits
: map{ fl, li[] }
des invitations en attente de vote ou de réponse. Clé:im
du membre invité.tid
: table des IDs des membres.st
: table des statuts.flags
: tables des flags.lng
: liste noire groupe des ids (courts) des membres.lnc
: liste noire compte des ids (courts) des membres.cvG
: carte de visite du groupe, textes cryptés par la clé du groupe{v, photo, info}
.
Décompte des participations à des groupes d’un compte
- quand un avatar a accepté une invitation, il devient actif et a une nouvelle entrée dans la liste des participations aux groupes (
mpg
) dans l’avatar principal de son compte. - quand l’avatar est radié cette entrée est supprimée.
- le nombre de participations aux groupes dans
comptas.qv.ng
du compte est le nombre total de ces entrées dansmpg
.
Documents membres
Un document membres
est créé à la déclaration d’un avatar comme contact.
Le document membres
est détruit,
- par une opération de radiation.
- par la destruction de son groupe lors de la résiliation du dernier membre actif.
data:
id
: id du groupe.ids
: indiceim
de membre relatif à son groupe.v
:-
vcv
: version de la carte de visite du membre. dpc
: date de premier contact.ddi
: date de la dernière invitation (envoyée au membre, c’est à dire votée).- dates de début de la première et fin de la dernière période…
dac fac
: d’activité.dln fln
: d’accès en lecture aux notes.den fen
: d’accès en écriture aux notes.dam fam
: d’accès aux membres.
cleAG
: clé A de l’avatar membre cryptée par la clé G du groupe.cvA
: carte de visite du membre{id, v, ph, tx}
, textes cryptés par la clé A de l’avatar membre.msgG
: message d’invitation crypté par la clé G pour une invitation en attente de vote ou de réponse.
Un message d’invitation est aussi inscrit dans le chat du groupe ou figure aussi la réponse de l’invité.
msgG
est effacé après acceptation ou refus, mais pas les items correspondants dans le chat.
Opérations
Par un animateur:
-
Inscription en contact - 0 -> 1
- Radiation d’un contact - 1 -> 0
- Invitation simple - 1 -> 3
- Annulation d’invitation - 2 / 3
- et retour en contact -> 1
- et radiation sans inscription en liste noire G -> 0
- et radiation avec inscription en liste noire G -> 0
- Vote d’invitation - 2
- vote pour -> 2 ou 3
- retrait d’un vote pour
- Modification des conditions d’invitation - 2 / 3. Pour le mode unanime revient à 2 (votes annulés)
- Modification des droits d’accès - 4 / 5
- Radiation d’un membre actif - 4 / 5
- et retour en contact -> 1
- et radiation sans inscription en liste noire G -> 0
- et radiation avec inscription en liste noire G -> 0
Par le membre lui-même:
- Acceptation d’invitation - 3 -> 4 / 5
- Refus d’une invitation - 3
- et retour en contact -> 1
- et radiation sans inscription en liste noire C -> 0
- et radiation avec inscription en liste noire C -> 0
- Modification des accès membre / note et statut d’animateur - 4 / 5 -> 4 (si retrait animateur)
- Auto-radiation - 4 / 5
- et retour en contact -> 1
- et radiation sans inscription en liste noire C -> 0
- et radiation avec inscription en liste noire C _> 0
Inscription en contact
- s’il est en liste noire, refus.
- attribution de l’indice
im
. - un row
membres
est créé.
Invitation par un animateur
- choix des droits et inscription dans
invits
du compte de l’avatar. - vote d’invitation (en mode unanime):
- si tous les animateurs ont voté, inscription dans
invits
du compte de l’avatar. - si le votant change les droits, les autres votes sont annulés.
- si tous les animateurs ont voté, inscription dans
ddi
est remplie dansmembres
.
Annulation d’invitation par un animateur
- effacement de l’entrée de l’id du groupe dans
invits
du compte de l’avatar.
Radiation par un animateur (avec ou sans liste noire)
- le statut passe de 1-2 (sinon erreur) à 0.
- s’il était invité, effacement de l’entrée de l’id du groupe dans
invits
de l’avatar. - inscription éventuelle en liste noire
lng
. - le document
membres
devient zombi.
Refus d’invitation par le compte
- mise à 0 du statut, des flags et de l’entrée dans
tid
. - document
membres
mis en zombi - Option liste noire: inscription dans
lnc
. - son item dans
invits
du compte de son avatar est effacé.
Acceptation d’invitation par le compte
- dans l’avatar principal du compte un item est ajouté dans
mpg
, - dans
comptas
le compteurqv.ng
est incrémenté. dac dln ... fam
demembres
sont mises à jour.- son item dans
invits
du compte de son avatar est effacé. - flags
AN AM
: accès aux notes, accès aux autres membres. - statut à 3 ou 4.
Modification des droits par un animateur
- flags
DM DN DE
Radiation d’un actif par un animateur
- le statut est actif et deviendra 0 (radié) ou 1 (retour en contact).
- le membre est mis (ou non) en liste noire
lng
. - cas de radiation: son document
membres
est mis en zombi.
Modification des accès membres / notes par le compte
- flags
AN AM
: accès aux notes, accès aux autres membres.
Radiation demandée par le compte**
- document
membres
mis en zombi. - mis à 0 du statut, de l’entrée dans tid. Dans flags il ne reste que les HM HN HE.
- si le membre était le dernier actif, le groupe disparaît.
- la participation au groupe disparaît de
mpg
du compte. - option liste noire: mise en liste noire
lnc
.
Documents Chatgrs
A chaque groupe est associé UN document chatgrs
qui représente le chat des membres d’un groupe. Il est créé avec le groupe et disparaît avec lui.
data
id
: id du groupeids
:1
-
v
: sa version. items
: liste ordonnée des items de chat{im, dh, dhx, t}
im
: im du membre auteur,dh
: date-heure d’écriture.dhx
: date-heure de suppression.t
: texte gzippé crypté par la clé G du groupe (vide s’il a été supprimé).
Opérations
Ajout d’un item
- autorisé pour tout membre actif ayant droit d’accès aux membres.
- le texte est limité à 300 signes.
Effacement d’un item
- autorisé pour l’auteur de l’item ou un animateur du groupe.
Sur invitation par un animateur
- le texte d’invitation est enregistré comme item, les autres membres du groupe peuvent ainsi le voir.
Sur acceptation ou refus d’invitation
- le texte explicatif est enregistré comme item.
Un item ne peut pas être corrigé après écriture, juste effacé.
Le chat d’un groupe garde les items dans l’ordre ante-chronologique jusqu’à concurrence d’une taille totale de 5000 signes.
Résiliation d’un compte, avatar, groupe
Elle est effectuée en deux phases:
- une transaction courte immédiate:
- récupère les groupes où l’avatar est invité (dans
invits
de son compte) et dont il est membre actif (dansmpg
de son compte). - pour chacun de ces groupes, supprime ce qui est relié à cet avatar.
- supprime l’avatar dans la liste des avatars
mav
de son compte. - met l’avatar en état zombi. Ceci marque une
dlv
dans le documentversions
de l’avatar. - purge ses documents
sponsorings
. - dès lors l’avatar est logiquement supprimé.
- inscription des deux tâches différées
AVC
etAGN
.
- récupère les groupes où l’avatar est invité (dans
- deux tâches différées sont lancées:
AVC
: met à jour les chats externes / purge les chats internes de l’avatar.AGN
: purge les notes de l’avatar.
La résiliation d’un avatar peut provoquer la suppression d’un groupe quand l’avatar était le dernier membre actif.
Suppression d’un groupe
Elle est effectuée en deux phases:
- dans l’opération / transaction principale:
- suppression des invitations en cours.
- suppression du groupe des comptes l’ayant en tant que participant.
- mise à jour de la comptas du compte hébergeur.
- le groupe est mis à l’état zombi. Ceci marque une
dlv
dans le documentversions
du groupe. - inscription des deux tâches différées
GRM
etAGN
.
- deux tâches différées sont lancées:
GRM
: purge les membres du groupe.AGN
: purge les notes du groupe.
Résiliation d’un compte
En une transaction la résiliation immédiate des avatars du compte est effectuée,
- peut entraîner des résiliation de groupes (ceux n’ayant plus d’actifs),
- ce qui lance des tâches
AGN
voireGRM
.
Contrôle global des ressources d’un espace
Les quotas globaux sont attribués par l’administrateur technique.
Le Comptable attribue une réserve globale pour tous les comptes “A”: la somme de leurs quotas ne pourra pas dépasser ce quota.
- le restant entre les quotas globaux et ceux réservés pour les comptes “A”, sont utilisables pour les partitions (compte “O”).
Le Comptable crée des partitions et leur alloue à chacune des quotas. La somme de ces quotas ne peut pas être supérieure aux quotas globaux diminués de ceux réservés pour les comptes “A”.
Le Comptable et les délégués d’une partition allouent des quotas aux comptes de la partition, leur somme ne peut pas dépasser les quotas de la partition.
Lorsqu’à un niveau donné, global, réserve des A, partition, les quotas sont révisés à la baisse, il n’y a pas d’impact immédiat. Toutefois les futures allocations / révisions de quotas du niveau inférieur ne peuvent intervenir qu’à la baisse, du moins sur le / les quotas documents, volume de fichiers, calcul excédentaire.
Dans espaces
L’attribut quotas { qn, qv, qc }
donne les quotas globaux maximum attribués par l’administrateur technique.
La somme des quotas attribués aux partitions et pour les comptes A ne doit pas dépasser ces valeurs.
Dans syntheses
qA
:{ qc, qn, qv }
- quotas maximum disponibles pour les comptes A.-
qtA
:{ qc, qn, qv }
- quotas effectivement attribués aux comptes A. En conséquenceqA.qn - qtA.qn
est le quotas qn encore attribuable aux compte A. tsp[p]
q
:{ qc, qn, qv }
- quotas maximum de la partition pqt
:{ qc qn qv c2m n v }
- quotasqc qn qv
effectivement attribués aux comptes de la partition et consommations actuellesc2m n v
(approximatives).- En conséquence q.qn - qt.qn par exemple représente les quotas encore attribuables aux comptes de la partition p.
tsp['0']
est la totalisation des tsp[p]
calculé à la compilation.
q
:{qc, qn, qv}
sont les quotas totaux maximum pour l’ensemble des partitions.
Les quotas globaux réservés par le Comptable est la somme dans syntheses
de qA + tsp['0'].q
et elle doit toujours être inférieure à espaces.quotas
.
Opérations impactant ces compteurs
Attribution de quotas par l’administrateur technique (remplace l’attribution de profil).
- affecte
espaces.quotas
Attribution / ajustement des quotas des comptes A par le Comptable
- affecte
syntheses.qA
- bloqué si c’est en augmentation ET fait dépasser le quotas général de espaces.
Attribution / ajustement des quotas d’une partition p par le Comptable
- affecte
partition[p].q
ce qui se répercute sursyntheses.tsp[p].q
- bloqué si c’est en augmentation ET fait dépasser le quotas général de espaces.
Ajustement de ses quotas par un compte “A” dont un qc
(qui peut le ralentir).
- affecte comptes[A].qv
- augmente / diminue
syntheses.qtA
- bloqué si c’est en augmentation ET fait dépasser le quotas général de espaces.
Mutation d’un compte c
“A” en compte “O” de la partition p
- diminue
syntheses.qtA
- augmente
partition[p].mcpt[c].q
(si c’est possible) ce qui se répercute sursyntheses.tsp[p].qt
- blocage si les quotas de la partition ne supportent pas les quotas du compte muté.
Mutation d’un compte c
“O” de la partition p
en compte “A”
- augmente
syntheses.qtA
. - diminue
partition[p].mcpt[c].q
ce qui se répercute sursyntheses.tsp[p].qt
. - bloqué si l’augmentation de
syntheses.qtA
fait dépassersyntheses.qA
.
Nouveau sponsoring
- vérifie que les quotas alloués seraient acceptables si la création du compte avait lieu à cet instant.
Création du compte par sponsoring
- bloque si les quotas enregistrés dans le sponsoring ne peuvent pas être honorés, les conditions ayant changé entre l’enregistrement du sponsoring et l’instant de la création.
Gestion des disparitions des comptes: dlv
Chaque compte a une date limite de validité mémorisé dans son comptas
:
- toujours une date de dernier jour du mois,
- propriété indexée de son document
comptas
.
Le GC utilise le dépassement de dlv
pour libérer les ressources correspondantes (notes, chats, …) d’un compte qui n’est plus utilisé. comptas
mémorise :
ddsn
: quand le solde est négatif, c’est la date du jour le plus récent où le solde est passé de positif à négatif. Ce calcul est effectué en remettant les compteurs à l’instant t.dharc
: quand le compte (“O”) a une restriction d’accès (nr = 2) sur sa notification de compte, c’est la date-heure du passage le plus récent de nr < 2 à nr = 2.dharp
: quand le compte (“O”) a une restriction d’accès (nr = 2) sur sa notification de partition, c’est la date-heure du passage le plus récent de nr < 2 à nr = 2.
Si l’une de ces trois date est positionné, le compte est sous le coup d’une restriction d’accès (soit pour solde négatif, soit pour notification de compte, soit pour notification de partition) depuis la plus ancienne de ces trois dates.
- dans ce cas le compte peut vivre jusqu’à (
nbmi
/ 2) mois après cette date.
Si ces dates ne sont positionnées, le compte peut vivre jusqu’à nbmi mois après sa dernière connexion.
Remarques:
- décompte en nombre de jour, un mois faisant 30 jours (
nbmi
mois signifie en faitnbmi
* 30 jours). - la
dlv
est le dernier jour du mois de la date ainsi calculée.
Remarque. En toute rigueur un compte “A” qui aurait un gros crédit pourrait ne pas être obligé de se connecter pour prolonger la vie de son compte oublié / tombé en désuétude / décédé. Mais il n’est pas souhaitable de conserver des comptes morts en hébergement, même payé: ils encombrent pour rien l’espace.
Changement des paramètres dans l’espace d’une organisation
Il y a deux données:
dlvat
: date limite de vie des comptes “O”, fixée par l’administrateur technique en fonction des contributions effectives reçues de l’organisation pour héberger ses comptes “O”.nbmi
: nombre de mois d’inactivité acceptable fixé par le Comptable (3, 6, 9, 12, 18 ou 24). Ce changement n’a pas d’effet rétroactif.
Remarque:
nbmi
est fixé par configuration par le Comptable pour chaque espace. C’est une contrainte de délai maximum entre deux connexions à un compte, faute de quoi le compte est automatiquement supprimé.- La constante
IDBOBS
fixe un délai maximum (2 ans par exemple), pour un appareil et un compte pour bénéficier de la synchronisation incrémentale. Un compte peut se connecter toutes les semaines et avoir un poste sur lequel il n’a pas ouvert une session synchronisée depuis 3 ans: bien que tout à fait vivant, si le compte se reconnecte en mode synchronisé sur ce poste, il repartira depuis une base locale vierge, sans bénéficier d’un redémarrage incrémental.
Changement de dlvat
Si le financement de l’hébergement par accord entre l’administrateur technique et le Comptable d’un espace n’est plus assuré, beaucoup de comptes “O” auront leur existence menacée par l’approche de cette date couperet.
Par convention une
dlvat
est fixée au 1 d’un mois et ne devrait pas être changée pour une date inférieure à M + 3 du jour de modification.
Décomptes des coûts et crédits
Remarque: en l’absence d’activité de sessions la consommation d’un compte est nulle, alors que le coût d’abonnement augmente à chaque seconde même sans activité.
On décompte dans le service OP le nombre de lectures et d’écritures effectués dans chaque opération:
- intégration dans le document
comptas
du compte, le cas échéant avec propagation aux documentspartitions / syntheses
si le changement est significatif. - le volume de download est décompté quand une session demande une URL de GET d’un fichier (en considérant que puisqu’elle a demandé l’URL, elle s’en est servi).
- le volume d’upload est décompté sur l’opération qui valide l’upload.
- retour à la session par le record adq pour information où sont cumulés les 4 compteurs depuis le début de la session et publication éventuelle aux autres sessions en cours du même compte si le changement est significatif.
Le tarif de base par défaut repris pour les estimations s’appuie sur les données de pricing de Firebase [https://firebase.google.com/pricing#blaze-calculator], MAIS les tarifs sont fixés dans config.mjs
pour chaque fournisseur.
Le volume technique moyen d’un groupe / note / chat est estimé à 8K. Ce chiffre est probablement faible, le volume utile en Firestore étant faible par rapport au volume réel occupé avec les index … D’un autre côté, le serveur considère les volumes utilisés en base alors que n / v vont être décomptés sur des quotas (des maximum rarement atteints).
Classe Tarif
Un tarif correspond à,
am
: son premier mois d’application. Un tarif s’applique toujours au premier de son mois.cu
: un tableau de 6 coûts unitaires[u1, u2, ul, ue, um, ud]
u1
: 30 jours de quota qn (250 notes / chats)u2
: 30 jours de quota qv (100Mo)ul
: 1 million de lecturesue
: 1 million d’écrituresum
: 1 GB de transfert montant.ud
: 1 GB de transfert descendant.
En configuration un tableau ordonné par aaaamm
donne les tarifs applicables, ceux de plus d’un an n’étant pas utiles.
L’initialisation de la classe Tarif.init(...)
est faite depuis la configuration du service OP. Le tarif courant est communiqué à la connexion de la session afin d’éviter une divergence entre application Web et service OP.
On ne modifie pas les tarifs rétroactivement, en particulier celui du mois en cours (les futurs c’est possible).
La méthode const t = Tarif.cu(a, m)
retourne le tarif en vigueur pour le mois indiqué.
Classe Compteurs
Les compteurs d’un document comptas sont sérialisés en base:
- ils représentent les valeurs calculées à la date dh.
- à la lecture depuis la base, depuis ces valeurs calculées à
dh
, le temps a passé: les compteurs doivent être recalculés à l’instantt
,- depuis les valeurs à l’instant
dh
, - en tenant compte du temps écoulé entre
dh
ett
, t
(l’instant de calcul) est rangé dansdh
,- l’objet est sérialisé à la fin du recalcul.
- depuis les valeurs à l’instant
Sous-objet quotas et volumes qv
: { qc, qn, qv, nn, nc, ng, v, cjm }
qc
: quota de consommationqn
: quota du nombre total de notes / chats / groupes.qv
: quota du volume des fichiers.nn
: nombre de notes existantes.nc
: nombre de chats existants.ng
: nombre de participations aux groupes existantes.cjm
: coût journalier moyen de calcul établi sur M / M-1.v
: volume effectif total des fichiers.
Unités
- T : temps.
- D : nombre de document (note, chat, participations à un groupe).
- B : byte.
- L : lecture d’un document.
- E : écriture d’un document.
- € : unité monétaire.
Propriétés de Compteurs
:
dh0
: date-heure de création du compte.dh
: date-heure du dernier calcul (juste avant sérialisation).dhP
: date-heure de création ou de changement O <-> A (informative, n’intervient pas dans les calculs).idp
: id de la partition pour un compte O.qv
: quotas et volumes pris en compte au dernier calcul :{ qc, qn, qv, nn, nc, ng, v, cjm }
qc
: quota de consommationqn
: quota du nombre total de notes / chats / groupes.qv
: quota du volume des fichiers.nn
: nombre de notes existantes.nc
: nombre de chats existants.ng
: nombre de participations aux groupes existantes.cjm
: coût journalier moyen de calcul établi sur M / M-1.v
: volume effectif total des fichiers.
ddsn
: date-heure de début de solde négatif.vd
: [0..11] - vecteur détaillé pour les 12 mois de l’année (glissante).
Propriétés calculées:
pcn
: % de qn utilisépcv
: % de qv utilisé- pcc : % du cjm*30 à qc
cjm
: consommation moyenne sur M / M-1 ramenée à un jour.njec
: nombre de jours estimés avant épuisement du crédit.flags
: flags courants :RAL
: ralentissement (excès de calcul / quota).NRED
: documents en réduction (excès de nombre de documents / quota).VRED
: volume de fichiers en réduction (excès de volume / quota).ARSN
: accès restreint pour solde négatif.
aaaa mm
: année / mois de dh.
Vecteur vd
: pour chaque mois M de l’année glissante ([0] est janvier)
- MS 0 : nombre de ms dans le mois - si 0, le compte n’était pas créé
- moyennes des quotas:
- QC 1 : moyenne de qc dans le mois (en c)
- QN 2 : moyenne de qn dans le mois (en nombre de documents)
- QV 3 : moyenne de qv dans le mois (en bytes)
- cumuls des consommations:
- NL 4 : nb lectures cumulés sur le mois (L),
- NE 5 : nb écritures cumulés sur le mois (E),
- VM 6 : total des transferts montants (B),
- VD 7 : total des transferts descendants (B).
- moyennes des compteurs:
- NN 8 : nombre moyen de notes existantes.
- NC 9 : nombre moyen de chats existants.
- NG 10 : nombre moyen de participations aux groupes existantes.
- V 11 : volume moyen effectif total des fichiers stockés.
- compteurs monétaires
- AC 12 : coût de l’abonnement (dans le mois)
- AF 13 : abonnement facturé (dans le mois) - pour un compte ayant été “A” une partie du mois.
- CC 14 : coût de consommation (dans le mois)
- CF 15 : consommation facturée (dans le mois) - pour un compte ayant été “A” une partie du mois.
- DB 16 : débits du mois
- CR 17 : crédits du mois
- S 18 : solde au début du mois
Le solde en fin de mois est celui du début du mois suivant: S - DB + CR - CF - AF
Le principe de calcul est de partir avec la dernière photographie enregistrée à la date-heure dh
.
- le calcul démarre maintenant à la date-heure
now
. - la première étape est d’établir le passé survenu entre
dh
etnow
: ce peut être quelques secondes comme 18 mois.- par principe aucun événement ne s’est produit entre ces deux instants, il s’agit donc de prolonger l’état connu à
dh
jusqu’ànow
. - le mois M de la photo précédente à
dh
doit être prolongé, soit jusqu’ànow
, soit jusqu’à la fin du mois. - puis le cas échéant il peut y avoir N mois entiers à prolonger dans l’état connu à fin M.
- puis le cas échéant il peut y avoir un dernier mois incomplet prolongeant le dernier calculé.
- par principe aucun événement ne s’est produit entre ces deux instants, il s’agit donc de prolonger l’état connu à
Quand on prolonge un mois, selon les compteurs deux cas se présentent:
- soit c’est une addition : les nombres de lectures, écritures … augmentent.
- soit c’est l’ajustement d’une moyenne en fonction du nombre de millisecondes sur laquelle elle était calculée et celui sur laquelle elle est à prolonger.
Le calcul s’effectuant depuis le dernier mois calculé, mois par mois, le calcul peut s’effectuer sur plus de 12 mois, sachant que seuls les onze derniers et le mois courant sont disponibles dans vd
.
Après la phase de prolongation de dh
à now
, on met à jour le nouvel état courant:
- les compteurs
qv
peuvent être à mettre à jour, - le statut O/A peut être à mettre à jour,
- une consommation peut être enregistrée MAIS CE N’EST Qu4AU CYCLE SUIVANT qu’elle coûtera quelque chose.
Le coût de calcul moyen sur M /M-1 peut être effectué:
- si le nombre de ms de cette période est trop faible (moins de 10 jours), la moyenne peut être aberrante en survalorisant les opérations les plus récentes.
- cette moyenne considère qu’il y a toujours eu au moins 10 jours de vie, même si la création remonte à moins que cela.
Dynamique
Un objet de class Compteurs
est construit,
- soit depuis
serial
, la sérialisation de son dernier état, - soit depuis
null
pour un nouveau compte. - la construction recalcule tout l’objet: il était sérialisé à un instant
dh
, il est recalculé pour être à jour à l’instant t. - puis il peut être mis à jour, facultativement, juste avant le retour du
constructor
, par:qv
: quand il faut mettre à jour les quotas ou les volumes,conso
: quand il faut enregistrer une consommation,idp
: changement de partition (A <-> O),dbcr
: enregistrement, soit d’un crédit ou d’un don reçu ou de dons (>0), soit d’un don effectué (<0).
const compteurs = new Compteurs(serial, qv, conso, idp, dbcr, dh)
dh
est facultatif et ne sert que pour effectuer des batteries de tests ne dépendants pas de l’heure courante.
Le getter get serial ()
retourne la sérialisation de l’objet afin de l’écrire dans la propriété compteurs
de comptas
.
En session, compteurs
est recalculé par compile()
à la connexion et en synchro,
En serveur, des opérations peuvent faire évoluer qv
de comptas
. L’objet compteurs
est construit (avec un qv
-et conso
s’il enregistre une consommation) puis sa sérialisation est enregistrée dans comptas
:
- création / suppression d’une note ou d’un chat: incrément / décrément de nn / nc.
- prise / abandon d’hébergement d’un groupe: delta sur nn / nc / v.
- création / suppression de fichiers: delta sur v.
- enregistrement d’un changement de quotas qn / qv.
- upload / download d’un fichier: delta sur vm / vd.
- enregistrement d’une consommation de calcul: delta sur nl / ne / vd / vm en passant l’évolution de consommation dans l’objet
conso
.
En session:
- le Comptable peut afficher le
compteurs
de n’importe quel compte “A” ou “O”. - les délégués d’une partition ne peuvent faire afficher les
compteurs
que des comptes “O” de leur partition.
Tâches différées et périodiques (GC)
Une opération effectue dans sa transaction les mises à jour immédiates de manière à ce que la cohérence des données soit garantie. Mais pour certaines opérations il peut rester des activités d’optimisation et / ou de nettoyage à exécuter qui peuvent être différées.
Une tâche périodique GC a pour objectif de détecter les changements d’états liés au simple passage du temps:
- compte résilié en raison d’une non-utilisation prolongée,
- groupe n’étant plus hébergé,
- sponsorings ayant dépassé leur date limite,
- production d’états mensuels,
- nettoyages:
- des transferts de fichiers non validés,
- de suppression de fichiers enregistrés mais restés présents.
Tâche différée: exemple
- transaction principale: un groupe est supprimé. Dès cet instant toute opération tentant d’agir sur le groupe sortira en exception parce que le groupe n’existe plus.
- tâche différée: purge de ses membres et de ses notes.
Un document taches
enregistre toutes ces tâches différées:
- une opération principale peut enregistrer des tâches sous contrôle transactionnel.
- un démon (opération
ProchTache
) est lancé s’il n’était pas en cours, qui va scrutertaches
,- en extraire la prochaine à traiter et se terminer s’il n’y en a pas,
- la traiter en une transaction, ce qui peut le cas échéant ajouter d’autres tâches,
- in fine la retirer de
tâches
, ou pour une tâche périodique la réinscrire pour le lendemain typiquement. - puis relancer un démon.
Une tâche non périodique:
- a un code opération (celle de son traitement),
- est associée à un espace (
org
) et ne fait rien si son espace est figé ou clos. - a un document cible identifié par une
id
. - est exécutée sous privilège administrateur et n’enregistre pas ses consommations,
- a une date-heure au plus tôt: quand une tâche a rencontré une exception, sa date-heure au plus tôt permet de laisser s’écouler un certain délai avant une nouvelle exécution.
- n’a pas de rapport de bonne exécution, la tâche étant détruite.
- elle a un rapport d’exception décrivant l’exception qui a interrompu sa dernière exécution.
Une tâche périodique:
- a un code opération (celle de son traitement),
- se réinscrit systématiquement pour plus tard en début de tâche afin de ne pas être lancée par deux démons de deux serveurs / cloud function parallèle,
- est exécutée sous privilège administrateur et n’enregistre pas ses consommations.
- peut avoir un rapport d’exception décrivant l’exception qui a interrompu sa dernière exécution.
Multi serveur / cloud function: empêcher 2 serveurs de lancer la même tâche:
- début de tâche: mise à jour de la date-heure au plus tôt. Comme si la relance de la tâche était déjà planifiée.
- fin de tâche: purge de la tâche pour une tâche non périodique et changement de l’heure de relance pour une tâche périodique.
Service CRON
- en l’absence de trafic des tâches non périodiques en exception pourraient n’être relancées que tardivement, des rapports mensuels ne pas être calculés à temps.
- un service CRON lance (de l’extérieur) chaque jour une opération
ProchTache
par une URL comportant un code d’autorisation inscrit en configuration pour éviter des sollicitations intempestives.
L’administrateur dispose d’un accès aux tâches, et peut:
- voir la liste des tâches,
- soit les tâches périodiques,
- soit les tâches non périodiques d’un espace.
- voir le dernier compte-rendu d’exception d’une tâche.
- supprimer une tâche,
- relancer une tâche,
- annuler une tâche,
- réveiller le démon.
La table / document n’a pas de data mais directement des colonnes / attributs exposés dans la base :
op
: code de l’opération.org
: code de l’organisation (vide pour une tâche périodique).dh
: date-heure au plus tôt d’exécution.id
: id de l’objet principal concerné, ‘’ pour un périodique.exc
: rapport d’exception de la dernière exécution.dhf
: date-heure de fin pour une tâche GC.nb
: nombre d’items traités à la dernière exécution d’une tâche GC.
Liste des tâches
Périodiques (GC):
- DFH = 1 // détection d’une fin d’hébergement
- DLV = 2 // détection d’une résiliation de compte
- TRA = 3 // traitement des transferts perdus
- VER = 4 // purge des versions supprimées depuis longtemps
- STA = 5 // statistique “mensuelle” des comptas et des tickets
- FPU = 7 // purge des fichiers à purger
Non périodiques: org
, organisation, id
d’un groupe ou avatar selon le cas.
- GRM = 21 // purge des membres d’un groupe supprimé
- AGN = 22 // purge des notes d’un groupe ou avatar supprimé
- AVC = 24 // gestion et purges des chats de l’avatar
Connexion et Synchronisation au fil de l’eau d’une session de l’application Web
Principes:
- à la fin de la phase de connexion,
- tous les documents synchronisés du périmètre du compte sont en mémoire et cohérents entre eux.
- 1
espaces
- 1 sous-arbre
comptes comptis invits
- N sous-arbres
avatars ... notes sponsorings chats tickets
- M sous-arbres
groupes ... notes membres
- 1
- si la session est synchronisée cet état est aussi celui de la base base locale IDB qui a été mise à jour de manière cohérente pour le compte, puis pour chaque avatar, chaque groupe.
- tous les documents synchronisés du périmètre du compte sont en mémoire et cohérents entre eux.
- par la suite l’opération
Sync
maintient cet état.
La création d’un compte par acceptation de sponsoring amène la session au même point que la connexion ci-dessus.
Les trois autres documents du périmètre du compte
syntheses partitions comptas
sont chargés à la demande.
Publication aux sessions en cours des applications Web à la fin de chaque opération
Un objet de classe TrLog
est créé et transmis au service PUBSUB: il contient les informations que l’opération a fait évoluer dans le périmètre du compte sous lequel elle s’est exécuté.
vesp
: le numéro de version de l’espace, SSI l’opération a mis à jour le document espaces.vadq
: le numéro de version du document comptas du compte, SSI son record adq a évolué de manière suffisamment significative depuis la dernière version notifiée par PUBSUB.vcpt
: le numéro de version du document comptesavgr
: les versions des sous-arbres avatars / groupes ayant changé.perimetres
: la liste des comptes dont le périmètre a changé avec la version de ce périmètre.
Le service PUBSUB connaissant les sessions en cours et leurs périmètres de documents synchronisés est en mesure de savoir quelles sessions doivent être notifiées de quels changements. Chaque changement se limite à indiquer sa nouvelle version: chaque session des applications Web en cours détermine ainsi, par rapport aux versions qu’elle détient,
- si elle doit recharger le document
espaces
de son organisation: ceci lui indiquera d’éventuelles restrictions (FIGE
: espace figé,LSNTF
/ARNTF
: restrictions de niveau partition). - si elle doit recharger le record
adq
issu de son documentcomptas
(dont les éventuels flags RAL NRED VRED ARSN). - si elle doit ou non re-synchroniser les données de son compte (voir ci-après Sync / DataSync) et obtenir les éventuelles restrictions de niveau compte LSNTF ARNTF).
Toutes les alertes pouvant entraver le fonctionnement du compte sont ainsi synchronisées: elles apparaissent dès qu’elles sont positionnées et disparaissent dès qu’elles sont effacées de la base centrale.
L’opération Sync
et l’objet DataSync
L’objet DataSync
échangé en argument et résultat d’une opération Sync
, sert à une session d’une application Web:
- à obtenir les documents la resynchronisant avec l’état le plus récent de la base.
- à indiquer à sa base locale IDB ce qui y est stocké et dans quelle version.
Les états successifs de la base sont toujours cohérents: tous les documents de chaque périmètre d’un compte sont cohérents entre eux.
L’état courant en mémoire d’une session d’une application Web et le cas échéant de sa base locale IDB, est consigné dans l’objet DataSync
ci-dessous:
- chaque sous-arbre d’un avatar ou d’un groupe est cohérent (tous les documents sont synchrones sur la même version
vs
version session), - en revanche il peut y avoir (plus ou moins temporairement) des sous-arbres à jour par rapport à la base et d’autres en retard.
L’objet DataSync
:
compte
:{ vs, vb }
vs
: numéro de version de l’image détenue en session.vb
: numéro de version de l’image en base centrale.
avatars
: Map des avatars du périmètre.- Clé: id de l’avatar
- Valeur:
{ id, chg, vs, vb }
chg
:true
si l’avatar a été détecté changé en base par le serveur.
groupes
: : Map des groupes du périmètre.- Clé: id groupe
- Valeur:
{ id, chg, vs, vb, ms, ns, m, n }
chg
:true
si le groupe a été détecté changé en base par le serveur.vs
: numéro de version du sous-arbre détenue en session.vb
: numéro de version du sous-arbre en base centrale,ms
:true
si la session a actuellement la liste des membres.ns
:true
si la session a actuellement la liste des notes.m
:true
si en base centrale le groupe indique que le compte a accès aux membres.n
:true
si en base centrale le groupe indique que le compte a accès aux membres
Remarques:
- un
DataSync
reflète l’état d’une session, lesvs
(etms ns
des groupes) indiquent quelles versions sont connues d’une session. - Un
DataSync
reflète aussi l’état en base centrale quand il a été calculé, lesvb
(etm n
pour les groupes) indiquent quelles versions sont détenues dans l’état courant de la base centrale. - Quand toutes les
vb
etvs
correspondantes sont égales (et les couplesms ns / m n
pour les groupes), l’état en session reflète celui en base centrale: il n’y a plus rien à synchroniser … jusqu’à ce l’état en base centrale change et que l’existence d’une mise à jour soit notifiée par web push à la session.
Chaque appel de l’opération Sync
:
- transmet le
DataSync
donnant l’image connue en session, - reçoit en retour,
- le
DataSync
rafraîchi par le dernier état courant en base centrale. - le dernier état, s’il a changé, des documents
comptes comptis invits
du compte, - zéro, un ou plusieurs lots de mises de sous-arbres avatar et groupe entiers.
- le
Pas forcément les mises à jour de tous les sous-arbres:
- le volume pourrait être trop important,
- le nombre de sous-arbres mis à jour dépend du volume de la mise à jour.
- en conséquence si le
DataSync
indique que tous n’ont pas été transmis, une opérationSync
est relancée avec le dernierDataSync
reçu.
Cas particulier de la connexion, premier appel de Sync
de la session:
- c’est le serveur qui construit le
DataSync
depuis l’état du compte et les versions des sous-arbres qu’il va tous chercher. - au retour, la session va récupérer (en mode synchronisé) le
maxim
de documents encore valides et présents dans IDB:- elle lit depuis IDB le
DataSync
qui était valide lors de la fin de la session précédente et qui donne les versionsvs
(etms ns
pour les groupes), - elle lit depuis IDB l’état des sous-arbres connus afin d’éviter un rechargement total: les
vs
(etms ns
) sont mis à jour dans le DataSync. - le prochain appel de
Sync
ne provoquera des chargements que de ce qui est nouveau et pas des documents ayant une version déjà à jour en session UI IDB.
- elle lit depuis IDB le
Appels suivants de Sync
- le
DataSync
reçu sur le serveur permet de savoir ce que la session connaît. - si des avis de mises à jour sont parvenus, la liste de leur
id
est passée àSync
: au lieu de relire toutes les versions de tous les sous-arbresSync
se contente de lire uniquement les versions des sous-arbres changés donnés par la liste desid
reçue de la session UI.
A chaque appel de Sync
, les versions de comptes comptis invits
sont vérifiées: en effet avant de transmettre les mises à jour des sous-arbres Sync
s’enquiert auprès du document comptes
:
- des sous-arbres n’ayant plus d’intérêt (avatars et groupes hors périmètre),
- des nouveaux sous-arbres (nouveaux avatars, nouveau groupes apparaissant dans le périmètre),
- pour les groupes si les accès membres et notes ont changé pour le compte.
Synchronisation en session
Après la phase de connexion, l’état en mémoire est cohérent et stable, avec écoute des web push activée en permanence: ces avis sont reçus par notifications poussées au Browser. Le service PUBSUB voit passer toutes les mises à jour et connaît les périmètres de toutes les sessions.
Remarques:
- les avis de mise à jour de
espaces adq
ne sont pas liés àSync / DataSync
et traités isolément dès leur arrivée. -
les avis de mise à jour des sous-arbre compte, sous-arbre avatar, sous-arbre groupe peuvent parvenir dans un ordre différent de celui dans lequel les mises à jour sont intervenues;
- en revanche un avis sur
comptes
pourrait parvenir après un avis sur un de ses avatars: pour éviter cette discordance, l’état decomptes
est toujours relu (si nécessaire) à chaqueSync
. - il se POURRAIT qu’un sous-arbre (complet) avatar soit remis à jour AVANT un sous-arbre groupe, dans l’ordre inverse des opérations sur le serveur. Cette discordance potentielle entre la vue en session et la réalité,
- va être temporaire,
- est fonctionnellement quasi impossible à discerner,
- n’a pas de conséquence sur la cohérence des données.
Connexion en mode avion
Phase unique:
- lecture de l’item de boot de la base locale:
- il permet d’authentifier le compte (et d’acquérir sa clé K),
- lecture du
DataSync
de la base locale,
- mise en mémoire tampon compilée depuis la base locale,
- des documents
espaces comptes comptis invits
. - des documents des sous-arbres avatar et compte.
- des documents
- mise à jour des stores des documents compilés en une séquence sans interruption (sans
await
) afin que la vision graphique soit cohérente.
Synchronisation au fil de l’eau
Au fil de l’eau il parvient des notifications web-push de mises à jour de versions.
Une table queue de traitements mémorise pour chaque sous-arbre, son id
et la version notifiée par l’avis de mise à jour. Elle regroupe ainsi des événements survenus très proches.
Les avis de mises à jour dont la version est inférieure ou égale à la version déjà détenue dans les stores de la session, sont ignorés.
Itération pour vider cette queue
Tant qu’il reste des traitements à effectuer, une opération Sync
est soumise:
- le
DataSync
est celui courant, - L’id du sous-arbre est:
id
si l’avis de changement concerne le sous-arbre compte.ida
, l’id du sous-arbre si la notification correspond à un sous-arbre.
Le traitement standard de retour,
- met à jour la base locale en une transaction,
- met à jour les store de la session sans interruption (sans
await
).