> La révision linguistique de cette traduction est en cours. En cas d’ambiguïté, consultez l’[original anglais](https://www.sm.ch-j.eu/docs/i18n/en/server-diagnostics.md). # Diagnostic du serveur Intégré dans la barre latérale du noyau, dans l'ordre Plugins → Diagnostics du serveur → Hash & Sommes de contrôle. Il ne nécessite pas de session SSH ou de plugin téléchargé. Tous les codes d'exécution, les tests et les installations sont en direct dans `app/`; le module n'est pas dépendant des dépôts de frères et sœurs. Le dépôt n'a pas de `doc.md`, donc ce document et les deux README décrivent l'implémentation. ## Déroulement de l'utilisateur Saisissez un nom d’hôte, une adresse IPv4 ou IPv6, ou une URL HTTP(S)/WS(S). Sans schéma, les noms d’hôte et les adresses IP utilisent HTTPS par défaut ; les URL explicites conservent leur chemin, leur requête et leur port. Les identifiants dans les URL, les schémas non pris en charge, les espaces et caractères de contrôle, ainsi que les noms d’hôte ressemblant à des commandes shell sont refusés. Les adresses IPv6 littérales sont automatiquement placées entre crochets ; les identifiants de zone, notamment pour les adresses de lien local, ne sont pas pris en charge par l’analyseur d’URL. Choisissez Auto (préférez IPv4, sinon IPv6), IPv4 ou IPv6. Résoudre les adresses pour choisir une réponse courante particulière. La vue d'ensemble affiche toutes les réponses résolues; les sondes testent l'adresse sélectionnée ou une adresse par famille demandée. Les deux familles sont mesurées indépendamment. La seule présence de l'AAAA n'implique jamais le fonctionnement de la connectivité IPv6. Exécuter Diagnostics exécute DNS, ping, traceroute, HTTP, compression, TLS et les ports TCP sélectionnés. WebSocket est opt-in. Chaque outil dispose également d'un contrôle d'exécution/arrêt séparé. Un exercice de diagnostic peut être actif en même temps. Un parcours terminé signifie que les outils ont fini, pas que toutes les sondes ont réussi. Il n'y a pas de verdict de couverture hors ligne. Timeout, nombre de paquets, répétitions, maximum de hop, résolveur DNS, sélection du protocole, connexion chaude et comparaison HTTP/HTTPS sont configurables. Changer la cible efface une IP précédemment sélectionnée. L'historique peut rouvrir, comparer deux rapports, supprimer, importer JSON, copier ou exporter JSON/CSV/TXT dans les dialogues de base natifs. Le thème Light/dark/system s'applique à la section diagnostics et est sauvegardé dans la configuration d'interface utilisateur existante. CZ/DE/EN suit immédiatement la langue de l'application. ## Composants et comportement du protocole | Composant | Mise en œuvre et interprétation | | --- | --- | | `common.js` | Valide les cibles/options, les limites et les valeurs enum; conversion IDNA; les statistiques numériques excluent les valeurs inconnues. | | `dnsDiagnostics.js` La résolution d'adresses du système | utilise `dns.lookup` pour honorer la configuration de l'OS et les fichiers hôtes. Les requêtes d'enregistrement utilisent UDP DNS limité avec le repli TCP pour les réponses tronquées contre `dns.getServers()`, ou le résolveur public/Custom explicitement choisi. Aucun changement implicite vers le public DNS. | | `processTools.js` | Exécute OS ping/traceroute avec un tableau d'arguments et `shell: false`, sortie limitée, délai d'exécution explicite et nettoyage avorté/de l'habileté. Parses les réponses de paquets et le saut, plutôt que de traiter la durée du processus comme RTT. | | `httpDiagnostics.js` | boucle groupée pour HTTP/1.1, HTTP/2 et HTTP/3; vérification stricte du certificat et famille IP épinglée. Chaque version est demandée indépendamment; la version réelle est enregistrée. | | `socketDiagnostics.js` | Explicite TLS sondes de version, connections TCP limitées/ bannières passives, pré-authentification SSH l'observation clé d'hôte en utilisant la dépendance existante ssh2, et le RFC optionnel 6455 Validation de mise à niveau. | | `diagnosticsService.js` | Exécute et annule les outils, sélectionne/valide les adresses, progresse les flux, préserve les mesures partielles et possède la date limite d'exécution. | | `historyStore.js` | Historique local, redondance, importations contrôlées par schéma et exportations de données mesurées. | ### ICMP et itinéraires Ping par défaut à quatre requêtes d'écho ICMP exécutées individuellement. Les résultats contiennent les valeurs mesurées par paquet, les nombres reçus/envoyés, la perte, min/average/max, l'écart-type de population, la différence absolue moyenne entre les valeurs mesurées consécutives (jitter), la limite TTL/Hop lorsqu'elle est imprimée et les timestamps. Une réponse `<1 ms` est comptée comme reçue avec une limite supérieure, plutôt que d'inventer un RTT numérique. Les TCR inconnus sont exclus des statistiques de la latence. Les statistiques utilisent la fenêtre conservée de la plupart des paquets 500; les comptes envoyés/received/loss couvrent l'ensemble de l'exécution. Les graphiques montrent les dernières observations 200, avec des symboles distincts pour les réponses, les réponses à la sous-résolution, les réponses manquantes et les délais de requête/processus explicites. Une réponse manquante peut refléter le filtrage ICMP, la perte de paquets ou l'arrêt du temps; ces observations ne peuvent pas identifier un pare-feu de manière concluante. Les exécutables manquants, les erreurs de permission locale et les invocations d'outils invalides sont des erreurs d'outil distinctes, et non la perte de paquets ou l'indisponibilité du serveur. Aucune escalade des privilèges n'est demandée. Traceroute streams houblon, adresses, sondes individuelles, moyens et pourcentages observés sans réponse. L'inversion de DNS est résolue après la route, en utilisant le résolveur sélectionné. Les répétitions comparent les séquences observées d'adressage de houblon; les différences peuvent refléter l'équilibrage de la charge. Les houblons intermédiaires sans réponse n'établissent pas de route interrompue. Les métadonnées et la méthode de la sonde brute apparaissent dans des détails extensibles. macOS nécessite des attentes de trace de seconde entière; le temps d'arrêt effectif arrondi est enregistré. ### DNS Les douze types d'enregistrements sont A, AAAA, CNAME, MX, NS, TXT, SOA, SRV, CAA, PTR, DS et DNSKEY. L'analyse par fil DNS permet de vérifier l'identité des transactions/questions, la taille des enregistrements, les boucles de pointeur de compression et les limites des messages. Les réponses conservent les TTL d'enregistrement, le timing des requêtes, le résolveur et les états NXDOMAIN/NODATA/SERVFAIL/refused/timeout. Les recherche d'adresses OS ne peuvent pas fournir TTL; la requête d'enregistrement séparée peut. Le CNAME suivant est limité à huit liens avec la détection du cycle. La cohérence répète les réponses A/AAAA du résolveur sélectionné, et effectue le PTR confirmé par l'avant pour les tests DNS littéraux IP. Les réponses modifiées sont des observations, pas une preuve d'un défaut DNS. Les requêtes pour SRV utilisent le nom de la cible comme indiqué; saisissez un nom de service tel que `_service._tcp.example.org` au besoin. DNSSEC est toujours **non validé**. La présence DS/DNSKEY et même le drapeau AD d'un résolveur ne sont jamais traités comme une validation indépendante. ### HTTP, performance et compression HTTP/1.1 accepte cette version comme prise en charge seulement quand elle a été effectivement retournée. HTTPS HTTP/2 nécessite un h2 négocié; aucun retour en arrière n'est remarqué. Cleartext HTTP/2 utilise des connaissances antérieures, et non une sonde HTTP/1.1 Upgrade. La vérification TLS reste stricte pour chaque requête HTTP/WebSocket. Les redirections manuelles sont limitées à huit ; les boucles, les destinations invalides et les redirections excessives entraînent une erreur explicite. La chaîne complète enregistre les changements de domaine et les passages de HTTPS à HTTP ; les changements de schéma et de préfixe www sont visibles dans les URL source et destination. Les identifiants et les schémas de redirection autres que HTTP(S) sont refusés. Chaque redirection vers un autre hôte est résolue indépendamment avec le résolveur sélectionné et la famille IP demandée. Les mesures comprennent DNS (lorsqu'elles sont effectuées), TCP, TLS, TTFB réponse finale, tTFB globale incluant DNS/redirects, téléchargement, redirection et temps mural total, octets d'entité réels, vitesse de transfert, état, en-têtes de réponse, adresse/port du serveur réel, ALPN et réutilisation de connexion vérifiée. Les phases DNS/TCP/TLS non réalisées sur une connexion épinglée ou réutilisée sont `N/A`, pas de faux zéros. QUIC n'a pas de phase TCP; sa poignée de main est enregistrée séparément. Le transfert d'en-têtes ou les frais généraux de fil intégral ne sont pas déclarés comme étant des mesures par octet-entité. Il s'agit des chronométrages serveur/réseau, pas du rendu de page ou des scores Lighthouse. Chaque protocole sélectionné utilise la même cible et les mêmes répétitions. IPv4/IPv6 et HTTP/HTTPS sont des options de comparaison explicites. Le schéma alternatif utilise son port par défaut. Chaque protocole commence un processus indépendant de client groupé par échantillon. La réutilisation des connexions n'est pas affirmée. Les statistiques du temps total incluent min/average/median/max/nearest-rank P95 et un taux d'erreur de transport/protocole séparé; les codes d'état HTTP restent visibles même lorsqu'un serveur retourne avec succès une réponse 4xx/5xx. La compression envoie l'identité, gzip, dégonfler, br et (lorsque l'exécution le supporte) zstd comme requêtes d'acceptation-encodage séparées. L'encodage du contenu doit correspondre, et la décompression limitée doit réussir. Un rapport n'est calculé que si le hachage du corps décodé, l'URL finale et l'état correspondent à la base d'identité. Les encodages ignorés ne sont pas pris en charge; les corps changeants/dynamiques n'ont pas de rapport. C'est une observation pour cette URL/status, et non pour la prise en charge du serveur universel. Les vérifications en-tête de sécurité montrent la présence et la valeur du SST, du CSP, des options de type X-Content, du référent-Politique, des autorisations-Politique et des options de cadre X. Une directive CSP frame-ancestors peut remplacer cette dernière. La présence n'établit pas que la politique est correctement configurée ou que le site Web est sécurisé. ### Exigences et preuve de HTTP/3 HTTP/1.1, HTTP/2 et HTTP/3 utilisent le même client de boucle groupé. macOS arm64 et Linux x64 utiliser la boucle 8.22.0, OpenSSL 3.5.9, nghttp2 1.70.0, ngtcp2 1.25.0 et nghttp3 1.18.0. Windows x64 utilise la compilation statique Curl-for-win officielle Curl.se 8.22.0_3 avec LibreSSL 4.3.3 et les mêmes bibliothèques HTTP. Aucun retour en boucle système, téléchargement d'exécution ou autorisation de l'administrateur n'est nécessaire. La recette de construction reproductible en amont de Windows est https://github.com/curl/curl-for-win/tree/9d77e31e . Construisez avec `python3 scripts/native/build.py` (Windows: `python scripts/native/build.py`) avant emballage. macOS/Linux nécessite des outils C/C++, CMake, Ninja, Perl, make et pkg-config. Les sources sont épinglées par la version et en amont SHA-256 dans `scripts/native/dependencies.lock.json`. Le script vérifie chaque téléchargement, relie statiquement les bibliothèques de transport tiers et échoue sans les fonctionnalités HTTP2/HTTP3/SSL. Seules les bibliothèques du système d'exploitation restent dynamiques. Windows utilise l'archive binaire officielle épinglée, et non une pile de transport Windows compilée localement. Le fichier CA groupé a son propre hachage épinglé; les licences de composants et la provenance de construction en amont accompagnent l'exécution. Le client et le magasin de fiducie sont installés à l'extérieur app.asar dans `resources/native-runtime/-/`. Chaque diagnostic vérifie les hachages de composants, l'architecture et les capacités exécutables avant utilisation. Les fichiers Config, les proxies, les overpassements d'environnement de confiance TLS et les variables d'injection de bibliothèque sont exclus. curl fonctionne avec un chemin absolu, shell désactivé, confiance CA vérifiée, une famille d'IP explicitement résolue, aucun cookies, aucune redirection automatique, et la sortie et le temps délimités. Les redirections sont validées et résolues par la demande. HTTPS sur les ports autres que 443 est pris en charge. HTTP/3 utilise `--http3-only` et n'est confirmé qu'après un transfert complet de rapport de la version HTTP 3 avec vérification du certificat. Les réponses aux erreurs HTTP telles que 404 peuvent confirmer le protocole. Alt-Svc est une publicité, pas une preuve. Le délai QUIC, la défaillance du certificat, la défaillance DNS, le refus de connexion, le protocole incompatible et la défaillance des composants restent distincts. Un timeout UDP laisse le support du serveur non vérifié. Le timing de la poignée de main QUIC n'est pas indiqué comme timing TCP. Chaque mesure commence un processus/connection séparé. L'option chaude ne prétend pas réutiliser la connexion pour le client groupé. Cela maintient les comparaisons de protocole cohérents. Les rapports incluent les versions d'exécution, les capacités, la vérification TLS et le timing QUIC, tandis que l'historique/export supprime les corps, les requêtes URL et les en-têtes d'authentification. Mettre à jour ces broches et reconstruire chaque plate-forme prise en charge lors de la mise à jour de la pile de transport ou du magasin de confiance CA. Les artefacts publiés et les instantanés sources sont immuables. ## CIB de base Le préchargement n'expose que `window.chjCore.diagnostics` ; tous les gestionnaires conservent la vérification de l'expéditeur de fenêtre principale existante et les travaux en réseau restent en main. Les résultats utilisent `{ ok: true, value }` ou `{ ok: false, error: { code, message } }`. | Chaîne / méthode de précharge | Charge utile / résultat | | --- | --- | | `diagnostics:resolve` / `resolve(options)` | Cible/réglages validés → adresses cibles et résolues. Au plus deux demandes de résolution simultanées. | | `diagnostics:start` / `start(options)` | Sélection de la cible validée/settings/tool → ID d'emploi opaque et rapport initial. | | `diagnostics:cancel` / `cancel(id, tool?)` | Annuler un outil actif/queued ou l'exécution complète. | | `diagnostics:get` / `get(id)` | Capture instantanée d'un rapport connu exécuté ou enregistré. | | `diagnostics:history` / `history()` Sommaires d'historique local |. | | `diagnostics:removeHistory` / `removeHistory(id)` | Supprimer l'élément d'historique sélectionné. | | `diagnostics:copy` / `copy(id, format)` | Main écrit un rapport connu expurgé au presse-papiers. | | `diagnostics:export` / `export(id, format)` | JSON/CSV/TXT via la boîte de dialogue native save ; le rendeur ne peut pas fournir un chemin du système de fichiers. | | `diagnostics:import` / `import()` Sélecteur de fichiers natif |, validation et reformulation de la taille /schema/depth avant stockage. | | `diagnostics:progress` / `onProgress(callback)` | Adresses résolues, démarrage/complétions d'outils, paquets, houblons, échantillons HTTP et achèvement; retourne un callback de désabonnement. | Aucun shell générique, système de fichiers ou réseau API n'est exposé. L'isolement du contexte, le bac à sable, l'intégration des nœuds désactivés et le rendu existant CSP restent activés. Les contrats de plugin existants et la vérification/exceptions de mise à jour sont inchangés. ## Budgets et données locales - Une course, deux outils actifs, au plus deux sondes IP-famille par outil; TCP limite en outre chaque adresse à quatre connexions. - Timeout par opération 250–30000 ms; paquets 1–100, répétitions 1–20; ports 1–40 hop, 1–16. Les courses régulières s'arrêtent à cinq minutes; les ping continus à trente minutes. Le sous-processus traceroute a un nouveau bouchon 180-seconde. - Sortie du processus normalement 256 KiB; corps de l'entité HTTP 2 MiB; corps décompressé 8 MIB; en-têtes HTTP limités; aucun corps de réponse n'entre dans l'historique. - Conservez au plus les paquets/événements de progrès 500, cinq sorties en mémoire, trente rapports d'historique et 10 MiB d'histoire. L'historique utilise l'auteur atomique privé existant à `/diagnostics/history.json` (mode 0600). - Les importations sont au plus 2 MiB, schéma 1, avec des collections de résultats limitées et validées. Les cellules CSV sont échappées et la formule préfixe neutralisée. Les requêtes/fragments d'URL, les identifiants, les cookies, les en-têtes d'authentification et les corps bruts sont exclus des rapports /copied/exported stockés. Les détails bruts montrent des données structurées mesurées, et non un corps de capture ou de réponse conservé. - Pas de synchronisation cloud, connexion automatique, modification de configuration du serveur ou balayage agressif/non lié. L'utilisateur choisit explicitement la cible/ports/resolver. ## Exigences de la plate-forme et vérification | Plateforme | ICMP | Route | Autres protocoles | | --- | --- | --- | --- | | Windows 10/11 | `ping.exe -4/-6` | `tracert.exe -4/-6`, ICMP | Bundled curl.exe avec HTTP/2 et HTTP/3. Les champs RTT localisés ne dépendent pas du mot "time". | | macOS | `/sbin/ping`, `/sbin/ping6` | `/usr/sbin/traceroute`, `/usr/sbin/traceroute6`, UDP; attente en entier-seconde | Courroie enroulée HTTP/2 et HTTP/3. | | Ubuntu/Linux | iputils `ping -4/-6` standard | norme `traceroute -4/-6`, UDP | boucle groupée avec HTTP/2 et HTTP/3; les outils ICMP/route manquants sont signalés séparément. | Aucune nouvelle dépendance npm n'a été ajoutée. La mise en œuvre utilise les composants Node et l'application existante ssh2. Il n'installe ni outils système, ni demande de droits administratifs. Les pare-feu et les restrictions UDP peuvent empêcher un test d'établir un support; ils ne peuvent être déduits d'un temps mort seul. La couverture automatisée est en `diagnosticsCore.test.js`, `diagnosticsNetwork.test.js`, `diagnosticsHttp.test.js` et `diagnosticsIpc.test.js`: validation/IPv6 Littéralement, natif/local DNS Fixations UDP+TCP, réponses manquantes/duelles-familles et erreurs de résolution, CNAME/cohérence, Fixations OS argument/parsage, processus d'enfant réels limités, observations ICMP bloquées, réel local HTTP/1.1 et TLS h2, redirections/limites du corps/timeouts/reuse, la compression est activée/ignée, HTTP3 capacité/résultats de réussite parsing/rejection, confiance locale de l'AC/mismatch/expiration et réels IPv6 HTTP/HTTPS, connexion TCP/refused/mock timeout, véritable WebSocket et SSH poignées de main pré-authentification, annulation/cleanup/partial résultats, état hors ligne, historique privé aller-retour/rejeter l'importation/exports, confiance IPC et précharger des abonnements. `npm test` exécute des tests déterministes sans serveurs de test publics. `npm run test:diagnostics:ui` exécute `scripts/smokeDiagnostics.js` dans un bureau graphique Electron, en utilisant la production UI/preload/IPC et de véritables sondes locales HTTP/compression. Les services non liés ne sont enclenchés/offline que dans ce harnais d'essai. Il vérifie l'ordre de navigation, les résultats du protocole, la persistance, CZ/DE/EN, les deux thèmes, le débordement de fenêtre étroit et les préférences des bacs à sable. Si le shell définit ELECTRON_RUN_AS_NODE, désactivez-le pour cette commande. La vérification d'exécution en cours couvre les transferts QUIC contrôlés, IPv4/IPv6, HTTPS sur un port non par défaut, les réponses 404 et les défaillances TLS ainsi qu'une publicité de service exclusivement TCP Alt-Svc. Les résultats par construction accompagnent chaque sortie. Limites facultatives explicites : aucune validation DNSSEC indépendante (nécessite un cycle de vie complet du résolveur/fiduciaire), aucun audit phare (serveur/réseau uniquement), aucun service d'audit ou de révocation/CT déprécié TLS, aucune réclamation de réutilisation à chaud HTTP3 et aucune mesure de réutilisation à chaleur HTTP/3. Les capacités non prises en charge sont affichées plutôt que simulées. ## Fichiers dans ce changement Création : les sept fichiers de service dans `src/main/diagnostics/`; `src/renderer/diagnostics.js`, `diagnosticsI18n.js` et `diagnostics.css` ; les quatre fichiers `test/diagnostics*.test.js` : cinq fichiers sous `test/fixtures/diagnostics/` ou `scripts/smokeDiagnostics.js`. Intégration/mise à jour : `src/main/index.js`, `src/main/ipc/registerCoreIpc.js`, `src/preload/corePreload.js`, `src/renderer/index.html`, `app.js`, `i18n.js`, `package.json`, `app/README.md`, racine `README.md`, `.gitignore` (quatre exceptions de fixation publique) et les gitleaks racinaires permettent de désigner de façon étroite le public délibérément TLS le montage de la clé d'essai. La clé privée CA de signature a été supprimée; le montage n'est jamais utilisé par l'exécution de l'application.