Skip to content

Commit 57eade2

Browse files
BornToBeRootclaude
andauthored
Feature: RDAP tool (#3607)
* Feature: Add RDAP client and IANA bootstrap service Adds the RDAP (RFC 7480, 9082, 9083, 9224) client to NETworkManager.Models: query parser (IDN, CIDR, asplain/asdot ASN, object-tag handles), IANA bootstrap download/cache with conditional GET, label-wise/longest-prefix/ range matching, ARIN fallback for unlisted number resources, a small table of RDAP servers not listed by IANA (.de, .ch/.li, .io), HTTPS-first server selection, manual redirect handling, registrar referral and a tolerant jCard parser. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Register RDAP application, settings and strings Adds ApplicationName.RDAP (before Whois), its icon, settings (query history, query type, referral, timeout, export), the RDAP settings page entry, tab count, documentation link, query type converter and English strings. Existing users get the new app via the settings upgrade. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Add RDAP view, settings page and Whois hand-off Adds the RDAP tool (tabs, query type, registrar referral, structured result view with raw JSON toggle, JSON/TXT export, history) and the RDAP settings page (IANA bootstrap cache status, update now, timeout). Domains without a known RDAP server can be opened in Whois; for this, WhoisHostViewModel.AddTab is public, WhoisHostView forwards it and the redirect in MainWindow now creates a Whois tab instead of ignoring the data. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Add RDAP profile support Profiles can store an RDAP query and its query type (inherits the host by default), including the profile dialog tab, the profile list column and the import of hosts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix: IP Geolocation history written to Whois history Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: Add RDAP documentation and changelog Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Move RDAP referral option to settings, align export "Follow referral to registrar" is now a setting (Settings > RDAP) instead of a checkbox next to the query button. Export is available via an Export... button below the result and via right-click, like IP Geolocation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Show links of RDAP notices and remarks Notices like terms of service, privacy policy or inaccuracy report forms now show their links, which open in the browser (LinkTextBlock style, ExternalProcessStarter.OpenUrl). The URLs come from the RDAP server and are therefore restricted to absolute HTTP(S) URIs in normalized form before they are passed to the shell. Links are also included in the text export. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix: RDAP bootstrap cache status and publication dates - Publication date is parsed as UTC and shown in local time (was a culture dependent string, shown with the wrong offset) and always read from the cached file. - Incomplete cache entries (file present, no download time) are repaired: the file is downloaded again instead of sending a conditional request. - Replacing a cached file is retried, since it can be locked briefly (e.g. by a virus scanner). - The last error per file is stored and shown in Settings > RDAP. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Follow RDAP registrar referral by default Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Refresh RDAP bootstrap files once a week The IANA files rarely change, so they are now checked automatically once a week instead of daily (data.iana.org max-age). A longer server cache lifetime is still honored, and "Update now" checks immediately. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Use help icons in RDAP settings Additional information for "Bootstrap files" and "Follow referral to registrar" is shown as an info icon tooltip, like on the other settings pages, instead of a text below the setting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Align RDAP result layout with other tools - Detail rows use CenterTextBlock labels and a 10px gap without extra row margins, like IP Geolocation and Network Interface. - Section labels (Events, Nameservers, ...) use the gray group label style instead of an enlarged header. - No duplicate "Result" title; Registry/Registrar titles are only shown if the referral was followed. - Notice texts are shown in normal weight (only values are bold). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix: Limit RDAP bootstrap retries if IANA is not reachable - A failed update is retried after one hour, at most 3 times; then the cached files are used until the regular weekly update ("Update now" always checks). The cached copy is never removed before a new file was downloaded and validated. - After a network error, the remaining files are not tried in the same update (same server), so a blocked server costs at most one timeout. - cache-info.json is only written if something was checked. - A temporary file is removed if replacing the cached file fails. - The "bootstrap unavailable" message includes the reason. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Secure RDAP referrals and validate the query per type - The referral to the registrar (and its redirects) is only followed via HTTPS and not to local or private addresses, since the URL is sent by the registry. A skipped referral is logged and shown as status message. - New RDAPQueryValidator validates the query depending on the query type (domain, TLD, IP address/CIDR, ASN, entity) while typing, in the RDAP tool and in the profile dialog, and validates again if the type changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Add export button to Whois Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: RDAP retries, referral security, Whois export Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: Add PR link to changelog Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix: Address review feedback for RDAP (#3607) - Referrals: pin the connection to the checked addresses (SocketsHttpHandler ConnectCallback) to prevent DNS rebinding to local/private addresses, fail closed if the host cannot be resolved; proxied connections (CONNECT) are checked before the request. - Run command / redirected data: detect the query type from the input instead of using the last selected type. - Notice links: use a keyboard accessible Hyperlink (Tab + Enter). - Clarify why zone IDs are removed from IPv6 input (RFC 9082 3.1.1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Make links keyboard accessible (#3607) New shared LinkHyperlink style (looks like LinkTextBlock, but focusable with Tab and opened with Enter). Used for the links in About (license, community, update), Web Console (WebView2 runtime download) and the RDAP notices, which were mouse-only TextBlocks before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix: Limit RDAP response size Responses (RDAP queries, referrals, bootstrap files) are limited to 10 MB, so a broken or malicious server cannot exhaust the memory. Larger responses fail as network error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix: Settings lists not saved after the settings were loaded The CollectionChanged handlers were only attached to the initial collections in the constructor. Since the settings are stored as JSON (#3282), System.Text.Json replaces the collections when loading, and some views replace them at runtime (e.g. PuTTY/PowerShell histories, reset to defaults), so changes to these lists no longer marked the settings as changed and were lost if nothing else changed. Each collection setter now moves the handler to the new collection. Also adds the missing handler for Network_CustomDNSServers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feature: Show "Open in Whois" in the center of the RDAP view If no RDAP server is known for a domain, the error stays in the status line and the center of the view (instead of the "Enter a domain..." placeholder) shows a hint and an "Open in Whois" button, like the WebView2 hint in Web Console. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: Add RDAP screenshot Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: Add blog post "Introducing RDAP" Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: Clarify RDAP transport in blog post Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: Add RDAP to website tool list and command line arguments - Homepage / docs introduction: RDAP chip (28 built-in tools). - --application: values updated to the current applications (RDAP, HostsFileEditor, Firewall, NeighborTable added; obsolete ARPTable removed). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent cfd5dfa commit 57eade2

78 files changed

Lines changed: 6016 additions & 44 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎Source/GlobalAssemblyInfo.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
[assembly: AssemblyTrademark("")]
77
[assembly: AssemblyCulture("")]
88

9-
[assembly: AssemblyVersion("2026.8.5.0")]
10-
[assembly: AssemblyFileVersion("2026.8.5.0")]
9+
[assembly: AssemblyVersion("2026.10.11.0")]
10+
[assembly: AssemblyFileVersion("2026.10.11.0")]
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Windows.Data;
4+
using NETworkManager.Localization;
5+
using NETworkManager.Models.RDAP;
6+
7+
namespace NETworkManager.Converters;
8+
9+
/// <summary>
10+
/// Convert <see cref="RDAPQueryType" /> to translated <see cref="string" />.
11+
/// </summary>
12+
public sealed class RDAPQueryTypeToStringConverter : IValueConverter
13+
{
14+
/// <summary>
15+
/// Convert <see cref="RDAPQueryType" /> to translated <see cref="string" />.
16+
/// </summary>
17+
/// <param name="value">Object from type <see cref="RDAPQueryType" />.</param>
18+
/// <param name="targetType"></param>
19+
/// <param name="parameter"></param>
20+
/// <param name="culture"></param>
21+
/// <returns>Translated <see cref="RDAPQueryType" />.</returns>
22+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
23+
{
24+
return value is not RDAPQueryType queryType
25+
? "-/-"
26+
: ResourceTranslator.Translate(ResourceIdentifier.RDAPQueryType, queryType);
27+
}
28+
29+
/// <summary>
30+
/// !!! Method not implemented !!!
31+
/// </summary>
32+
/// <param name="value"></param>
33+
/// <param name="targetType"></param>
34+
/// <param name="parameter"></param>
35+
/// <param name="culture"></param>
36+
/// <returns></returns>
37+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
38+
{
39+
throw new NotImplementedException();
40+
}
41+
}

‎Source/NETworkManager.Documentation/DocumentationIdentifier.cs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ public enum DocumentationIdentifier
105105
/// </summary>
106106
ApplicationWakeOnLan,
107107

108+
/// <summary>
109+
/// RDAP documentation page.
110+
/// </summary>
111+
ApplicationRdap,
112+
108113
/// <summary>
109114
/// Whois documentation page.
110115
/// </summary>

‎Source/NETworkManager.Documentation/DocumentationManager.cs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ public static class DocumentationManager
7878
new DocumentationInfo(DocumentationIdentifier.ApplicationWakeOnLan,
7979
@"docs/application/wake-on-lan"),
8080

81+
new DocumentationInfo(DocumentationIdentifier.ApplicationRdap,
82+
@"docs/application/rdap"),
83+
8184
new DocumentationInfo(DocumentationIdentifier.ApplicationWhois,
8285
@"docs/application/whois"),
8386

@@ -221,6 +224,7 @@ public static DocumentationIdentifier GetIdentifierByApplicationName(Application
221224
ApplicationName.DiscoveryProtocol => DocumentationIdentifier.ApplicationDiscoveryProtocol,
222225
ApplicationName.Firewall => DocumentationIdentifier.ApplicationFirewall,
223226
ApplicationName.WakeOnLAN => DocumentationIdentifier.ApplicationWakeOnLan,
227+
ApplicationName.RDAP => DocumentationIdentifier.ApplicationRdap,
224228
ApplicationName.Whois => DocumentationIdentifier.ApplicationWhois,
225229
ApplicationName.IPGeolocation => DocumentationIdentifier.ApplicationIPGeolocation,
226230
ApplicationName.SubnetCalculator => DocumentationIdentifier.ApplicationSubnetCalculator,
@@ -269,6 +273,7 @@ public static DocumentationIdentifier GetIdentifierBySettingsName(SettingsName n
269273
SettingsName.SNMP => GetIdentifierByApplicationName(ApplicationName.SNMP),
270274
SettingsName.SNTPLookup => GetIdentifierByApplicationName(ApplicationName.SNTPLookup),
271275
SettingsName.WakeOnLAN => GetIdentifierByApplicationName(ApplicationName.WakeOnLAN),
276+
SettingsName.RDAP => GetIdentifierByApplicationName(ApplicationName.RDAP),
272277
SettingsName.BitCalculator => GetIdentifierByApplicationName(ApplicationName.BitCalculator),
273278
_ => DocumentationIdentifier.Default
274279
};

‎Source/NETworkManager.Localization/ResourceIdentifier.cs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public enum ResourceIdentifier
1010
ProfileName,
1111
ProfileGroup,
1212
PuTTYLogMode,
13+
RDAPQueryType,
1314
RemoteDesktopAudioCaptureRedirectionMode,
1415
RemoteDesktopAudioRedirectionMode,
1516
RemoteDesktopGatewayServerLogonMethod,

‎Source/NETworkManager.Localization/Resources/StaticStrings.Designer.cs‎

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Source/NETworkManager.Localization/Resources/StaticStrings.resx‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,4 +360,16 @@
360360
<data name="ExampleActiveDirectorySearchFilter" xml:space="preserve">
361361
<value>(name=SRV-*)</value>
362362
</data>
363+
<data name="ExampleTLD" xml:space="preserve">
364+
<value>de</value>
365+
</data>
366+
<data name="ExampleIPAddressOrCIDR" xml:space="preserve">
367+
<value>192.0.2.0/24</value>
368+
</data>
369+
<data name="ExampleASN" xml:space="preserve">
370+
<value>AS15169</value>
371+
</data>
372+
<data name="ExampleRDAPEntityHandle" xml:space="preserve">
373+
<value>ORG-RIEN1-RIPE</value>
374+
</data>
363375
</root>

0 commit comments

Comments
 (0)