Relus, empreintés,
et jamais modifiés après publication.

Un système de plugins est une invitation à exécuter le code de quelqu’un d’autre sur vos fichiers. Cette page porte sur ce à quoi cette invitation est limitée ici : ce que veut dire la relecture, ce que l’app revérifie avant d’installer quoi que ce soit, et ce qu’un plugin ne peut pas atteindre même après votre accord.

Studio 1.17.1 · macOS 14+8.5 MB à télécharger
Linelark Studio avec le panneau d’un plugin de formatage installé dans le dock de droite, à côté du fichier qu’il formaterait
Un plugin relu, dessiné par l’app elle-mêmeStudio 1.17.1 · macOS 14+

Ce qui se dresse entre un plugin et vos fichiers.

Quatre étapes distinctes, dont chacune peut refuser : la relecture, l’entrée de catalogue, le téléchargement, et les permissions que vous accordez ensuite.

01

Une version est immuable une fois publiée

L’archive est construite de façon déterministe et son SHA-256 consigné. Une nouvelle soumission dont les octets diffèrent est refusée plutôt que fusionnée : toute modification — même une seule ligne reformulée — doit devenir une nouvelle version avec sa propre relecture.

02

L’empreinte est revérifiée sur votre machine

Après le téléchargement, l’app recalcule le SHA-256 et le compare à la valeur relue, et vérifie que la taille correspond à celle enregistrée. Une différence refuse l’installation purement et simplement plutôt que d’avertir.

03

L’URL de téléchargement ne peut pas pointer ailleurs

Une entrée de catalogue n’est acceptée que si son URL de téléchargement est en https, sur linelark.com, au chemin exact de ce plugin et de cette version, sans chaîne de requête ni fragment. Un catalogue altéré ne peut pas rediriger une installation vers un autre hôte.

04

L’archive elle-même est contrainte

Aucun lien symbolique, aucun chemin sortant du bundle, 1 000 entrées au maximum, 20 Mo décompressés et 50 Mo compressés au maximum. Un zip qui tente l’un de ces écarts est rejeté avant que rien ne soit écrit.

05

Les capacités sont déclarées, puis accordées séparément

Le manifeste demande l’accès en écriture à git, des hôtes nommés, et des identifiants nommés. Installer n’accorde rien — vous activez chaque élément dans Gérer les plugins, et le panneau montre exactement ce qui a été demandé.

06

Changer ce qu’un plugin demande révoque votre accord

Les permissions sont liées à une empreinte des capacités du manifeste. Une mise à jour qui ajoute un hôte, ou qui déplace un identifiant vers un autre en-tête, doit redemander depuis zéro plutôt que d’hériter du oui donné à la version précédente.

Ce qu’un plugin ne peut pas faire, quoi qu’il demande.

Ce sont des propriétés de la surface d’API plutôt que des promesses sur le comportement des plugins. Une capacité qui n’existe pas ne peut être ni demandée, ni détournée, ni accordée par erreur.

LimiteComment elle est tenue
Lire un identifiant stockéAucun appel n’en renvoie un. Un plugin peut demander si un identifiant existe et peut en confier un ; la valeur est attachée aux requêtes par l’hôte et n’entre jamais dans le contexte du plugin.
Envoyer un identifiant ailleursChaque identifiant est lié dans le manifeste à un seul hôte et à un seul en-tête. L’hôte ne l’attache qu’aux requêtes destinées à cet hôte.
Atteindre un hôte non déclaréHTTPS uniquement, hôtes comparés exactement sans caractères génériques, redirections non suivies, réponses plafonnées à 5 Mo.
Toucher des fichiers arbitrairesIl n’y a aucune API de système de fichiers. Le stockage d’un plugin est un seul fichier JSON désigné par son propre identifiant, sans chemin à nommer, plafonné à 4 Mo et 2 000 clés.
Écrire sur le disque discrètementLa seule sortie est une fenêtre d’enregistrement. La fenêtre est le consentement : il n’y a donc aucun argument de chemin qu’un plugin puisse choisir.
Forcer un push, réinitialiser ou fusionnerAucun appel de ce genre n’existe. Le pull est en avance rapide seulement, et un push divergent est rejeté par git lui-même.
Jeter vos modifications sans demanderL’hôte affiche lui-même cette confirmation, avant l’appel, parce qu’un plugin ne peut pas montrer de fenêtre de dialogue et qu’un plugin qui le pourrait serait la mauvaise chose à qui confier cela.
Se charger sur un hôte trop ancienUn plugin déclare la génération d’API pour laquelle il a été écrit, et une app plus ancienne refuse de le charger et le dit, plutôt que de perdre la moitié de son panneau en silence.

Lu dans le code publié de Linelark Studio 1.17.1, et non dans sa documentation. Quand les deux divergent, c’est celui-ci qui est livré.

Les limites de ce modèle.

Les mécanismes ci-dessus sont réels et vérifiables. Les parties qui ne sont pas mécaniques méritent d’être nommées, parce qu’une page sur la confiance qui ne liste que des forces n’est pas une page sur la confiance.

  • La relecture, c’est une personne qui lit le codeIl n’y a ni audit formel, ni évaluation par un tiers, ni analyse automatisée de logiciels malveillants. Relire veut dire que le bundle a été empaqueté, validé et lu par le responsable du catalogue, en regard des permissions qu’il demande.
  • Une permission accordée est une vraie permissionL’accès en écriture à git veut dire qu’un plugin peut indexer, valider, changer de branche et pousser. L’accès réseau veut dire qu’il peut parler aux hôtes qu’il a déclarés. Les portes sont un consentement, pas un bac à sable à l’intérieur du consentement.
  • Un plugin peut figer l’éditeurLes scripts s’exécutent sans chien de garde. Un plugin qui ne rend jamais la main gèlera l’app jusqu’à ce qu’on la force à quitter, et l’API contrainte ne peut pas l’empêcher.
  • L’installation manuelle contourne entièrement le catalogueUn dossier de plugin installé à la main n’est comparé à aucune empreinte, parce qu’il n’y a rien à quoi le comparer. Les garanties de cette page portent sur les installations depuis le catalogue.

Ouvrez-le sur
vos propres fichiers.

Notarisé par Apple, macOS 14 et versions ultérieures, Intel et Apple silicon.

Télécharger Studio 1.17.1 8.5 MB · toutes les versions, avec leurs empreintes