Skip to content

Commit a542eaf

Browse files
BornToBeRootclaude
andcommitted
Feature: Query IP addresses in RDAP from IP Scanner and Traceroute
New context menu item "RDAP" in IP Scanner (result) and Traceroute (hop) that opens a new RDAP tab with the IP address. Disabled for hops that timed out (no IP address). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent b6777c8 commit a542eaf

8 files changed

Lines changed: 60 additions & 2 deletions

File tree

‎Source/NETworkManager/ViewModels/IPScannerViewModel.cs‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,17 @@ private void PerformDNSLookupHostnameAction()
408408
EventSystem.RedirectToApplication(ApplicationName.DNSLookup, SelectedResult.Hostname);
409409
}
410410

411+
/// <summary>
412+
/// Gets the command to query the registration data of the selected IP address via RDAP. The IP address is used,
413+
/// since a hostname is usually not a registered domain.
414+
/// </summary>
415+
public ICommand PerformRDAPQueryCommand => new RelayCommand(_ => PerformRDAPQueryAction());
416+
417+
private void PerformRDAPQueryAction()
418+
{
419+
EventSystem.RedirectToApplication(ApplicationName.RDAP, SelectedResult.PingInfo.IPAddress.ToString());
420+
}
421+
411422
/// <summary>
412423
/// Gets the command to execute a custom command for the selected host.
413424
/// </summary>

‎Source/NETworkManager/ViewModels/TracerouteViewModel.cs‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,17 @@ private void PerformDNSLookupAction(object data)
320320
EventSystem.RedirectToApplication(ApplicationName.DNSLookup, data.ToString());
321321
}
322322

323+
/// <summary>
324+
/// Gets the command to query the registration data of the selected hop's IP address via RDAP. The IP address is
325+
/// used, since the hostname of a router is usually not a registered domain.
326+
/// </summary>
327+
public ICommand PerformRDAPQueryCommand => new RelayCommand(PerformRDAPQueryAction);
328+
329+
private void PerformRDAPQueryAction(object data)
330+
{
331+
EventSystem.RedirectToApplication(ApplicationName.RDAP, data.ToString());
332+
}
333+
323334
/// <summary>
324335
/// Gets the command to copy the round-trip time to the clipboard.
325336
/// </summary>

‎Source/NETworkManager/Views/IPScannerView.xaml‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,16 @@
383383
</Rectangle>
384384
</MenuItem.Icon>
385385
</MenuItem>
386+
<MenuItem Header="{x:Static localization:Strings.RDAP}"
387+
Command="{Binding PerformRDAPQueryCommand}">
388+
<MenuItem.Icon>
389+
<Rectangle Width="16" Height="16" Fill="{DynamicResource MahApps.Brushes.Gray3}">
390+
<Rectangle.OpacityMask>
391+
<VisualBrush Stretch="Uniform" Visual="{iconPacks:Material Kind=CardAccountDetailsOutline}" />
392+
</Rectangle.OpacityMask>
393+
</Rectangle>
394+
</MenuItem.Icon>
395+
</MenuItem>
386396
<Separator />
387397
<MenuItem Tag="CustomCommands" Header="{x:Static localization:Strings.CustomCommands}">
388398
<MenuItem.Icon>

‎Source/NETworkManager/Views/TracerouteView.xaml‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,28 @@
302302
</Rectangle>
303303
</MenuItem.Icon>
304304
</MenuItem>
305+
<MenuItem Header="{x:Static Member=localization:Strings.RDAP}"
306+
Command="{Binding PerformRDAPQueryCommand}"
307+
CommandParameter="{Binding SelectedResult.IPAddress}">
308+
<MenuItem.Style>
309+
<Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource MahApps.Styles.MenuItem}">
310+
<Style.Triggers>
311+
<!-- Timed out hops have no IP address -->
312+
<DataTrigger Binding="{Binding SelectedResult.IPAddress}" Value="{x:Null}">
313+
<Setter Property="IsEnabled" Value="False" />
314+
</DataTrigger>
315+
</Style.Triggers>
316+
</Style>
317+
</MenuItem.Style>
318+
<MenuItem.Icon>
319+
<Rectangle Width="16" Height="16"
320+
Fill="{DynamicResource ResourceKey=MahApps.Brushes.Gray3}">
321+
<Rectangle.OpacityMask>
322+
<VisualBrush Stretch="Uniform" Visual="{iconPacks:Material Kind=CardAccountDetailsOutline}" />
323+
</Rectangle.OpacityMask>
324+
</Rectangle>
325+
</MenuItem.Icon>
326+
</MenuItem>
305327
<Separator />
306328
<MenuItem Header="{x:Static Member=localization:Strings.CopyDots}"
307329
Style="{StaticResource ResourceKey=CopyMenuItem}">

