Aller au contenu

Licences et projets

Le statut d'une licence d'après son abonnement, le quota, les projets du client, leurs identifiants, la synchronisation et la révocation.

Une licence est ce qu'un abonnement donne au client : le droit d'avoir un certain nombre de projets, et un identifiant actif pour chacun. Cette page décrit comment la licence suit son abonnement, et ce que le client et l'administration font de ses projets.

Le statut suit l'abonnement

StatutLibelléCe qu'il signifieIdentifiants
pendingEn attente du paiementSouscrit, la première facture n'est pas payée.Coupés
activeActiveAbonnement payé, ou en essai.Actifs
gracePaiement en retardLe renouvellement est impayé, le délai de grâce court.Actifs
suspendedSuspendueL'abonnement a pris fin. Les projets sont gardés.Coupés
revokedRévoquéeSuspendue trop longtemps, ou révoquée par l'administration.Révoqués

Le module écoute les événements de Facturation, dans leur transaction :

Événement de FacturationEffet sur la licence
subscription.createdCrée la licence : active pour un essai, pending sinon.
subscription.activated, subscription.renewedactive. Les identifiants coupés sont rétablis.
subscription.past_duegrace, avec la fin de la grâce. Rien n'est coupé.
subscription.endedsuspended, quelle que soit la raison de la fin.
subscription.plan_changedUne fois effectif : la nouvelle offre et son quota. Une descente programmée pour le renouvellement n'est d'abord qu'inscrite à l'historique.
subscription.cancel_scheduled, subscription.resumedHistorique seulement : la licence reste active jusqu'à la fin de la période payée.

Chaque événement n'est appliqué qu'une fois : son identifiant est gardé sur la ligne d'historique qu'il produit, et un événement déjà vu est ignoré. Un gestionnaire qui échoue annule le changement de Facturation avec lui : le paiement d'un webhook Stripe est alors refusé, et Stripe le relivre.

Le client qui revient

Un client dont l'abonnement a pris fin retrouve sa licence suspendue en souscrivant de nouveau : elle passe sur le nouvel abonnement, avec ses projets et leurs identifiants. Tant que le premier paiement n'est pas reçu, elle reste pending, et ses identifiants restent coupés. Le délai de révocation ne repart qu'au paiement. Une licence révoquée n'est jamais reprise : le client repart d'une licence vide.

Le quota

Le quota est celui de l'offre de la licence, réglé dans Quotas. Seuls les projets actifs comptent.

  • Un projet de plus que le quota est refusé (quota_reached). Le client retire un projet, ou passe à une offre supérieure.
  • Une montée (vers une offre plus chère) est immédiate, au paiement de sa facture : le nouveau quota s'applique tout de suite.
  • Une descente est programmée pour le renouvellement. D'ici là, la section « Projets » prévient le client du nouveau quota et de la date. Au renouvellement qui l'applique, s'il reste plus de projets actifs que le nouveau quota, les plus récents passent suspended. Rien n'est retiré : un projet suspendu revient quand une place se libère, ou avec une offre supérieure.
  • Changer le quota d'une offre dans Quotas ne touche à aucun projet existant : un quota plus bas refuse seulement les nouveaux.
  • Une offre retirée des quotas ne donne plus aucun projet aux licences qui l'auraient encore. Le retrait est refusé tant qu'une licence non révoquée l'utilise (plan_has_licenses).

Usage raisonnable. Une licence qui dépasse le seuil de son offre déclenche une notification aux détenteurs de licenses.manage, une seule fois par licence. Rien n'est bloqué.

Les projets

Le client gère ses projets depuis la section « Projets » de son espace client. Pour chaque licence : l'offre et son statut, le quota (« 12 / 30 projets actifs », ou « 12 projets, sans limite ») avec sa barre de remplissage, le bouton « Nouveau projet », puis le tableau des projets : nom, identifiant, date de création, dernière utilisation, statut, et un menu « … » par ligne. Les avis de paiement en retard, d'abonnement terminé, d'attente du premier paiement et de descente programmée s'affichent sous l'en-tête.

L'adresse ?nouveau=1 (/compte/projets?nouveau=1 par défaut) ouvre le formulaire de création à l'arrivée, sur la première licence qui peut encore recevoir un projet. Le paramètre est ensuite retiré de l'adresse, pour qu'un rechargement ne rouvre pas le formulaire.

