diff --git a/CLAUDE.md b/CLAUDE.md index c5ab384..72e32ab 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -99,6 +99,14 @@ The Android release key: alias `meweb`, certificate SHA-256 `CheckRunner` skips the router protocols on a mobile link, and a private or 100.64 address on the device with a different public echo is the operator's NAT (`NatKind.Shared`); before 0.4 a phone on Iliad read "router not answering" and "can't tell" everywhere downstream. Provider profiles describe home lines, so on mobile the card says so. +- **The publisher's own network measures the house, not the line.** When the public IPv4 equals the server's, or + the IPv6 shares its /48 (`Addresses.SameNetwork`, `RunReport.OwnNetwork`), everything aimed at the server loops + back through the FRITZ!Box: the NAT type, the port burst, hairpin, lifetime, speed and round trip. Those cards then + say `ReachOwnNetwork` and the burst is not sent; before 0.5.3 a home report read "hard NAT" next to "ports kept". +- **One verdict decides who holds the IPv4.** `Verdicts.Holder(NatOf(...))` feeds both the address card and the + provider card's "On this line" row, so a home router behind CGNAT can no longer read "your router" on one card and + "shared with other customers" on the next. Provider notes that the check contradicts (sharing, port 25) get that row + right under them, added when the provider card is settled again at the end of the run. - **The route is drawn, never trusted.** `Route.Trace` (8 TTLs) feeds the path's wires: hops after the first, up to the first public one, sit before the shared exit or the provider; public ones carry their AS number into the internet; unanswered runs collapse to "…". The NAT verdict never reads them (see the 100.64 pitfall). diff --git a/Directory.Build.props b/Directory.Build.props index 88ed8e8..5daab62 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 0.5.2 + 0.5.3 me-web? Arasaka di Hvozdikov Yevheniy © 2026 Arasaka di Hvozdikov Yevheniy diff --git a/src/MeWeb.App/Strings/am.json b/src/MeWeb.App/Strings/am.json index 569692b..a450a4b 100644 --- a/src/MeWeb.App/Strings/am.json +++ b/src/MeWeb.App/Strings/am.json @@ -135,6 +135,7 @@ "FactStunFirst": "የመጀመሪያው STUN አገልጋይ", "FactStunSecond": "ሁለተኛው STUN አገልጋይ", "FactSystem": "ሲስተም", + "FactThisLine": "በዚህ መስመር ላይ", "FactUpload": "መስቀል", "FactUpnp": "UPnP", "FactUpstreams": "ከኢንተርኔት ጋር የሚያገናኙት አውታረ መረቦች", diff --git a/src/MeWeb.App/Strings/ar.json b/src/MeWeb.App/Strings/ar.json index 198b7f8..f945155 100644 --- a/src/MeWeb.App/Strings/ar.json +++ b/src/MeWeb.App/Strings/ar.json @@ -135,6 +135,7 @@ "FactStunFirst": "خادم STUN الأول", "FactStunSecond": "خادم STUN الثاني", "FactSystem": "النظام", + "FactThisLine": "على هذا الخط", "FactUpload": "الرفع", "FactUpnp": "UPnP", "FactUpstreams": "متصل بالإنترنت عبر", diff --git a/src/MeWeb.App/Strings/ay.json b/src/MeWeb.App/Strings/ay.json index e5296b1..9a8b3e8 100644 --- a/src/MeWeb.App/Strings/ay.json +++ b/src/MeWeb.App/Strings/ay.json @@ -135,6 +135,7 @@ "FactStunFirst": "Nayrïr STUN servidor", "FactStunSecond": "Payïr STUN servidor", "FactSystem": "Sistema", + "FactThisLine": "Aka líneana", "FactUpload": "Apkatäña", "FactUpnp": "UPnP", "FactUpstreams": "Internetar kuna redanak tuqis mayachasi", diff --git a/src/MeWeb.App/Strings/az-Cyrl.json b/src/MeWeb.App/Strings/az-Cyrl.json index 8613f19..aaa4e07 100644 --- a/src/MeWeb.App/Strings/az-Cyrl.json +++ b/src/MeWeb.App/Strings/az-Cyrl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Биринҹи STUN сервери", "FactStunSecond": "Икинҹи STUN сервери", "FactSystem": "Систем", + "FactThisLine": "Бу хәтдә", "FactUpload": "Ҝөндәрмә", "FactUpnp": "UPnP", "FactUpstreams": "Интернетә бунлар васитәсилә гошулур", diff --git a/src/MeWeb.App/Strings/az.json b/src/MeWeb.App/Strings/az.json index 79ae60b..d4c931a 100644 --- a/src/MeWeb.App/Strings/az.json +++ b/src/MeWeb.App/Strings/az.json @@ -135,6 +135,7 @@ "FactStunFirst": "Birinci STUN serveri", "FactStunSecond": "İkinci STUN serveri", "FactSystem": "Sistem", + "FactThisLine": "Bu xətdə", "FactUpload": "Göndərmə", "FactUpnp": "UPnP", "FactUpstreams": "İnternetə qoşulduğu şəbəkələr", diff --git a/src/MeWeb.App/Strings/be.json b/src/MeWeb.App/Strings/be.json index 4f086d5..32018b5 100644 --- a/src/MeWeb.App/Strings/be.json +++ b/src/MeWeb.App/Strings/be.json @@ -135,6 +135,7 @@ "FactStunFirst": "Першы сервер STUN", "FactStunSecond": "Другі сервер STUN", "FactSystem": "Сістэма", + "FactThisLine": "На гэтай лініі", "FactUpload": "Запампоўка", "FactUpnp": "UPnP", "FactUpstreams": "Выхад у інтэрнэт праз", diff --git a/src/MeWeb.App/Strings/bg.json b/src/MeWeb.App/Strings/bg.json index 49aed9c..0956c91 100644 --- a/src/MeWeb.App/Strings/bg.json +++ b/src/MeWeb.App/Strings/bg.json @@ -135,6 +135,7 @@ "FactStunFirst": "Първи STUN сървър", "FactStunSecond": "Втори STUN сървър", "FactSystem": "Система", + "FactThisLine": "На тази линия", "FactUpload": "Качване", "FactUpnp": "UPnP", "FactUpstreams": "Свързан с интернет чрез", diff --git a/src/MeWeb.App/Strings/bi.json b/src/MeWeb.App/Strings/bi.json index e164899..bd5821c 100644 --- a/src/MeWeb.App/Strings/bi.json +++ b/src/MeWeb.App/Strings/bi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Fas STUN seva", "FactStunSecond": "Seken STUN seva", "FactSystem": "Sistem", + "FactThisLine": "Long laen ia", "FactUpload": "Aplod", "FactUpnp": "UPnP", "FactUpstreams": "I konek long intanet tru long", diff --git a/src/MeWeb.App/Strings/bn.json b/src/MeWeb.App/Strings/bn.json index 66c744a..37309a5 100644 --- a/src/MeWeb.App/Strings/bn.json +++ b/src/MeWeb.App/Strings/bn.json @@ -135,6 +135,7 @@ "FactStunFirst": "প্রথম STUN সার্ভার", "FactStunSecond": "দ্বিতীয় STUN সার্ভার", "FactSystem": "সিস্টেম", + "FactThisLine": "এই লাইনে", "FactUpload": "আপলোড", "FactUpnp": "UPnP", "FactUpstreams": "যাদের মাধ্যমে ইন্টারনেটে যুক্ত", diff --git a/src/MeWeb.App/Strings/bs-Cyrl.json b/src/MeWeb.App/Strings/bs-Cyrl.json index fd706dd..99a17d2 100644 --- a/src/MeWeb.App/Strings/bs-Cyrl.json +++ b/src/MeWeb.App/Strings/bs-Cyrl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Први STUN сервер", "FactStunSecond": "Други STUN сервер", "FactSystem": "Систем", + "FactThisLine": "На овој линији", "FactUpload": "Отпремање", "FactUpnp": "UPnP", "FactUpstreams": "Веза с интернетом преко", diff --git a/src/MeWeb.App/Strings/bs.json b/src/MeWeb.App/Strings/bs.json index bc5854e..9fe88c2 100644 --- a/src/MeWeb.App/Strings/bs.json +++ b/src/MeWeb.App/Strings/bs.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvi STUN server", "FactStunSecond": "Drugi STUN server", "FactSystem": "Sistem", + "FactThisLine": "Na ovoj liniji", "FactUpload": "Otpremanje", "FactUpnp": "UPnP", "FactUpstreams": "Povezano s internetom preko", diff --git a/src/MeWeb.App/Strings/ca.json b/src/MeWeb.App/Strings/ca.json index aba713c..5d464d0 100644 --- a/src/MeWeb.App/Strings/ca.json +++ b/src/MeWeb.App/Strings/ca.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primer servidor STUN", "FactStunSecond": "Segon servidor STUN", "FactSystem": "Sistema", + "FactThisLine": "En aquesta línia", "FactUpload": "Pujada", "FactUpnp": "UPnP", "FactUpstreams": "Connectat a Internet a través de", diff --git a/src/MeWeb.App/Strings/cs.json b/src/MeWeb.App/Strings/cs.json index c8d6583..5b84359 100644 --- a/src/MeWeb.App/Strings/cs.json +++ b/src/MeWeb.App/Strings/cs.json @@ -135,6 +135,7 @@ "FactStunFirst": "První server STUN", "FactStunSecond": "Druhý server STUN", "FactSystem": "Systém", + "FactThisLine": "Na této přípojce", "FactUpload": "Odesílání", "FactUpnp": "UPnP", "FactUpstreams": "Připojeno k internetu přes", diff --git a/src/MeWeb.App/Strings/da.json b/src/MeWeb.App/Strings/da.json index 7093355..7c59804 100644 --- a/src/MeWeb.App/Strings/da.json +++ b/src/MeWeb.App/Strings/da.json @@ -135,6 +135,7 @@ "FactStunFirst": "Første STUN-server", "FactStunSecond": "Anden STUN-server", "FactSystem": "System", + "FactThisLine": "På denne forbindelse", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Forbundet til internettet gennem", diff --git a/src/MeWeb.App/Strings/de.json b/src/MeWeb.App/Strings/de.json index 9630484..6fe9092 100644 --- a/src/MeWeb.App/Strings/de.json +++ b/src/MeWeb.App/Strings/de.json @@ -135,6 +135,7 @@ "FactStunFirst": "Erster STUN-Server", "FactStunSecond": "Zweiter STUN-Server", "FactSystem": "System", + "FactThisLine": "An diesem Anschluss", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Mit dem Internet verbunden über", diff --git a/src/MeWeb.App/Strings/dv.json b/src/MeWeb.App/Strings/dv.json index ab50491..950b7b6 100644 --- a/src/MeWeb.App/Strings/dv.json +++ b/src/MeWeb.App/Strings/dv.json @@ -135,6 +135,7 @@ "FactStunFirst": "ފުރަތަމަ STUN ސަރވަރު", "FactStunSecond": "ދެވަނަ STUN ސަރވަރު", "FactSystem": "ސިސްޓަމް", + "FactThisLine": "މި ލައިނުގައި", "FactUpload": "އަޕްލޯޑް", "FactUpnp": "UPnP", "FactUpstreams": "އިންޓަނެޓާ ގުޅޭ ނެޓްވޯކްތައް", diff --git a/src/MeWeb.App/Strings/dz.json b/src/MeWeb.App/Strings/dz.json index 3cab0ab..431b734 100644 --- a/src/MeWeb.App/Strings/dz.json +++ b/src/MeWeb.App/Strings/dz.json @@ -135,6 +135,7 @@ "FactStunFirst": "STUN སར་བར་དང་པ", "FactStunSecond": "STUN སར་བར་གཉིས་པ", "FactSystem": "རིམ་ལུགས", + "FactThisLine": "མཐུད་ལམ་འདི་གུ", "FactUpload": "ཡར་བཏོན", "FactUpnp": "UPnP", "FactUpstreams": "ཨིན་ཊར་ནེཊ་ལུ་ མཐུད་ནིའི་བརྒྱུད་ལམ", diff --git a/src/MeWeb.App/Strings/el.json b/src/MeWeb.App/Strings/el.json index 5770910..9c8f207 100644 --- a/src/MeWeb.App/Strings/el.json +++ b/src/MeWeb.App/Strings/el.json @@ -135,6 +135,7 @@ "FactStunFirst": "Πρώτος διακομιστής STUN", "FactStunSecond": "Δεύτερος διακομιστής STUN", "FactSystem": "Σύστημα", + "FactThisLine": "Σε αυτή τη γραμμή", "FactUpload": "Αποστολή", "FactUpnp": "UPnP", "FactUpstreams": "Συνδέεται στο διαδίκτυο μέσω", diff --git a/src/MeWeb.App/Strings/en.json b/src/MeWeb.App/Strings/en.json index 036fb45..75fe350 100644 --- a/src/MeWeb.App/Strings/en.json +++ b/src/MeWeb.App/Strings/en.json @@ -135,6 +135,7 @@ "FactStunFirst": "First STUN server", "FactStunSecond": "Second STUN server", "FactSystem": "System", + "FactThisLine": "On this line", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Connected to the internet through", diff --git a/src/MeWeb.App/Strings/es.json b/src/MeWeb.App/Strings/es.json index ee7f74a..0e10215 100644 --- a/src/MeWeb.App/Strings/es.json +++ b/src/MeWeb.App/Strings/es.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primer servidor STUN", "FactStunSecond": "Segundo servidor STUN", "FactSystem": "Sistema", + "FactThisLine": "En esta línea", "FactUpload": "Subida", "FactUpnp": "UPnP", "FactUpstreams": "Conectado a internet a través de", diff --git a/src/MeWeb.App/Strings/et.json b/src/MeWeb.App/Strings/et.json index ace5ab7..59aa31c 100644 --- a/src/MeWeb.App/Strings/et.json +++ b/src/MeWeb.App/Strings/et.json @@ -135,6 +135,7 @@ "FactStunFirst": "Esimene STUN-server", "FactStunSecond": "Teine STUN-server", "FactSystem": "Süsteem", + "FactThisLine": "Sellel ühendusel", "FactUpload": "Üleslaadimine", "FactUpnp": "UPnP", "FactUpstreams": "Internetiühendus järgmiste võrkude kaudu", diff --git a/src/MeWeb.App/Strings/fa.json b/src/MeWeb.App/Strings/fa.json index d4697fb..03240b7 100644 --- a/src/MeWeb.App/Strings/fa.json +++ b/src/MeWeb.App/Strings/fa.json @@ -135,6 +135,7 @@ "FactStunFirst": "سرور STUN اول", "FactStunSecond": "سرور STUN دوم", "FactSystem": "سیستم", + "FactThisLine": "روی این خط", "FactUpload": "آپلود", "FactUpnp": "UPnP", "FactUpstreams": "اتصال به اینترنت از طریق", diff --git a/src/MeWeb.App/Strings/fi.json b/src/MeWeb.App/Strings/fi.json index 1535cf1..7dca576 100644 --- a/src/MeWeb.App/Strings/fi.json +++ b/src/MeWeb.App/Strings/fi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Ensimmäinen STUN-palvelin", "FactStunSecond": "Toinen STUN-palvelin", "FactSystem": "Järjestelmä", + "FactThisLine": "Tässä liittymässä", "FactUpload": "Lähetys", "FactUpnp": "UPnP", "FactUpstreams": "Yhteys internetiin näiden verkkojen kautta", diff --git a/src/MeWeb.App/Strings/fil.json b/src/MeWeb.App/Strings/fil.json index 60e3b61..17dee19 100644 --- a/src/MeWeb.App/Strings/fil.json +++ b/src/MeWeb.App/Strings/fil.json @@ -135,6 +135,7 @@ "FactStunFirst": "Unang STUN server", "FactStunSecond": "Ikalawang STUN server", "FactSystem": "Sistema", + "FactThisLine": "Sa linyang ito", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Nakakonekta sa internet sa pamamagitan ng", diff --git a/src/MeWeb.App/Strings/fj.json b/src/MeWeb.App/Strings/fj.json index e5ad61b..bef9a1e 100644 --- a/src/MeWeb.App/Strings/fj.json +++ b/src/MeWeb.App/Strings/fj.json @@ -135,6 +135,7 @@ "FactStunFirst": "Imatai ni server ni STUN", "FactStunSecond": "Ikarua ni server ni STUN", "FactSystem": "Sisitemu", + "FactThisLine": "Ena laini oqo", "FactUpload": "Vakacabe", "FactUpnp": "UPnP", "FactUpstreams": "E semati ki na internet ena", diff --git a/src/MeWeb.App/Strings/fr.json b/src/MeWeb.App/Strings/fr.json index 19a644b..dbc01f1 100644 --- a/src/MeWeb.App/Strings/fr.json +++ b/src/MeWeb.App/Strings/fr.json @@ -135,6 +135,7 @@ "FactStunFirst": "Premier serveur STUN", "FactStunSecond": "Deuxième serveur STUN", "FactSystem": "Système", + "FactThisLine": "Sur cette ligne", "FactUpload": "Envoi", "FactUpnp": "UPnP", "FactUpstreams": "Connecté à Internet via", diff --git a/src/MeWeb.App/Strings/ga.json b/src/MeWeb.App/Strings/ga.json index 1255eff..5e3c879 100644 --- a/src/MeWeb.App/Strings/ga.json +++ b/src/MeWeb.App/Strings/ga.json @@ -135,6 +135,7 @@ "FactStunFirst": "An chéad fhreastalaí STUN", "FactStunSecond": "An dara freastalaí STUN", "FactSystem": "Córas", + "FactThisLine": "Ar an líne seo", "FactUpload": "Uaslódáil", "FactUpnp": "UPnP", "FactUpstreams": "Ceangailte leis an idirlíon trí", diff --git a/src/MeWeb.App/Strings/gil.json b/src/MeWeb.App/Strings/gil.json index 0cb35dd..e8e01ac 100644 --- a/src/MeWeb.App/Strings/gil.json +++ b/src/MeWeb.App/Strings/gil.json @@ -135,6 +135,7 @@ "FactStunFirst": "Moan te server n STUN", "FactStunSecond": "Kauoua te server n STUN", "FactSystem": "Sistem", + "FactThisLine": "N te rain aei", "FactUpload": "Kanakoan", "FactUpnp": "UPnP", "FactUpstreams": "E kaboraoaki nakon te internet rinanon", diff --git a/src/MeWeb.App/Strings/gn.json b/src/MeWeb.App/Strings/gn.json index 1de357a..3c6f25d 100644 --- a/src/MeWeb.App/Strings/gn.json +++ b/src/MeWeb.App/Strings/gn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Servidor STUN peteĩha", "FactStunSecond": "Servidor STUN mokõiha", "FactSystem": "Sistema", + "FactThisLine": "Ko línea-pe", "FactUpload": "Ñemohupi", "FactUpnp": "UPnP", "FactUpstreams": "Ojoaju internet-pe ko'ã rupive", diff --git a/src/MeWeb.App/Strings/gsw.json b/src/MeWeb.App/Strings/gsw.json index 2fee1fc..375de8e 100644 --- a/src/MeWeb.App/Strings/gsw.json +++ b/src/MeWeb.App/Strings/gsw.json @@ -135,6 +135,7 @@ "FactStunFirst": "Erschte STUN-Server", "FactStunSecond": "Zweite STUN-Server", "FactSystem": "System", + "FactThisLine": "A dem Aaschluss", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Mit em Internet verbunde über", diff --git a/src/MeWeb.App/Strings/he.json b/src/MeWeb.App/Strings/he.json index 4ee25a4..160c50f 100644 --- a/src/MeWeb.App/Strings/he.json +++ b/src/MeWeb.App/Strings/he.json @@ -135,6 +135,7 @@ "FactStunFirst": "שרת STUN ראשון", "FactStunSecond": "שרת STUN שני", "FactSystem": "מערכת", + "FactThisLine": "בקו הזה", "FactUpload": "העלאה", "FactUpnp": "UPnP", "FactUpstreams": "מחובר לאינטרנט דרך", diff --git a/src/MeWeb.App/Strings/hi.json b/src/MeWeb.App/Strings/hi.json index 87d1955..1e2e635 100644 --- a/src/MeWeb.App/Strings/hi.json +++ b/src/MeWeb.App/Strings/hi.json @@ -135,6 +135,7 @@ "FactStunFirst": "पहला STUN सर्वर", "FactStunSecond": "दूसरा STUN सर्वर", "FactSystem": "सिस्टम", + "FactThisLine": "इस लाइन पर", "FactUpload": "अपलोड", "FactUpnp": "UPnP", "FactUpstreams": "इंटरनेट से जोड़ने वाले नेटवर्क", diff --git a/src/MeWeb.App/Strings/hif.json b/src/MeWeb.App/Strings/hif.json index f5ea527..b31b050 100644 --- a/src/MeWeb.App/Strings/hif.json +++ b/src/MeWeb.App/Strings/hif.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pahila STUN server", "FactStunSecond": "Dusra STUN server", "FactSystem": "System", + "FactThisLine": "Ii line pe", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Internet se in network ke raste juraa hai", diff --git a/src/MeWeb.App/Strings/ho.json b/src/MeWeb.App/Strings/ho.json index be95632..25b2e95 100644 --- a/src/MeWeb.App/Strings/ho.json +++ b/src/MeWeb.App/Strings/ho.json @@ -135,6 +135,7 @@ "FactStunFirst": "STUN seva ginigunana", "FactStunSecond": "STUN seva iharuana", "FactSystem": "Sistem", + "FactThisLine": "Inai lain ai", "FactUpload": "Aplod", "FactUpnp": "UPnP", "FactUpstreams": "Intanet dekenai ia konek dalana", diff --git a/src/MeWeb.App/Strings/hr.json b/src/MeWeb.App/Strings/hr.json index 02a124a..92cea41 100644 --- a/src/MeWeb.App/Strings/hr.json +++ b/src/MeWeb.App/Strings/hr.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvi STUN server", "FactStunSecond": "Drugi STUN server", "FactSystem": "Sustav", + "FactThisLine": "Na ovoj liniji", "FactUpload": "Slanje", "FactUpnp": "UPnP", "FactUpstreams": "Povezan s internetom preko", diff --git a/src/MeWeb.App/Strings/ht.json b/src/MeWeb.App/Strings/ht.json index 2188be1..bebdb68 100644 --- a/src/MeWeb.App/Strings/ht.json +++ b/src/MeWeb.App/Strings/ht.json @@ -135,6 +135,7 @@ "FactStunFirst": "Premye sèvè STUN", "FactStunSecond": "Dezyèm sèvè STUN", "FactSystem": "Sistèm", + "FactThisLine": "Sou liy sa a", "FactUpload": "Televèsman", "FactUpnp": "UPnP", "FactUpstreams": "Konekte ak entènèt la atravè", diff --git a/src/MeWeb.App/Strings/hu.json b/src/MeWeb.App/Strings/hu.json index 2fc2544..b3a194f 100644 --- a/src/MeWeb.App/Strings/hu.json +++ b/src/MeWeb.App/Strings/hu.json @@ -135,6 +135,7 @@ "FactStunFirst": "Első STUN-szerver", "FactStunSecond": "Második STUN-szerver", "FactSystem": "Rendszer", + "FactThisLine": "Ezen a vonalon", "FactUpload": "Feltöltés", "FactUpnp": "UPnP", "FactUpstreams": "Az internethez ezeken keresztül csatlakozik", diff --git a/src/MeWeb.App/Strings/hy.json b/src/MeWeb.App/Strings/hy.json index 425df1d..60f0bc5 100644 --- a/src/MeWeb.App/Strings/hy.json +++ b/src/MeWeb.App/Strings/hy.json @@ -135,6 +135,7 @@ "FactStunFirst": "Առաջին STUN սերվերը", "FactStunSecond": "Երկրորդ STUN սերվերը", "FactSystem": "Համակարգ", + "FactThisLine": "Այս գծում", "FactUpload": "Վերբեռնում", "FactUpnp": "UPnP", "FactUpstreams": "Համացանցին միացված է այս ցանցերի միջոցով", diff --git a/src/MeWeb.App/Strings/id.json b/src/MeWeb.App/Strings/id.json index b8a17b7..e7c19b6 100644 --- a/src/MeWeb.App/Strings/id.json +++ b/src/MeWeb.App/Strings/id.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server STUN pertama", "FactStunSecond": "Server STUN kedua", "FactSystem": "Sistem", + "FactThisLine": "Di jalur ini", "FactUpload": "Unggah", "FactUpnp": "UPnP", "FactUpstreams": "Terhubung ke internet melalui", diff --git a/src/MeWeb.App/Strings/is.json b/src/MeWeb.App/Strings/is.json index 7ca6926..1e33ff5 100644 --- a/src/MeWeb.App/Strings/is.json +++ b/src/MeWeb.App/Strings/is.json @@ -135,6 +135,7 @@ "FactStunFirst": "Fyrri STUN-þjónn", "FactStunSecond": "Seinni STUN-þjónn", "FactSystem": "Kerfi", + "FactThisLine": "Á þessari tengingu", "FactUpload": "Upphal", "FactUpnp": "UPnP", "FactUpstreams": "Tengt internetinu um", diff --git a/src/MeWeb.App/Strings/it.json b/src/MeWeb.App/Strings/it.json index 5bef779..c9a0fe7 100644 --- a/src/MeWeb.App/Strings/it.json +++ b/src/MeWeb.App/Strings/it.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primo server STUN", "FactStunSecond": "Secondo server STUN", "FactSystem": "Sistema", + "FactThisLine": "Su questa linea", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Collegato a internet tramite", diff --git a/src/MeWeb.App/Strings/ja.json b/src/MeWeb.App/Strings/ja.json index e48be27..00f714b 100644 --- a/src/MeWeb.App/Strings/ja.json +++ b/src/MeWeb.App/Strings/ja.json @@ -135,6 +135,7 @@ "FactStunFirst": "1 つ目の STUN サーバー", "FactStunSecond": "2 つ目の STUN サーバー", "FactSystem": "システム", + "FactThisLine": "この回線では", "FactUpload": "アップロード", "FactUpnp": "UPnP", "FactUpstreams": "インターネットへの接続先", diff --git a/src/MeWeb.App/Strings/ka.json b/src/MeWeb.App/Strings/ka.json index f7194ba..eb6aada 100644 --- a/src/MeWeb.App/Strings/ka.json +++ b/src/MeWeb.App/Strings/ka.json @@ -135,6 +135,7 @@ "FactStunFirst": "პირველი STUN სერვერი", "FactStunSecond": "მეორე STUN სერვერი", "FactSystem": "სისტემა", + "FactThisLine": "ამ ხაზზე", "FactUpload": "ატვირთვა", "FactUpnp": "UPnP", "FactUpstreams": "ინტერნეტთან დამაკავშირებელი ქსელები", diff --git a/src/MeWeb.App/Strings/kk.json b/src/MeWeb.App/Strings/kk.json index d6ad765..3b5ce73 100644 --- a/src/MeWeb.App/Strings/kk.json +++ b/src/MeWeb.App/Strings/kk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Бірінші STUN сервері", "FactStunSecond": "Екінші STUN сервері", "FactSystem": "Жүйе", + "FactThisLine": "Бұл қосылымда", "FactUpload": "Жүктеп жіберу", "FactUpnp": "UPnP", "FactUpstreams": "Интернетке мына желілер арқылы қосылған", diff --git a/src/MeWeb.App/Strings/km.json b/src/MeWeb.App/Strings/km.json index 98dcae2..878e89b 100644 --- a/src/MeWeb.App/Strings/km.json +++ b/src/MeWeb.App/Strings/km.json @@ -135,6 +135,7 @@ "FactStunFirst": "ម៉ាស៊ីនមេ STUN ទីមួយ", "FactStunSecond": "ម៉ាស៊ីនមេ STUN ទីពីរ", "FactSystem": "ប្រព័ន្ធ", + "FactThisLine": "នៅលើខ្សែអ៊ីនធឺណិតនេះ", "FactUpload": "ផ្ទុកឡើង", "FactUpnp": "UPnP", "FactUpstreams": "តភ្ជាប់អ៊ីនធឺណិតតាមរយៈ", diff --git a/src/MeWeb.App/Strings/ko.json b/src/MeWeb.App/Strings/ko.json index f84d073..3f4b510 100644 --- a/src/MeWeb.App/Strings/ko.json +++ b/src/MeWeb.App/Strings/ko.json @@ -135,6 +135,7 @@ "FactStunFirst": "첫 번째 STUN 서버", "FactStunSecond": "두 번째 STUN 서버", "FactSystem": "시스템", + "FactThisLine": "이 회선에서는", "FactUpload": "업로드", "FactUpnp": "UPnP", "FactUpstreams": "인터넷 연결을 제공하는 네트워크", diff --git a/src/MeWeb.App/Strings/ky.json b/src/MeWeb.App/Strings/ky.json index 9c972ce..cb7cd08 100644 --- a/src/MeWeb.App/Strings/ky.json +++ b/src/MeWeb.App/Strings/ky.json @@ -135,6 +135,7 @@ "FactStunFirst": "Биринчи STUN сервери", "FactStunSecond": "Экинчи STUN сервери", "FactSystem": "Система", + "FactThisLine": "Бул линияда", "FactUpload": "Жүктөп жөнөтүү", "FactUpnp": "UPnP", "FactUpstreams": "Интернетке булар аркылуу туташкан", diff --git a/src/MeWeb.App/Strings/lb.json b/src/MeWeb.App/Strings/lb.json index d775372..82ae0a1 100644 --- a/src/MeWeb.App/Strings/lb.json +++ b/src/MeWeb.App/Strings/lb.json @@ -135,6 +135,7 @@ "FactStunFirst": "Éischten STUN-Server", "FactStunSecond": "Zweeten STUN-Server", "FactSystem": "System", + "FactThisLine": "Op dësem Uschloss", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Mam Internet verbonnen iwwer", diff --git a/src/MeWeb.App/Strings/lo.json b/src/MeWeb.App/Strings/lo.json index c1701e5..9ff489c 100644 --- a/src/MeWeb.App/Strings/lo.json +++ b/src/MeWeb.App/Strings/lo.json @@ -135,6 +135,7 @@ "FactStunFirst": "ເຊີເວີ STUN ທຳອິດ", "FactStunSecond": "ເຊີເວີ STUN ທີສອງ", "FactSystem": "ລະບົບ", + "FactThisLine": "ໃນສາຍອິນເຕີເນັດນີ້", "FactUpload": "ອັບໂຫຼດ", "FactUpnp": "UPnP", "FactUpstreams": "ເຊື່ອມຕໍ່ອິນເຕີເນັດຜ່ານ", diff --git a/src/MeWeb.App/Strings/lt.json b/src/MeWeb.App/Strings/lt.json index 714cf82..8f6e43e 100644 --- a/src/MeWeb.App/Strings/lt.json +++ b/src/MeWeb.App/Strings/lt.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pirmasis STUN serveris", "FactStunSecond": "Antrasis STUN serveris", "FactSystem": "Sistema", + "FactThisLine": "Šioje linijoje", "FactUpload": "Išsiuntimas", "FactUpnp": "UPnP", "FactUpstreams": "Prie interneto jungiasi per", diff --git a/src/MeWeb.App/Strings/lv.json b/src/MeWeb.App/Strings/lv.json index 948d875..1ec9154 100644 --- a/src/MeWeb.App/Strings/lv.json +++ b/src/MeWeb.App/Strings/lv.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pirmais STUN serveris", "FactStunSecond": "Otrais STUN serveris", "FactSystem": "Sistēma", + "FactThisLine": "Šajā pieslēgumā", "FactUpload": "Augšupielāde", "FactUpnp": "UPnP", "FactUpstreams": "Savienots ar internetu caur", diff --git a/src/MeWeb.App/Strings/mg.json b/src/MeWeb.App/Strings/mg.json index a3d9988..876398f 100644 --- a/src/MeWeb.App/Strings/mg.json +++ b/src/MeWeb.App/Strings/mg.json @@ -135,6 +135,7 @@ "FactStunFirst": "Mpizara STUN voalohany", "FactStunSecond": "Mpizara STUN faharoa", "FactSystem": "Rafitra", + "FactThisLine": "Amin'ity tsipika ity", "FactUpload": "Fampakarana", "FactUpnp": "UPnP", "FactUpstreams": "Mifandray amin'ny aterineto amin'ny alalan'ny", diff --git a/src/MeWeb.App/Strings/mh.json b/src/MeWeb.App/Strings/mh.json index 267b38a..c4eca5d 100644 --- a/src/MeWeb.App/Strings/mh.json +++ b/src/MeWeb.App/Strings/mh.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server in STUN eo m̧oktata", "FactStunSecond": "Server in STUN eo kein karuo", "FactSystem": "System", + "FactThisLine": "Ilo laain in", "FactUpload": "Jilkinļo̧k", "FactUpnp": "UPnP", "FactUpstreams": "Ej kobaik ippān internet kōn", diff --git a/src/MeWeb.App/Strings/mi.json b/src/MeWeb.App/Strings/mi.json index 70633a4..060d798 100644 --- a/src/MeWeb.App/Strings/mi.json +++ b/src/MeWeb.App/Strings/mi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Tūmau STUN tuatahi", "FactStunSecond": "Tūmau STUN tuarua", "FactSystem": "Pūnaha", + "FactThisLine": "I tēnei rārangi", "FactUpload": "Tukuake", "FactUpnp": "UPnP", "FactUpstreams": "E hono ana ki te ipurangi mā", diff --git a/src/MeWeb.App/Strings/mk.json b/src/MeWeb.App/Strings/mk.json index a7020f2..f1d8e31 100644 --- a/src/MeWeb.App/Strings/mk.json +++ b/src/MeWeb.App/Strings/mk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Прв STUN сервер", "FactStunSecond": "Втор STUN сервер", "FactSystem": "Систем", + "FactThisLine": "На оваа линија", "FactUpload": "Прикачување", "FactUpnp": "UPnP", "FactUpstreams": "Поврзано на интернет преку", diff --git a/src/MeWeb.App/Strings/mn.json b/src/MeWeb.App/Strings/mn.json index ee63564..f89295b 100644 --- a/src/MeWeb.App/Strings/mn.json +++ b/src/MeWeb.App/Strings/mn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Эхний STUN сервер", "FactStunSecond": "Хоёр дахь STUN сервер", "FactSystem": "Систем", + "FactThisLine": "Энэ шугам дээр", "FactUpload": "Илгээх", "FactUpnp": "UPnP", "FactUpstreams": "Интернэтэд дамжин холбогддог сүлжээ", diff --git a/src/MeWeb.App/Strings/ms-Arab.json b/src/MeWeb.App/Strings/ms-Arab.json index 582ade9..30daef6 100644 --- a/src/MeWeb.App/Strings/ms-Arab.json +++ b/src/MeWeb.App/Strings/ms-Arab.json @@ -135,6 +135,7 @@ "FactStunFirst": "ڤلاين STUN ڤرتام", "FactStunSecond": "ڤلاين STUN کدوا", "FactSystem": "سيستم", + "FactThisLine": "ڤد تالين اين", "FactUpload": "موات ناءيق", "FactUpnp": "UPnP", "FactUpstreams": "برسمبوڠ ک اينترنيت ملالوءي", diff --git a/src/MeWeb.App/Strings/ms.json b/src/MeWeb.App/Strings/ms.json index 8dd8912..20160cc 100644 --- a/src/MeWeb.App/Strings/ms.json +++ b/src/MeWeb.App/Strings/ms.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pelayan STUN pertama", "FactStunSecond": "Pelayan STUN kedua", "FactSystem": "Sistem", + "FactThisLine": "Pada talian ini", "FactUpload": "Muat naik", "FactUpnp": "UPnP", "FactUpstreams": "Disambungkan ke internet melalui", diff --git a/src/MeWeb.App/Strings/mt.json b/src/MeWeb.App/Strings/mt.json index 442820a..9ed31e2 100644 --- a/src/MeWeb.App/Strings/mt.json +++ b/src/MeWeb.App/Strings/mt.json @@ -135,6 +135,7 @@ "FactStunFirst": "L-ewwel server STUN", "FactStunSecond": "It-tieni server STUN", "FactSystem": "Sistema", + "FactThisLine": "Fuq din il-linja", "FactUpload": "Tlugħ", "FactUpnp": "UPnP", "FactUpstreams": "Imqabbad mal-internet permezz ta'", diff --git a/src/MeWeb.App/Strings/my.json b/src/MeWeb.App/Strings/my.json index 59896c4..8f1f7e2 100644 --- a/src/MeWeb.App/Strings/my.json +++ b/src/MeWeb.App/Strings/my.json @@ -135,6 +135,7 @@ "FactStunFirst": "ပထမ STUN ဆာဗာ", "FactStunSecond": "ဒုတိယ STUN ဆာဗာ", "FactSystem": "စနစ်", + "FactThisLine": "ဤလိုင်းတွင်", "FactUpload": "အပ်လုဒ်", "FactUpnp": "UPnP", "FactUpstreams": "အင်တာနက်သို့ ချိတ်ဆက်ရာ ကွန်ရက်များ", diff --git a/src/MeWeb.App/Strings/nb.json b/src/MeWeb.App/Strings/nb.json index 6a97b27..724b994 100644 --- a/src/MeWeb.App/Strings/nb.json +++ b/src/MeWeb.App/Strings/nb.json @@ -135,6 +135,7 @@ "FactStunFirst": "Første STUN-server", "FactStunSecond": "Andre STUN-server", "FactSystem": "System", + "FactThisLine": "På denne linjen", "FactUpload": "Opplasting", "FactUpnp": "UPnP", "FactUpstreams": "Koblet til internett gjennom", diff --git a/src/MeWeb.App/Strings/nd.json b/src/MeWeb.App/Strings/nd.json index d3e62f2..93695d7 100644 --- a/src/MeWeb.App/Strings/nd.json +++ b/src/MeWeb.App/Strings/nd.json @@ -135,6 +135,7 @@ "FactStunFirst": "Iseva yokuqala ye-STUN", "FactStunSecond": "Iseva yesibili ye-STUN", "FactSystem": "Isistimu", + "FactThisLine": "Emugqeni lo", "FactUpload": "Ukuthumela", "FactUpnp": "UPnP", "FactUpstreams": "Ukuxhumana le-intanethi kudlula ku", diff --git a/src/MeWeb.App/Strings/ne.json b/src/MeWeb.App/Strings/ne.json index 2544f2c..21cb90d 100644 --- a/src/MeWeb.App/Strings/ne.json +++ b/src/MeWeb.App/Strings/ne.json @@ -135,6 +135,7 @@ "FactStunFirst": "पहिलो STUN सर्भर", "FactStunSecond": "दोस्रो STUN सर्भर", "FactSystem": "प्रणाली", + "FactThisLine": "यो लाइनमा", "FactUpload": "अपलोड", "FactUpnp": "UPnP", "FactUpstreams": "इन्टरनेटसँग जोड्ने नेटवर्कहरू", diff --git a/src/MeWeb.App/Strings/nl.json b/src/MeWeb.App/Strings/nl.json index 727daf7..654d54d 100644 --- a/src/MeWeb.App/Strings/nl.json +++ b/src/MeWeb.App/Strings/nl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Eerste STUN-server", "FactStunSecond": "Tweede STUN-server", "FactSystem": "Systeem", + "FactThisLine": "Op deze aansluiting", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Met het internet verbonden via", diff --git a/src/MeWeb.App/Strings/nn.json b/src/MeWeb.App/Strings/nn.json index 4a3f175..c9e5c55 100644 --- a/src/MeWeb.App/Strings/nn.json +++ b/src/MeWeb.App/Strings/nn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Første STUN-tenar", "FactStunSecond": "Andre STUN-tenar", "FactSystem": "System", + "FactThisLine": "På denne linja", "FactUpload": "Opplasting", "FactUpnp": "UPnP", "FactUpstreams": "Kopla til internett gjennom", diff --git a/src/MeWeb.App/Strings/no.json b/src/MeWeb.App/Strings/no.json index 3668759..5af0b91 100644 --- a/src/MeWeb.App/Strings/no.json +++ b/src/MeWeb.App/Strings/no.json @@ -135,6 +135,7 @@ "FactStunFirst": "Første STUN-server", "FactStunSecond": "Andre STUN-server", "FactSystem": "System", + "FactThisLine": "På denne linjen", "FactUpload": "Opplasting", "FactUpnp": "UPnP", "FactUpstreams": "Koblet til internett gjennom", diff --git a/src/MeWeb.App/Strings/ny.json b/src/MeWeb.App/Strings/ny.json index 133ebbf..a4388c4 100644 --- a/src/MeWeb.App/Strings/ny.json +++ b/src/MeWeb.App/Strings/ny.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva yoyamba ya STUN", "FactStunSecond": "Seva yachiwiri ya STUN", "FactSystem": "Makina", + "FactThisLine": "Pa mzere uwu", "FactUpload": "Kukweza", "FactUpnp": "UPnP", "FactUpstreams": "Kulumikizana ndi intaneti kudzera mu", diff --git a/src/MeWeb.App/Strings/pl.json b/src/MeWeb.App/Strings/pl.json index ef6444c..b1e4985 100644 --- a/src/MeWeb.App/Strings/pl.json +++ b/src/MeWeb.App/Strings/pl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Pierwszy serwer STUN", "FactStunSecond": "Drugi serwer STUN", "FactSystem": "System", + "FactThisLine": "Na tym łączu", "FactUpload": "Wysyłanie", "FactUpnp": "UPnP", "FactUpstreams": "Połączenie z internetem przez", diff --git a/src/MeWeb.App/Strings/ps.json b/src/MeWeb.App/Strings/ps.json index faca840..a6df955 100644 --- a/src/MeWeb.App/Strings/ps.json +++ b/src/MeWeb.App/Strings/ps.json @@ -135,6 +135,7 @@ "FactStunFirst": "لومړی STUN سرور", "FactStunSecond": "دویم STUN سرور", "FactSystem": "سیسټم", + "FactThisLine": "په دې لیکه کې", "FactUpload": "اپلوډ", "FactUpnp": "UPnP", "FactUpstreams": "له انټرنېټ سره د دغو شبکو له لارې نښلول شوی", diff --git a/src/MeWeb.App/Strings/pt.json b/src/MeWeb.App/Strings/pt.json index cedaf67..3727fb9 100644 --- a/src/MeWeb.App/Strings/pt.json +++ b/src/MeWeb.App/Strings/pt.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primeiro servidor STUN", "FactStunSecond": "Segundo servidor STUN", "FactSystem": "Sistema", + "FactThisLine": "Nesta linha", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Chega à internet por meio de", diff --git a/src/MeWeb.App/Strings/qu.json b/src/MeWeb.App/Strings/qu.json index e3ae984..a8466ee 100644 --- a/src/MeWeb.App/Strings/qu.json +++ b/src/MeWeb.App/Strings/qu.json @@ -135,6 +135,7 @@ "FactStunFirst": "Ñawpaq kaq STUN servidor", "FactStunSecond": "Iskay kaq STUN servidor", "FactSystem": "Sistema", + "FactThisLine": "Kay líneapi", "FactUpload": "Wichachiy", "FactUpnp": "UPnP", "FactUpstreams": "Internetman tinkinan redkuna", diff --git a/src/MeWeb.App/Strings/rn.json b/src/MeWeb.App/Strings/rn.json index e7ee4c9..a61d69f 100644 --- a/src/MeWeb.App/Strings/rn.json +++ b/src/MeWeb.App/Strings/rn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seriveri ya mbere ya STUN", "FactStunSecond": "Seriveri ya kabiri ya STUN", "FactSystem": "Sisitemu", + "FactThisLine": "Kuri uyu murongo", "FactUpload": "Kurungika", "FactUpnp": "UPnP", "FactUpstreams": "Ifatanijwe n'interineti biciye kuri", diff --git a/src/MeWeb.App/Strings/ro.json b/src/MeWeb.App/Strings/ro.json index 532db86..849a3b2 100644 --- a/src/MeWeb.App/Strings/ro.json +++ b/src/MeWeb.App/Strings/ro.json @@ -135,6 +135,7 @@ "FactStunFirst": "Primul server STUN", "FactStunSecond": "Al doilea server STUN", "FactSystem": "Sistem", + "FactThisLine": "Pe această linie", "FactUpload": "Încărcare", "FactUpnp": "UPnP", "FactUpstreams": "Conectat la internet prin", diff --git a/src/MeWeb.App/Strings/ru.json b/src/MeWeb.App/Strings/ru.json index 016f5d4..c919c10 100644 --- a/src/MeWeb.App/Strings/ru.json +++ b/src/MeWeb.App/Strings/ru.json @@ -135,6 +135,7 @@ "FactStunFirst": "Первый сервер STUN", "FactStunSecond": "Второй сервер STUN", "FactSystem": "Система", + "FactThisLine": "На этой линии", "FactUpload": "Отправка", "FactUpnp": "UPnP", "FactUpstreams": "Подключение к интернету через", diff --git a/src/MeWeb.App/Strings/rw.json b/src/MeWeb.App/Strings/rw.json index eb9169d..d8d8803 100644 --- a/src/MeWeb.App/Strings/rw.json +++ b/src/MeWeb.App/Strings/rw.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seriveri ya mbere ya STUN", "FactStunSecond": "Seriveri ya kabiri ya STUN", "FactSystem": "Sisitemu", + "FactThisLine": "Kuri uyu murongo", "FactUpload": "Kohereza", "FactUpnp": "UPnP", "FactUpstreams": "Ihuzwa na murandasi binyuze kuri", diff --git a/src/MeWeb.App/Strings/sg.json b/src/MeWeb.App/Strings/sg.json index a6ce523..81e7e90 100644 --- a/src/MeWeb.App/Strings/sg.json +++ b/src/MeWeb.App/Strings/sg.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serveur ti kôzo ti STUN", "FactStunSecond": "Serveur ti ûse ti STUN", "FactSystem": "Système", + "FactThisLine": "Na ndö ti ligne so", "FactUpload": "Tokua", "FactUpnp": "UPnP", "FactUpstreams": "A sâra connexion na internet na lêgë ti", diff --git a/src/MeWeb.App/Strings/si.json b/src/MeWeb.App/Strings/si.json index 64df035..dfda6d7 100644 --- a/src/MeWeb.App/Strings/si.json +++ b/src/MeWeb.App/Strings/si.json @@ -135,6 +135,7 @@ "FactStunFirst": "පළමු STUN සර්වරය", "FactStunSecond": "දෙවන STUN සර්වරය", "FactSystem": "පද්ධතිය", + "FactThisLine": "මෙම සම්බන්ධතාවයේ", "FactUpload": "උඩුගත කිරීම", "FactUpnp": "UPnP", "FactUpstreams": "අන්තර්ජාලයට සම්බන්ධ වන්නේ මේ හරහා", diff --git a/src/MeWeb.App/Strings/sk.json b/src/MeWeb.App/Strings/sk.json index e10fc9b..85ca121 100644 --- a/src/MeWeb.App/Strings/sk.json +++ b/src/MeWeb.App/Strings/sk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvý server STUN", "FactStunSecond": "Druhý server STUN", "FactSystem": "Systém", + "FactThisLine": "Na tejto prípojke", "FactUpload": "Odosielanie", "FactUpnp": "UPnP", "FactUpstreams": "Pripojenie k internetu cez", diff --git a/src/MeWeb.App/Strings/sl.json b/src/MeWeb.App/Strings/sl.json index 1aa4a58..2f50039 100644 --- a/src/MeWeb.App/Strings/sl.json +++ b/src/MeWeb.App/Strings/sl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvi strežnik STUN", "FactStunSecond": "Drugi strežnik STUN", "FactSystem": "Sistem", + "FactThisLine": "Na tej liniji", "FactUpload": "Nalaganje", "FactUpnp": "UPnP", "FactUpstreams": "Povezano z internetom prek", diff --git a/src/MeWeb.App/Strings/sm.json b/src/MeWeb.App/Strings/sm.json index 0b3d420..a9f1ddb 100644 --- a/src/MeWeb.App/Strings/sm.json +++ b/src/MeWeb.App/Strings/sm.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server STUN muamua", "FactStunSecond": "Server STUN lona lua", "FactSystem": "Polokalama faʻavae", + "FactThisLine": "I lenei laina", "FactUpload": "Laʻu atu", "FactUpnp": "UPnP", "FactUpstreams": "Fesoʻotaʻi i le initaneti e ala i", diff --git a/src/MeWeb.App/Strings/sn.json b/src/MeWeb.App/Strings/sn.json index 5639dc4..e87c47e 100644 --- a/src/MeWeb.App/Strings/sn.json +++ b/src/MeWeb.App/Strings/sn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva yekutanga yeSTUN", "FactStunSecond": "Seva yechipiri yeSTUN", "FactSystem": "Sisitimu", + "FactThisLine": "Pamutsetse uyu", "FactUpload": "Kuapurodha", "FactUpnp": "UPnP", "FactUpstreams": "Netiweki dzinoibatanidza neindaneti", diff --git a/src/MeWeb.App/Strings/so.json b/src/MeWeb.App/Strings/so.json index 95ec91c..501079c 100644 --- a/src/MeWeb.App/Strings/so.json +++ b/src/MeWeb.App/Strings/so.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server-ka STUN ee koowaad", "FactStunSecond": "Server-ka STUN ee labaad", "FactSystem": "Nidaamka", + "FactThisLine": "Khadkan", "FactUpload": "Soo gelin", "FactUpnp": "UPnP", "FactUpstreams": "Ku xiran internetka iyadoo loo marayo", diff --git a/src/MeWeb.App/Strings/sq.json b/src/MeWeb.App/Strings/sq.json index 75e3dbb..3e45ccf 100644 --- a/src/MeWeb.App/Strings/sq.json +++ b/src/MeWeb.App/Strings/sq.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serveri i parë STUN", "FactStunSecond": "Serveri i dytë STUN", "FactSystem": "Sistemi", + "FactThisLine": "Në këtë linjë", "FactUpload": "Ngarkimi", "FactUpnp": "UPnP", "FactUpstreams": "Lidhja me internetin përmes", diff --git a/src/MeWeb.App/Strings/sr-Latn.json b/src/MeWeb.App/Strings/sr-Latn.json index 2b33dbe..1a195cd 100644 --- a/src/MeWeb.App/Strings/sr-Latn.json +++ b/src/MeWeb.App/Strings/sr-Latn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Prvi STUN server", "FactStunSecond": "Drugi STUN server", "FactSystem": "Sistem", + "FactThisLine": "Na ovoj liniji", "FactUpload": "Otpremanje", "FactUpnp": "UPnP", "FactUpstreams": "Povezano na internet preko", diff --git a/src/MeWeb.App/Strings/sr.json b/src/MeWeb.App/Strings/sr.json index 6d45197..8ab6abd 100644 --- a/src/MeWeb.App/Strings/sr.json +++ b/src/MeWeb.App/Strings/sr.json @@ -135,6 +135,7 @@ "FactStunFirst": "Први STUN сервер", "FactStunSecond": "Други STUN сервер", "FactSystem": "Систем", + "FactThisLine": "На овој линији", "FactUpload": "Отпремање", "FactUpnp": "UPnP", "FactUpstreams": "Повезано са интернетом преко", diff --git a/src/MeWeb.App/Strings/ss.json b/src/MeWeb.App/Strings/ss.json index 43084ea..4bc3a71 100644 --- a/src/MeWeb.App/Strings/ss.json +++ b/src/MeWeb.App/Strings/ss.json @@ -135,6 +135,7 @@ "FactStunFirst": "Iseva yekucala ye-STUN", "FactStunSecond": "Iseva yesibili ye-STUN", "FactSystem": "Luhlelo", + "FactThisLine": "Kulomugca", "FactUpload": "Kutfumela", "FactUpnp": "UPnP", "FactUpstreams": "Tinethiwekhi letiyixhumanisa ne-inthanethi", diff --git a/src/MeWeb.App/Strings/st.json b/src/MeWeb.App/Strings/st.json index e5c42f1..f74bc37 100644 --- a/src/MeWeb.App/Strings/st.json +++ b/src/MeWeb.App/Strings/st.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva ya pele ya STUN", "FactStunSecond": "Seva ya bobedi ya STUN", "FactSystem": "Sistimi", + "FactThisLine": "Mohaleng ona", "FactUpload": "Ho romela", "FactUpnp": "UPnP", "FactUpstreams": "E hokahane le inthanete ka", diff --git a/src/MeWeb.App/Strings/sv.json b/src/MeWeb.App/Strings/sv.json index 26c21db..52b9a44 100644 --- a/src/MeWeb.App/Strings/sv.json +++ b/src/MeWeb.App/Strings/sv.json @@ -135,6 +135,7 @@ "FactStunFirst": "Första STUN-servern", "FactStunSecond": "Andra STUN-servern", "FactSystem": "System", + "FactThisLine": "På den här anslutningen", "FactUpload": "Uppladdning", "FactUpnp": "UPnP", "FactUpstreams": "Ansluten till internet via", diff --git a/src/MeWeb.App/Strings/sw.json b/src/MeWeb.App/Strings/sw.json index 2536b4e..f3d84fa 100644 --- a/src/MeWeb.App/Strings/sw.json +++ b/src/MeWeb.App/Strings/sw.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva ya kwanza ya STUN", "FactStunSecond": "Seva ya pili ya STUN", "FactSystem": "Mfumo", + "FactThisLine": "Kwenye laini hii", "FactUpload": "Kupakia", "FactUpnp": "UPnP", "FactUpstreams": "Imeunganishwa na intaneti kupitia", diff --git a/src/MeWeb.App/Strings/ta.json b/src/MeWeb.App/Strings/ta.json index 1857053..9bd776f 100644 --- a/src/MeWeb.App/Strings/ta.json +++ b/src/MeWeb.App/Strings/ta.json @@ -135,6 +135,7 @@ "FactStunFirst": "முதல் STUN சர்வர்", "FactStunSecond": "இரண்டாவது STUN சர்வர்", "FactSystem": "இயக்க முறைமை", + "FactThisLine": "இந்த இணைப்பில்", "FactUpload": "பதிவேற்றம்", "FactUpnp": "UPnP", "FactUpstreams": "இணைய இணைப்பு இவற்றின் வழியாக", diff --git a/src/MeWeb.App/Strings/tet.json b/src/MeWeb.App/Strings/tet.json index 8640c29..8402cd8 100644 --- a/src/MeWeb.App/Strings/tet.json +++ b/src/MeWeb.App/Strings/tet.json @@ -135,6 +135,7 @@ "FactStunFirst": "Servidór STUN dahuluk", "FactStunSecond": "Servidór STUN daruak", "FactSystem": "Sistema", + "FactThisLine": "Iha liña ne'e", "FactUpload": "Upload", "FactUpnp": "UPnP", "FactUpstreams": "Liga ba internet liuhusi", diff --git a/src/MeWeb.App/Strings/tg.json b/src/MeWeb.App/Strings/tg.json index dee0486..e4a8863 100644 --- a/src/MeWeb.App/Strings/tg.json +++ b/src/MeWeb.App/Strings/tg.json @@ -135,6 +135,7 @@ "FactStunFirst": "Сервери якуми STUN", "FactStunSecond": "Сервери дуюми STUN", "FactSystem": "Система", + "FactThisLine": "Дар ин хат", "FactUpload": "Фиристодан", "FactUpnp": "UPnP", "FactUpstreams": "Ба интернет пайваст тавассути", diff --git a/src/MeWeb.App/Strings/th.json b/src/MeWeb.App/Strings/th.json index a9383ae..97702b2 100644 --- a/src/MeWeb.App/Strings/th.json +++ b/src/MeWeb.App/Strings/th.json @@ -135,6 +135,7 @@ "FactStunFirst": "เซิร์ฟเวอร์ STUN ตัวแรก", "FactStunSecond": "เซิร์ฟเวอร์ STUN ตัวที่สอง", "FactSystem": "ระบบ", + "FactThisLine": "บนสายนี้", "FactUpload": "อัปโหลด", "FactUpnp": "UPnP", "FactUpstreams": "เชื่อมต่ออินเทอร์เน็ตผ่าน", diff --git a/src/MeWeb.App/Strings/ti.json b/src/MeWeb.App/Strings/ti.json index 5f2ccc8..98038e1 100644 --- a/src/MeWeb.App/Strings/ti.json +++ b/src/MeWeb.App/Strings/ti.json @@ -135,6 +135,7 @@ "FactStunFirst": "ቀዳማይ ሰርቨር STUN", "FactStunSecond": "ካልኣይ ሰርቨር STUN", "FactSystem": "ስርዓት", + "FactThisLine": "ኣብዚ መስመር", "FactUpload": "ምልዓል", "FactUpnp": "UPnP", "FactUpstreams": "ምስ ኢንተርነት ዝራኸበሉ መርበባት", diff --git a/src/MeWeb.App/Strings/tk.json b/src/MeWeb.App/Strings/tk.json index 5e8bda1..5058c28 100644 --- a/src/MeWeb.App/Strings/tk.json +++ b/src/MeWeb.App/Strings/tk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Birinji STUN serweri", "FactStunSecond": "Ikinji STUN serweri", "FactSystem": "Ulgam", + "FactThisLine": "Bu liniýada", "FactUpload": "Ibermek", "FactUpnp": "UPnP", "FactUpstreams": "Internete şular arkaly birikýär", diff --git a/src/MeWeb.App/Strings/tn.json b/src/MeWeb.App/Strings/tn.json index 345275a..862789e 100644 --- a/src/MeWeb.App/Strings/tn.json +++ b/src/MeWeb.App/Strings/tn.json @@ -135,6 +135,7 @@ "FactStunFirst": "Seva ya ntlha ya STUN", "FactStunSecond": "Seva ya bobedi ya STUN", "FactSystem": "Sisteme", + "FactThisLine": "Mo moleng o", "FactUpload": "Go tlhatlosa", "FactUpnp": "UPnP", "FactUpstreams": "Dineteweke tse di e golaganyang le inthanete", diff --git a/src/MeWeb.App/Strings/to.json b/src/MeWeb.App/Strings/to.json index 858eb9c..89568d1 100644 --- a/src/MeWeb.App/Strings/to.json +++ b/src/MeWeb.App/Strings/to.json @@ -135,6 +135,7 @@ "FactStunFirst": "ʻUluaki sēva STUN", "FactStunSecond": "Sēva STUN hono ua", "FactSystem": "Sisitemi", + "FactThisLine": "ʻI he laine ko ʻeni", "FactUpload": "Hiki atu", "FactUpnp": "UPnP", "FactUpstreams": "Fehokotaki ki he ʻinitaneti ʻo fakafou ʻi", diff --git a/src/MeWeb.App/Strings/tpi.json b/src/MeWeb.App/Strings/tpi.json index 3cd4f7c..7485501 100644 --- a/src/MeWeb.App/Strings/tpi.json +++ b/src/MeWeb.App/Strings/tpi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Namba wan seva STUN", "FactStunSecond": "Namba tu seva STUN", "FactSystem": "Sistem", + "FactThisLine": "Long dispela lain", "FactUpload": "Aplod", "FactUpnp": "UPnP", "FactUpstreams": "I konek long intanet long rot bilong", diff --git a/src/MeWeb.App/Strings/tr.json b/src/MeWeb.App/Strings/tr.json index b32075b..38a9eba 100644 --- a/src/MeWeb.App/Strings/tr.json +++ b/src/MeWeb.App/Strings/tr.json @@ -135,6 +135,7 @@ "FactStunFirst": "Birinci STUN sunucusu", "FactStunSecond": "İkinci STUN sunucusu", "FactSystem": "Sistem", + "FactThisLine": "Bu hatta", "FactUpload": "Yükleme", "FactUpnp": "UPnP", "FactUpstreams": "İnternete şu ağlar üzerinden bağlı", diff --git a/src/MeWeb.App/Strings/tvl.json b/src/MeWeb.App/Strings/tvl.json index d9145a9..bbc7ba4 100644 --- a/src/MeWeb.App/Strings/tvl.json +++ b/src/MeWeb.App/Strings/tvl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Server STUN muamua", "FactStunSecond": "Server STUN te lua", "FactSystem": "System", + "FactThisLine": "I te laina tenei", "FactUpload": "Tuku atu", "FactUpnp": "UPnP", "FactUpstreams": "E fesokotaki ki te initaneti i", diff --git a/src/MeWeb.App/Strings/tzm.json b/src/MeWeb.App/Strings/tzm.json index 5f121a8..199a13b 100644 --- a/src/MeWeb.App/Strings/tzm.json +++ b/src/MeWeb.App/Strings/tzm.json @@ -135,6 +135,7 @@ "FactStunFirst": "Aqeddac STUN amezwaru", "FactStunSecond": "Aqeddac STUN wiss sin", "FactSystem": "Anagraw", + "FactThisLine": "G tuqqna ad", "FactUpload": "Asali", "FactUpnp": "UPnP", "FactUpstreams": "Iqqen s unternit zeg", diff --git a/src/MeWeb.App/Strings/uk.json b/src/MeWeb.App/Strings/uk.json index 691575a..50b760e 100644 --- a/src/MeWeb.App/Strings/uk.json +++ b/src/MeWeb.App/Strings/uk.json @@ -135,6 +135,7 @@ "FactStunFirst": "Перший сервер STUN", "FactStunSecond": "Другий сервер STUN", "FactSystem": "Система", + "FactThisLine": "На цій лінії", "FactUpload": "Вивантаження", "FactUpnp": "UPnP", "FactUpstreams": "Підключено до інтернету через", diff --git a/src/MeWeb.App/Strings/ur.json b/src/MeWeb.App/Strings/ur.json index 76fdd75..1d4085f 100644 --- a/src/MeWeb.App/Strings/ur.json +++ b/src/MeWeb.App/Strings/ur.json @@ -135,6 +135,7 @@ "FactStunFirst": "پہلا STUN سرور", "FactStunSecond": "دوسرا STUN سرور", "FactSystem": "سسٹم", + "FactThisLine": "اس لائن پر", "FactUpload": "اپ لوڈ", "FactUpnp": "UPnP", "FactUpstreams": "انٹرنیٹ سے جوڑنے والے نیٹ ورک", diff --git a/src/MeWeb.App/Strings/uz-Cyrl.json b/src/MeWeb.App/Strings/uz-Cyrl.json index 1ceaf05..126a812 100644 --- a/src/MeWeb.App/Strings/uz-Cyrl.json +++ b/src/MeWeb.App/Strings/uz-Cyrl.json @@ -135,6 +135,7 @@ "FactStunFirst": "Биринчи STUN сервери", "FactStunSecond": "Иккинчи STUN сервери", "FactSystem": "Тизим", + "FactThisLine": "Бу линияда", "FactUpload": "Юбориш", "FactUpnp": "UPnP", "FactUpstreams": "Интернетга шулар орқали уланади", diff --git a/src/MeWeb.App/Strings/uz.json b/src/MeWeb.App/Strings/uz.json index 84b9c95..6347a72 100644 --- a/src/MeWeb.App/Strings/uz.json +++ b/src/MeWeb.App/Strings/uz.json @@ -135,6 +135,7 @@ "FactStunFirst": "Birinchi STUN serveri", "FactStunSecond": "Ikkinchi STUN serveri", "FactSystem": "Tizim", + "FactThisLine": "Bu liniyada", "FactUpload": "Yuborish", "FactUpnp": "UPnP", "FactUpstreams": "Internetga shu tarmoqlar orqali ulangan", diff --git a/src/MeWeb.App/Strings/vi.json b/src/MeWeb.App/Strings/vi.json index 28c42c5..0faf7a1 100644 --- a/src/MeWeb.App/Strings/vi.json +++ b/src/MeWeb.App/Strings/vi.json @@ -135,6 +135,7 @@ "FactStunFirst": "Máy chủ STUN thứ nhất", "FactStunSecond": "Máy chủ STUN thứ hai", "FactSystem": "Hệ thống", + "FactThisLine": "Trên đường truyền này", "FactUpload": "Tải lên", "FactUpnp": "UPnP", "FactUpstreams": "Kết nối internet qua", diff --git a/src/MeWeb.App/Strings/wni.json b/src/MeWeb.App/Strings/wni.json index bc60ff6..1b38f1b 100644 --- a/src/MeWeb.App/Strings/wni.json +++ b/src/MeWeb.App/Strings/wni.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serveur STUN ya mwandzo", "FactStunSecond": "Serveur STUN ya pvili", "FactSystem": "Système", + "FactThisLine": "Ha ligne iyi", "FactUpload": "Envoi", "FactUpnp": "UPnP", "FactUpstreams": "Connexion ya internet ndzia ya", diff --git a/src/MeWeb.App/Strings/wo.json b/src/MeWeb.App/Strings/wo.json index dbb53d8..73625bc 100644 --- a/src/MeWeb.App/Strings/wo.json +++ b/src/MeWeb.App/Strings/wo.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serwëer STUN bu njëkk", "FactStunSecond": "Serwëer STUN bu ñaareel", "FactSystem": "Sistem", + "FactThisLine": "Ci rëdd bii", "FactUpload": "Yéege", "FactUpnp": "UPnP", "FactUpstreams": "Jokkoo ak internet jaarale ci", diff --git a/src/MeWeb.App/Strings/yo.json b/src/MeWeb.App/Strings/yo.json index 0519e0e..bf054a7 100644 --- a/src/MeWeb.App/Strings/yo.json +++ b/src/MeWeb.App/Strings/yo.json @@ -135,6 +135,7 @@ "FactStunFirst": "Sáfà STUN àkọ́kọ́", "FactStunSecond": "Sáfà STUN kejì", "FactSystem": "Sístẹ́mù", + "FactThisLine": "Lórí ìlà yìí", "FactUpload": "Ìgbéṣókè", "FactUpnp": "UPnP", "FactUpstreams": "Ó so mọ́ íntánẹ́ẹ̀tì nípasẹ̀", diff --git a/src/MeWeb.App/Strings/zdj.json b/src/MeWeb.App/Strings/zdj.json index cb20bbb..97962e0 100644 --- a/src/MeWeb.App/Strings/zdj.json +++ b/src/MeWeb.App/Strings/zdj.json @@ -135,6 +135,7 @@ "FactStunFirst": "Serveur STUN ya mwandzo", "FactStunSecond": "Serveur STUN ya pvili", "FactSystem": "Système", + "FactThisLine": "Ha ligne iyi", "FactUpload": "Envoi", "FactUpnp": "UPnP", "FactUpstreams": "Connecté ha internet ha ndjia ya", diff --git a/src/MeWeb.App/Strings/zh.json b/src/MeWeb.App/Strings/zh.json index 739544f..ff17c5a 100644 --- a/src/MeWeb.App/Strings/zh.json +++ b/src/MeWeb.App/Strings/zh.json @@ -135,6 +135,7 @@ "FactStunFirst": "第一个 STUN 服务器", "FactStunSecond": "第二个 STUN 服务器", "FactSystem": "系统", + "FactThisLine": "此线路上", "FactUpload": "上传", "FactUpnp": "UPnP", "FactUpstreams": "通过以下网络接入互联网", diff --git a/src/MeWeb.Core/Checks/CheckRunner.cs b/src/MeWeb.Core/Checks/CheckRunner.cs index 989109e..9f21af9 100644 --- a/src/MeWeb.Core/Checks/CheckRunner.cs +++ b/src/MeWeb.Core/Checks/CheckRunner.cs @@ -25,6 +25,7 @@ public class RunReport public DnsReport Dns { get; set; } public DeviceReport DeviceReport { get; set; } public CellularReport Cellular { get; set; } + public bool OwnNetwork { get; set; } public SpeedReport Speed { get; set; } public List Uses { get; set; } = []; public HistorySummary History { get; set; } @@ -84,12 +85,20 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k Settle(Verdicts.Online(run.Online, run.Local)); }); + var router = Step(CheckId.Router, async () => + { + await connection; + run.Router = run.Local?.Active?.Kind == LinkKind.Mobile ? new RouterReport() : await Gateway.Inspect(platform, run.Local?.GatewayV4, ct); + Settle(Verdicts.Router(run.Router, run.Local)); + }); + var addresses = Step(CheckId.Addresses, async () => { run.PublicV4 = await v4; run.PublicV6 = await v6; - await connection; - Settle(Verdicts.Addresses(run.PublicV4, run.PublicV6, run.Local)); + await Task.WhenAll(connection, router); + run.OwnNetwork = Addresses.SameNetwork(await ServerProbe.ServerAddresses(ct), run.PublicV4, run.PublicV6); + Settle(Verdicts.Addresses(run.PublicV4, run.PublicV6, run.Local, run.Router)); }); var provider = Step(CheckId.Provider, async () => @@ -102,13 +111,6 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k Settle(Verdicts.Provider(knowledge, run.NetworkV4, run.NetworkV6, run.PublicV4 is not null || run.PublicV6 is not null, run.Local?.Active?.Kind == LinkKind.Mobile)); }); - var router = Step(CheckId.Router, async () => - { - await connection; - run.Router = run.Local?.Active?.Kind == LinkKind.Mobile ? new RouterReport() : await Gateway.Inspect(platform, run.Local?.GatewayV4, ct); - Settle(Verdicts.Router(run.Router, run.Local)); - }); - var nat = Step(CheckId.Nat, async () => { await Task.WhenAll(router, addresses); @@ -122,15 +124,20 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k { await connection; run.Stun = await Stun.Compare((Shared.Endpoints.SecondStunHost, Shared.Endpoints.SecondStunPort), (Shared.Endpoints.StunHost, Shared.Endpoints.StunPort), run.Local, ct); - run.Stun.Ports = await Stun.Ports((Shared.Endpoints.StunHost, Shared.Endpoints.StunPort), 16, ct); + await addresses; + if (!run.OwnNetwork) run.Stun.Ports = await Stun.Ports((Shared.Endpoints.StunHost, Shared.Endpoints.StunPort), 16, ct); await nat; - var (low, high) = history.PortRange(run.PublicV4); - Stun.Classify(run.Stun.Ports, low, high); - Settle(Verdicts.Behaviour(run.Stun, run.Nat)); + if (run.Stun.Ports is not null) + { + var (low, high) = history.PortRange(run.PublicV4); + Stun.Classify(run.Stun.Ports, low, high); + } + Settle(Verdicts.Behaviour(run.Stun, run.Nat, run.OwnNetwork)); + if (run.Stun.Ports is null) return; _ = Task.Run(async () => { await Stun.Lifetime((Shared.Endpoints.StunHost, Shared.Endpoints.StunPort), run.Stun.Ports, [30, 120], ct); - Settle(Verdicts.Behaviour(run.Stun, run.Nat)); + Settle(Verdicts.Behaviour(run.Stun, run.Nat, run.OwnNetwork)); }, ct); }); @@ -163,6 +170,11 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k Settle(new Finding { Id = CheckId.Speed, Outcome = Outcome.Unknown, Summary = "SpeedOffline" }); return; } + if (run.OwnNetwork) + { + Settle(new Finding { Id = CheckId.Speed, Outcome = Outcome.Unknown, Summary = "ReachOwnNetwork" }); + return; + } run.Speed = await SpeedCheck.Run(https, run.Local?.Active?.Kind ?? LinkKind.Unknown, ct); Settle(Verdicts.Speed(run.Speed)); }); @@ -183,6 +195,7 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k PortLow = run.Stun?.Ports?.Pattern is PortPattern.InOrder or PortPattern.Block ? run.Stun.Ports.Low : 0, PortHigh = run.Stun?.Ports?.Pattern is PortPattern.InOrder or PortPattern.Block ? run.Stun.Ports.High : 0, }); + Settle(Verdicts.Provider(knowledge, run.NetworkV4, run.NetworkV6, run.PublicV4 is not null || run.PublicV6 is not null, run.Local?.Active?.Kind == LinkKind.Mobile, run)); Settle(Verdicts.History(run.History)); run.Uses = Uses.Decide(run); }); diff --git a/src/MeWeb.Core/Checks/ServerProbe.cs b/src/MeWeb.Core/Checks/ServerProbe.cs index a63d0b7..bfa63d6 100644 --- a/src/MeWeb.Core/Checks/ServerProbe.cs +++ b/src/MeWeb.Core/Checks/ServerProbe.cs @@ -127,6 +127,18 @@ public class ServerProbe(HttpClient https, HttpClient plain) } } + public static async Task ServerAddresses(CancellationToken ct) + { + try + { + return await Dns.GetHostAddressesAsync(Endpoints.Host, ct); + } + catch (Exception) when (!ct.IsCancellationRequested) + { + return []; + } + } + static async Task Resolves(string host, CancellationToken ct) { try diff --git a/src/MeWeb.Core/Checks/Verdicts.cs b/src/MeWeb.Core/Checks/Verdicts.cs index f84444e..6e51090 100644 --- a/src/MeWeb.Core/Checks/Verdicts.cs +++ b/src/MeWeb.Core/Checks/Verdicts.cs @@ -73,7 +73,7 @@ public static class Verdicts return finding; } - public static Finding Addresses(string v4, string v6, LocalSnapshot local) + public static Finding Addresses(string v4, string v6, LocalSnapshot local, RouterReport router) { var finding = new Finding { Id = CheckId.Addresses }; (finding.Outcome, finding.Summary) = (v4, v6) switch @@ -86,9 +86,7 @@ public static class Verdicts if (v4 is not null) { finding.With("FactPublicV4", v4); - var own = local.Active?.Addresses.Any(a => Net.Addresses.SameAddress(a, v4)) == true; - var shared = local.Active?.Kind == LinkKind.Mobile || Net.Addresses.Parse(local.LocalV4) is { } address && Net.Addresses.Classify(address) == AddressKind.Shared; - finding.WithKey("FactWhoHasIt", own ? "ValueOnThisDevice" : shared ? "ValueSharedProvider" : "ValueSharedAtHome"); + finding.WithKey("FactWhoHasIt", Holder(NatOf(local, router, v4))); } if (v6 is not null) { @@ -99,7 +97,7 @@ public static class Verdicts return finding; } - public static Finding Provider(KnowledgeBase knowledge, AsnEntry v4, AsnEntry v6, bool anyAddress, bool mobile) + public static Finding Provider(KnowledgeBase knowledge, AsnEntry v4, AsnEntry v6, bool anyAddress, bool mobile, RunReport run = null) { var finding = new Finding { Id = CheckId.Provider }; if (!anyAddress) @@ -131,9 +129,19 @@ public static class Verdicts if (upstreams.Count > 0) finding.With("FactUpstreams", string.Join("\n", upstreams.Select(u => $"{knowledge.NameOf(u) ?? "AS" + u} (AS{u})"))); if (profile is null) return finding; AddFact(finding, "FactProviderIpv4", "ProviderIpv4", profile.Ipv4); + var usual = profile.Ipv4?.Value is null ? null : Pascal(profile.Ipv4.Value); + var sharedHere = run?.Nat is NatKind.Shared or NatKind.Translated; + var ownHere = run?.Nat is NatKind.HomeRouter or NatKind.Direct or NatKind.DoubleNat; + if ((usual is "Shared" or "SharedPorts" && ownHere) || (usual is "PublicDynamic" && sharedHere)) + finding.WithKey("FactThisLine", Holder(run.Nat)); AddFact(finding, "FactProviderPublic", "ProviderPublic", profile.PublicAddress); AddFact(finding, "FactProviderIpv6", "ProviderIpv6", profile.Ipv6); AddFact(finding, "FactProviderPort25", "ProviderPort25", profile.Port25); + var port25 = profile.Port25?.Value is null ? null : Pascal(profile.Port25.Value); + if (run?.Mail?.Port25 == Core.Mail.PortState.Open && port25 is "Blocked" or "BlockedOnRequest" or "Closed") + finding.WithKey("FactThisLine", "ValuePort25Open", run.Mail.Banner ?? ""); + else if (run?.Mail?.Port25 == Core.Mail.PortState.Blocked && port25 is "Open") + finding.WithKey("FactThisLine", "ValuePort25Blocked"); if (profile.Sheet is not null) finding.Facts.Add(new Fact { Label = "FactProviderSheet", Key = "ValueOpenSheet", Link = profile.Sheet }); return finding; } @@ -192,6 +200,13 @@ public static class Verdicts return (finding, kind); } + static string Holder(NatKind nat) => nat switch + { + NatKind.Direct => "ValueOnThisDevice", + NatKind.Shared or NatKind.Translated => "ValueSharedProvider", + _ => "ValueSharedAtHome", + }; + public static NatKind NatOf(LocalSnapshot local, RouterReport router, string v4) { if (v4 is null) return NatKind.NoIpv4; @@ -212,11 +227,12 @@ public static class Verdicts }; } - public static Finding Behaviour(StunReport stun, NatKind nat) + public static Finding Behaviour(StunReport stun, NatKind nat, bool ownNetwork) { var finding = new Finding { Id = CheckId.Behaviour }; (finding.Outcome, finding.Summary) = stun.Behaviour switch { + _ when ownNetwork => (Outcome.Unknown, "ReachOwnNetwork"), NatBehaviour.None => (Outcome.Good, "BehaviourNone"), NatBehaviour.Easy => (Outcome.Good, "BehaviourEasy"), NatBehaviour.Hard => (Outcome.Caution, "BehaviourHard"), diff --git a/src/MeWeb.Core/Net/Addresses.cs b/src/MeWeb.Core/Net/Addresses.cs index a405caf..41bf945 100644 --- a/src/MeWeb.Core/Net/Addresses.cs +++ b/src/MeWeb.Core/Net/Addresses.cs @@ -36,6 +36,17 @@ public static class Addresses public static IPAddress Parse(string text) => IPAddress.TryParse(text, out var address) ? address : null; + public static bool SameNetwork(IEnumerable server, string v4, string v6) + { + foreach (var address in server) + { + if (address.AddressFamily == AddressFamily.InterNetwork && SameAddress(address.ToString(), v4)) return true; + if (address.AddressFamily != AddressFamily.InterNetworkV6 || Parse(v6) is not { } mine) continue; + if (address.GetAddressBytes().AsSpan(0, 6).SequenceEqual(mine.GetAddressBytes().AsSpan(0, 6))) return true; + } + return false; + } + public static bool SameAddress(string left, string right) { var a = Parse(left);