‎Website/docs/application/ip-scanner.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ with link-local addresses (`169.254.x.x`) given lower priority.
5757

5858
### Context menu
5959

60-
Right-clicking a result allows forwarding device information to another tool (e.g. [Port Scanner](./port-scanner), Remote Desktop), creating a new profile, or executing a [custom command](#custom-commands).
60+
Right-clicking a result allows forwarding device information to another tool (e.g. [Port Scanner](./port-scanner), Remote Desktop), querying the registration data of its IP address via [RDAP](./rdap), creating a new profile, or executing a [custom command](#custom-commands).
6161

6262
| Action | Description |
6363
| ------------- | ------------------------------------------------ |

‎Website/docs/application/rdap.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ The firewall must allow outgoing HTTPS connections (TCP port 443) to `data.iana.
3939

4040
A running query can be canceled with **Cancel** (or `Esc`).
4141

42+
The IP address of a host or hop can also be queried from the context menu of the [IP Scanner](./ip-scanner.md) and [Traceroute](./traceroute.md).
43+
4244
### Example inputs
4345

4446
With the type **Auto** (default), the type is detected from the query: IP address or CIDR, AS number (e.g. `AS13335`, `13335` or `1.10`), top-level domain (a single label, e.g. `de`), entity handle (a single label with a service provider tag, e.g. `ORG-RIEN1-RIPE`), otherwise domain. Select a type to override the detection, e.g. to query a nameserver (detected as domain).

‎Website/docs/application/traceroute.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ Traceroute works by sending ICMP packets with incrementally increasing TTL (Time
2323

2424
### Context menu
2525

26+
Right-clicking a hop allows forwarding it to another tool (e.g. [Port Scanner](./port-scanner), [DNS Lookup](./dns-lookup)) or querying the registration data of its IP address (e.g. the network and its owner) via [RDAP](./rdap).
27+
2628
| Action | Description |
2729
|--------|-------------|
2830
| **Copy** | Copies the selected information to the clipboard |

‎Website/docs/changelog/next-release.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Release date: **xx.xx.2026**
2727

2828
**RDAP**
2929

30-
- New [**RDAP**](../application/rdap.md) tool to look up registration data via the Registration Data Access Protocol, the standardized, JSON-based successor of Whois. Supports domains, nameservers, top-level domains, IP addresses/CIDR prefixes, AS numbers and entity handles; the type is detected automatically or can be selected. The RDAP server is determined automatically using the IANA bootstrap files, which are cached locally and can be updated in the new **Settings > RDAP** page. Results are shown in a structured view (details, status, events, nameservers, DNSSEC, networks and AS numbers of an organization, contacts, notices) or as raw JSON, and can be exported as JSON or text. For domains (e.g. `.com`/`.net`), the referral to the registrar's RDAP server is followed as well (can be disabled in **Settings > RDAP**). Includes profile support. If no RDAP server is known for a domain, it can be opened in **Whois** with a single click. [#3607](https://github.com/BornToBeRoot/NETworkManager/pull/3607)
30+
- New [**RDAP**](../application/rdap.md) tool to look up registration data via the Registration Data Access Protocol, the standardized, JSON-based successor of Whois. Supports domains, nameservers, top-level domains, IP addresses/CIDR prefixes, AS numbers and entity handles; the type is detected automatically or can be selected. The RDAP server is determined automatically using the IANA bootstrap files, which are cached locally and can be updated in the new **Settings > RDAP** page. Results are shown in a structured view (details, status, events, nameservers, DNSSEC, networks and AS numbers of an organization, contacts, notices) or as raw JSON, and can be exported as JSON or text. For domains (e.g. `.com`/`.net`), the referral to the registrar's RDAP server is followed as well (can be disabled in **Settings > RDAP**). Includes profile support. If no RDAP server is known for a domain, it can be opened in **Whois** with a single click. IP addresses can be queried from the context menu of **IP Scanner** and **Traceroute**. [#3607](https://github.com/BornToBeRoot/NETworkManager/pull/3607)
3131

3232
**Traceroute**
3333

0 commit comments

Comments
 (0)