ActionEffet
Nouveau projetUn nom, de 1 à 100 caractères. Le projet reçoit un identifiant chez le fournisseur. Avec Verdaccio, sa clé fzk_… et les lignes à coller dans le .npmrc du projet s'affichent une seule fois.
Régénérer la cléUne nouvelle clé remplace l'ancienne, qui est révoquée tout de suite. La nouvelle s'affiche une fois, et le client remplace la ligne de son .npmrc.
Retirer le projetDéfinitif : le projet ne compte plus, sa clé est révoquée.

La colonne « Identifiant » donne l'identifiant du projet au registre, fz-… avec Verdaccio : c'est ce que répond npm whoami, et ce que le support demande. Régénérer la clé et retirer le projet passent par le menu « … » de la ligne, puis par une fenêtre de confirmation. La création est refusée hors des statuts active et grace (license_inactive).

La clé tout juste créée s'affiche dans une carte au-dessus du tableau : l'avertissement « Cette clé n'est affichée qu'une fois. », les lignes du .npmrc et un bouton « Copier ». La carte se ferme sur « J'ai copié la clé », et la clé n'est plus lisible nulle part.

La carte de l'accueil du compte

La section déclare un Summary : sur l'accueil de l'espace client, une carte « Projets » montre l'offre et le statut de la licence principale, le quota en usage avec sa barre (en teinte de danger une fois le quota atteint), une ligne d'alerte pour une licence en retard de paiement, suspendue ou en attente du paiement, puis les liens « Créer un projet » (vers ?nouveau=1, seulement si la licence peut recevoir un projet) et « Voir les projets ». La licence principale est la première de la section : une licence active ou en retard avant les autres, puis la plus récente. Un compte sans licence n'a pas de carte.

Pour une page du projet qui veut ces chiffres sans la carte, getAccountLicenseSummary(userId) de ./server les donne. Voir API.

Chaque action passe par la fiche de facturation liée au compte connecté : un projet d'un autre client répond 404, comme un projet qui n'existe pas.

Depuis l'admin, sur la page d'une licence : suspendre un projet (il ne compte plus, sa clé est coupée), le rétablir dans la limite du quota, le retirer, ou régénérer sa clé. Une clé régénérée par l'administration n'est montrée à personne : à réserver à une clé compromise, le client en régénère ensuite une depuis son espace.

Les identifiants

Chaque projet a au plus un identifiant en service. Avec Verdaccio, c'est un nom au registre, fz-…, et une clé, fzk_…. Son état voulu se déduit, à un seul endroit du code, du statut de la licence et de celui du projet :

LicenceProjetÉtat voulu
active, graceactiveactive
pending, suspendedquel qu'il soit, sauf retirésuspended
quelle qu'elle soitsuspendedsuspended
revokedquel qu'il soitrevoked
quelle qu'elle soitrevokedrevoked

Un identifiant remplacé par une régénération est révoqué pour de bon, quoi que fasse la licence ensuite.

La base ne garde que le SHA-256 du secret, la clé avec Verdaccio : il est aléatoire et long, un hachage lent n'ajouterait rien. Le registre retrouve une clé par ce hachage. Une copie de la base n'ouvre aucun projet.

La synchronisation

Les événements et les actions n'écrivent que l'état voulu. La tâche licenses-sync, chaque minute, appelle le connecteur qui a créé l'identifiant pour appliquer cet état, et note l'état appliqué. Un appel qui échoue garde son erreur sur la ligne, visible dans l'admin, et la tâche le reprend de moins en moins souvent : après 2, 4, 8 minutes, puis toutes les heures au plus. « Synchroniser maintenant », dans l'admin, ignore cette attente.

Aucun appel au connecteur n'a lieu dans une transaction : un fournisseur lent ne tient aucun verrou, ni du module, ni de Facturation.

Avec le connecteur verdaccio, il n'y a rien à pousser : le registre lit l'état voulu à chaque vérification. Voir Connecteurs et Verdaccio.

La révocation

Une licence suspendue garde ses projets, pour le client qui revient. La tâche de nuit la révoque après FRAZA_MODULE_LICENSES_REVOKE_AFTER_DAYS jours de suspension (365 par défaut) : la licence, ses projets et leurs identifiants passent revoked, et la section « Projets » du client ne la montre plus. L'administration peut aussi révoquer tout de suite une licence suspendue, depuis sa page.

Sur cette page