# Server Diagnostics Terintegrasi ke bilah sisi Core dengan urutan Plugins → Server Diagnostics → Hash & Checksum. Fitur ini tidak memerlukan sesi SSH atau plugin yang diunduh. Semua kode runtime, pengujian, dan fixture berada di `app/`; modul ini tidak bergantung pada repositori saudara. Repositori tidak memiliki `doc.md`, sehingga dokumen ini dan kedua README menjelaskan implementasinya. ## Alur kerja pengguna Masukkan nama host, IPv4, IPv6, atau URL HTTP(S)/WS(S). Nama host/IP tanpa skema secara default menggunakan HTTPS; URL eksplisit mempertahankan jalur, kueri, dan port-nya selama permintaan. Kredensial dalam URL, skema yang tidak didukung, spasi/karakter kontrol, dan nama host yang menyerupai perintah shell ditolak. Literal IPv6 otomatis diapit tanda kurung siku; pengenal zona scoped/link-local tidak didukung oleh parser URL. Pilih Auto (utamakan IPv4, jika tidak ada gunakan IPv6), IPv4, IPv6, atau Both (Keduanya). Resolve alamat untuk memilih jawaban tertentu yang berlaku saat ini. Ikhtisar menampilkan semua jawaban hasil resolve; probe menguji alamat yang dipilih atau satu alamat per keluarga yang diminta. Kedua keluarga diukur secara independen. Keberadaan AAAA saja tidak pernah berarti konektivitas IPv6 berfungsi. Run Diagnostics (Jalankan diagnostik) menjalankan DNS, ping, traceroute, HTTP, kompresi, TLS, dan port TCP yang dipilih. WebSocket harus diaktifkan secara eksplisit. Setiap alat juga memiliki kontrol Run/Stop (Jalankan/Hentikan) tersendiri. Hanya satu proses diagnostik yang dapat aktif sekaligus. Proses yang selesai berarti alat-alat telah selesai bekerja, bukan berarti setiap probe berhasil. Tidak ada vonis menyeluruh “server offline”. Batas waktu, jumlah paket, pengulangan, hop maksimum, resolver DNS, pilihan protokol, koneksi warm, dan perbandingan HTTP/HTTPS dapat dikonfigurasi. Mengubah target akan menghapus IP yang dipilih sebelumnya. Riwayat dapat membuka kembali, membandingkan dua laporan, menghapus, mengimpor JSON, menyalin, atau mengekspor JSON/CSV/TXT melalui dialog Core native. Tema terang/gelap/sistem berlaku untuk bagian diagnostik dan disimpan dalam konfigurasi UI yang ada. CZ/DE/EN langsung mengikuti bahasa aplikasi. ## Komponen dan perilaku protokol | Komponen | Implementasi dan interpretasi | | --- | --- | | `common.js` | Memvalidasi target/opsi, batas, dan nilai enum; konversi IDNA; statistik numerik mengecualikan nilai yang tidak diketahui. | | `dnsDiagnostics.js` | Resolusi alamat sistem menggunakan `dns.lookup` agar mengikuti konfigurasi sistem operasi dan file hosts. Kueri rekaman menggunakan DNS UDP terbatas dengan fallback TCP untuk respons terpotong terhadap `dns.getServers()`, atau resolver kustom/publik yang dipilih secara eksplisit. Tidak ada peralihan implisit ke DNS publik. | | `processTools.js` | Menjalankan ping/traceroute sistem operasi dengan array argumen dan `shell: false`, keluaran terbatas, batas waktu eksplisit, serta pembersihan abort/kill. Mengurai balasan paket dan hop, alih-alih memperlakukan durasi proses sebagai RTT. | | `httpDiagnostics.js` | curl bawaan untuk HTTP/1.1, HTTP/2, dan HTTP/3; verifikasi sertifikat yang ketat dan keluarga IP yang dipatok. Setiap versi diminta secara independen; versi yang sebenarnya dicatat. | | `socketDiagnostics.js` | Probe versi TLS eksplisit, koneksi TCP terbatas/banner pasif, pengamatan kunci host SSH sebelum autentikasi menggunakan dependensi ssh2 yang ada, dan validasi Upgrade RFC 6455 opsional. | | `diagnosticsService.js` | Menjalankan dan membatalkan alat, memilih/memvalidasi alamat, mengalirkan progres, mempertahankan pengukuran parsial, dan mengelola tenggat proses. | | `historyStore.js` | Riwayat lokal berversi yang terbatas, penyamaran data, impor dengan pemeriksaan skema, dan ekspor data terukur. | ### ICMP dan rute Ping secara default mengirim empat permintaan ICMP echo yang dijalankan satu per satu. Hasil berisi RTT terukur per paket, jumlah diterima/dikirim, kehilangan, min/rata-rata/maks, simpangan baku populasi, rata-rata selisih absolut antara RTT terukur yang berurutan (jitter), TTL/Hop Limit jika dicetak, dan cap waktu. Balasan `<1 ms` dihitung sebagai diterima dengan batas atas, alih-alih mengarang RTT numerik. RTT yang tidak diketahui dikecualikan dari statistik latensi. Statistik menggunakan jendela tersimpan berisi maksimal 500 paket; jumlah dikirim/diterima/kehilangan mencakup seluruh proses. Grafik menampilkan 200 pengamatan terakhir, dengan simbol berbeda untuk balasan, balasan di bawah resolusi, balasan yang hilang, dan batas waktu permintaan/proses yang eksplisit. Balasan yang hilang dapat mencerminkan pemfilteran ICMP, kehilangan paket, atau batas waktu habis; pengamatan ini tidak dapat memastikan adanya firewall. Executable yang tidak ada, kegagalan izin lokal, dan pemanggilan alat yang tidak valid adalah kesalahan alat tersendiri, bukan kehilangan paket atau server tidak tersedia. Tidak ada permintaan peningkatan hak istimewa. Traceroute mengalirkan hop, alamat, probe individual, rata-rata, dan persentase probe tak berjawab yang teramati. DNS balik di-resolve setelah rute selesai, menggunakan resolver yang dipilih. Pengulangan membandingkan urutan alamat hop yang teramati; perbedaan dapat mencerminkan penyeimbangan beban. Hop perantara yang tidak menjawab tidak membuktikan rute yang rusak. Metadata probe mentah dan metodenya muncul di detail yang dapat dibentangkan. macOS memerlukan waktu tunggu traceroute dalam detik bulat; batas waktu efektif yang dibulatkan dicatat. ### DNS Kedua belas jenis rekaman adalah A, AAAA, CNAME, MX, NS, TXT, SOA, SRV, CAA, PTR, DS, dan DNSKEY. Penguraian format wire DNS memeriksa identitas transaksi/pertanyaan, ukuran rekaman, perulangan pointer kompresi, dan batas pesan. Jawaban mempertahankan TTL rekaman, waktu kueri, resolver, dan status NXDOMAIN/NODATA/SERVFAIL/refused/timeout. Pencarian alamat sistem operasi tidak dapat menyediakan TTL; kueri rekaman terpisah dapat. Penelusuran CNAME dibatasi hingga delapan tautan dengan deteksi siklus. Pemeriksaan konsistensi mengulangi jawaban A/AAAA dari resolver yang dipilih, dan melakukan PTR terkonfirmasi-maju untuk pengujian DNS dengan literal IP. Jawaban yang berubah adalah pengamatan, bukan bukti kesalahan DNS. Kueri SRV menggunakan nama target apa adanya; masukkan nama layanan seperti `_service._tcp.example.org` bila diperlukan. DNSSEC selalu **tidak divalidasi**. Keberadaan DS/DNSKEY dan bahkan flag AD dari resolver tidak pernah dianggap sebagai validasi independen. ### HTTP, performa, dan kompresi HTTP/1.1 hanya diterima sebagai didukung jika versi tersebut benar-benar dikembalikan. HTTP/2 melalui HTTPS memerlukan h2 yang dinegosiasikan; tidak ada fallback yang diberi label ulang. HTTP/2 tanpa enkripsi menggunakan prior knowledge, bukan probe Upgrade HTTP/1.1. Verifikasi TLS tetap ketat untuk setiap permintaan HTTP/WebSocket. Pengalihan manual dibatasi hingga delapan; perulangan, tujuan tidak valid, dan pengalihan berlebihan gagal secara eksplisit. Rantai lengkap mencatat perubahan lintas domain dan penurunan dari HTTPS; perubahan skema dan www terlihat di URL sumber/tujuan. Kredensial dan skema pengalihan non-HTTP(S) ditolak. Setiap pengalihan lintas host di-resolve secara independen melalui resolver dan keluarga IP yang dipilih. Pengukuran mencakup DNS (jika dilakukan), TCP, TLS, TTFB respons akhir, TTFB keseluruhan termasuk DNS/pengalihan, unduhan, pengalihan dan total waktu nyata, byte entitas sebenarnya, kecepatan transfer, status, header respons, alamat/port server sebenarnya, ALPN, dan penggunaan ulang koneksi yang terverifikasi. Fase DNS/TCP/TLS yang tidak dilakukan pada koneksi yang dipatok atau digunakan ulang bernilai `N/A`, bukan nol palsu. QUIC tidak memiliki fase TCP; handshake-nya dicatat secara terpisah. Overhead transfer header atau overhead wire penuh tidak diklaim sebagai pengukuran byte entitas. Ini adalah waktu server/jaringan, bukan rendering halaman atau skor Lighthouse. Setiap protokol yang dipilih menggunakan target dan pengulangan yang sama. IPv4/IPv6 dan HTTP/HTTPS adalah opsi perbandingan eksplisit. Skema alternatif menggunakan port default-nya. Setiap protokol memulai proses klien bawaan yang independen untuk setiap sampel. Penggunaan ulang koneksi tidak diklaim. Statistik total waktu mencakup min/rata-rata/median/maks/P95 peringkat terdekat serta tingkat kesalahan transport/protokol tersendiri; kode status HTTP tetap terlihat bahkan ketika server berhasil mengembalikan respons 4xx/5xx. Kompresi mengirim identity, gzip, deflate, br, dan (jika didukung runtime) zstd sebagai permintaan Accept-Encoding terpisah. Content-Encoding harus cocok, dan dekompresi terbatas harus berhasil. Rasio hanya dihitung jika hash isi yang didekode, URL akhir, dan status cocok dengan baseline identity. Encoding yang diabaikan dianggap tidak didukung; isi yang berubah/dinamis tidak memiliki rasio. Ini adalah pengamatan untuk URL/status tersebut, bukan dukungan server secara umum. Pemeriksaan header keamanan menampilkan keberadaan dan nilai HSTS, CSP, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, dan X-Frame-Options. Direktif CSP frame-ancestors dapat menggantikan yang terakhir. Keberadaan header tidak membuktikan bahwa kebijakan dikonfigurasi dengan benar atau bahwa situs web aman. ### Persyaratan dan bukti HTTP/3 HTTP/1.1, HTTP/2, dan HTTP/3 menggunakan klien curl bawaan yang sama. macOS arm64 dan Linux x64 menggunakan curl 8.22.0, OpenSSL 3.5.9, nghttp2 1.70.0, ngtcp2 1.25.0, dan nghttp3 1.18.0. Windows x64 menggunakan build statis resmi curl-for-win 8.22.0_3 dari curl.se dengan LibreSSL 4.3.3 dan pustaka HTTP yang sama. Tidak diperlukan fallback ke curl sistem, unduhan saat runtime, atau izin administrator. Resep build upstream Windows yang dapat direproduksi ada di https://github.com/curl/curl-for-win/tree/9d77e31e . Lakukan build dengan `python3 scripts/native/build.py` (Windows: `python scripts/native/build.py`) sebelum pengemasan. macOS/Linux memerlukan alat C/C++, CMake, Ninja, Perl, make, dan pkg-config. Sumber dipatok berdasarkan versi dan SHA-256 upstream di `scripts/native/dependencies.lock.json`. Skrip memverifikasi setiap unduhan, menautkan pustaka transport pihak ketiga secara statis, dan gagal jika fitur HTTP2/HTTP3/SSL tidak ada. Hanya pustaka sistem operasi yang tetap dinamis. Windows menggunakan arsip biner resmi yang dipatok, bukan tumpukan transport Windows yang dikompilasi secara lokal. File CA bawaan memiliki hash yang dipatok tersendiri; lisensi komponen dan asal build upstream disertakan bersama runtime. Klien dan penyimpanan kepercayaan diinstal di luar app.asar di `resources/native-runtime/-/`. Setiap diagnostik memverifikasi hash komponen, arsitektur, dan kemampuan executable sebelum digunakan. File konfigurasi, proxy, penggantian lingkungan untuk kepercayaan TLS, dan variabel injeksi pustaka dikecualikan. curl berjalan dengan jalur absolut, shell dinonaktifkan, kepercayaan CA terverifikasi, keluarga IP yang ditentukan secara eksplisit, tanpa cookie, tanpa pengalihan otomatis, serta dengan keluaran dan waktu yang dibatasi. Pengalihan divalidasi dan di-resolve ulang oleh aplikasi. HTTPS pada port selain 443 didukung. HTTP/3 menggunakan `--http3-only` dan hanya dikonfirmasi setelah transfer selesai dengan melaporkan HTTP versi 3 dan verifikasi sertifikat yang berhasil. Respons kesalahan HTTP seperti 404 dapat mengonfirmasi protokol tersebut. Alt-Svc adalah pengumuman, bukan bukti. Batas waktu QUIC, kegagalan sertifikat, kegagalan DNS, koneksi ditolak, protokol tidak kompatibel, dan kegagalan komponen tetap dibedakan. Batas waktu UDP membuat dukungan server tetap belum terverifikasi. Waktu handshake QUIC tidak dilaporkan sebagai waktu TCP. Setiap pengukuran memulai proses/koneksi terpisah. Opsi warm tidak mengklaim penggunaan ulang koneksi untuk klien bawaan. Hal ini menjaga perbandingan protokol tetap konsisten. Laporan mencakup versi runtime, kemampuan, verifikasi TLS, dan waktu QUIC, sedangkan riwayat/ekspor menghapus isi, kueri URL, dan header autentikasi. Perbarui nilai patokan ini dan lakukan build ulang untuk setiap platform yang didukung saat memperbarui tumpukan transport atau penyimpanan kepercayaan CA. Artefak yang diterbitkan dan cuplikan sumber bersifat tetap. ## IPC Core Preload hanya mengekspos `window.chjCore.diagnostics`; semua penangan mempertahankan pemeriksaan pengirim jendela utama yang ada dan pekerjaan jaringan tetap berada di proses utama. Hasil menggunakan `{ ok: true, value }` atau `{ ok: false, error: { code, message } }`. | Kanal / metode preload | Payload / hasil | | --- | --- | | `diagnostics:resolve` / `resolve(options)` | Target/pengaturan yang divalidasi → target dan alamat hasil resolve. Maksimal dua permintaan resolusi bersamaan. | | `diagnostics:start` / `start(options)` | Target/pengaturan/pilihan alat yang divalidasi → ID job buram dan laporan awal. | | `diagnostics:cancel` / `cancel(id, tool?)` | Membatalkan satu alat yang aktif/mengantre atau seluruh proses. | | `diagnostics:get` / `get(id)` | Snapshot dari proses yang dikenal atau laporan yang disimpan. | | `diagnostics:history` / `history()` | Ringkasan riwayat lokal. | | `diagnostics:removeHistory` / `removeHistory(id)` | Menghapus item riwayat yang dipilih. | | `diagnostics:copy` / `copy(id, format)` | Proses utama menulis laporan dikenal yang sudah disamarkan ke papan klip. | | `diagnostics:export` / `export(id, format)` | JSON/CSV/TXT melalui dialog simpan native; renderer tidak dapat memberikan jalur sistem file. | | `diagnostics:import` / `import()` | Pemilih file native, validasi ukuran/skema/kedalaman, dan penyamaran sebelum disimpan. | | `diagnostics:progress` / `onProgress(callback)` | Alamat hasil resolve, mulai/selesainya alat, paket, hop, sampel HTTP, dan penyelesaian; mengembalikan callback untuk berhenti berlangganan. | Tidak ada API shell, sistem file, atau jaringan generik yang diekspos. Isolasi konteks, sandbox, integrasi Node yang dinonaktifkan, dan CSP renderer yang ada tetap aktif. Kontrak plugin yang ada serta verifikasi/pengecualian pembaru tidak berubah. ## Anggaran dan data lokal - Satu proses, dua alat aktif, maksimal dua probe keluarga IP per alat; TCP juga membatasi setiap alamat hingga empat koneksi. - Batas waktu per operasi 250–30000 ms; 1–100 paket, 1–20 pengulangan, 1–40 hop, 1–16 port. Proses biasa berhenti setelah lima menit; ping berkelanjutan setelah tiga puluh menit. Subproses traceroute memiliki batas tambahan 180 detik. - Keluaran proses biasanya 256 KiB; isi entitas HTTP 2 MiB; isi setelah dekompresi 8 MiB; header HTTP dibatasi; tidak ada isi respons yang masuk ke riwayat. - Menyimpan maksimal 500 paket/event progres, lima proses di memori, tiga puluh laporan riwayat, dan 10 MiB riwayat. Riwayat menggunakan penulis atomik privat yang ada di `/diagnostics/history.json` (mode 0600). - Impor maksimal 2 MiB, skema 1, dengan kedalaman bersarang terbatas dan koleksi hasil yang divalidasi. Sel CSV di-escape dan awalan formula dinetralkan. Kueri/fragmen URL, kredensial, cookie, header autentikasi, dan isi mentah dikecualikan dari laporan yang disimpan/disalin/diekspor. Detail mentah menampilkan data terstruktur yang terukur, bukan tangkapan paket atau isi respons yang disimpan. - Tidak ada sinkronisasi cloud, login otomatis, perubahan konfigurasi server, atau pemindaian agresif/tanpa batas. Pengguna memilih target/port/resolver secara eksplisit. ## Persyaratan platform dan verifikasi | Platform | ICMP | Rute | Protokol lain | | --- | --- | --- | --- | | Windows 10/11 | `ping.exe -4/-6` | `tracert.exe -4/-6`, ICMP | curl.exe bawaan dengan HTTP/2 dan HTTP/3. Kolom RTT yang dilokalkan tidak bergantung pada kata “time”. | | macOS | `/sbin/ping`, `/sbin/ping6` | `/usr/sbin/traceroute`, `/usr/sbin/traceroute6`, UDP; waktu tunggu dalam detik bulat | curl bawaan dengan HTTP/2 dan HTTP/3. | | Ubuntu/Linux | iputils `ping -4/-6` | `traceroute -4/-6` standar, UDP | curl bawaan dengan HTTP/2 dan HTTP/3; alat ICMP/rute yang tidak ada dilaporkan secara terpisah. | Tidak ada dependensi npm baru yang ditambahkan. Implementasi menggunakan modul bawaan Node dan ssh2 yang sudah ada di aplikasi. Implementasi ini tidak menginstal alat sistem dan tidak meminta hak administratif. Firewall dan pembatasan UDP dapat mencegah pengujian membuktikan dukungan; hal tersebut tidak dapat disimpulkan hanya dari batas waktu yang habis. Cakupan otomatis ada di `diagnosticsCore.test.js`, `diagnosticsNetwork.test.js`, `diagnosticsHttp.test.js`, dan `diagnosticsIpc.test.js`: validasi/literal IPv6, fixture DNS UDP+TCP native/lokal, jawaban yang hilang/dua keluarga dan kesalahan resolver, CNAME/konsistensi, fixture argumen/penguraian sistem operasi, proses anak sungguhan yang dibatasi, pengamatan ICMP yang diblokir, HTTP/1.1 dan TLS h2 lokal sungguhan, pengalihan/batas isi/batas waktu/penggunaan ulang, kompresi aktif/diabaikan, kemampuan HTTP3/penguraian hasil sukses/penolakan fallback, kepercayaan CA lokal/ketidakcocokan/kedaluwarsa dan HTTP/HTTPS IPv6 sungguhan, koneksi TCP/ditolak/batas waktu tiruan, handshake WebSocket dan SSH pra-autentikasi sungguhan, pembatalan/pembersihan/hasil parsial, status luring, perjalanan pulang-pergi riwayat privat/penolakan impor/ekspor, IPC tepercaya, dan langganan preload. `npm test` menjalankan pengujian deterministik tanpa server uji publik. `npm run test:diagnostics:ui` menjalankan `scripts/smokeDiagnostics.js` di desktop Electron grafis, menggunakan UI/preload/IPC produksi dan probe HTTP/kompresi lokal sungguhan. Layanan yang tidak terkait hanya di-stub/dibuat luring dalam harness uji ini. Pengujian ini memeriksa urutan navigasi, hasil protokol, persistensi, CZ/DE/EN, kedua tema, luapan pada jendela sempit, dan preferensi sandbox. Jika shell menetapkan ELECTRON_RUN_AS_NODE, hapus variabel tersebut untuk perintah ini. Verifikasi runtime saat ini mencakup transfer QUIC terkendali, IPv4/IPv6, HTTPS pada port non-default, respons 404, kegagalan TLS, dan layanan khusus TCP yang mengiklankan Alt-Svc. Hasil per build disertakan dengan setiap rilis. Batasan opsional yang eksplisit: tidak ada validasi DNSSEC independen (memerlukan resolver validasi lengkap/siklus hidup trust anchor), tidak ada audit Lighthouse (hanya waktu server/jaringan), tidak ada audit TLS usang atau layanan pencabutan/CT, tidak ada klaim penggunaan ulang warm HTTP3, dan tidak ada pengukuran penggunaan ulang warm HTTP/3. Kemampuan yang tidak didukung ditampilkan, bukan disimulasikan. ## File dalam perubahan ini Dibuat: tujuh file layanan di `src/main/diagnostics/`; `src/renderer/diagnostics.js`, `diagnosticsI18n.js`, `diagnostics.css`; empat file `test/diagnostics*.test.js`; lima file di bawah `test/fixtures/diagnostics/`; `scripts/smokeDiagnostics.js`; dokumen ini. Diintegrasikan/diperbarui: `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`, `README.md` akar, `.gitignore` (empat pengecualian fixture publik), dan allowlist gitleaks akar yang secara sempit menyebut fixture kunci uji TLS yang sengaja dibuat publik. Kunci privat CA penandatanganan telah dibuang; fixture tidak pernah digunakan oleh runtime aplikasi.