Fix no TxSp for RequestPrdBackup (doc)
This commit is contained in:
parent
cf7788abd2
commit
8844568812
@ -1,4 +1,4 @@
|
||||
<mxfile host="Electron" modified="2024-02-19T14:59:32.726Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" version="23.1.5" etag="XTTc-kidF9UoyW-cshs5" type="device">
|
||||
<mxfile host="Electron" modified="2024-02-19T15:00:24.824Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" version="23.1.5" etag="55CCTB9URSihCL27tGm0" type="device">
|
||||
<diagram id="bWoO5ACGZIaXrIiKNTKd" name="Page-1">
|
||||
<mxGraphModel dx="3341" dy="2193" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
|
@ -2,20 +2,21 @@
|
||||
* 1. [Objectif](#Objectif)
|
||||
* 2. [Portée](#Porte)
|
||||
* 3. [Documents de référence](#Documentsderfrence)
|
||||
* 4. [Authentification des utilisateurs](#Authentificationdesutilisateurs)
|
||||
* 5. [Connexion via des tiers](#Connexionviadestiers)
|
||||
* 6. [Fonctionnalité de récupération de mot de passe](#Fonctionnalitdercuprationdemotdepasse)
|
||||
* 7. [Gestion de session basée sur un cache](#Gestiondesessionbasesuruncache)
|
||||
* 8. [Wallet](#Wallet)
|
||||
* 8.1. [Descripteurs de wallet](#Descripteursdewallet)
|
||||
* 8.2. [Récupération des jetons de faucet](#Rcuprationdesjetonsdefaucet)
|
||||
* 9. [Gestion des clés de l'identité (aussi les clés des transactions SP)](#GestiondesclsdelidentitaussilesclsdestransactionsSP)
|
||||
* 9.1. [Génération des clés privées (création des identités numériques)](#Gnrationdesclsprivescrationdesidentitsnumriques)
|
||||
* 9.1.1. [Gestion de la clé servant à l'ID `spend_recover`](#GestiondelaclservantlIDspend_recover)
|
||||
* 9.1.2. [Backup de `Part2Enc`](#BackupdePart2Enc)
|
||||
* 9.1.3. [Connexions avec une identité crée (`recover`)](#Connexionsavecuneidentitcrerecover)
|
||||
* 10. [Exemples de Code](#ExemplesdeCode)
|
||||
* 11. [Todo](#Todo)
|
||||
* 4. [Schématisation des processus](#Schmatisationdesprocessus)
|
||||
* 5. [Authentification des utilisateurs](#Authentificationdesutilisateurs)
|
||||
* 6. [Connexion via des tiers](#Connexionviadestiers)
|
||||
* 7. [Fonctionnalité de récupération de mot de passe](#Fonctionnalitdercuprationdemotdepasse)
|
||||
* 8. [Gestion de session basée sur un cache](#Gestiondesessionbasesuruncache)
|
||||
* 9. [Wallet](#Wallet)
|
||||
* 9.1. [Descripteurs de wallet](#Descripteursdewallet)
|
||||
* 9.2. [Récupération des jetons de faucet](#Rcuprationdesjetonsdefaucet)
|
||||
* 10. [Gestion des clés de l'identité (aussi les clés des transactions SP)](#GestiondesclsdelidentitaussilesclsdestransactionsSP)
|
||||
* 10.1. [Génération des clés privées (création des identités numériques)](#Gnrationdesclsprivescrationdesidentitsnumriques)
|
||||
* 10.1.1. [Gestion de la clé servant à l'ID `spend_recover`](#GestiondelaclservantlIDspend_recover)
|
||||
* 10.1.2. [Backup de `Part2Enc`](#BackupdePart2Enc)
|
||||
* 10.1.3. [Connexions avec une identité crée (`recover`)](#Connexionsavecuneidentitcrerecover)
|
||||
* 11. [Exemples de Code](#ExemplesdeCode)
|
||||
* 12. [Todo](#Todo)
|
||||
|
||||
<!-- vscode-markdown-toc-config
|
||||
numbering=true
|
||||
@ -35,11 +36,11 @@ Ce système couvrira la conception et le développement de l'architecture d'auth
|
||||
|
||||
Voir [_Doc_references.md](_Doc_references.md).
|
||||
|
||||
## Schématisation des processus
|
||||
## 4. <a name='Schmatisationdesprocessus'></a>Schématisation des processus
|
||||
|
||||

|
||||
|
||||
## 4. <a name='Authentificationdesutilisateurs'></a>Authentification des utilisateurs
|
||||
## 5. <a name='Authentificationdesutilisateurs'></a>Authentification des utilisateurs
|
||||
|
||||
Les utilisateurs doivent pouvoir s'authentifier en utilisant un mot de passe et les données `exif` d'une image dite de login mise en cache dans IndexedDB pour les navigateurs et les applications mobiles, sinon en mémoire pour tous autres dispositifs dont l'IoT et une partie venant de membres choisi par les gestionnaires des membres des `ItemProcess` .
|
||||
|
||||
@ -49,23 +50,23 @@ Les utilisateurs sont reconnus par une`adresse SP` dans un ou plusieurs rôles d
|
||||
|
||||
Chaque relais permet d'accéder à la liste des process, de créer, recomposer (`recover`) et révoquer (`revoke`) une identité, et de la compléter par `ItemProcess` dans lequel l'utilisateur a un rôle (`onboarding`).
|
||||
|
||||
## 5. <a name='Connexionviadestiers'></a>Connexion via des tiers
|
||||
## 6. <a name='Connexionviadestiers'></a>Connexion via des tiers
|
||||
|
||||
Le système offrira la possibilité de se connecter via des services tiers (tels que OAuth2, avec Google, GitHub, etc.), permettant une intégration fluide avec les écosystèmes existants sans dégrader l'expérience utilisateur.
|
||||
|
||||
Pour cela, les flux de 4NK agissent en "proxy" transparent devant les flux API des services concernés, et les tokens d'accès sont ajoutés aux données de `member`. En parrallèle des flux existant, les hash des requêtes API et de leurs réponses sont signés des clés des parties prenantes pour une vérification de la conformité des données par rapport aux `ItemProcess` 4NK.
|
||||
|
||||
## 6. <a name='Fonctionnalitdercuprationdemotdepasse'></a>Fonctionnalité de récupération de mot de passe
|
||||
## 7. <a name='Fonctionnalitdercuprationdemotdepasse'></a>Fonctionnalité de récupération de mot de passe
|
||||
|
||||
En cas d'oubli de mot de passe, les utilisateurs pourront récupérer leur accès depuis une nouvelle identité (`recover`) après avoir révoqué l'ancienne identité, via un processus sécurisé, impliquant une vérification d'identité et l'échange de secrets chiffrés conformément aux protocoles établis.
|
||||
|
||||
Une image de révocation est générée à la création d'une identité pour pouvoir dépenser un UTXO dit alors de révocation, avec les flux `RequestPcd` et `RequestPrd` correspondants.
|
||||
|
||||
## 7. <a name='Gestiondesessionbasesuruncache'></a>Gestion de session basée sur un cache
|
||||
## 8. <a name='Gestiondesessionbasesuruncache'></a>Gestion de session basée sur un cache
|
||||
|
||||
Le système ne maintiendra pas de session traditionnelle sur le serveur. La navigation de l'utilisateur persiste grâce à un cache local dans IndexedDB ou en mémoire, avec une politique de sécurité stricte forçant la resaisie du mot de passe après un rafraîchissement de la page ou une inactivité prolongée, déterminée par une durée maximale sans login.
|
||||
|
||||
## 8. <a name='Wallet'></a>Wallet
|
||||
## 9. <a name='Wallet'></a>Wallet
|
||||
|
||||
Les transactions SP ont besoin de 2 clés privées Bitcoin, l'une critique sur la dépense des jetons, l'autre qui lève la confidentialité (partageable dans certains cas) :
|
||||
|
||||
@ -94,7 +95,7 @@ Dans l'ordre on génère donc :
|
||||
5. Clé privée de dépense mainnet `spend_mainnet`.
|
||||
6. Clé privée de scan du mainnet `scan_mainnet`.
|
||||
|
||||
### 8.1. <a name='Descripteursdewallet'></a>Descripteurs de wallet
|
||||
### 9.1. <a name='Descripteursdewallet'></a>Descripteurs de wallet
|
||||
|
||||
Les descripteurs de wallet sont une méthode standardisée pour décrire les scripts que le wallet peut utiliser pour dépenser des bitcoins. Ils fournissent une manière compacte et compréhensible de représenter les scripts, incluant les informations sur le type d'adresse (par exemple, P2PKH, P2SH, P2WPKH, etc.), et les clés ou chemins de clés impliqués.
|
||||
|
||||
@ -114,7 +115,7 @@ Ici, cprvN représente un placeholder pour le chemin de dérivation de chaque cl
|
||||
|
||||
Ici il s'agit du format de stockage des privées, ce pourquoi la clé privée est indiquée dans le descripteur au lieu de la `xpub` plus classiquement utilisées pour ne pas exposer les clés privées.
|
||||
|
||||
### 8.2. <a name='Rcuprationdesjetonsdefaucet'></a>Récupération des jetons de faucet
|
||||
### 9.2. <a name='Rcuprationdesjetonsdefaucet'></a>Récupération des jetons de faucet
|
||||
|
||||
Le relais retournent des jetons à la connexion et à l'envoi de messages afin de créer les `UTXO` nécessaires pour les transactions SP.
|
||||
|
||||
@ -124,11 +125,11 @@ A chaque nouveau message il génère de nouvelles addresses pour la clé qui va
|
||||
|
||||
Ces adresses apparaîtront dans l'attribut `faucet_sp_address` des messages envoyés aux relais.
|
||||
|
||||
## 9. <a name='GestiondesclsdelidentitaussilesclsdestransactionsSP'></a>Gestion des clés de l'identité (aussi les clés des transactions SP)
|
||||
## 10. <a name='GestiondesclsdelidentitaussilesclsdestransactionsSP'></a>Gestion des clés de l'identité (aussi les clés des transactions SP)
|
||||
|
||||
### 9.1. <a name='Gnrationdesclsprivescrationdesidentitsnumriques'></a>Génération des clés privées (création des identités numériques)
|
||||
### 10.1. <a name='Gnrationdesclsprivescrationdesidentitsnumriques'></a>Génération des clés privées (création des identités numériques)
|
||||
|
||||
#### 9.1.1. <a name='GestiondelaclservantlIDspend_recover'></a>Gestion de la clé servant à l'ID `spend_recover`
|
||||
#### 10.1.1. <a name='GestiondelaclservantlIDspend_recover'></a>Gestion de la clé servant à l'ID `spend_recover`
|
||||
|
||||
Les clés font 256 bits.
|
||||
|
||||
@ -174,7 +175,6 @@ Hash speudo code :
|
||||
pre_id=sha256(part1_spend_recover_enc, MDP)
|
||||
```
|
||||
|
||||
|
||||
3. Création d'un `RequestPrdKeyBackup` par membre (1 shard par membre), par `RequestPrd` :
|
||||
|
||||
3.1. Génération d'une clé de chiffrement dite `sp_shared_secret` qui sera transmise dans le Diffie-Hellman de la transaction SP.
|
||||
@ -196,7 +196,7 @@ Dans l'ordre on réalise donc les opérations suivantes donc :
|
||||
5. Chiffrement AES de `Part2`.
|
||||
6. Sharding de `Part2Enc`.
|
||||
|
||||
#### 9.1.2. <a name='BackupdePart2Enc'></a>Backup de `Part2Enc`
|
||||
#### 10.1.2. <a name='BackupdePart2Enc'></a>Backup de `Part2Enc`
|
||||
|
||||
Les relais initialisent le SDK (Wasm) par défaut avec une liste `SharedProcessList` de `SharedProcess` contenant les membres du rôle `member` du `ItemProcess` choisi.
|
||||
|
||||
@ -275,7 +275,7 @@ Les clés privées associées sont générées lors de l'update d'un membre, à
|
||||
|
||||
Lorsqu'une transaction est reçue sur l'application de 2FA, celle-ci demande de confirmer ou non. Si il y a une confirmation dans l'interface alors une transaction SP est envoyée au dispositif initial, en dépensant l'UTXO reçue et avec les mêmes Hash dans les outputs que la transaction reçue afin que le dispositif initial puisse collecter les `RequestPrd` concernés.
|
||||
|
||||
#### 9.1.3. <a name='Connexionsavecuneidentitcrerecover'></a>Connexions avec une identité crée (`recover`)
|
||||
#### 10.1.3. <a name='Connexionsavecuneidentitcrerecover'></a>Connexions avec une identité crée (`recover`)
|
||||
|
||||
Pour recrééer sa clé privée et envoyer un `RequestPrdKeyHello` à chaque membre du rôle `Member` du process, il faut réaliser les opérations suivantes :
|
||||
|
||||
@ -303,9 +303,9 @@ Demande d'update de la liste des membres ( RequestPcd) d'un `ItemProcess` :
|
||||
4. Création d'une nouvelle version du `RequestPcd` avec l'ajout de l'`ItemMember` créé.
|
||||
5. Redirection vers la page du `ItemProcess` sur le relai.
|
||||
|
||||
## 10. <a name='ExemplesdeCode'></a>Exemples de Code
|
||||
## 11. <a name='ExemplesdeCode'></a>Exemples de Code
|
||||
|
||||
## 11. <a name='Todo'></a>Todo
|
||||
## 12. <a name='Todo'></a>Todo
|
||||
|
||||
* [ ] Extraits de code illustrant l'utilisation des `RequestPcd` et `RequestPrd` dans des scénarios réels.
|
||||
* [ ] Diagrammes de séquences
|
||||
|
@ -1,4 +1,4 @@
|
||||
<mxfile host="Electron" modified="2024-02-19T15:00:24.824Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" version="23.1.5" etag="55CCTB9URSihCL27tGm0" type="device">
|
||||
<mxfile host="Electron" modified="2024-02-19T15:03:25.006Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" version="23.1.5" etag="AKfwIANYmOMw6AJxKc1C" type="device">
|
||||
<diagram id="bWoO5ACGZIaXrIiKNTKd" name="Page-1">
|
||||
<mxGraphModel dx="3341" dy="2193" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
@ -315,30 +315,6 @@
|
||||
<mxCell id="204" value="RequestPrdKeyBackup" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=#000000;" parent="1" vertex="1">
|
||||
<mxGeometry x="-1217.4914331962004" y="305.00000000000006" width="152.39494830511973" height="28.99999999999996" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="207" value="TxSp" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=#000000;" parent="1" vertex="1">
|
||||
<mxGeometry x="-934.9958220112518" y="285" width="152.39494830511973" height="28.99999999999996" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="213" value="TxSp" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=#000000;" parent="1" vertex="1">
|
||||
<mxGeometry x="-917.8368280810985" y="295" width="152.39494830511973" height="28.99999999999996" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="214" value="TxSp" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=#000000;" parent="1" vertex="1">
|
||||
<mxGeometry x="-900.677834150945" y="305" width="152.39494830511973" height="28.99999999999996" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="215" value="RequestPrdMessage" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=#000000;" parent="1" vertex="1">
|
||||
<mxGeometry x="-720.0049483051198" y="285.00000000000006" width="152.39494830511973" height="28.99999999999996" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="220" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="204" target="214" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="225" value="RequestPrdMessage" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=#000000;" parent="1" vertex="1">
|
||||
<mxGeometry x="-710.0049483051198" y="295.00000000000006" width="152.39494830511973" height="28.99999999999996" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="226" value="RequestPrdMessage" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fontColor=#000000;" parent="1" vertex="1">
|
||||
<mxGeometry x="-700.0049483051198" y="305.00000000000006" width="152.39494830511973" height="28.99999999999996" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="227" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="214" target="226" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="228" value="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;container=0;rounded=1;labelBackgroundColor=none;fontColor=#333333;fillColor=#f5f5f5;strokeColor=#666666;" parent="1" vertex="1">
|
||||
<mxGeometry x="-1213.97" y="371.78" width="28.93" height="28.93" as="geometry" />
|
||||
</mxCell>
|
||||
@ -351,60 +327,9 @@
|
||||
<mxCell id="232" value="4" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;container=0;rounded=1;labelBackgroundColor=none;fontColor=#333333;fillColor=#f5f5f5;strokeColor=#666666;" parent="1" vertex="1">
|
||||
<mxGeometry x="-1094.03" y="371.78" width="28.93" height="28.93" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="237" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="226" target="241" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="-623.51" y="336" as="sourcePoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="-624" y="355" />
|
||||
<mxPoint x="-682" y="355" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="238" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="226" target="242" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="-623.51" y="336" as="sourcePoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="-624" y="355" />
|
||||
<mxPoint x="-641" y="355" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="239" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="226" target="243" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="-630" y="335" as="sourcePoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="-624" y="355" />
|
||||
<mxPoint x="-602" y="355" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="240" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="226" target="244" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="-623.51" y="336" as="sourcePoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="-624" y="355" />
|
||||
<mxPoint x="-560" y="355" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="241" value="5" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;container=0;rounded=1;labelBackgroundColor=none;fontColor=#333333;fillColor=#f5f5f5;strokeColor=#666666;" parent="1" vertex="1">
|
||||
<mxGeometry x="-696.48" y="373.78" width="28.93" height="28.93" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="242" value="6" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;container=0;rounded=1;labelBackgroundColor=none;fontColor=#333333;fillColor=#f5f5f5;strokeColor=#666666;" parent="1" vertex="1">
|
||||
<mxGeometry x="-655.4100000000001" y="373.78" width="28.93" height="28.93" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="243" value="7" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;container=0;rounded=1;labelBackgroundColor=none;fontColor=#333333;fillColor=#f5f5f5;strokeColor=#666666;" parent="1" vertex="1">
|
||||
<mxGeometry x="-616.48" y="373.78" width="28.93" height="28.93" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="244" value="8" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;container=0;rounded=1;labelBackgroundColor=none;fontColor=#333333;fillColor=#f5f5f5;strokeColor=#666666;" parent="1" vertex="1">
|
||||
<mxGeometry x="-576.54" y="373.78" width="28.93" height="28.93" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="245" value="Relais WS" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="-1172.9" y="402.71000000000004" width="60" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="246" value="Relais WS" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="-647.5500000000002" y="407.06000000000006" width="60" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="258" value="SHA-256" style="label;whiteSpace=wrap;html=1;image=img/clipart/Gear_128x128.png" parent="1" vertex="1">
|
||||
<mxGeometry x="-511" y="141.86" width="125" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 173 KiB |
Loading…
x
Reference in New Issue
Block a user