From 1ddf7d392bab16bff9e2bfc7d70fd8585166096d Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:09:44 +0200 Subject: [PATCH 01/11] Feature: RDAP auto query type and validation of inherited host - New query type "Auto" (default) that detects the type from the query. - The inherited host of a profile is validated against the query type. - Numeric TLDs (e.g. "8.8.8.8" as domain) and entity handles without a service provider tag are rejected. - Watermark per query type in the profile dialog (shared converter). - Imported profiles use the type "Auto". Co-Authored-By: Claude Opus 5.5 --- .../RDAPQueryTypeToWatermarkConverter.cs | 46 +++++++++++++++++++ .../Resources/Strings.Designer.cs | 18 ++++++++ .../Resources/Strings.resx | 6 +++ .../RDAP/RDAPQueryParseError.cs | 1 + .../RDAP/RDAPQueryParser.cs | 31 ++++++++++--- .../RDAP/RDAPQueryType.cs | 5 ++ .../GlobalStaticConfiguration.cs | 2 +- .../RDAPQueryValidator.cs | 4 +- .../ImportProfilesResultViewModel.cs | 4 +- .../ViewModels/ProfileViewModel.cs | 4 +- .../ViewModels/RDAPViewModel.cs | 13 ------ .../Views/ProfileChildWindow.xaml | 22 ++++++--- Source/NETworkManager/Views/RDAPView.xaml | 3 +- Website/docs/application/rdap.md | 10 ++-- Website/docs/changelog/next-release.md | 2 +- 15 files changed, 133 insertions(+), 38 deletions(-) create mode 100644 Source/NETworkManager.Converters/RDAPQueryTypeToWatermarkConverter.cs diff --git a/Source/NETworkManager.Converters/RDAPQueryTypeToWatermarkConverter.cs b/Source/NETworkManager.Converters/RDAPQueryTypeToWatermarkConverter.cs new file mode 100644 index 0000000000..91e26b8a7a --- /dev/null +++ b/Source/NETworkManager.Converters/RDAPQueryTypeToWatermarkConverter.cs @@ -0,0 +1,46 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.RDAP; + +namespace NETworkManager.Converters; + +/// +/// Convert to an example input (watermark). +/// +public sealed class RDAPQueryTypeToWatermarkConverter : IValueConverter +{ + /// + /// Convert to an example input (watermark). + /// + /// Object from type . + /// + /// + /// + /// Example input for the . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value switch + { + RDAPQueryType.TLD => StaticStrings.ExampleTLD, + RDAPQueryType.IPAddress => StaticStrings.ExampleIPAddressOrCIDR, + RDAPQueryType.ASN => StaticStrings.ExampleASN, + RDAPQueryType.Entity => StaticStrings.ExampleRDAPEntityHandle, + _ => StaticStrings.ExampleDomain + }; + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs index f009997dd5..a493e346d0 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs @@ -4354,6 +4354,15 @@ public static string EnterValidPortOrPortRange { } } + /// + /// Looks up a localized string similar to Enter a valid domain, IP address, AS number or entity handle!. + /// + public static string EnterValidRDAPQuery { + get { + return ResourceManager.GetString("EnterValidRDAPQuery", resourceCulture); + } + } + /// /// Looks up a localized string similar to Enter a valid subnet (e.g., 192.168.178.133/26)!. /// @@ -9536,6 +9545,15 @@ public static string RDAPQueryType_ASN { } } + /// + /// Looks up a localized string similar to Auto. + /// + public static string RDAPQueryType_Auto { + get { + return ResourceManager.GetString("RDAPQueryType_Auto", resourceCulture); + } + } + /// /// Looks up a localized string similar to Domain. /// diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx index 8a727ed0af..7a6603aa29 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.resx @@ -4809,4 +4809,10 @@ Cloudflare may log your IP address and network information. See Cloudflare's pri Delete rules ({0}) + + Auto + + + Enter a valid domain, IP address, AS number or entity handle! + \ No newline at end of file diff --git a/Source/NETworkManager.Models/RDAP/RDAPQueryParseError.cs b/Source/NETworkManager.Models/RDAP/RDAPQueryParseError.cs index 4212a78fb8..4e8e50b4b3 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPQueryParseError.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPQueryParseError.cs @@ -6,6 +6,7 @@ namespace NETworkManager.Models.RDAP; public enum RDAPQueryParseError { None, + InvalidQuery, InvalidDomain, InvalidTLD, InvalidIPAddress, diff --git a/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs b/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs index 9e640c2c86..7c50756b41 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs @@ -23,7 +23,7 @@ public static partial class RDAPQueryParser /// /// Parses the input for the given query type. /// - /// Type of the query. + /// Type of the query. detects the type from the input. /// User input. /// Normalized query if the input is valid. /// if the input is valid, otherwise the error. @@ -36,7 +36,9 @@ public static RDAPQueryParseError TryParse(RDAPQueryType type, string input, out if (string.IsNullOrEmpty(input)) return GetError(type); - query = type switch + var parseType = type == RDAPQueryType.Auto ? DetectType(input) : type; + + query = parseType switch { RDAPQueryType.Domain => ParseDomain(input), RDAPQueryType.TLD => ParseTLD(input), @@ -52,7 +54,8 @@ public static RDAPQueryParseError TryParse(RDAPQueryType type, string input, out /// /// Detects the query type of an input without a type (e.g. data redirected from another tool): IP address or /// CIDR, AS number ("AS15169", "15169", "1.10"), TLD (single label), entity handle (single label with a hyphen, - /// e.g. "ORG-RIEN1-RIPE"), otherwise domain. + /// e.g. "ORG-RIEN1-RIPE"), otherwise domain. The detected type is not validated, use + /// for that. /// /// User input. /// Detected query type. @@ -81,6 +84,7 @@ private static RDAPQueryParseError GetError(RDAPQueryType type) { return type switch { + RDAPQueryType.Auto => RDAPQueryParseError.InvalidQuery, RDAPQueryType.Domain => RDAPQueryParseError.InvalidDomain, RDAPQueryType.TLD => RDAPQueryParseError.InvalidTLD, RDAPQueryType.IPAddress => RDAPQueryParseError.InvalidIPAddress, @@ -105,11 +109,20 @@ private static string ToALabel(string domain) } } + /// + /// A top-level domain is never all-numeric (RFC 3696 2), so inputs like "8.8.8.8" or "13335" are rejected as + /// domain or TLD. + /// + private static bool HasNumericTLD(string domain) + { + return domain[(domain.LastIndexOf('.') + 1)..].All(char.IsAsciiDigit); + } + private static RDAPQuery ParseDomain(string input) { var domain = ToALabel(input.Trim('.')); - if (string.IsNullOrEmpty(domain)) + if (string.IsNullOrEmpty(domain) || HasNumericTLD(domain)) return null; // A single label is a TLD, which is only served by the IANA root zone RDAP server. @@ -130,7 +143,7 @@ private static RDAPQuery ParseTLD(string input) // rdap.iana.org returns 400 for ".de", so the leading dot must be removed. var tld = ToALabel(input.Trim('.')); - if (string.IsNullOrEmpty(tld) || tld.Contains('.')) + if (string.IsNullOrEmpty(tld) || tld.Contains('.') || HasNumericTLD(tld)) return null; return CreateTLDQuery(tld); @@ -249,9 +262,15 @@ private static RDAPQuery ParseASN(string input) }; } + /// + /// An entity can only be resolved via its service provider tag after the last hyphen (RFC 8521), so a handle + /// without a tag (e.g. "8.8.8.8") is rejected. + /// private static RDAPQuery ParseEntity(string input) { - if (input.Any(char.IsWhiteSpace) || input.Contains('/')) + var index = input.LastIndexOf('-'); + + if (input.Any(char.IsWhiteSpace) || input.Contains('/') || index <= 0 || index == input.Length - 1) return null; return new RDAPQuery diff --git a/Source/NETworkManager.Models/RDAP/RDAPQueryType.cs b/Source/NETworkManager.Models/RDAP/RDAPQueryType.cs index 7c5f9a0ea9..baf748f244 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPQueryType.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPQueryType.cs @@ -5,6 +5,11 @@ namespace NETworkManager.Models.RDAP; /// public enum RDAPQueryType { + /// + /// Detects the type from the input (see ). + /// + Auto, + /// /// Domain name (e.g. example.com), resolved via the IANA DNS bootstrap. /// diff --git a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs index d880a6c7d2..a64b230b2b 100644 --- a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs +++ b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs @@ -290,7 +290,7 @@ public static class GlobalStaticConfiguration public static ExportFileType Lookup_Port_ExportFileType => ExportFileType.Csv; // Application: RDAP - public static RDAPQueryType RDAP_QueryType => RDAPQueryType.Domain; + public static RDAPQueryType RDAP_QueryType => RDAPQueryType.Auto; public static bool RDAP_FollowReferral => true; public static int RDAP_Timeout => 10000; public static ExportFileType RDAP_ExportFileType => ExportFileType.Json; diff --git a/Source/NETworkManager.Validators/RDAPQueryValidator.cs b/Source/NETworkManager.Validators/RDAPQueryValidator.cs index f2fd6240b6..0d8876ad9c 100644 --- a/Source/NETworkManager.Validators/RDAPQueryValidator.cs +++ b/Source/NETworkManager.Validators/RDAPQueryValidator.cs @@ -7,6 +7,7 @@ namespace NETworkManager.Validators; /// /// Validates an RDAP query (domain, TLD, IP address/CIDR, AS number or entity handle) depending on the query type. +/// With , the input must be valid for the detected type. /// public class RDAPQueryValidator : ValidationRule { @@ -14,7 +15,7 @@ public class RDAPQueryValidator : ValidationRule public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - var error = RDAPQueryParser.TryParse(Wrapper?.QueryType ?? RDAPQueryType.Domain, value as string, out _); + var error = RDAPQueryParser.TryParse(Wrapper?.QueryType ?? RDAPQueryType.Auto, value as string, out _); return error == RDAPQueryParseError.None ? ValidationResult.ValidResult @@ -30,6 +31,7 @@ public static string GetErrorMessage(RDAPQueryParseError error) { return error switch { + RDAPQueryParseError.InvalidQuery => Strings.EnterValidRDAPQuery, RDAPQueryParseError.InvalidDomain => Strings.EnterValidDomain, RDAPQueryParseError.InvalidTLD => Strings.EnterValidTLD, RDAPQueryParseError.InvalidIPAddress => Strings.EnterValidIPAddressOrCIDR, diff --git a/Source/NETworkManager/ViewModels/ImportProfilesResultViewModel.cs b/Source/NETworkManager/ViewModels/ImportProfilesResultViewModel.cs index 3d608f6b0b..f225e8fa67 100644 --- a/Source/NETworkManager/ViewModels/ImportProfilesResultViewModel.cs +++ b/Source/NETworkManager/ViewModels/ImportProfilesResultViewModel.cs @@ -264,9 +264,7 @@ private static void ApplyToolDefaults(ProfileInfo profile, ProfileName tool) case ProfileName.RDAP: profile.RDAP_Enabled = true; profile.RDAP_Query = profile.Host; - profile.RDAP_QueryType = System.Net.IPAddress.TryParse(profile.Host, out _) - ? RDAPQueryType.IPAddress - : RDAPQueryType.Domain; + profile.RDAP_QueryType = RDAPQueryType.Auto; break; case ProfileName.Whois: profile.Whois_Enabled = true; diff --git a/Source/NETworkManager/ViewModels/ProfileViewModel.cs b/Source/NETworkManager/ViewModels/ProfileViewModel.cs index dbb27679fc..b67356d8ee 100644 --- a/Source/NETworkManager/ViewModels/ProfileViewModel.cs +++ b/Source/NETworkManager/ViewModels/ProfileViewModel.cs @@ -2857,8 +2857,8 @@ public RDAPQueryType RDAP_QueryType field = value; OnPropertyChanged(); - // Validate the query again for the new type. - OnPropertyChanged(nameof(RDAP_Query)); + // Validate the query (or the inherited host) again for the new type. + OnPropertyChanged(RDAP_InheritHost ? nameof(Host) : nameof(RDAP_Query)); } } diff --git a/Source/NETworkManager/ViewModels/RDAPViewModel.cs b/Source/NETworkManager/ViewModels/RDAPViewModel.cs index e95eb41b8a..568b3a91ef 100644 --- a/Source/NETworkManager/ViewModels/RDAPViewModel.cs +++ b/Source/NETworkManager/ViewModels/RDAPViewModel.cs @@ -63,25 +63,12 @@ public RDAPQueryType QueryType field = value; OnPropertyChanged(); - OnPropertyChanged(nameof(QueryWatermark)); // Validate the query again for the new type. OnPropertyChanged(nameof(Query)); } } - /// - /// Example input for the selected query type. - /// - public string QueryWatermark => QueryType switch - { - RDAPQueryType.TLD => StaticStrings.ExampleTLD, - RDAPQueryType.IPAddress => StaticStrings.ExampleIPAddressOrCIDR, - RDAPQueryType.ASN => StaticStrings.ExampleASN, - RDAPQueryType.Entity => StaticStrings.ExampleRDAPEntityHandle, - _ => StaticStrings.ExampleDomain - }; - public bool IsRunning { get; diff --git a/Source/NETworkManager/Views/ProfileChildWindow.xaml b/Source/NETworkManager/Views/ProfileChildWindow.xaml index e3a3f084c1..58db166951 100644 --- a/Source/NETworkManager/Views/ProfileChildWindow.xaml +++ b/Source/NETworkManager/Views/ProfileChildWindow.xaml @@ -39,6 +39,7 @@ x:Key="RemoteDesktopNetworkConnectionTypeToStringConverter" /> + - @@ -4006,18 +4004,31 @@ + mah:TextBoxHelper.Watermark="{Binding RDAP_QueryType, Converter={StaticResource RDAPQueryTypeToWatermarkConverter}}"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -75,6 +194,19 @@ Visibility="{Binding Events.Count, Converter={StaticResource IntNotZeroToVisibilityCollapsedConverter}}"> + + + @@ -91,6 +223,19 @@ + + + @@ -105,6 +250,19 @@ Visibility="{Binding DSData.Count, Converter={StaticResource IntNotZeroToVisibilityCollapsedConverter}}"> + + + @@ -123,6 +281,19 @@ Visibility="{Binding Contacts.Count, Converter={StaticResource IntNotZeroToVisibilityCollapsedConverter}}"> + + + @@ -244,7 +415,8 @@ diff --git a/Website/docs/application/rdap.md b/Website/docs/application/rdap.md index 9df4e3e7ab..4aa853676b 100644 --- a/Website/docs/application/rdap.md +++ b/Website/docs/application/rdap.md @@ -37,6 +37,8 @@ The firewall must allow outgoing HTTPS connections (TCP port 443) to `data.iana. ![RDAP](../img/rdap.png) +A running query can be canceled with **Cancel** (or `Esc`). + ### Example inputs 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 `1.10` as something other than an AS number. @@ -59,6 +61,15 @@ The result can be exported via the **Export...** button below the result or via | **JSON** | Exports the response exactly as returned by the server. If the referral was followed, both responses as an array. | | **TXT** | Exports the structured view as text. | +### Context menu + +Right-click a row in one of the tables (events, nameservers, DNSSEC, contacts). + +| Action | Description | +| ------------- | -------------------------------------------------------------------- | +| **Copy** | Copies a value of the selected row (e.g. the email of a contact) | +| **Export...** | Exports the result to a file (see [Export](#export)) | + ## Profile ### Inherit host from general From 9e41b2da78b54b24dfeab97bf4cce88f2762a89d Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:23:18 +0200 Subject: [PATCH 04/11] Feature: RDAP nameserver lookups and networks/AS numbers of an entity - New query type "Nameserver" (RFC 9082 3.1.4), resolved via the registry of the nameserver's TLD. IP addresses of a nameserver are shown in the details. - Networks and AS numbers of an entity (RFC 9083 5.1, e.g. sent by RIPE, APNIC and ARIN for an organization) are shown in two new tables with copy context menu and included in the text export. Co-Authored-By: Claude Opus 5.5 --- .../RDAPQueryTypeToWatermarkConverter.cs | 1 + .../Resources/StaticStrings.Designer.cs | 9 ++ .../Resources/StaticStrings.resx | 3 + .../Resources/Strings.Designer.cs | 27 +++++ .../Resources/Strings.resx | 9 ++ .../RDAP/RDAPBootstrapService.cs | 3 +- .../NETworkManager.Models/RDAP/RDAPQuery.cs | 2 +- .../RDAP/RDAPQueryParseError.cs | 1 + .../RDAP/RDAPQueryParser.cs | 21 ++++ .../RDAP/RDAPQueryType.cs | 5 + .../RDAP/RDAPResponse.cs | 12 ++ .../RDAPQueryValidator.cs | 4 +- .../ViewModels/RDAPObjectViewModel.cs | 90 ++++++++++++-- Source/NETworkManager/Views/RDAPView.xaml | 114 ++++++++++++++++++ Website/docs/application/rdap.md | 15 +-- Website/docs/changelog/next-release.md | 2 +- 16 files changed, 299 insertions(+), 19 deletions(-) diff --git a/Source/NETworkManager.Converters/RDAPQueryTypeToWatermarkConverter.cs b/Source/NETworkManager.Converters/RDAPQueryTypeToWatermarkConverter.cs index 91e26b8a7a..f3281bae55 100644 --- a/Source/NETworkManager.Converters/RDAPQueryTypeToWatermarkConverter.cs +++ b/Source/NETworkManager.Converters/RDAPQueryTypeToWatermarkConverter.cs @@ -23,6 +23,7 @@ public object Convert(object value, Type targetType, object parameter, CultureIn { return value switch { + RDAPQueryType.Nameserver => StaticStrings.ExampleRDAPNameserver, RDAPQueryType.TLD => StaticStrings.ExampleTLD, RDAPQueryType.IPAddress => StaticStrings.ExampleIPAddressOrCIDR, RDAPQueryType.ASN => StaticStrings.ExampleASN, diff --git a/Source/NETworkManager.Localization/Resources/StaticStrings.Designer.cs b/Source/NETworkManager.Localization/Resources/StaticStrings.Designer.cs index 9086aaf302..a8fd398f88 100644 --- a/Source/NETworkManager.Localization/Resources/StaticStrings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/StaticStrings.Designer.cs @@ -591,6 +591,15 @@ public static string ExampleRDAPEntityHandle { } } + /// + /// Looks up a localized string similar to a.iana-servers.net. + /// + public static string ExampleRDAPNameserver { + get { + return ResourceManager.GetString("ExampleRDAPNameserver", resourceCulture); + } + } + /// /// Looks up a localized string similar to COM5. /// diff --git a/Source/NETworkManager.Localization/Resources/StaticStrings.resx b/Source/NETworkManager.Localization/Resources/StaticStrings.resx index 64d770e8d1..e881eaa0a9 100644 --- a/Source/NETworkManager.Localization/Resources/StaticStrings.resx +++ b/Source/NETworkManager.Localization/Resources/StaticStrings.resx @@ -372,4 +372,7 @@ ORG-RIEN1-RIPE + + a.iana-servers.net + \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs index 748291480f..deacaa193c 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs @@ -1274,6 +1274,15 @@ public static string ASName { } } + /// + /// Looks up a localized string similar to AS numbers. + /// + public static string ASNumbers { + get { + return ResourceManager.GetString("ASNumbers", resourceCulture); + } + } + /// /// Looks up a localized string similar to At least one application must be visible!. /// @@ -4318,6 +4327,15 @@ public static string EnterValidMACAddress { } } + /// + /// Looks up a localized string similar to Enter a valid nameserver (e.g., "ns1.example.com")!. + /// + public static string EnterValidNameserver { + get { + return ResourceManager.GetString("EnterValidNameserver", resourceCulture); + } + } + /// /// Looks up a localized string similar to Enter a valid number!. /// @@ -9581,6 +9599,15 @@ public static string RDAPQueryType_IPAddress { } } + /// + /// Looks up a localized string similar to Nameserver. + /// + public static string RDAPQueryType_Nameserver { + get { + return ResourceManager.GetString("RDAPQueryType_Nameserver", resourceCulture); + } + } + /// /// Looks up a localized string similar to TLD. /// diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx index f00a6bce42..ce465a1134 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.resx @@ -4818,4 +4818,13 @@ Cloudflare may log your IP address and network information. See Cloudflare's pri The RDAP server did not respond within {0} seconds. + + Nameserver + + + Enter a valid nameserver (e.g., "ns1.example.com")! + + + AS numbers + \ No newline at end of file diff --git a/Source/NETworkManager.Models/RDAP/RDAPBootstrapService.cs b/Source/NETworkManager.Models/RDAP/RDAPBootstrapService.cs index a8ba833be3..ce59a0316c 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPBootstrapService.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPBootstrapService.cs @@ -173,7 +173,8 @@ public List GetBaseUrls(RDAPQuery query) var urls = query.Type switch { RDAPQueryType.TLD => [IANARootZoneUrl], - RDAPQueryType.Domain => FindDomain(query.DomainName), + // A nameserver is served by the registry of its TLD (RFC 9224 4). + RDAPQueryType.Domain or RDAPQueryType.Nameserver => FindDomain(query.DomainName), RDAPQueryType.IPAddress => FindIPAddress(query.IPAddress, query.PrefixLength), RDAPQueryType.ASN => FindASN(query.ASN), RDAPQueryType.Entity => FindEntity(query.Handle), diff --git a/Source/NETworkManager.Models/RDAP/RDAPQuery.cs b/Source/NETworkManager.Models/RDAP/RDAPQuery.cs index 0df4ffaeef..c3d5430680 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPQuery.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPQuery.cs @@ -23,7 +23,7 @@ public class RDAPQuery public string PathSegment { get; init; } /// - /// Domain name in A-label form (Domain and TLD queries only). + /// Domain name in A-label form (Domain, Nameserver and TLD queries only). /// public string DomainName { get; init; } diff --git a/Source/NETworkManager.Models/RDAP/RDAPQueryParseError.cs b/Source/NETworkManager.Models/RDAP/RDAPQueryParseError.cs index 4e8e50b4b3..fa2aa95d0e 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPQueryParseError.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPQueryParseError.cs @@ -8,6 +8,7 @@ public enum RDAPQueryParseError None, InvalidQuery, InvalidDomain, + InvalidNameserver, InvalidTLD, InvalidIPAddress, InvalidASN, diff --git a/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs b/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs index 7c50756b41..68acecffe5 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs @@ -41,6 +41,7 @@ public static RDAPQueryParseError TryParse(RDAPQueryType type, string input, out query = parseType switch { RDAPQueryType.Domain => ParseDomain(input), + RDAPQueryType.Nameserver => ParseNameserver(input), RDAPQueryType.TLD => ParseTLD(input), RDAPQueryType.IPAddress => ParseIPAddress(input), RDAPQueryType.ASN => ParseASN(input), @@ -86,6 +87,7 @@ private static RDAPQueryParseError GetError(RDAPQueryType type) { RDAPQueryType.Auto => RDAPQueryParseError.InvalidQuery, RDAPQueryType.Domain => RDAPQueryParseError.InvalidDomain, + RDAPQueryType.Nameserver => RDAPQueryParseError.InvalidNameserver, RDAPQueryType.TLD => RDAPQueryParseError.InvalidTLD, RDAPQueryType.IPAddress => RDAPQueryParseError.InvalidIPAddress, RDAPQueryType.ASN => RDAPQueryParseError.InvalidASN, @@ -138,6 +140,25 @@ private static RDAPQuery ParseDomain(string input) }; } + /// + /// Parses a nameserver (host name with at least two labels, RFC 9082 3.1.4). + /// + private static RDAPQuery ParseNameserver(string input) + { + var name = ToALabel(input.Trim('.')); + + if (string.IsNullOrEmpty(name) || !name.Contains('.') || HasNumericTLD(name)) + return null; + + return new RDAPQuery + { + Type = RDAPQueryType.Nameserver, + Value = name, + DomainName = name, + PathSegment = $"nameserver/{name}" + }; + } + private static RDAPQuery ParseTLD(string input) { // rdap.iana.org returns 400 for ".de", so the leading dot must be removed. diff --git a/Source/NETworkManager.Models/RDAP/RDAPQueryType.cs b/Source/NETworkManager.Models/RDAP/RDAPQueryType.cs index baf748f244..3845ae2086 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPQueryType.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPQueryType.cs @@ -15,6 +15,11 @@ public enum RDAPQueryType /// Domain, + /// + /// Nameserver (e.g. a.iana-servers.net), resolved via the IANA DNS bootstrap (registry of its TLD). + /// + Nameserver, + /// /// Top-level domain (e.g. de), queried directly against the IANA root zone RDAP server. /// diff --git a/Source/NETworkManager.Models/RDAP/RDAPResponse.cs b/Source/NETworkManager.Models/RDAP/RDAPResponse.cs index 581bb2f7fe..81ca04a743 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPResponse.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPResponse.cs @@ -46,6 +46,18 @@ public class RDAPObject // Entity [JsonProperty("roles")] public List Roles { get; set; } + /// + /// IP networks of an entity (RFC 9083 5.1), e.g. sent by ARIN for an organization. + /// + [JsonProperty("networks")] + public List Networks { get; set; } + + /// + /// AS numbers of an entity (RFC 9083 5.1), e.g. sent by ARIN for an organization. + /// + [JsonProperty("autnums")] + public List Autnums { get; set; } + /// /// jCard (RFC 7095). Kept as raw JSON, since its shape varies between servers. See . /// diff --git a/Source/NETworkManager.Validators/RDAPQueryValidator.cs b/Source/NETworkManager.Validators/RDAPQueryValidator.cs index 0d8876ad9c..25decd07fe 100644 --- a/Source/NETworkManager.Validators/RDAPQueryValidator.cs +++ b/Source/NETworkManager.Validators/RDAPQueryValidator.cs @@ -6,7 +6,8 @@ namespace NETworkManager.Validators; /// -/// Validates an RDAP query (domain, TLD, IP address/CIDR, AS number or entity handle) depending on the query type. +/// Validates an RDAP query (domain, nameserver, TLD, IP address/CIDR, AS number or entity handle) depending on the +/// query type. /// With , the input must be valid for the detected type. /// public class RDAPQueryValidator : ValidationRule @@ -33,6 +34,7 @@ public static string GetErrorMessage(RDAPQueryParseError error) { RDAPQueryParseError.InvalidQuery => Strings.EnterValidRDAPQuery, RDAPQueryParseError.InvalidDomain => Strings.EnterValidDomain, + RDAPQueryParseError.InvalidNameserver => Strings.EnterValidNameserver, RDAPQueryParseError.InvalidTLD => Strings.EnterValidTLD, RDAPQueryParseError.InvalidIPAddress => Strings.EnterValidIPAddressOrCIDR, RDAPQueryParseError.InvalidASN => Strings.EnterValidASN, diff --git a/Source/NETworkManager/ViewModels/RDAPObjectViewModel.cs b/Source/NETworkManager/ViewModels/RDAPObjectViewModel.cs index 43fe1e3abe..af1350b7d3 100644 --- a/Source/NETworkManager/ViewModels/RDAPObjectViewModel.cs +++ b/Source/NETworkManager/ViewModels/RDAPObjectViewModel.cs @@ -36,7 +36,7 @@ public RDAPObjectViewModel(RDAPResult result, string title) Nameservers = response.Nameservers?.OfType() .Select(x => new RDAPNameserverItem( FormatDomain(x.LdhName, x.UnicodeName), - string.Join(", ", (x.IPAddresses?.V4 ?? []).Concat(x.IPAddresses?.V6 ?? [])))) + FormatIPAddresses(x.IPAddresses))) .ToList() ?? []; DSData = response.SecureDNS?.DSData?.OfType() @@ -45,6 +45,14 @@ public RDAPObjectViewModel(RDAPResult result, string title) x.DigestType?.ToString(CultureInfo.InvariantCulture), x.Digest)) .ToList() ?? []; + Networks = response.Networks?.OfType() + .Select(x => new RDAPNetworkItem(x.Handle, x.Name, FormatAddressRange(x), x.Country)) + .ToList() ?? []; + + Autnums = response.Autnums?.OfType() + .Select(x => new RDAPAutnumItem(x.Handle, x.Name, FormatAutnumRange(x), x.Country)) + .ToList() ?? []; + Contacts = []; AddContacts(response.Entities); @@ -75,6 +83,10 @@ public RDAPObjectViewModel(RDAPResult result, string title) public List DSData { get; } + public List Networks { get; } + + public List Autnums { get; } + public List Contacts { get; } public List Notices { get; } @@ -88,7 +100,9 @@ private void AddDetails(RDAPResponse response) AddDetail(Strings.Server, RequestUrl); AddDetail(Strings.ObjectClass, response.ObjectClassName); AddDetail(Strings.Handle, response.Handle); - AddDetail(Strings.Domain, FormatDomain(response.LdhName, response.UnicodeName)); + AddDetail(response.ObjectClassName == "nameserver" ? Strings.Hostname : Strings.Domain, + FormatDomain(response.LdhName, response.UnicodeName)); + AddDetail(Strings.IPAddresses, FormatIPAddresses(response.IPAddresses)); AddDetail(Strings.Name, response.Name); AddDetail(Strings.Type, response.Type); @@ -96,13 +110,9 @@ private void AddDetails(RDAPResponse response) AddDetail(Strings.Range, $"{response.StartAddress} - {response.EndAddress}"); if (response.Cidrs is { Count: > 0 }) - AddDetail(Strings.CIDR, string.Join(", ", - response.Cidrs.OfType().Select(x => $"{x.V4Prefix ?? x.V6Prefix}/{x.Length}"))); + AddDetail(Strings.CIDR, FormatCidrs(response.Cidrs)); - if (response.StartAutnum != null || response.EndAutnum != null) - AddDetail(Strings.Range, response.StartAutnum == response.EndAutnum - ? $"AS{response.StartAutnum}" - : $"AS{response.StartAutnum} - AS{response.EndAutnum}"); + AddDetail(Strings.Range, FormatAutnumRange(response)); AddDetail(Strings.Country, response.Country); AddDetail(Strings.ParentHandle, response.ParentHandle); @@ -185,6 +195,39 @@ private static List GetLinks(List links) .ToList() ?? []; } + private static string FormatIPAddresses(RDAPIPAddresses ipAddresses) + { + return string.Join(", ", (ipAddresses?.V4 ?? []).Concat(ipAddresses?.V6 ?? [])); + } + + private static string FormatCidrs(List cidrs) + { + return string.Join(", ", cidrs.OfType().Select(x => $"{x.V4Prefix ?? x.V6Prefix}/{x.Length}")); + } + + /// + /// Formats the address range of an IP network, preferably as CIDR (cidr0 extension). + /// + private static string FormatAddressRange(RDAPObject network) + { + if (network.Cidrs is { Count: > 0 }) + return FormatCidrs(network.Cidrs); + + return network.StartAddress == null && network.EndAddress == null + ? null + : $"{network.StartAddress} - {network.EndAddress}"; + } + + private static string FormatAutnumRange(RDAPObject autnum) + { + if (autnum.StartAutnum == null && autnum.EndAutnum == null) + return null; + + return autnum.StartAutnum == autnum.EndAutnum + ? $"AS{autnum.StartAutnum}" + : $"AS{autnum.StartAutnum} - AS{autnum.EndAutnum}"; + } + /// /// Formats a domain name with its Unicode form (if different) and without a trailing dot. /// @@ -239,6 +282,22 @@ public string ToText() $"{Strings.KeyTag}: {ds.KeyTag}, {Strings.Algorithm}: {ds.Algorithm}, {Strings.DigestType}: {ds.DigestType}, {Strings.Digest}: {ds.Digest}"); } + if (Networks.Count > 0) + { + text.AppendLine().AppendLine($"## {Strings.Networks}"); + + foreach (var network in Networks) + text.AppendLine(FormatListItem(network.Range, network.Name, network.Handle, network.Country)); + } + + if (Autnums.Count > 0) + { + text.AppendLine().AppendLine($"## {Strings.ASNumbers}"); + + foreach (var autnum in Autnums) + text.AppendLine(FormatListItem(autnum.Range, autnum.Name, autnum.Handle, autnum.Country)); + } + if (Contacts.Count > 0) { text.AppendLine().AppendLine($"## {Strings.Contacts}"); @@ -277,6 +336,17 @@ public string ToText() return text.ToString(); } + /// + /// Formats a network or AS number for the text export, e.g. "192.0.2.0/24 EXAMPLE-NET (NET-192-0-2-0-1, US)". + /// + private static string FormatListItem(string range, string name, string handle, string country) + { + var details = string.Join(", ", new[] { handle, country }.Where(x => !string.IsNullOrWhiteSpace(x))); + + return string.Join(" ", new[] { range, name, details.Length > 0 ? $"({details})" : null } + .Where(x => !string.IsNullOrWhiteSpace(x))); + } + private static void AppendValue(StringBuilder text, string name, string value) { if (!string.IsNullOrWhiteSpace(value)) @@ -294,6 +364,10 @@ public record RDAPNameserverItem(string Name, string IPAddresses); public record RDAPDSDataItem(string KeyTag, string Algorithm, string DigestType, string Digest); +public record RDAPNetworkItem(string Handle, string Name, string Range, string Country); + +public record RDAPAutnumItem(string Handle, string Name, string Range, string Country); + public record RDAPContactItem( string Roles, string Handle, diff --git a/Source/NETworkManager/Views/RDAPView.xaml b/Source/NETworkManager/Views/RDAPView.xaml index 3d9bd29996..979a2acdf8 100644 --- a/Source/NETworkManager/Views/RDAPView.xaml +++ b/Source/NETworkManager/Views/RDAPView.xaml @@ -116,6 +116,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Website/docs/application/rdap.md b/Website/docs/application/rdap.md index 4aa853676b..5ccf4ef866 100644 --- a/Website/docs/application/rdap.md +++ b/Website/docs/application/rdap.md @@ -6,15 +6,15 @@ keywords: [NETworkManager, RDAP, Registration Data Access Protocol, domain looku # RDAP -With **RDAP** (Registration Data Access Protocol) you can retrieve registration data for domains, top-level domains, IP addresses and networks, AS numbers and entities (e.g. organizations or contacts) from the responsible registry. +With **RDAP** (Registration Data Access Protocol) you can retrieve registration data for domains, nameservers, top-level domains, IP addresses and networks, AS numbers and entities (e.g. organizations or contacts) from the responsible registry. -RDAP is the standardized successor of Whois ([RFC 7480](https://www.rfc-editor.org/rfc/rfc7480), [RFC 9082](https://www.rfc-editor.org/rfc/rfc9082), [RFC 9083](https://www.rfc-editor.org/rfc/rfc9083), [RFC 9224](https://www.rfc-editor.org/rfc/rfc9224)). Unlike Whois, it uses HTTPS and returns structured JSON, so the result is shown in a structured view with details, status, events, nameservers, DNSSEC, contacts and notices. Links of notices (e.g. terms of service, privacy policy or the form to report inaccurate data) can be opened in the browser. The raw JSON response can be shown and exported as well. +RDAP is the standardized successor of Whois ([RFC 7480](https://www.rfc-editor.org/rfc/rfc7480), [RFC 9082](https://www.rfc-editor.org/rfc/rfc9082), [RFC 9083](https://www.rfc-editor.org/rfc/rfc9083), [RFC 9224](https://www.rfc-editor.org/rfc/rfc9224)). Unlike Whois, it uses HTTPS and returns structured JSON, so the result is shown in a structured view with details, status, events, nameservers, DNSSEC, networks and AS numbers (of an organization), contacts and notices. Links of notices (e.g. terms of service, privacy policy or the form to report inaccurate data) can be opened in the browser. The raw JSON response can be shown and exported as well. :::info The RDAP server for a query is determined using the bootstrap files published by IANA at [data.iana.org/rdap](https://data.iana.org/rdap/). They are downloaded with the first query, cached locally and refreshed automatically once a week. If `data.iana.org` cannot be reached, the cached files are used and the update is retried after an hour (at most 3 times, then with the next weekly update). Files that have not been downloaded yet (or can't be read) are downloaded with the next query. See [Settings](#settings). -- **Domains** are resolved via the registry of their top-level domain. Some registries (e.g. `.de`, `.ch`, `.li`, `.io`) run an RDAP server that is not (yet) listed by IANA; these are included in NETworkManager. +- **Domains** and **nameservers** are resolved via the registry of their top-level domain. Some registries (e.g. `.de`, `.ch`, `.li`, `.io`) run an RDAP server that is not (yet) listed by IANA; these are included in NETworkManager. - **Top-level domains** (e.g. `de`) are queried at the IANA root zone RDAP server (`rdap.iana.org`). - **IP addresses** and **AS numbers** are resolved via the Regional Internet Registries (RIRs). Private and reserved ranges (e.g. `10.0.0.0/8`, `fe80::/10`) are queried at ARIN, which returns the IANA reservation. - **Entities** can only be resolved if their handle ends with a service provider tag registered at IANA (e.g. `ORG-RIEN1-RIPE`, `-ARIN`). @@ -41,16 +41,17 @@ A running query can be canceled with **Cancel** (or `Esc`). ### Example inputs -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 `1.10` as something other than an AS number. +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). | Type | Query | Description | | ---------- | ---------------- | ------------------------------------------------------------------- | | Domain | `borntoberoot.net` | Query a domain at the registry of the top-level domain | +| Nameserver | `a.iana-servers.net` | Query a nameserver at the registry of its top-level domain | | TLD | `de` | Query a top-level domain at the IANA root zone | | IP address | `1.1.1.1` | Query the network that contains the IP address | | IP address | `2001:db8::/32` | Query the network that contains the CIDR prefix | | ASN | `AS13335` | Query an AS number (`13335`, `AS13335` and asdot like `1.10` work) | -| Entity | `ORG-RIEN1-RIPE` | Query an entity (organization, contact) by its handle | +| Entity | `ORG-RIEN1-RIPE` | Query an entity (organization, contact) by its handle. For an organization, some registries (e.g. RIPE, APNIC, ARIN) also return its networks and AS numbers | ### Export @@ -63,7 +64,7 @@ The result can be exported via the **Export...** button below the result or via ### Context menu -Right-click a row in one of the tables (events, nameservers, DNSSEC, contacts). +Right-click a row in one of the tables (events, nameservers, DNSSEC, networks, AS numbers, contacts). | Action | Description | | ------------- | -------------------------------------------------------------------- | @@ -100,7 +101,7 @@ Domain, top-level domain, IP address, AS number or entity handle to query. Type of the query. `Auto` detects the type from the query (see [Example inputs](#example-inputs)). -**Type:** `Auto`, `Domain`, `TLD`, `IP address`, `ASN`, `Entity` +**Type:** `Auto`, `Domain`, `Nameserver`, `TLD`, `IP address`, `ASN`, `Entity` **Default:** `Auto` diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md index a9609128a8..5dea291313 100644 --- a/Website/docs/changelog/next-release.md +++ b/Website/docs/changelog/next-release.md @@ -27,7 +27,7 @@ Release date: **xx.xx.2026** **RDAP** -- 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, 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, 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) +- 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) **Traceroute** From b6777c8ab69427cc6c5d6a37a4409c11ad2b460a Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:27:28 +0200 Subject: [PATCH 05/11] Fix: RDAP referral behind a proxy, private address check for NAT64/6to4 - If the referral goes through the system proxy, the host name is not resolved locally (the proxy resolves it), so referrals work in networks where only the proxy resolves public names. IP addresses in the URL are still checked. - The private address check also covers IPv6 addresses that contain an IPv4 address (NAT64 64:ff9b::/96, 6to4 2002::/16), the rest of 64:ff9b::/32 (local-use NAT64), 192.0.0.0/24 and 198.18.0.0/15. Co-Authored-By: Claude Opus 5.5 --- .../NETworkManager.Models/RDAP/RDAPClient.cs | 36 +++++++++++++++++-- Website/docs/application/rdap.md | 2 +- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Source/NETworkManager.Models/RDAP/RDAPClient.cs b/Source/NETworkManager.Models/RDAP/RDAPClient.cs index b818883507..eb6ca1b3d8 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPClient.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPClient.cs @@ -279,7 +279,9 @@ private async Task GetAsync(RDAPQuery query, string url, TimeSpan ti /// /// Checks the target of a referral, which is sent by the registry and therefore untrusted. Only HTTPS is allowed /// (no downgrade to plain text) and the host must not resolve to a local or private address, so a response - /// cannot make the client send requests into the local network. + /// cannot make the client send requests into the local network. If the request goes through a proxy, the proxy + /// resolves the host and connects to it, so the host is not resolved locally (often not possible in networks + /// where only the proxy resolves public names); an IP address in the URL is still checked. /// private static async Task ValidateReferralTargetAsync(Uri url, CancellationToken cancellationToken) { @@ -296,6 +298,10 @@ private static async Task ValidateReferralTargetAsync(Uri url, CancellationToken { addresses = [ipAddress]; } + else if (IsProxied(url)) + { + return; + } else { try @@ -313,6 +319,16 @@ private static async Task ValidateReferralTargetAsync(Uri url, CancellationToken throw new RDAPException(RDAPErrorKind.PrivateAddress, url.AbsoluteUri) { RequestUrl = url.AbsoluteUri }; } + /// + /// Whether a request to the URL goes through the system proxy (the proxy of the referral client). + /// + private static bool IsProxied(Uri url) + { + var proxy = HttpClient.DefaultProxy; + + return !proxy.IsBypassed(url) && proxy.GetProxy(url) != null; + } + /// /// Connect callback of the referral client: resolves the host once, checks all addresses and connects to exactly /// these addresses, so a second DNS answer (DNS rebinding) cannot redirect the connection to a local or private @@ -352,7 +368,9 @@ private static async ValueTask ConnectToPublicAddressAsync(SocketsHttpCo } /// - /// Loopback, private (RFC 1918, RFC 4193), shared (RFC 6598), link-local, unspecified and multicast addresses. + /// Loopback, private (RFC 1918, RFC 4193), shared (RFC 6598), link-local, unspecified, multicast and special + /// purpose (IETF protocol assignments, benchmarking) addresses. IPv6 addresses that contain an IPv4 address + /// (NAT64, 6to4) are checked by that IPv4 address, since they are translated or tunneled to it. /// private static bool IsLocalOrPrivateAddress(IPAddress address) { @@ -369,7 +387,19 @@ private static bool IsLocalOrPrivateAddress(IPAddress address) bytes[0] == 172 && (bytes[1] & 0xF0) == 16 || bytes[0] == 192 && bytes[1] == 168 || bytes[0] == 169 && bytes[1] == 254 || - bytes[0] == 100 && (bytes[1] & 0xC0) == 64; + bytes[0] == 100 && (bytes[1] & 0xC0) == 64 || + bytes[0] == 192 && bytes[1] == 0 && bytes[2] == 0 || + bytes[0] == 198 && (bytes[1] & 0xFE) == 18; + + // NAT64 (RFC 6052): the well-known prefix 64:ff9b::/96 contains the IPv4 address in the last 4 bytes. Other + // addresses in 64:ff9b::/32, e.g. the local-use prefix 64:ff9b:1::/48 (RFC 8215), are translated by the local + // network operator and are therefore treated as local. + if (bytes[0] == 0x00 && bytes[1] == 0x64 && bytes[2] == 0xFF && bytes[3] == 0x9B) + return bytes[4..12].Any(x => x != 0) || IsLocalOrPrivateAddress(new IPAddress(bytes[12..])); + + // 6to4 (RFC 3056): 2002::/16 contains the IPv4 address in bytes 2-5. + if (bytes[0] == 0x20 && bytes[1] == 0x02) + return IsLocalOrPrivateAddress(new IPAddress(bytes[2..6])); return address.Equals(IPAddress.IPv6Any) || address.IsIPv6LinkLocal || address.IsIPv6SiteLocal || address.IsIPv6Multicast || (bytes[0] & 0xFE) == 0xFC; diff --git a/Website/docs/application/rdap.md b/Website/docs/application/rdap.md index 5ccf4ef866..1a46493dce 100644 --- a/Website/docs/application/rdap.md +++ b/Website/docs/application/rdap.md @@ -123,7 +123,7 @@ For many domains (e.g. `.com` and `.net`), the registry only returns basic data :::note -For security reasons, a referral is only followed if it uses HTTPS and does not point to a local or private address (e.g. `192.168.0.0/16`). Otherwise, a message is shown and only the result of the registry is displayed. +For security reasons, a referral is only followed if it uses HTTPS and does not point to a local or private address (e.g. `192.168.0.0/16`). Otherwise, a message is shown and only the result of the registry is displayed. If a proxy is configured in Windows, the proxy resolves the host name of the referral, so it is only checked if it is an IP address. ::: From a542eaf4e1939bb2da24538e80484c6ed3631ef9 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:29:45 +0200 Subject: [PATCH 06/11] 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 --- .../ViewModels/IPScannerViewModel.cs | 11 ++++++++++ .../ViewModels/TracerouteViewModel.cs | 11 ++++++++++ .../NETworkManager/Views/IPScannerView.xaml | 10 +++++++++ .../NETworkManager/Views/TracerouteView.xaml | 22 +++++++++++++++++++ Website/docs/application/ip-scanner.md | 2 +- Website/docs/application/rdap.md | 2 ++ Website/docs/application/traceroute.md | 2 ++ Website/docs/changelog/next-release.md | 2 +- 8 files changed, 60 insertions(+), 2 deletions(-) diff --git a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs index 3d00a2ee17..f62b83d536 100644 --- a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs @@ -408,6 +408,17 @@ private void PerformDNSLookupHostnameAction() EventSystem.RedirectToApplication(ApplicationName.DNSLookup, SelectedResult.Hostname); } + /// + /// Gets the command to query the registration data of the selected IP address via RDAP. The IP address is used, + /// since a hostname is usually not a registered domain. + /// + public ICommand PerformRDAPQueryCommand => new RelayCommand(_ => PerformRDAPQueryAction()); + + private void PerformRDAPQueryAction() + { + EventSystem.RedirectToApplication(ApplicationName.RDAP, SelectedResult.PingInfo.IPAddress.ToString()); + } + /// /// Gets the command to execute a custom command for the selected host. /// diff --git a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs index 74c07f461a..a30690baa2 100644 --- a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs +++ b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs @@ -320,6 +320,17 @@ private void PerformDNSLookupAction(object data) EventSystem.RedirectToApplication(ApplicationName.DNSLookup, data.ToString()); } + /// + /// Gets the command to query the registration data of the selected hop's IP address via RDAP. The IP address is + /// used, since the hostname of a router is usually not a registered domain. + /// + public ICommand PerformRDAPQueryCommand => new RelayCommand(PerformRDAPQueryAction); + + private void PerformRDAPQueryAction(object data) + { + EventSystem.RedirectToApplication(ApplicationName.RDAP, data.ToString()); + } + /// /// Gets the command to copy the round-trip time to the clipboard. /// diff --git a/Source/NETworkManager/Views/IPScannerView.xaml b/Source/NETworkManager/Views/IPScannerView.xaml index 36e784063d..5441f7b9fa 100644 --- a/Source/NETworkManager/Views/IPScannerView.xaml +++ b/Source/NETworkManager/Views/IPScannerView.xaml @@ -383,6 +383,16 @@ + + + + + + + + + diff --git a/Source/NETworkManager/Views/TracerouteView.xaml b/Source/NETworkManager/Views/TracerouteView.xaml index f732d6dc4a..e52e10d73c 100644 --- a/Source/NETworkManager/Views/TracerouteView.xaml +++ b/Source/NETworkManager/Views/TracerouteView.xaml @@ -302,6 +302,28 @@ + + + + + + + + + + + + diff --git a/Website/docs/application/ip-scanner.md b/Website/docs/application/ip-scanner.md index 6c46b528d4..4a63e77f68 100644 --- a/Website/docs/application/ip-scanner.md +++ b/Website/docs/application/ip-scanner.md @@ -57,7 +57,7 @@ with link-local addresses (`169.254.x.x`) given lower priority. ### Context menu -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). +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). | Action | Description | | ------------- | ------------------------------------------------ | diff --git a/Website/docs/application/rdap.md b/Website/docs/application/rdap.md index 1a46493dce..5ccc1b481e 100644 --- a/Website/docs/application/rdap.md +++ b/Website/docs/application/rdap.md @@ -39,6 +39,8 @@ The firewall must allow outgoing HTTPS connections (TCP port 443) to `data.iana. A running query can be canceled with **Cancel** (or `Esc`). +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). + ### Example inputs 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). diff --git a/Website/docs/application/traceroute.md b/Website/docs/application/traceroute.md index 73d6abbf76..9f4b1e8c1d 100644 --- a/Website/docs/application/traceroute.md +++ b/Website/docs/application/traceroute.md @@ -23,6 +23,8 @@ Traceroute works by sending ICMP packets with incrementally increasing TTL (Time ### Context menu +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). + | Action | Description | |--------|-------------| | **Copy** | Copies the selected information to the clipboard | diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md index 5dea291313..6f6ad4587f 100644 --- a/Website/docs/changelog/next-release.md +++ b/Website/docs/changelog/next-release.md @@ -27,7 +27,7 @@ Release date: **xx.xx.2026** **RDAP** -- 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) +- 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) **Traceroute** From a6d610777969a628e3df7d4b8b780615840caec5 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:34:23 +0200 Subject: [PATCH 07/11] Feature: RDAP submenu (IP address, hostname, ASN) and parent domain lookup - IP Scanner and Traceroute: "RDAP..." submenu like "DNS Lookup..." with IP address and hostname; Traceroute also with the AS number of the IP geolocation. Entries without data are disabled. - If a domain is not found (e.g. a hostname like www.borntoberoot.net), its parent domain is queried (up to 3 levels), since registries only know registered domains. The status shows which domain is displayed. Co-Authored-By: Claude Opus 5.5 --- .../Resources/Strings.Designer.cs | 18 +++++ .../Resources/Strings.resx | 6 ++ .../NETworkManager.Models/RDAP/RDAPClient.cs | 32 +++++++- .../RDAP/RDAPQueryParser.cs | 19 +++++ .../ViewModels/IPScannerViewModel.cs | 17 ++++- .../ViewModels/RDAPViewModel.cs | 11 ++- .../ViewModels/TracerouteViewModel.cs | 7 +- .../NETworkManager/Views/IPScannerView.xaml | 40 +++++++--- .../NETworkManager/Views/TracerouteView.xaml | 76 +++++++++++++------ Website/docs/application/ip-scanner.md | 2 +- Website/docs/application/rdap.md | 4 +- Website/docs/application/traceroute.md | 2 +- Website/docs/changelog/next-release.md | 2 +- 13 files changed, 189 insertions(+), 47 deletions(-) diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs index deacaa193c..2051f3b01c 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs @@ -9482,6 +9482,15 @@ public static string RDAPBootstrapUnavailableX { } } + /// + /// Looks up a localized string similar to RDAP.... + /// + public static string RDAPDots { + get { + return ResourceManager.GetString("RDAPDots", resourceCulture); + } + } + /// /// Looks up a localized string similar to The server returned an error: {0}. /// @@ -9518,6 +9527,15 @@ public static string RDAPNetworkErrorX { } } + /// + /// Looks up a localized string similar to No RDAP record found for "{0}", showing the registration data of "{1}".. + /// + public static string RDAPNoRecordForXShowingY { + get { + return ResourceManager.GetString("RDAPNoRecordForXShowingY", resourceCulture); + } + } + /// /// Looks up a localized string similar to No RDAP server is known for "{0}". Entity handles can only be resolved if they end with a known service provider tag (e.g., "-RIPE" or "-ARIN").. /// diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx index ce465a1134..ab13d168e6 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.resx @@ -4827,4 +4827,10 @@ Cloudflare may log your IP address and network information. See Cloudflare's pri AS numbers + + RDAP... + + + No RDAP record found for "{0}", showing the registration data of "{1}". + \ No newline at end of file diff --git a/Source/NETworkManager.Models/RDAP/RDAPClient.cs b/Source/NETworkManager.Models/RDAP/RDAPClient.cs index eb6ca1b3d8..1e47588e80 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPClient.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPClient.cs @@ -31,6 +31,12 @@ public class RDAPClient : SingletonBase /// private const int MaxRedirects = 5; + /// + /// Maximum number of parent domains to query if a domain is not found (e.g. a hostname like + /// "ae-1.router.example.net"), so a long hostname doesn't trigger the rate limit of a registry. + /// + private const int MaxParentDomainQueries = 3; + /// /// Maximum size of a response (after decompression). Real RDAP responses are well below 1 MB. Larger responses /// are rejected, so a broken or malicious server (e.g. a referral target) cannot exhaust the memory. @@ -96,7 +102,9 @@ public RDAPClient() #region Public methods /// - /// Executes an RDAP query. + /// Executes an RDAP query. If a domain is not found, its parent domains are queried, since registries only know + /// the registered domain and not its subdomains (e.g. "www.example.com" → "example.com"). The domain that was + /// found is in . /// /// Query to execute (see ). /// Directory where the IANA bootstrap files are cached. @@ -114,8 +122,28 @@ public async Task QueryAsync(RDAPQuery query, string cacheDirectory, if (query.Type != RDAPQueryType.TLD) await bootstrapService.EnsureUpToDateAsync(cacheDirectory, cancellationToken).ConfigureAwait(false); - var baseUrls = bootstrapService.GetBaseUrls(query); + for (var parentQueries = 0; ; parentQueries++) + { + try + { + return await QueryServersAsync(query, bootstrapService.GetBaseUrls(query), timeout, followReferral, + cancellationToken).ConfigureAwait(false); + } + catch (RDAPException ex) when (ex.Kind == RDAPErrorKind.NotFound && + parentQueries < MaxParentDomainQueries && + RDAPQueryParser.GetParentDomain(query) is { } parent) + { + query = parent; + } + } + } + /// + /// Queries the servers in order until one answers. + /// + private async Task QueryServersAsync(RDAPQuery query, List baseUrls, TimeSpan timeout, + bool followReferral, CancellationToken cancellationToken) + { RDAPException lastNetworkError = null; // Try the next server only on network errors and timeouts. Any HTTP answer is authoritative for the query. diff --git a/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs b/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs index 68acecffe5..43ccad786a 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs @@ -140,6 +140,25 @@ private static RDAPQuery ParseDomain(string input) }; } + /// + /// Gets the parent domain of a domain query (e.g. "example.com" for "www.example.com"), as long as it has at least + /// two labels. + /// + /// Domain query. + /// Query for the parent domain, or null if there is none. + public static RDAPQuery GetParentDomain(RDAPQuery query) + { + if (query.Type != RDAPQueryType.Domain) + return null; + + var index = query.DomainName.IndexOf('.'); + + // The parent must still contain a dot, otherwise it is a TLD. + return index > 0 && query.DomainName.IndexOf('.', index + 1) > 0 + ? ParseDomain(query.DomainName[(index + 1)..]) + : null; + } + /// /// Parses a nameserver (host name with at least two labels, RFC 9082 3.1.4). /// diff --git a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs index f62b83d536..4905fdb68d 100644 --- a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs @@ -409,16 +409,25 @@ private void PerformDNSLookupHostnameAction() } /// - /// Gets the command to query the registration data of the selected IP address via RDAP. The IP address is used, - /// since a hostname is usually not a registered domain. + /// Gets the command to query the registration data of the selected IP address via RDAP. /// - public ICommand PerformRDAPQueryCommand => new RelayCommand(_ => PerformRDAPQueryAction()); + public ICommand PerformRDAPQueryIPAddressCommand => new RelayCommand(_ => PerformRDAPQueryIPAddressAction()); - private void PerformRDAPQueryAction() + private void PerformRDAPQueryIPAddressAction() { EventSystem.RedirectToApplication(ApplicationName.RDAP, SelectedResult.PingInfo.IPAddress.ToString()); } + /// + /// Gets the command to query the registration data of the selected hostname (its registered domain) via RDAP. + /// + public ICommand PerformRDAPQueryHostnameCommand => new RelayCommand(_ => PerformRDAPQueryHostnameAction()); + + private void PerformRDAPQueryHostnameAction() + { + EventSystem.RedirectToApplication(ApplicationName.RDAP, SelectedResult.Hostname); + } + /// /// Gets the command to execute a custom command for the selected host. /// diff --git a/Source/NETworkManager/ViewModels/RDAPViewModel.cs b/Source/NETworkManager/ViewModels/RDAPViewModel.cs index dc4a84526d..bacf3b4dbe 100644 --- a/Source/NETworkManager/ViewModels/RDAPViewModel.cs +++ b/Source/NETworkManager/ViewModels/RDAPViewModel.cs @@ -335,8 +335,17 @@ private async Task RunQuery() IsResultVisible = true; + List messages = []; + + // A subdomain (e.g. a hostname) was not found, but its parent domain. + if (_result.Query.Value != query.Value) + messages.Add(string.Format(Strings.RDAPNoRecordForXShowingY, query.Value, _result.Query.Value)); + if (_result.ReferralError != null) - ShowStatusMessage(GetReferralErrorMessage(_result.ReferralError, query)); + messages.Add(GetReferralErrorMessage(_result.ReferralError, _result.Query)); + + if (messages.Count > 0) + ShowStatusMessage(string.Join(Environment.NewLine, messages)); AddQueryToHistory(Query); } diff --git a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs index a30690baa2..c5b9f66207 100644 --- a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs +++ b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs @@ -321,14 +321,15 @@ private void PerformDNSLookupAction(object data) } /// - /// Gets the command to query the registration data of the selected hop's IP address via RDAP. The IP address is - /// used, since the hostname of a router is usually not a registered domain. + /// Gets the command to query the registration data of the selected hop's IP address, hostname (its registered + /// domain) or AS number via RDAP. /// public ICommand PerformRDAPQueryCommand => new RelayCommand(PerformRDAPQueryAction); private void PerformRDAPQueryAction(object data) { - EventSystem.RedirectToApplication(ApplicationName.RDAP, data.ToString()); + // The AS of the IP geolocation contains the name as well (e.g. "AS15169 Google LLC"). + EventSystem.RedirectToApplication(ApplicationName.RDAP, data.ToString().Split(' ')[0]); } /// diff --git a/Source/NETworkManager/Views/IPScannerView.xaml b/Source/NETworkManager/Views/IPScannerView.xaml index 5441f7b9fa..9f67238244 100644 --- a/Source/NETworkManager/Views/IPScannerView.xaml +++ b/Source/NETworkManager/Views/IPScannerView.xaml @@ -328,6 +328,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -383,16 +413,6 @@ - - - - - - - - - diff --git a/Source/NETworkManager/Views/TracerouteView.xaml b/Source/NETworkManager/Views/TracerouteView.xaml index e52e10d73c..e172960e64 100644 --- a/Source/NETworkManager/Views/TracerouteView.xaml +++ b/Source/NETworkManager/Views/TracerouteView.xaml @@ -242,6 +242,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -302,28 +356,6 @@ - - - - - - - - - - - - diff --git a/Website/docs/application/ip-scanner.md b/Website/docs/application/ip-scanner.md index 4a63e77f68..b85f2dfc42 100644 --- a/Website/docs/application/ip-scanner.md +++ b/Website/docs/application/ip-scanner.md @@ -57,7 +57,7 @@ with link-local addresses (`169.254.x.x`) given lower priority. ### Context menu -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). +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 or hostname via [RDAP](./rdap), creating a new profile, or executing a [custom command](#custom-commands). | Action | Description | | ------------- | ------------------------------------------------ | diff --git a/Website/docs/application/rdap.md b/Website/docs/application/rdap.md index 5ccc1b481e..7bbec8499b 100644 --- a/Website/docs/application/rdap.md +++ b/Website/docs/application/rdap.md @@ -14,7 +14,7 @@ RDAP is the standardized successor of Whois ([RFC 7480](https://www.rfc-editor.o The RDAP server for a query is determined using the bootstrap files published by IANA at [data.iana.org/rdap](https://data.iana.org/rdap/). They are downloaded with the first query, cached locally and refreshed automatically once a week. If `data.iana.org` cannot be reached, the cached files are used and the update is retried after an hour (at most 3 times, then with the next weekly update). Files that have not been downloaded yet (or can't be read) are downloaded with the next query. See [Settings](#settings). -- **Domains** and **nameservers** are resolved via the registry of their top-level domain. Some registries (e.g. `.de`, `.ch`, `.li`, `.io`) run an RDAP server that is not (yet) listed by IANA; these are included in NETworkManager. +- **Domains** and **nameservers** are resolved via the registry of their top-level domain. Registries only know registered domains, not their subdomains: if a domain is not found (e.g. a hostname like `www.borntoberoot.net`), its parent domain is queried (up to 3 levels, e.g. `borntoberoot.net`). Some registries (e.g. `.de`, `.ch`, `.li`, `.io`) run an RDAP server that is not (yet) listed by IANA; these are included in NETworkManager. - **Top-level domains** (e.g. `de`) are queried at the IANA root zone RDAP server (`rdap.iana.org`). - **IP addresses** and **AS numbers** are resolved via the Regional Internet Registries (RIRs). Private and reserved ranges (e.g. `10.0.0.0/8`, `fe80::/10`) are queried at ARIN, which returns the IANA reservation. - **Entities** can only be resolved if their handle ends with a service provider tag registered at IANA (e.g. `ORG-RIEN1-RIPE`, `-ARIN`). @@ -39,7 +39,7 @@ The firewall must allow outgoing HTTPS connections (TCP port 443) to `data.iana. A running query can be canceled with **Cancel** (or `Esc`). -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). +The IP address or hostname of a host can also be queried from the context menu of the [IP Scanner](./ip-scanner.md), and the IP address, hostname or AS number of a hop from the context menu of the [Traceroute](./traceroute.md). ### Example inputs diff --git a/Website/docs/application/traceroute.md b/Website/docs/application/traceroute.md index 9f4b1e8c1d..06e8bca556 100644 --- a/Website/docs/application/traceroute.md +++ b/Website/docs/application/traceroute.md @@ -23,7 +23,7 @@ Traceroute works by sending ICMP packets with incrementally increasing TTL (Time ### Context menu -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). +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), hostname or AS number via [RDAP](./rdap). | Action | Description | |--------|-------------| diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md index 6f6ad4587f..57c8eaaa12 100644 --- a/Website/docs/changelog/next-release.md +++ b/Website/docs/changelog/next-release.md @@ -27,7 +27,7 @@ Release date: **xx.xx.2026** **RDAP** -- 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) +- 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, hostnames and AS numbers can be queried from the context menu of **IP Scanner** and **Traceroute**; for a hostname (e.g. `www.borntoberoot.net`), the registered domain is found automatically. [#3607](https://github.com/BornToBeRoot/NETworkManager/pull/3607) **Traceroute** From 3bf9bba882c79d603cae78052bb86490789bd998 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:50:07 +0200 Subject: [PATCH 08/11] Fix: RDAP parent domain on 400, hostname without domain, docs - Parent domain lookup also on 400 Bad Request (PIR, Identity Digital, SWITCH and auDA answer a subdomain with 400, not 404). - IP Scanner: RDAP > Hostname only for hostnames with a domain (not for NetBIOS names like "PC-01"). - Text export: the handle of a network is left out if it is the range. - Docs: only RIPE organizations can be queried with their networks; AS numbers only from Traceroute. Co-Authored-By: Claude Opus 5.5 --- .../HostnameHasDomainToBooleanConverter.cs | 22 +++++++++++++++++++ .../NETworkManager.Models/RDAP/RDAPClient.cs | 7 +++--- .../ViewModels/RDAPObjectViewModel.cs | 4 ++++ .../NETworkManager/Views/IPScannerView.xaml | 3 ++- Website/docs/application/rdap.md | 6 ++--- Website/docs/changelog/next-release.md | 2 +- 6 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 Source/NETworkManager.Converters/HostnameHasDomainToBooleanConverter.cs diff --git a/Source/NETworkManager.Converters/HostnameHasDomainToBooleanConverter.cs b/Source/NETworkManager.Converters/HostnameHasDomainToBooleanConverter.cs new file mode 100644 index 0000000000..563eb93af7 --- /dev/null +++ b/Source/NETworkManager.Converters/HostnameHasDomainToBooleanConverter.cs @@ -0,0 +1,22 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +/// +/// Convert a hostname to : true if it has a domain (e.g. "server01.borntoberoot.net"), false for +/// a single label like a NetBIOS name ("SERVER01"). +/// +public sealed class HostnameHasDomainToBooleanConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is string hostname && hostname.Trim('.').Contains('.'); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/Source/NETworkManager.Models/RDAP/RDAPClient.cs b/Source/NETworkManager.Models/RDAP/RDAPClient.cs index 1e47588e80..32fcb4bcfa 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPClient.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPClient.cs @@ -103,8 +103,9 @@ public RDAPClient() /// /// Executes an RDAP query. If a domain is not found, its parent domains are queried, since registries only know - /// the registered domain and not its subdomains (e.g. "www.example.com" → "example.com"). The domain that was - /// found is in . + /// the registered domain and not its subdomains (e.g. "www.example.com" → "example.com"). Registries answer a + /// subdomain with 404 (e.g. Verisign, Nominet) or 400 (e.g. PIR, Identity Digital, SWITCH, auDA). The domain that + /// was found is in . /// /// Query to execute (see ). /// Directory where the IANA bootstrap files are cached. @@ -129,7 +130,7 @@ public async Task QueryAsync(RDAPQuery query, string cacheDirectory, return await QueryServersAsync(query, bootstrapService.GetBaseUrls(query), timeout, followReferral, cancellationToken).ConfigureAwait(false); } - catch (RDAPException ex) when (ex.Kind == RDAPErrorKind.NotFound && + catch (RDAPException ex) when ((ex.Kind is RDAPErrorKind.NotFound or RDAPErrorKind.BadRequest) && parentQueries < MaxParentDomainQueries && RDAPQueryParser.GetParentDomain(query) is { } parent) { diff --git a/Source/NETworkManager/ViewModels/RDAPObjectViewModel.cs b/Source/NETworkManager/ViewModels/RDAPObjectViewModel.cs index af1350b7d3..d0545dd45d 100644 --- a/Source/NETworkManager/ViewModels/RDAPObjectViewModel.cs +++ b/Source/NETworkManager/ViewModels/RDAPObjectViewModel.cs @@ -338,9 +338,13 @@ public string ToText() /// /// Formats a network or AS number for the text export, e.g. "192.0.2.0/24 EXAMPLE-NET (NET-192-0-2-0-1, US)". + /// The handle is left out if it is the range (e.g. RIPE uses the prefix as handle). /// private static string FormatListItem(string range, string name, string handle, string country) { + if (string.Equals(handle, range, StringComparison.OrdinalIgnoreCase)) + handle = null; + var details = string.Join(", ", new[] { handle, country }.Where(x => !string.IsNullOrWhiteSpace(x))); return string.Join(" ", new[] { range, name, details.Length > 0 ? $"({details})" : null } diff --git a/Source/NETworkManager/Views/IPScannerView.xaml b/Source/NETworkManager/Views/IPScannerView.xaml index 9f67238244..30bb80b8c4 100644 --- a/Source/NETworkManager/Views/IPScannerView.xaml +++ b/Source/NETworkManager/Views/IPScannerView.xaml @@ -32,6 +32,7 @@ + @@ -348,7 +349,7 @@ + IsEnabled="{Binding Path=Data.(viewModels:IPScannerViewModel.SelectedResult).Hostname, Source={StaticResource BindingProxy}, Converter={StaticResource HostnameHasDomainToBooleanConverter}}"> diff --git a/Website/docs/application/rdap.md b/Website/docs/application/rdap.md index 7bbec8499b..228405d8d1 100644 --- a/Website/docs/application/rdap.md +++ b/Website/docs/application/rdap.md @@ -14,7 +14,7 @@ RDAP is the standardized successor of Whois ([RFC 7480](https://www.rfc-editor.o The RDAP server for a query is determined using the bootstrap files published by IANA at [data.iana.org/rdap](https://data.iana.org/rdap/). They are downloaded with the first query, cached locally and refreshed automatically once a week. If `data.iana.org` cannot be reached, the cached files are used and the update is retried after an hour (at most 3 times, then with the next weekly update). Files that have not been downloaded yet (or can't be read) are downloaded with the next query. See [Settings](#settings). -- **Domains** and **nameservers** are resolved via the registry of their top-level domain. Registries only know registered domains, not their subdomains: if a domain is not found (e.g. a hostname like `www.borntoberoot.net`), its parent domain is queried (up to 3 levels, e.g. `borntoberoot.net`). Some registries (e.g. `.de`, `.ch`, `.li`, `.io`) run an RDAP server that is not (yet) listed by IANA; these are included in NETworkManager. +- **Domains** and **nameservers** are resolved via the registry of their top-level domain. Registries only know registered domains, not their subdomains: if a domain is not found or rejected (e.g. a hostname like `www.borntoberoot.net`), its parent domain is queried (up to 3 levels, e.g. `borntoberoot.net`). Some registries (e.g. `.de`, `.ch`, `.li`, `.io`) run an RDAP server that is not (yet) listed by IANA; these are included in NETworkManager. - **Top-level domains** (e.g. `de`) are queried at the IANA root zone RDAP server (`rdap.iana.org`). - **IP addresses** and **AS numbers** are resolved via the Regional Internet Registries (RIRs). Private and reserved ranges (e.g. `10.0.0.0/8`, `fe80::/10`) are queried at ARIN, which returns the IANA reservation. - **Entities** can only be resolved if their handle ends with a service provider tag registered at IANA (e.g. `ORG-RIEN1-RIPE`, `-ARIN`). @@ -39,7 +39,7 @@ The firewall must allow outgoing HTTPS connections (TCP port 443) to `data.iana. A running query can be canceled with **Cancel** (or `Esc`). -The IP address or hostname of a host can also be queried from the context menu of the [IP Scanner](./ip-scanner.md), and the IP address, hostname or AS number of a hop from the context menu of the [Traceroute](./traceroute.md). +The IP address or hostname (if it has a domain, e.g. `server01.borntoberoot.net`) of a host can also be queried from the context menu of the [IP Scanner](./ip-scanner.md), and the IP address, hostname or AS number of a hop from the context menu of the [Traceroute](./traceroute.md). ### Example inputs @@ -53,7 +53,7 @@ With the type **Auto** (default), the type is detected from the query: IP addres | IP address | `1.1.1.1` | Query the network that contains the IP address | | IP address | `2001:db8::/32` | Query the network that contains the CIDR prefix | | ASN | `AS13335` | Query an AS number (`13335`, `AS13335` and asdot like `1.10` work) | -| Entity | `ORG-RIEN1-RIPE` | Query an entity (organization, contact) by its handle. For an organization, some registries (e.g. RIPE, APNIC, ARIN) also return its networks and AS numbers | +| Entity | `ORG-RIEN1-RIPE` | Query an entity (organization, contact) by its handle. For an organization, some registries (e.g. RIPE) also return its networks and AS numbers | ### Export diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md index 57c8eaaa12..8d530d42f5 100644 --- a/Website/docs/changelog/next-release.md +++ b/Website/docs/changelog/next-release.md @@ -27,7 +27,7 @@ Release date: **xx.xx.2026** **RDAP** -- 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, hostnames and AS numbers can be queried from the context menu of **IP Scanner** and **Traceroute**; for a hostname (e.g. `www.borntoberoot.net`), the registered domain is found automatically. [#3607](https://github.com/BornToBeRoot/NETworkManager/pull/3607) +- 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 and hostnames can be queried from the context menu of **IP Scanner** and **Traceroute**, AS numbers from **Traceroute**; for a hostname (e.g. `www.borntoberoot.net`), the registered domain is found automatically. [#3607](https://github.com/BornToBeRoot/NETworkManager/pull/3607) **Traceroute** From b962bf3f8105d8c3c3c7149c791ec127f2dbb541 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Wed, 21 Oct 2026 16:10:05 +0200 Subject: [PATCH 09/11] Fix: RDAP registered domain via public suffix list, review fixes - A hostname is queried as its registered domain, determined with the public suffix list (ICANN section, MPL-2.0, generated by Scripts/Create-PublicSuffixListFromWeb.ps1). Replaces the parent domain lookup, which stopped after 3 levels and could show a public suffix like co.uk (a registry object) for an unregistered domain. - A missing bootstrap file is retried after 1 minute instead of with every query; bootstrap files are parsed once per query. - Tabs opened from other tools or the run command use the type Auto. - Traceroute: RDAP > Hostname only for hostnames with a domain. - Public suffix list listed in About > Resources. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 1 + Scripts/Create-PublicSuffixListFromWeb.ps1 | 44 + .../HostnameHasDomainToBooleanConverter.cs | 16 + .../ResourceManager.cs | 5 +- .../Resources/Strings.Designer.cs | 27 +- .../Resources/Strings.resx | 7 +- .../NETworkManager.Models.csproj | 2 + .../RDAP/PublicSuffixList.cs | 95 + .../RDAP/RDAPBootstrapService.cs | 28 +- .../NETworkManager.Models/RDAP/RDAPClient.cs | 32 +- .../RDAP/RDAPQueryParser.cs | 15 +- .../Resources/PublicSuffixList.dat | 6958 +++++++++++++++++ .../ViewModels/RDAPHostViewModel.cs | 6 +- .../ViewModels/RDAPViewModel.cs | 5 +- .../NETworkManager/Views/TracerouteView.xaml | 3 +- Website/docs/application/rdap.md | 2 +- Website/docs/changelog/next-release.md | 2 +- 17 files changed, 7186 insertions(+), 62 deletions(-) create mode 100644 Scripts/Create-PublicSuffixListFromWeb.ps1 create mode 100644 Source/NETworkManager.Models/RDAP/PublicSuffixList.cs create mode 100644 Source/NETworkManager.Models/Resources/PublicSuffixList.dat diff --git a/AGENTS.md b/AGENTS.md index 713c18c46f..d0e6761643 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,6 +41,7 @@ REPOSITORY_ROOT/ │ ├── Create-FlagFromSVG.ps1 # Create flag images │ ├── Create-OUIListFromWeb.ps1 # Update OUI (MAC vendor) list │ ├── Create-PortListFromWeb.ps1 # Update port list database +│ ├── Create-PublicSuffixListFromWeb.ps1 # Update public suffix list (RDAP: registered domain of a hostname) │ ├── Create-ReleaseTable.ps1 # Create the SHA256 sums / file table for release notes │ ├── Create-WhoisServerListFromWebAndWhois.ps1 # Update WHOIS servers │ ├── Create-WorldMapFromWeb.ps1 # Create the world map (Traceroute map) diff --git a/Scripts/Create-PublicSuffixListFromWeb.ps1 b/Scripts/Create-PublicSuffixListFromWeb.ps1 new file mode 100644 index 0000000000..0ce6a4a6dd --- /dev/null +++ b/Scripts/Create-PublicSuffixListFromWeb.ps1 @@ -0,0 +1,44 @@ +# Filepath in the resources +[string]$OutFilePath = Join-Path -Path (Split-Path $PSScriptRoot -Parent) -ChildPath "Source\NETworkManager.Models\Resources\PublicSuffixList.dat" + +# Download the public suffix list (MPL 2.0) from publicsuffix.org +$List = (Invoke-WebRequest -Uri "https://publicsuffix.org/list/public_suffix_list.dat").Content -split "[`r`n]+" + +# Keep the license notice, version and commit of the list +$Header = $List | Where-Object { $_ -match "^// (This Source Code Form|License, v\. 2\.0|file, You can obtain|VERSION:|COMMIT:)" } + +# Only the ICANN section is used, since the private section (e.g. github.io) doesn't contain registered domains +$IsICANN = $false +$IdnMapping = New-Object System.Globalization.IdnMapping + +$Rules = foreach ($Line in $List) { + if ($Line -eq "// ===BEGIN ICANN DOMAINS===") { + $IsICANN = $true + continue + } + + if ($Line -eq "// ===END ICANN DOMAINS===") { + break + } + + $Rule = $Line.Trim() + + if (-not $IsICANN -or [string]::IsNullOrEmpty($Rule) -or $Rule.StartsWith("//")) { + continue + } + + # Rules are converted to A-labels (punycode), like the queries. Wildcard (*.) and exception (!) prefixes are kept. + $Prefix = if ($Rule.StartsWith("*.")) { "*." } elseif ($Rule.StartsWith("!")) { "!" } else { "" } + + $Prefix + $IdnMapping.GetAscii($Rule.Substring($Prefix.Length)).ToLowerInvariant() +} + +$Description = @" +$($Header -join "`n") +// +// ICANN section of the public suffix list from https://publicsuffix.org/list/public_suffix_list.dat, with the +// rules converted to A-labels (punycode). +// Generated $(Get-Date) by Scripts/Create-PublicSuffixListFromWeb.ps1 +"@ + +Set-Content -Path $OutFilePath -Value (@($Description) + $Rules) -Encoding utf8NoBOM diff --git a/Source/NETworkManager.Converters/HostnameHasDomainToBooleanConverter.cs b/Source/NETworkManager.Converters/HostnameHasDomainToBooleanConverter.cs index 563eb93af7..be188890e9 100644 --- a/Source/NETworkManager.Converters/HostnameHasDomainToBooleanConverter.cs +++ b/Source/NETworkManager.Converters/HostnameHasDomainToBooleanConverter.cs @@ -10,11 +10,27 @@ namespace NETworkManager.Converters; /// public sealed class HostnameHasDomainToBooleanConverter : IValueConverter { + /// + /// Convert a hostname to . + /// + /// Hostname as . + /// + /// + /// + /// True if the hostname has a domain, otherwise false. public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value is string hostname && hostname.Trim('.').Contains('.'); } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); diff --git a/Source/NETworkManager.Documentation/ResourceManager.cs b/Source/NETworkManager.Documentation/ResourceManager.cs index 9fdb827a05..643cbc1e58 100644 --- a/Source/NETworkManager.Documentation/ResourceManager.cs +++ b/Source/NETworkManager.Documentation/ResourceManager.cs @@ -27,6 +27,9 @@ public static class ResourceManager Strings.Resource_ListTLD_Description), new("natural-earth-geojson", "https://github.com/martynafford/natural-earth-geojson", - Strings.Resource_NaturalEarth_Description) + Strings.Resource_NaturalEarth_Description), + + new("Public Suffix List", "https://publicsuffix.org/", + Strings.Resource_PublicSuffixList_Description) ]; } \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs index 2051f3b01c..a741b6bd2c 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs @@ -9527,15 +9527,6 @@ public static string RDAPNetworkErrorX { } } - /// - /// Looks up a localized string similar to No RDAP record found for "{0}", showing the registration data of "{1}".. - /// - public static string RDAPNoRecordForXShowingY { - get { - return ResourceManager.GetString("RDAPNoRecordForXShowingY", resourceCulture); - } - } - /// /// Looks up a localized string similar to No RDAP server is known for "{0}". Entity handles can only be resolved if they end with a known service provider tag (e.g., "-RIPE" or "-ARIN").. /// @@ -9680,6 +9671,15 @@ public static string RDAPTooManyRedirects { } } + /// + /// Looks up a localized string similar to "{0}" is not a registered domain, showing the registration data of "{1}".. + /// + public static string RDAPXIsNotARegisteredDomainShowingY { + get { + return ResourceManager.GetString("RDAPXIsNotARegisteredDomainShowingY", resourceCulture); + } + } + /// /// Looks up a localized string similar to Received. /// @@ -11057,6 +11057,15 @@ public static string Resource_OUI_Description { } } + /// + /// Looks up a localized string similar to List of public suffixes (e.g. "co.uk") from publicsuffix.org (MPL-2.0), which is used to get the registered domain of a hostname for RDAP queries.. + /// + public static string Resource_PublicSuffixList_Description { + get { + return ResourceManager.GetString("Resource_PublicSuffixList_Description", resourceCulture); + } + } + /// /// Looks up a localized string similar to Service Name and Transport Protocol Port Number Registry from iana.org.. /// diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx index ab13d168e6..c0559d2548 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.resx @@ -4830,7 +4830,10 @@ Cloudflare may log your IP address and network information. See Cloudflare's pri RDAP... - - No RDAP record found for "{0}", showing the registration data of "{1}". + + "{0}" is not a registered domain, showing the registration data of "{1}". + + + List of public suffixes (e.g. "co.uk") from publicsuffix.org (MPL-2.0), which is used to get the registered domain of a hostname for RDAP queries. \ No newline at end of file diff --git a/Source/NETworkManager.Models/NETworkManager.Models.csproj b/Source/NETworkManager.Models/NETworkManager.Models.csproj index 834de3882f..7f177215fb 100644 --- a/Source/NETworkManager.Models/NETworkManager.Models.csproj +++ b/Source/NETworkManager.Models/NETworkManager.Models.csproj @@ -15,6 +15,7 @@ + @@ -23,6 +24,7 @@ + diff --git a/Source/NETworkManager.Models/RDAP/PublicSuffixList.cs b/Source/NETworkManager.Models/RDAP/PublicSuffixList.cs new file mode 100644 index 0000000000..1c5b0df6b3 --- /dev/null +++ b/Source/NETworkManager.Models/RDAP/PublicSuffixList.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using log4net; + +namespace NETworkManager.Models.RDAP; + +/// +/// Public suffix list (ICANN section, see Scripts/Create-PublicSuffixListFromWeb.ps1) to get the registered domain of +/// a hostname (e.g. "bbc.co.uk" for "www.bbc.co.uk"). Registries only know registered domains, not their +/// subdomains or public suffixes like "co.uk". +/// +public static class PublicSuffixList +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(PublicSuffixList)); + + private const string Resource = "NETworkManager.Models.Resources.PublicSuffixList.dat"; + + private static readonly Lazy<(HashSet Rules, HashSet Wildcards, HashSet Exceptions)> + List = new(Load); + + /// + /// Gets the registered domain (public suffix plus one label) of a domain name, following the algorithm of + /// https://publicsuffix.org/list/: an exception rule wins, otherwise the longest matching rule, otherwise the + /// TLD ("*"). + /// + /// Domain name in lowercase A-label form (e.g. "www.bbc.co.uk"). + /// Registered domain (e.g. "bbc.co.uk"), or null if the domain is a public suffix itself. + public static string GetRegisteredDomain(string domain) + { + var (rules, wildcards, exceptions) = List.Value; + + var labels = domain.Split('.'); + + // Index of the first label of the public suffix, the TLD by default. + var suffixIndex = labels.Length - 1; + + for (var i = 0; i < labels.Length; i++) + { + var name = string.Join('.', labels[i..]); + + if (exceptions.Contains(name)) + { + suffixIndex = i + 1; + break; + } + + if (rules.Contains(name) || i + 1 < labels.Length && wildcards.Contains(string.Join('.', labels[(i + 1)..]))) + { + suffixIndex = i; + break; + } + } + + return suffixIndex > 0 ? string.Join('.', labels[(suffixIndex - 1)..]) : null; + } + + private static (HashSet, HashSet, HashSet) Load() + { + HashSet rules = new(StringComparer.Ordinal); + HashSet wildcards = new(StringComparer.Ordinal); + HashSet exceptions = new(StringComparer.Ordinal); + + try + { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(Resource); + + if (stream == null) + return (rules, wildcards, exceptions); + + using var reader = new StreamReader(stream); + + while (reader.ReadLine() is { } line) + { + if (line.Length == 0 || line.StartsWith("//")) + continue; + + if (line.StartsWith("*.")) + wildcards.Add(line[2..]); + else if (line.StartsWith('!')) + exceptions.Add(line[1..]); + else + rules.Add(line); + } + } + catch (Exception ex) + { + // Without the list, the TLD is used as public suffix (default rule). + Log.Error("Could not load the public suffix list.", ex); + } + + return (rules, wildcards, exceptions); + } +} diff --git a/Source/NETworkManager.Models/RDAP/RDAPBootstrapService.cs b/Source/NETworkManager.Models/RDAP/RDAPBootstrapService.cs index ce59a0316c..dfd65172e2 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPBootstrapService.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPBootstrapService.cs @@ -55,6 +55,13 @@ public class RDAPBootstrapService : SingletonBase /// private static readonly TimeSpan RetryInterval = TimeSpan.FromHours(1); + /// + /// Wait time before the next automatic attempt for a file that is not cached (e.g. the first query was made + /// offline). It is short, since the query type can't be used without the file, but a blocked data.iana.org + /// doesn't cost a timeout with every query. + /// + private static readonly TimeSpan MissingFileRetryInterval = TimeSpan.FromMinutes(1); + /// /// Number of failed automatic attempts after which a cached file is used until the next regular /// (e.g. if data.iana.org is blocked). "Update now" always checks. @@ -322,7 +329,9 @@ private async Task UpdateAsync(string cacheDirectory, bool force, CancellationTo // Load the cached files first, so a file that can't be parsed is downloaded again in this update (see // ReadServices). - if (_dns == null) + var loaded = _dns == null; + + if (loaded) LoadRegistries(); var attempted = false; @@ -333,9 +342,8 @@ private async Task UpdateAsync(string cacheDirectory, bool force, CancellationTo { var path = Path.Combine(_cacheDirectory, info.FileName); - // "Expires" is the time of the next check, after a successful update as well as after a failure. A - // missing file is tried with every query, since the query type can't be used without it. - if (!force && info.Expires > DateTime.Now && File.Exists(path)) + // "Expires" is the time of the next check, after a successful update as well as after a failure. + if (!force && info.Expires > DateTime.Now) continue; attempted = true; @@ -368,7 +376,7 @@ private async Task UpdateAsync(string cacheDirectory, bool force, CancellationTo } // The cached copy is kept and used, if an update fails. - if (contentChanged || _dns == null) + if (contentChanged || _dns == null && !loaded) LoadRegistries(); if (attempted) @@ -389,7 +397,7 @@ private async Task UpdateAsync(string cacheDirectory, bool force, CancellationTo /// /// Records a failed update. A cached file is retried after , at most /// times, then after the regular . A missing file - /// is tried again with the next query (see ). + /// is retried after . /// private void RecordFailure(RDAPBootstrapCacheInfo info, Exception ex) { @@ -398,9 +406,11 @@ private void RecordFailure(RDAPBootstrapCacheInfo info, Exception ex) var exists = File.Exists(Path.Combine(_cacheDirectory, info.FileName)); - info.Expires = DateTime.Now + (exists && info.FailedAttempts >= MaxFailedAttempts - ? RefreshInterval - : RetryInterval); + info.Expires = DateTime.Now + (!exists + ? MissingFileRetryInterval + : info.FailedAttempts >= MaxFailedAttempts + ? RefreshInterval + : RetryInterval); } /// diff --git a/Source/NETworkManager.Models/RDAP/RDAPClient.cs b/Source/NETworkManager.Models/RDAP/RDAPClient.cs index 32fcb4bcfa..8a415732cc 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPClient.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPClient.cs @@ -31,12 +31,6 @@ public class RDAPClient : SingletonBase /// private const int MaxRedirects = 5; - /// - /// Maximum number of parent domains to query if a domain is not found (e.g. a hostname like - /// "ae-1.router.example.net"), so a long hostname doesn't trigger the rate limit of a registry. - /// - private const int MaxParentDomainQueries = 3; - /// /// Maximum size of a response (after decompression). Real RDAP responses are well below 1 MB. Larger responses /// are rejected, so a broken or malicious server (e.g. a referral target) cannot exhaust the memory. @@ -102,10 +96,10 @@ public RDAPClient() #region Public methods /// - /// Executes an RDAP query. If a domain is not found, its parent domains are queried, since registries only know - /// the registered domain and not its subdomains (e.g. "www.example.com" → "example.com"). Registries answer a - /// subdomain with 404 (e.g. Verisign, Nominet) or 400 (e.g. PIR, Identity Digital, SWITCH, auDA). The domain that - /// was found is in . + /// Executes an RDAP query. For a subdomain (e.g. a hostname like "www.example.com"), the registered domain is + /// queried ("example.com"), since registries only know registered domains and answer a subdomain with 404 (e.g. + /// Verisign, Nominet) or 400 (e.g. PIR, Identity Digital, SWITCH, auDA). The queried domain is in + /// . /// /// Query to execute (see ). /// Directory where the IANA bootstrap files are cached. @@ -123,20 +117,10 @@ public async Task QueryAsync(RDAPQuery query, string cacheDirectory, if (query.Type != RDAPQueryType.TLD) await bootstrapService.EnsureUpToDateAsync(cacheDirectory, cancellationToken).ConfigureAwait(false); - for (var parentQueries = 0; ; parentQueries++) - { - try - { - return await QueryServersAsync(query, bootstrapService.GetBaseUrls(query), timeout, followReferral, - cancellationToken).ConfigureAwait(false); - } - catch (RDAPException ex) when ((ex.Kind is RDAPErrorKind.NotFound or RDAPErrorKind.BadRequest) && - parentQueries < MaxParentDomainQueries && - RDAPQueryParser.GetParentDomain(query) is { } parent) - { - query = parent; - } - } + query = RDAPQueryParser.GetRegisteredDomain(query) ?? query; + + return await QueryServersAsync(query, bootstrapService.GetBaseUrls(query), timeout, followReferral, + cancellationToken).ConfigureAwait(false); } /// diff --git a/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs b/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs index 43ccad786a..ab4e6bd85d 100644 --- a/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs +++ b/Source/NETworkManager.Models/RDAP/RDAPQueryParser.cs @@ -141,22 +141,19 @@ private static RDAPQuery ParseDomain(string input) } /// - /// Gets the parent domain of a domain query (e.g. "example.com" for "www.example.com"), as long as it has at least - /// two labels. + /// Gets the query for the registered domain of a domain query, if the domain is a subdomain (e.g. "bbc.co.uk" for + /// "www.bbc.co.uk", see ). /// /// Domain query. - /// Query for the parent domain, or null if there is none. - public static RDAPQuery GetParentDomain(RDAPQuery query) + /// Query for the registered domain, or null if the domain is a registered domain or a public suffix. + public static RDAPQuery GetRegisteredDomain(RDAPQuery query) { if (query.Type != RDAPQueryType.Domain) return null; - var index = query.DomainName.IndexOf('.'); + var registeredDomain = PublicSuffixList.GetRegisteredDomain(query.DomainName); - // The parent must still contain a dot, otherwise it is a TLD. - return index > 0 && query.DomainName.IndexOf('.', index + 1) > 0 - ? ParseDomain(query.DomainName[(index + 1)..]) - : null; + return registeredDomain == null || registeredDomain == query.DomainName ? null : ParseDomain(registeredDomain); } /// diff --git a/Source/NETworkManager.Models/Resources/PublicSuffixList.dat b/Source/NETworkManager.Models/Resources/PublicSuffixList.dat new file mode 100644 index 0000000000..b7349810d3 --- /dev/null +++ b/Source/NETworkManager.Models/Resources/PublicSuffixList.dat @@ -0,0 +1,6958 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. +// VERSION: 2026-10-20_08-40-56_UTC +// COMMIT: 5dd321ffe02039e2431382a095cf80e27ff5eb94 +// +// ICANN section of the public suffix list from https://publicsuffix.org/list/public_suffix_list.dat, with the +// rules converted to A-labels (punycode). +// Generated 10/21/2026 14:07:34 by Scripts/Create-PublicSuffixListFromWeb.ps1 +ac +com.ac +edu.ac +gov.ac +mil.ac +net.ac +org.ac +ad +ae +ac.ae +co.ae +gov.ae +mil.ae +net.ae +org.ae +sch.ae +aero +airline.aero +airport.aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +air-surveillance.aero +air-traffic-control.aero +aircraft.aero +airtraffic.aero +ambulance.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +marketplace.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +taxi.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero +af +com.af +edu.af +gov.af +net.af +org.af +ag +co.ag +com.ag +net.ag +nom.ag +org.ag +ai +com.ai +net.ai +off.ai +org.ai +al +com.al +edu.al +gov.al +mil.al +net.al +org.al +am +co.am +com.am +commune.am +net.am +org.am +ao +co.ao +ed.ao +edu.ao +gov.ao +gv.ao +it.ao +og.ao +org.ao +pb.ao +aq +ar +bet.ar +com.ar +coop.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +mutual.ar +net.ar +org.ar +seg.ar +senasa.ar +tur.ar +arpa +e164.arpa +home.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa +as +gov.as +asia +at +ac.at +sth.ac.at +co.at +gv.at +or.at +au +asn.au +com.au +edu.au +gov.au +id.au +net.au +org.au +conf.au +oz.au +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +act.edu.au +catholic.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au +aw +com.aw +ax +az +biz.az +co.az +com.az +edu.az +gov.az +info.az +int.az +mil.az +name.az +net.az +org.az +pp.az +pro.az +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb +bd +ac.bd +ai.bd +co.bd +com.bd +edu.bd +gov.bd +id.bd +info.bd +it.bd +mil.bd +net.bd +org.bd +sch.bd +tv.bd +be +ac.be +bf +gov.bf +bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +bh +com.bh +edu.bh +gov.bh +net.bh +org.bh +bi +co.bi +com.bi +edu.bi +or.bi +org.bi +biz +bj +africa.bj +agro.bj +architectes.bj +assur.bj +avocats.bj +co.bj +com.bj +eco.bj +econo.bj +edu.bj +info.bj +loisirs.bj +money.bj +net.bj +org.bj +ote.bj +restaurant.bj +resto.bj +tourism.bj +univ.bj +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm +bn +com.bn +edu.bn +gov.bn +net.bn +org.bn +bo +com.bo +edu.bo +gob.bo +int.bo +mil.bo +net.bo +org.bo +tv.bo +web.bo +academia.bo +agro.bo +arte.bo +blog.bo +bolivia.bo +ciencia.bo +cooperativa.bo +democracia.bo +deporte.bo +ecologia.bo +economia.bo +empresa.bo +ia.bo +indigena.bo +industria.bo +info.bo +medicina.bo +movimiento.bo +musica.bo +natural.bo +nombre.bo +noticias.bo +patria.bo +plurinacional.bo +politica.bo +profesional.bo +pueblo.bo +revista.bo +salud.bo +tecnologia.bo +tksat.bo +transporte.bo +wiki.bo +br +9guacu.br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +anani.br +aparecida.br +api.br +app.br +arq.br +art.br +ato.br +b.br +barueri.br +belem.br +bet.br +bhz.br +bib.br +bio.br +blog.br +bmd.br +boavista.br +bsb.br +campinagrande.br +campinas.br +caxias.br +cim.br +cng.br +cnt.br +com.br +contagem.br +coop.br +coz.br +cri.br +cuiaba.br +curitiba.br +def.br +des.br +det.br +dev.br +ecn.br +eco.br +edu.br +emp.br +enf.br +eng.br +esp.br +etc.br +eti.br +far.br +feira.br +flog.br +floripa.br +fm.br +fnd.br +fortal.br +fot.br +foz.br +fst.br +g12.br +geo.br +ggf.br +goiania.br +gov.br +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +ia.br +imb.br +ind.br +inf.br +jab.br +jampa.br +jdf.br +joinville.br +jor.br +jus.br +leg.br +leilao.br +lel.br +log.br +londrina.br +macapa.br +maceio.br +manaus.br +maringa.br +mat.br +med.br +mil.br +morena.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +ong.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +pvh.br +qsl.br +radio.br +rec.br +recife.br +rep.br +ribeirao.br +rio.br +riobranco.br +riopreto.br +salvador.br +sampa.br +santamaria.br +santoandre.br +saobernardo.br +saogonca.br +seg.br +sjc.br +slg.br +slz.br +social.br +sorocaba.br +srv.br +taxi.br +tc.br +tec.br +teo.br +the.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +xyz.br +zlg.br +bs +com.bs +edu.bs +gov.bs +net.bs +org.bs +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt +bv +bw +ac.bw +co.bw +gov.bw +net.bw +org.bw +by +gov.by +mil.by +com.by +of.by +bz +co.bz +com.bz +edu.bz +gov.bz +net.bz +org.bz +ca +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +gc.ca +cat +cc +cd +gov.cd +cf +cg +ch +ci +ac.ci +xn--aroport-bya.ci +asso.ci +co.ci +com.ci +ed.ci +edu.ci +go.ci +gouv.ci +int.ci +net.ci +or.ci +org.ci +*.ck +!www.ck +cl +co.cl +gob.cl +gov.cl +mil.cl +cm +co.cm +com.cm +gov.cm +net.cm +cn +ac.cn +com.cn +edu.cn +gov.cn +mil.cn +net.cn +org.cn +xn--55qx5d.cn +xn--od0alg.cn +xn--io0a7i.cn +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gx.cn +gz.cn +ha.cn +hb.cn +he.cn +hi.cn +hk.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +mo.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +tw.cn +xj.cn +xz.cn +yn.cn +zj.cn +co +com.co +edu.co +gov.co +mil.co +net.co +nom.co +org.co +com +coop +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr +cu +com.cu +edu.cu +gob.cu +inf.cu +nat.cu +net.cu +org.cu +cv +com.cv +edu.cv +id.cv +int.cv +net.cv +nome.cv +org.cv +publ.cv +cw +com.cw +edu.cw +net.cw +org.cw +cx +gov.cx +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +mil.cy +net.cy +org.cy +press.cy +pro.cy +tm.cy +cz +gov.cz +de +dj +dk +dm +co.dm +com.dm +edu.dm +gov.dm +net.dm +org.dm +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do +dz +art.dz +asso.dz +com.dz +edu.dz +gov.dz +net.dz +org.dz +pol.dz +soc.dz +tm.dz +ec +abg.ec +adm.ec +agron.ec +arqt.ec +art.ec +bar.ec +chef.ec +com.ec +cont.ec +cpa.ec +cue.ec +dent.ec +dgn.ec +disco.ec +doc.ec +edu.ec +eng.ec +esm.ec +fin.ec +fot.ec +gal.ec +gob.ec +gov.ec +gye.ec +ibr.ec +info.ec +k12.ec +lat.ec +loj.ec +med.ec +mil.ec +mktg.ec +mon.ec +net.ec +ntr.ec +odont.ec +org.ec +pro.ec +prof.ec +psic.ec +psiq.ec +pub.ec +rio.ec +rrpp.ec +sal.ec +tech.ec +tul.ec +tur.ec +uio.ec +vet.ec +xxx.ec +edu +ee +aip.ee +com.ee +edu.ee +fie.ee +gov.ee +lib.ee +med.ee +org.ee +pri.ee +riik.ee +eg +ac.eg +com.eg +edu.eg +eun.eg +gov.eg +info.eg +me.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg +sport.eg +tv.eg +*.er +es +com.es +edu.es +gob.es +nom.es +org.es +et +biz.et +com.et +edu.et +gov.et +info.et +name.et +net.et +org.et +eu +fi +aland.fi +fj +ac.fj +biz.fj +com.fj +edu.fj +gov.fj +id.fj +info.fj +mil.fj +name.fj +net.fj +org.fj +pro.fj +*.fk +fm +com.fm +edu.fm +net.fm +org.fm +fo +fr +asso.fr +com.fr +gouv.fr +nom.fr +prd.fr +tm.fr +avoues.fr +cci.fr +greta.fr +huissier-justice.fr +ga +gb +gd +edu.gd +gov.gd +ge +com.ge +cyb.ge +edu.ge +gov.ge +llc.ge +net.ge +online.ge +org.ge +pvt.ge +school.ge +tnx.ge +gf +gg +co.gg +net.gg +org.gg +gh +biz.gh +com.gh +edu.gh +gov.gh +mil.gh +net.gh +org.gh +gi +com.gi +edu.gi +gov.gi +ltd.gi +mod.gi +org.gi +gl +co.gl +com.gl +edu.gl +net.gl +org.gl +gm +gn +ac.gn +com.gn +edu.gn +gov.gn +net.gn +org.gn +gov +gp +asso.gp +com.gp +edu.gp +mobi.gp +net.gp +org.gp +gq +gr +com.gr +edu.gr +gov.gr +net.gr +org.gr +gs +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt +gu +com.gu +edu.gu +gov.gu +guam.gu +info.gu +net.gu +org.gu +web.gu +gw +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +xn--ciqpn.hk +xn--gmqw5a.hk +xn--55qx5d.hk +xn--mxtq1m.hk +xn--lcvr32d.hk +xn--wcvs22d.hk +xn--gmq050i.hk +xn--uc0atv.hk +xn--uc0ay4a.hk +xn--od0alg.hk +xn--zf0avx.hk +xn--mk0axi.hk +xn--tn0ag.hk +xn--od0aq3b.hk +xn--io0a7i.hk +hm +hn +com.hn +edu.hn +gob.hn +mil.hn +net.hn +org.hn +hr +com.hr +from.hr +iz.hr +name.hr +ht +adult.ht +art.ht +asso.ht +com.ht +coop.ht +edu.ht +firm.ht +gouv.ht +info.ht +med.ht +net.ht +org.ht +perso.ht +pol.ht +pro.ht +rel.ht +shop.ht +hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +co.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +info.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +org.hu +priv.hu +reklam.hu +sex.hu +shop.hu +sport.hu +suli.hu +szex.hu +tm.hu +tozsde.hu +utazas.hu +video.hu +id +ac.id +ai.id +biz.id +co.id +desa.id +go.id +kop.id +mil.id +my.id +net.id +or.id +ponpes.id +sch.id +web.id +xn--9tfky.id +ie +gov.ie +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il +xn--4dbrk0ce +xn--4dbgdty6c.xn--4dbrk0ce +xn--5dbhl8d.xn--4dbrk0ce +xn--8dbq2a.xn--4dbrk0ce +xn--hebda8b.xn--4dbrk0ce +im +ac.im +co.im +ltd.co.im +plc.co.im +com.im +net.im +org.im +tt.im +tv.im +in +5g.in +6g.in +ac.in +aero.in +ai.in +alumni.in +am.in +bank.in +bihar.in +biz.in +business.in +ca.in +cn.in +co.in +com.in +coop.in +cs.in +delhi.in +dr.in +edu.in +er.in +fin.in +firm.in +gen.in +gov.in +gujarat.in +ind.in +info.in +int.in +internet.in +io.in +me.in +mil.in +net.in +nic.in +org.in +pg.in +post.in +pro.in +res.in +school.in +travel.in +tv.in +ub.in +uk.in +up.in +us.in +info +int +eu.int +io +co.io +com.io +edu.io +gov.io +mil.io +net.io +nom.io +org.io +iq +com.iq +edu.iq +gov.iq +mil.iq +net.iq +org.iq +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +xn--mgba3a4f16a.ir +xn--mgba3a4fra.ir +is +it +edu.it +gov.it +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentin-sud-tirol.it +xn--trentin-sd-tirol-rzb.it +trentin-sudtirol.it +xn--trentin-sdtirol-7vb.it +trentin-sued-tirol.it +trentin-suedtirol.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +xn--trentino-sd-tirol-c3b.it +trentino-sudtirol.it +xn--trentino-sdtirol-szb.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +xn--trentinosd-tirol-rzb.it +xn--trentinosdtirol-7vb.it +trentinosued-tirol.it +trentinosuedtirol.it +trentinsud-tirol.it +xn--trentinsd-tirol-6vb.it +trentinsudtirol.it +xn--trentinsdtirol-nsb.it +trentinsued-tirol.it +trentinsuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +xn--valle-aoste-ebb.it +vallee-d-aoste.it +xn--valle-d-aoste-ehb.it +valleeaoste.it +xn--valleaoste-e7a.it +valleedaoste.it +xn--valledaoste-ebb.it +vao.it +vda.it +ven.it +veneto.it +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan.it +balsan-sudtirol.it +xn--balsan-sdtirol-nsb.it +balsan-suedtirol.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano.it +bolzano-altoadige.it +bozen.it +bozen-sudtirol.it +xn--bozen-sdtirol-2ob.it +bozen-suedtirol.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bulsan.it +bulsan-sudtirol.it +xn--bulsan-sdtirol-nsb.it +bulsan-suedtirol.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +xn--cesena-forl-mcb.it +cesenaforli.it +xn--cesenaforl-i8a.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +xn--forl-cesena-fcb.it +forlicesena.it +xn--forlcesena-c8a.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza.it +monza-brianza.it +monza-e-della-brianza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +su.it +sud-sardegna.it +sudsardegna.it +xn--sdtirol-n2a.it +suedtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trentino.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +verbano-cusio-ossola.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it +je +co.je +net.je +org.je +*.jm +jo +agri.jo +ai.jo +com.jo +edu.jo +eng.jo +fm.jo +gov.jo +mil.jo +net.jo +org.jo +per.jo +phd.jo +sch.jo +tv.jo +jobs +jp +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +xn--ehqz56n.jp +xn--1lqs03n.jp +xn--qqqt11m.jp +xn--f6qx53a.jp +xn--djrs72d6uy.jp +xn--mkru45i.jp +xn--0trq7p7nn.jp +xn--5js045d.jp +xn--kbrq7o.jp +xn--pssu33l.jp +xn--ntsq17g.jp +xn--uisz3g.jp +xn--6btw5a.jp +xn--1ctwo.jp +xn--6orx2r.jp +xn--rht61e.jp +xn--rht27z.jp +xn--nit225k.jp +xn--rht3d.jp +xn--djty4k.jp +xn--klty5x.jp +xn--kltx9a.jp +xn--kltp7d.jp +xn--c3s14m.jp +xn--vgu402c.jp +xn--efvn9s.jp +xn--1lqs71d.jp +xn--4pvxs.jp +xn--uuwu58a.jp +xn--zbx025d.jp +xn--8pvr4u.jp +xn--5rtp49c.jp +xn--ntso0iqx3a.jp +xn--elqq16h.jp +xn--4it168d.jp +xn--klt787d.jp +xn--rny31h.jp +xn--7t0a264c.jp +xn--uist22h.jp +xn--8ltr62k.jp +xn--2m4a15e.jp +xn--32vp30h.jp +xn--4it797k.jp +xn--5rtq34k.jp +xn--k7yn95e.jp +xn--tor131o.jp +xn--d5qv7z876c.jp +*.kawasaki.jp +!city.kawasaki.jp +*.kitakyushu.jp +!city.kitakyushu.jp +*.kobe.jp +!city.kobe.jp +*.nagoya.jp +!city.nagoya.jp +*.sapporo.jp +!city.sapporo.jp +*.sendai.jp +!city.sendai.jp +*.yokohama.jp +!city.yokohama.jp +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp +ke +ac.ke +co.ke +go.ke +info.ke +me.ke +mobi.ke +ne.ke +or.ke +sc.ke +kg +com.kg +edu.kg +gov.kg +mil.kg +net.kg +org.kg +kh +com.kh +edu.kh +gov.kh +net.kh +org.kh +ki +biz.ki +com.ki +edu.ki +gov.ki +info.ki +net.ki +org.ki +km +ass.km +com.km +edu.km +gov.km +mil.km +nom.km +org.km +prd.km +tm.km +asso.km +coop.km +gouv.km +medecin.km +notaires.km +pharmaciens.km +presse.km +veterinaire.km +kn +edu.kn +gov.kn +net.kn +org.kn +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp +kr +ac.kr +ai.kr +co.kr +es.kr +go.kr +hs.kr +io.kr +it.kr +kg.kr +me.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr +kw +com.kw +edu.kw +emb.kw +gov.kw +ind.kw +net.kw +org.kw +ky +com.ky +edu.ky +net.ky +org.ky +kz +com.kz +edu.kz +gov.kz +mil.kz +net.kz +org.kz +la +com.la +edu.la +gov.la +info.la +int.la +net.la +org.la +per.la +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb +lc +co.lc +com.lc +edu.lc +gov.lc +net.lc +org.lc +li +lk +ac.lk +assn.lk +com.lk +edu.lk +gov.lk +grp.lk +hotel.lk +int.lk +ltd.lk +net.lk +ngo.lk +org.lk +sch.lk +soc.lk +web.lk +lr +com.lr +edu.lr +gov.lr +net.lr +org.lr +ls +ac.ls +biz.ls +co.ls +edu.ls +gov.ls +info.ls +net.ls +org.ls +sc.ls +lt +gov.lt +lu +lv +asn.lv +com.lv +conf.lv +edu.lv +gov.lv +id.lv +mil.lv +net.lv +org.lv +ly +com.ly +edu.ly +gov.ly +id.ly +med.ly +net.ly +org.ly +plc.ly +sch.ly +ma +ac.ma +co.ma +gov.ma +net.ma +org.ma +press.ma +mc +asso.mc +tm.mc +md +me +ac.me +co.me +edu.me +gov.me +its.me +net.me +org.me +priv.me +mg +co.mg +com.mg +edu.mg +gov.mg +mil.mg +nom.mg +org.mg +prd.mg +mh +mil +mk +com.mk +edu.mk +gov.mk +inf.mk +name.mk +net.mk +org.mk +ml +ac.ml +art.ml +asso.ml +com.ml +edu.ml +gouv.ml +gov.ml +info.ml +inst.ml +net.ml +org.ml +pr.ml +presse.ml +*.mm +mn +edu.mn +gov.mn +org.mn +mo +com.mo +edu.mo +gov.mo +net.mo +org.mo +mobi +mp +mq +mr +gov.mr +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms +mt +com.mt +edu.mt +net.mt +org.mt +mu +ac.mu +co.mu +com.mu +gov.mu +net.mu +or.mu +org.mu +museum +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +net.mw +org.mw +mx +com.mx +edu.mx +gob.mx +net.mx +org.mx +my +biz.my +com.my +edu.my +gov.my +mil.my +name.my +net.my +org.my +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz +na +alt.na +co.na +com.na +gov.na +net.na +org.na +name +nc +asso.nc +nom.nc +ne +net +nf +arts.nf +com.nf +firm.nf +info.nf +net.nf +other.nf +per.nf +rec.nf +store.nf +web.nf +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni +nl +no +fhs.no +folkebibl.no +fylkesbibl.no +gielda.no +herad.no +idrett.no +kommune.no +museum.no +priv.no +suohkan.no +tjielte.no +uenorge.no +vgs.no +dep.no +mil.no +stat.no +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +akrehamn.no +xn--krehamn-dxa.no +algard.no +xn--lgrd-poac.no +arna.no +bronnoysund.no +xn--brnnysund-m8ac.no +brumunddal.no +bryne.no +drobak.no +xn--drbak-wua.no +egersund.no +fetsund.no +floro.no +xn--flor-jra.no +fredrikstad.no +hokksund.no +honefoss.no +xn--hnefoss-q1a.no +jessheim.no +jorpeland.no +xn--jrpeland-54a.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +xn--langevg-jxa.no +leirvik.no +mjondalen.no +xn--mjndalen-64a.no +mo-i-rana.no +mosjoen.no +xn--mosjen-eya.no +nesoddtangen.no +orkanger.no +osoyro.no +xn--osyro-wua.no +raholt.no +xn--rholt-mra.no +sandnessjoen.no +xn--sandnessjen-ogb.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +xn--stjrdalshalsen-sqb.no +tananger.no +tranby.no +vossevangen.no +aarborte.no +aejrie.no +afjord.no +xn--fjord-lra.no +agdenes.no +nes.akershus.no +aknoluokta.no +xn--koluokta-7ya57h.no +al.no +xn--l-1fa.no +alaheadju.no +xn--laheadju-7ya.no +alesund.no +xn--lesund-hua.no +alstahaug.no +alta.no +xn--lt-liac.no +alvdal.no +amli.no +xn--mli-tla.no +amot.no +xn--mot-tla.no +andasuolo.no +andebu.no +andoy.no +xn--andy-ira.no +ardal.no +xn--rdal-poa.no +aremark.no +arendal.no +xn--s-1fa.no +aseral.no +xn--seral-lra.no +asker.no +askim.no +askoy.no +xn--asky-ira.no +askvoll.no +asnes.no +xn--snes-poa.no +audnedal.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +xn--aurskog-hland-jnb.no +austevoll.no +austrheim.no +averoy.no +xn--avery-yua.no +badaddja.no +xn--bdddj-mrabd.no +xn--brum-voa.no +bahcavuotna.no +xn--bhcavuotna-s4a.no +bahccavuotna.no +xn--bhccavuotna-k7a.no +baidar.no +xn--bidr-5nac.no +bajddar.no +xn--bjddar-pta.no +balat.no +xn--blt-elab.no +balestrand.no +ballangen.no +balsfjord.no +bamble.no +bardu.no +barum.no +batsfjord.no +xn--btsfjord-9za.no +bearalvahki.no +xn--bearalvhki-y4a.no +beardu.no +beiarn.no +berg.no +bergen.no +berlevag.no +xn--berlevg-jxa.no +bievat.no +xn--bievt-0qa.no +bindal.no +birkenes.no +bjerkreim.no +bjugn.no +bodo.no +xn--bod-2na.no +bokn.no +bomlo.no +xn--bmlo-gra.no +bremanger.no +bronnoy.no +xn--brnny-wuac.no +budejju.no +nes.buskerud.no +bygland.no +bykle.no +cahcesuolo.no +xn--hcesuolo-7ya35b.no +davvenjarga.no +xn--davvenjrga-y4a.no +davvesiida.no +deatnu.no +dielddanuorri.no +divtasvuodna.no +divttasvuotna.no +donna.no +xn--dnna-gra.no +dovre.no +drammen.no +drangedal.no +dyroy.no +xn--dyry-ira.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenassi.no +xn--eveni-0qa01ga.no +evenes.no +evje-og-hornnes.no +farsund.no +fauske.no +fedje.no +fet.no +finnoy.no +xn--finny-yua.no +fitjar.no +fjaler.no +fjell.no +fla.no +xn--fl-zia.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +folldal.no +forde.no +xn--frde-gra.no +forsand.no +fosnes.no +xn--frna-woa.no +frana.no +frogn.no +froland.no +frosta.no +froya.no +xn--frya-hra.no +fuoisku.no +fuossko.no +fusa.no +fyresdal.no +gaivuotna.no +xn--givuotna-8ya.no +galsa.no +xn--gls-elac.no +gamvik.no +gangaviika.no +xn--ggaviika-8ya47h.no +gaular.no +gausdal.no +giehtavuoatna.no +gildeskal.no +xn--gildeskl-g0a.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +xn--gjvik-wua.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +grue.no +gulen.no +guovdageaidnu.no +ha.no +xn--h-2fa.no +habmer.no +xn--hbmer-xqa.no +hadsel.no +xn--hgebostad-g3a.no +hagebostad.no +halden.no +halsa.no +hamar.no +hamaroy.no +xn--hamary-fya.no +hammarfeasta.no +xn--hmmrfeasta-s4ac.no +hammerfest.no +hapmir.no +xn--hpmir-xqa.no +haram.no +hareid.no +harstad.no +hasvik.no +hattfjelldal.no +haugesund.no +os.hedmark.no +valer.hedmark.no +xn--vler-qoa.hedmark.no +hemne.no +hemnes.no +hemsedal.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +xn--hobl-ira.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +xn--holtlen-hxa.no +os.hordaland.no +hornindal.no +horten.no +hoyanger.no +xn--hyanger-q1a.no +hoylandet.no +xn--hylandet-54a.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +ibestad.no +inderoy.no +xn--indery-fya.no +iveland.no +ivgu.no +jevnaker.no +jolster.no +xn--jlster-bya.no +jondal.no +kafjord.no +xn--kfjord-iua.no +karasjohka.no +xn--krjohka-hwab49j.no +karasjok.no +karlsoy.no +xn--karlsy-fya.no +karmoy.no +xn--karmy-yua.no +kautokeino.no +klabu.no +xn--klbu-woa.no +klepp.no +kongsberg.no +kongsvinger.no +kraanghke.no +xn--kranghke-b0a.no +kragero.no +xn--krager-gya.no +kristiansand.no +kristiansund.no +krodsherad.no +xn--krdsherad-m8a.no +xn--kvfjord-nxa.no +xn--kvnangen-k0a.no +kvafjord.no +kvalsund.no +kvam.no +kvanangen.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +xn--kvitsy-fya.no +laakesvuemie.no +xn--lrdal-sra.no +lahppi.no +xn--lhppi-xqa.no +lardal.no +larvik.no +lavagis.no +lavangen.no +leangaviika.no +xn--leagaviika-52b.no +lebesby.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +lerdal.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindas.no +xn--linds-pra.no +lindesnes.no +loabat.no +xn--loabt-0qa.no +lodingen.no +xn--ldingen-q1a.no +lom.no +loppa.no +lorenskog.no +xn--lrenskog-54a.no +loten.no +xn--lten-gra.no +lund.no +lunner.no +luroy.no +xn--lury-ira.no +luster.no +lyngdal.no +lyngen.no +malatvuopmi.no +xn--mlatvuopmi-s4a.no +malselv.no +xn--mlselv-iua.no +malvik.no +mandal.no +marker.no +marnardal.no +masfjorden.no +masoy.no +xn--msy-ula0h.no +matta-varjjat.no +xn--mtta-vrjjat-k7af.no +meland.no +meldal.no +melhus.no +meloy.no +xn--mely-ira.no +meraker.no +xn--merker-kua.no +midsund.no +midtre-gauldal.no +moareke.no +xn--moreke-jua.no +modalen.no +modum.no +molde.no +heroy.more-og-romsdal.no +sande.more-og-romsdal.no +xn--hery-ira.xn--mre-og-romsdal-qqb.no +sande.xn--mre-og-romsdal-qqb.no +moskenes.no +moss.no +muosat.no +xn--muost-0qa.no +naamesjevuemie.no +xn--nmesjevuemie-tcba.no +xn--nry-yla5g.no +namdalseid.no +namsos.no +namsskogan.no +nannestad.no +naroy.no +narviika.no +narvik.no +naustdal.no +navuotna.no +xn--nvuotna-hwa.no +nedre-eiker.no +nesna.no +nesodden.no +nesseby.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +bo.nordland.no +xn--b-5ga.nordland.no +heroy.nordland.no +xn--hery-ira.nordland.no +nordre-land.no +nordreisa.no +nore-og-uvdal.no +notodden.no +notteroy.no +xn--nttery-byae.no +odda.no +oksnes.no +xn--ksnes-uua.no +omasvuotna.no +oppdal.no +oppegard.no +xn--oppegrd-ixa.no +orkdal.no +orland.no +xn--rland-uua.no +orskog.no +xn--rskog-uua.no +orsta.no +xn--rsta-fra.no +osen.no +osteroy.no +xn--ostery-fya.no +valer.ostfold.no +xn--vler-qoa.xn--stfold-9xa.no +ostre-toten.no +xn--stre-toten-zcb.no +overhalla.no +ovre-eiker.no +xn--vre-eiker-k8a.no +oyer.no +xn--yer-zna.no +oygarden.no +xn--ygarden-p1a.no +oystre-slidre.no +xn--ystre-slidre-ujb.no +porsanger.no +porsangu.no +xn--porsgu-sta26f.no +porsgrunn.no +rade.no +xn--rde-ula.no +radoy.no +xn--rady-ira.no +xn--rlingen-mxa.no +rahkkeravju.no +xn--rhkkervju-01af.no +raisa.no +xn--risa-5na.no +rakkestad.no +ralingen.no +rana.no +randaberg.no +rauma.no +re.no +rendalen.no +rennebu.no +rennesoy.no +xn--rennesy-v1a.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +risor.no +xn--risr-ira.no +rissa.no +roan.no +rodoy.no +xn--rdy-0nab.no +rollag.no +romsa.no +romskog.no +xn--rmskog-bya.no +roros.no +xn--rros-gra.no +rost.no +xn--rst-0na.no +royken.no +xn--ryken-vua.no +royrvik.no +xn--ryrvik-bya.no +ruovat.no +rygge.no +salangen.no +salat.no +xn--slat-5na.no +xn--slt-elab.no +saltdal.no +samnanger.no +sandefjord.no +sandnes.no +sandoy.no +xn--sandy-yua.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +siellak.no +sigdal.no +siljan.no +sirdal.no +skanit.no +xn--sknit-yqa.no +skanland.no +xn--sknland-fxa.no +skaun.no +skedsmo.no +ski.no +skien.no +skierva.no +xn--skierv-uta.no +skiptvet.no +skjak.no +xn--skjk-soa.no +skjervoy.no +xn--skjervy-v1a.no +skodje.no +smola.no +xn--smla-hra.no +snaase.no +xn--snase-nra.no +snasa.no +xn--snsa-roa.no +snillfjord.no +snoasa.no +sogndal.no +sogne.no +xn--sgne-gra.no +sokndal.no +sola.no +solund.no +somna.no +xn--smna-gra.no +sondre-land.no +xn--sndre-land-0cb.no +songdalen.no +sor-aurdal.no +xn--sr-aurdal-l8a.no +sor-fron.no +xn--sr-fron-q1a.no +sor-odal.no +xn--sr-odal-q1a.no +sor-varanger.no +xn--sr-varanger-ggb.no +sorfold.no +xn--srfold-bya.no +sorreisa.no +xn--srreisa-q1a.no +sortland.no +sorum.no +xn--srum-gra.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +xn--stjrdal-s1a.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +tana.no +bo.telemark.no +xn--b-5ga.telemark.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +tjome.no +xn--tjme-hra.no +tokke.no +tolga.no +tonsberg.no +xn--tnsberg-q1a.no +torsken.no +xn--trna-woa.no +trana.no +tranoy.no +xn--trany-yua.no +troandin.no +trogstad.no +xn--trgstad-r1a.no +tromsa.no +tromso.no +xn--troms-zua.no +trondheim.no +trysil.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +tysnes.no +xn--tysvr-vra.no +tysvar.no +ullensaker.no +ullensvang.no +ulstein.no +ulvik.no +unjarga.no +xn--unjrga-rta.no +utsira.no +vaapste.no +vadso.no +xn--vads-jra.no +xn--vry-yla5g.no +vaga.no +xn--vg-yiab.no +vagan.no +xn--vgan-qoa.no +vagsoy.no +xn--vgsy-qoa0j.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +xn--vard-jra.no +varggat.no +xn--vrggt-xqad.no +varoy.no +vefsn.no +vega.no +vegarshei.no +xn--vegrshei-c0a.no +vennesla.no +verdal.no +verran.no +vestby.no +sande.vestfold.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +xn--vestvgy-ixa6o.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +voagat.no +volda.no +voss.no +*.np +nr +biz.nr +com.nr +edu.nr +gov.nr +info.nr +net.nr +org.nr +nu +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +xn--mori-qsa.nz +mil.nz +net.nz +org.nz +parliament.nz +school.nz +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om +onion +org +pa +abo.pa +ac.pa +com.pa +edu.pa +gob.pa +ing.pa +med.pa +net.pa +nom.pa +org.pa +sld.pa +pe +com.pe +edu.pe +gob.pe +mil.pe +net.pe +nom.pe +org.pe +pf +com.pf +edu.pf +org.pf +*.pg +ph +com.ph +edu.ph +gov.ph +i.ph +mil.ph +net.ph +ngo.ph +org.ph +pk +ac.pk +biz.pk +com.pk +edu.pk +fam.pk +gkp.pk +gob.pk +gog.pk +gok.pk +gop.pk +gos.pk +gov.pk +net.pk +org.pk +web.pk +pl +com.pl +net.pl +org.pl +agro.pl +aid.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +media.pl +miasta.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +gov.pl +ap.gov.pl +griw.gov.pl +ic.gov.pl +is.gov.pl +kmpsp.gov.pl +konsulat.gov.pl +kppsp.gov.pl +kwp.gov.pl +kwpsp.gov.pl +mup.gov.pl +mw.gov.pl +oia.gov.pl +oirm.gov.pl +oke.gov.pl +oow.gov.pl +oschr.gov.pl +oum.gov.pl +pa.gov.pl +pinb.gov.pl +piw.gov.pl +po.gov.pl +pr.gov.pl +psp.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +sdn.gov.pl +sko.gov.pl +so.gov.pl +sr.gov.pl +starostwo.gov.pl +ug.gov.pl +ugim.gov.pl +um.gov.pl +umig.gov.pl +upow.gov.pl +uppo.gov.pl +us.gov.pl +uw.gov.pl +uzs.gov.pl +wif.gov.pl +wiih.gov.pl +winb.gov.pl +wios.gov.pl +witd.gov.pl +wiw.gov.pl +wkz.gov.pl +wsa.gov.pl +wskr.gov.pl +wsse.gov.pl +wuoz.gov.pl +wzmiuw.gov.pl +zp.gov.pl +zpisdn.gov.pl +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kazimierz-dolny.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorskie.pl +pomorze.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +skoczow.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl +pm +pn +co.pn +edu.pn +gov.pn +net.pn +org.pn +post +pr +ac.pr +biz.pr +com.pr +edu.pr +est.pr +gov.pr +info.pr +isla.pr +name.pr +net.pr +org.pr +pro.pr +prof.pr +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro +ps +com.ps +edu.ps +gov.ps +net.ps +org.ps +plo.ps +sec.ps +pt +com.pt +edu.pt +gov.pt +int.pt +net.pt +nome.pt +org.pt +publ.pt +pw +gov.pw +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa +re +asso.re +com.re +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs +ru +rw +ac.rw +co.rw +coop.rw +gov.rw +mil.rw +net.rw +org.rw +sa +com.sa +edu.sa +gov.sa +med.sa +net.sa +org.sa +pub.sa +sch.sa +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb +sc +com.sc +edu.sc +gov.sc +net.sc +org.sc +sd +com.sd +edu.sd +gov.sd +info.sd +med.sd +net.sd +org.sd +tv.sd +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se +sg +com.sg +edu.sg +gov.sg +net.sg +org.sg +sh +com.sh +gov.sh +mil.sh +net.sh +org.sh +si +sj +sk +org.sk +sl +com.sl +edu.sl +gov.sl +net.sl +org.sl +sm +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +univ.sn +so +com.so +edu.so +gov.so +me.so +net.so +org.so +sr +ss +biz.ss +co.ss +com.ss +edu.ss +gov.ss +me.ss +net.ss +org.ss +sch.ss +st +co.st +com.st +consulado.st +edu.st +embaixada.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st +su +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv +sx +gov.sx +sy +com.sy +edu.sy +gov.sy +mil.sy +net.sy +org.sy +sz +ac.sz +co.sz +org.sz +tc +td +tel +tf +tg +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th +tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj +tk +tl +gov.tl +tm +co.tm +com.tm +edu.tm +gov.tm +mil.tm +net.tm +nom.tm +org.tm +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +info.tn +intl.tn +mincom.tn +nat.tn +net.tn +org.tn +perso.tn +tourism.tn +to +com.to +edu.to +gov.to +mil.to +net.to +org.to +tr +av.tr +bbs.tr +bel.tr +biz.tr +com.tr +dr.tr +edu.tr +gen.tr +gov.tr +info.tr +k12.tr +kep.tr +mil.tr +name.tr +net.tr +org.tr +pol.tr +tel.tr +tsk.tr +tv.tr +web.tr +nc.tr +gov.nc.tr +tt +biz.tt +co.tt +com.tt +edu.tt +gov.tt +info.tt +mil.tt +name.tt +net.tt +org.tt +pro.tt +tv +tw +club.tw +com.tw +ebiz.tw +edu.tw +game.tw +gov.tw +idv.tw +mil.tw +net.tw +org.tw +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz +ua +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +kropyvnytskyi.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +luhansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +uzhhorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zakarpattia.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua +ug +ac.ug +co.ug +com.ug +edu.ug +go.ug +gov.ug +mil.ug +ne.ug +or.ug +org.ug +sc.ug +us.ug +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk +us +dni.us +isa.us +nsn.us +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +va.us +vi.us +vt.us +wa.us +wi.us +wv.us +wy.us +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.fl.us +k12.ga.us +k12.gu.us +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.sc.us +k12.tn.us +k12.tx.us +k12.ut.us +k12.va.us +k12.vi.us +k12.vt.us +k12.wa.us +k12.wi.us +cc.ak.us +lib.ak.us +cc.al.us +lib.al.us +cc.ar.us +lib.ar.us +cc.as.us +lib.as.us +cc.az.us +lib.az.us +cc.ca.us +lib.ca.us +cc.co.us +lib.co.us +cc.ct.us +lib.ct.us +cc.dc.us +lib.dc.us +cc.de.us +cc.fl.us +lib.fl.us +cc.ga.us +lib.ga.us +cc.gu.us +lib.gu.us +cc.hi.us +lib.hi.us +cc.ia.us +lib.ia.us +cc.id.us +lib.id.us +cc.il.us +lib.il.us +cc.in.us +lib.in.us +cc.ks.us +lib.ks.us +cc.ky.us +lib.ky.us +cc.la.us +lib.la.us +cc.ma.us +lib.ma.us +cc.md.us +lib.md.us +cc.me.us +lib.me.us +cc.mi.us +lib.mi.us +cc.mn.us +lib.mn.us +cc.mo.us +lib.mo.us +cc.ms.us +cc.mt.us +lib.mt.us +cc.nc.us +lib.nc.us +cc.ne.us +lib.ne.us +cc.nh.us +lib.nh.us +cc.nj.us +lib.nj.us +cc.nm.us +lib.nm.us +cc.nv.us +lib.nv.us +cc.ny.us +lib.ny.us +cc.oh.us +lib.oh.us +cc.ok.us +lib.ok.us +cc.or.us +lib.or.us +cc.pa.us +lib.pa.us +cc.pr.us +lib.pr.us +cc.ri.us +lib.ri.us +cc.sc.us +lib.sc.us +cc.sd.us +lib.sd.us +cc.tn.us +lib.tn.us +cc.tx.us +lib.tx.us +cc.ut.us +lib.ut.us +cc.va.us +lib.va.us +cc.vi.us +lib.vi.us +cc.vt.us +lib.vt.us +cc.wa.us +lib.wa.us +cc.wi.us +lib.wi.us +cc.wv.us +cc.wy.us +k12.wy.us +lib.wy.us +chtr.k12.ma.us +paroch.k12.ma.us +pvt.k12.ma.us +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy +uz +co.uz +com.uz +net.uz +org.uz +va +vc +com.vc +edu.vc +gov.vc +mil.vc +net.vc +org.vc +ve +arts.ve +bib.ve +co.ve +com.ve +e12.ve +edu.ve +emprende.ve +firm.ve +gob.ve +gov.ve +ia.ve +info.ve +int.ve +mil.ve +net.ve +nom.ve +org.ve +rar.ve +rec.ve +store.ve +tec.ve +web.ve +vg +edu.vg +vi +co.vi +com.vi +k12.vi +net.vi +org.vi +vn +ac.vn +ai.vn +biz.vn +com.vn +edu.vn +gov.vn +health.vn +id.vn +info.vn +int.vn +io.vn +name.vn +net.vn +org.vn +pro.vn +angiang.vn +bacgiang.vn +backan.vn +baclieu.vn +bacninh.vn +baria-vungtau.vn +bentre.vn +binhdinh.vn +binhduong.vn +binhphuoc.vn +binhthuan.vn +camau.vn +cantho.vn +caobang.vn +daklak.vn +daknong.vn +danang.vn +dienbien.vn +dongnai.vn +dongthap.vn +gialai.vn +hagiang.vn +haiduong.vn +haiphong.vn +hanam.vn +hanoi.vn +hatinh.vn +haugiang.vn +hoabinh.vn +hue.vn +hungyen.vn +khanhhoa.vn +kiengiang.vn +kontum.vn +laichau.vn +lamdong.vn +langson.vn +laocai.vn +longan.vn +namdinh.vn +nghean.vn +ninhbinh.vn +ninhthuan.vn +phutho.vn +phuyen.vn +quangbinh.vn +quangnam.vn +quangngai.vn +quangninh.vn +quangtri.vn +soctrang.vn +sonla.vn +tayninh.vn +thaibinh.vn +thainguyen.vn +thanhhoa.vn +thanhphohochiminh.vn +thuathienhue.vn +tiengiang.vn +travinh.vn +tuyenquang.vn +vinhlong.vn +vinhphuc.vn +yenbai.vn +vu +com.vu +edu.vu +net.vu +org.vu +wf +ws +com.ws +edu.ws +gov.ws +net.ws +org.ws +yt +xn--mgbaam7a8h +xn--y9a3aq +xn--54b7fta0cc +xn--90ae +xn--mgbcpq6gpa1a +xn--90ais +xn--fiqs8s +xn--fiqz9s +xn--lgbbat1ad8j +xn--wgbh1c +xn--e1a4c +xn--qxa6a +xn--mgbah1a3hjkrd +xn--node +xn--qxam +xn--j6w193g +xn--gmqw5a.xn--j6w193g +xn--55qx5d.xn--j6w193g +xn--mxtq1m.xn--j6w193g +xn--wcvs22d.xn--j6w193g +xn--uc0atv.xn--j6w193g +xn--od0alg.xn--j6w193g +xn--2scrj9c +xn--3hcrj9c +xn--45br5cyl +xn--h2breg3eve +xn--h2brj9c8c +xn--mgbgu82a +xn--rvc1e0am3e +xn--h2brj9c +xn--mgbbh1a +xn--mgbbh1a71e +xn--fpcrj9c3d +xn--gecrj9c +xn--s9brj9c +xn--45brj9c +xn--xkc2dl3a5ee0h +xn--mgba3a4f16a +xn--mgba3a4fra +xn--mgbtx2b +xn--mgbayh7gpa +xn--3e0b707e +xn--80ao21a +xn--q7ce6a +xn--fzc2c9e2c +xn--xkc2al3hye2a +xn--mgbc0a9azcg +xn--d1alf +xn--l1acc +xn--mix891f +xn--mix082f +xn--mgbx4cd0ab +xn--mgb9awbf +xn--mgbai9azgqp6j +xn--mgbai9a5eva00b +xn--ygbi2ammx +xn--90a3ac +xn--80au.xn--90a3ac +xn--90azh.xn--90a3ac +xn--d1at.xn--90a3ac +xn--c1avg.xn--90a3ac +xn--o1ac.xn--90a3ac +xn--o1ach.xn--90a3ac +xn--p1ai +xn--wgbl6a +xn--mgberp4a5d4ar +xn--mgberp4a5d4a87g +xn--mgbqly7c0a67fbc +xn--mgbqly7cvafr +xn--mgbpl2fh +xn--yfro4i67o +xn--clchc0ea0b2g2a9gcd +xn--ogbpf8fl +xn--mgbtf8fl +xn--o3cw4h +xn--o3cyx2a.xn--o3cw4h +xn--12co0c3b4eva.xn--o3cw4h +xn--m3ch0j3a.xn--o3cw4h +xn--h3cuzk1di.xn--o3cw4h +xn--12c1fe0br.xn--o3cw4h +xn--12cfi8ixb8l.xn--o3cw4h +xn--pgbs0dh +xn--kpry57d +xn--kprw13d +xn--nnx388a +xn--j1amh +xn--mgb2ddes +xxx +ye +com.ye +edu.ye +gov.ye +mil.ye +net.ye +org.ye +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nic.za +nis.za +nom.za +org.za +school.za +tm.za +web.za +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw +aaa +aarp +abb +abbott +abbvie +abc +able +abogado +abudhabi +academy +accenture +accountant +accountants +aco +actor +ads +adult +aeg +aetna +afl +africa +agakhan +agency +aig +airbus +airforce +airtel +akdn +alibaba +alipay +allfinanz +allstate +ally +alsace +alstom +amazon +americanexpress +americanfamily +amex +amfam +amica +amsterdam +analytics +android +anquan +anz +aol +apartments +app +apple +aquarelle +arab +aramco +archi +army +art +arte +asda +associates +athleta +attorney +auction +audi +audible +audio +auspost +author +auto +autos +aws +axa +azure +baby +baidu +banamex +band +bank +bar +barcelona +barclaycard +barclays +barefoot +bargains +baseball +basketball +bauhaus +bayern +bbc +bbt +bbva +bcg +bcn +beats +beauty +beer +berlin +best +bestbuy +bet +bharti +bible +bid +bike +bing +bingo +bio +black +blackfriday +blockbuster +blog +bloomberg +blue +bms +bmw +bnpparibas +boats +boehringer +bofa +bom +bond +boo +book +booking +bosch +bostik +boston +bot +boutique +box +bradesco +bridgestone +broadway +broker +brother +brussels +build +builders +business +buy +buzz +bzh +cab +cafe +cal +call +calvinklein +cam +camera +camp +canon +capetown +capital +capitalone +car +caravan +cards +care +career +careers +cars +casa +case +cash +casino +catering +catholic +cba +cbn +cbre +center +ceo +cern +cfa +cfd +chanel +channel +charity +chase +chat +cheap +chintai +christmas +chrome +church +cipriani +circle +cisco +citadel +citi +citic +city +claims +cleaning +click +clinic +clinique +clothing +cloud +club +clubmed +coach +codes +coffee +college +cologne +commbank +community +company +compare +computer +comsec +condos +construction +consulting +contact +contractors +cooking +cool +corsica +country +coupon +coupons +courses +cpa +credit +creditcard +creditunion +cricket +crown +crs +cruise +cruises +cuisinella +cymru +cyou +dad +dance +data +date +dating +datsun +day +dclk +dds +deal +dealer +deals +degree +delivery +dell +deloitte +delta +democrat +dental +dentist +desi +design +dev +dhl +diamonds +diet +digital +direct +directory +discount +discover +dish +diy +dnp +docs +doctor +dog +domains +dot +download +drive +dtv +dubai +dupont +durban +dvag +dvr +earth +eat +eco +edeka +education +email +emerck +energy +engineer +engineering +enterprises +epson +equipment +ericsson +erni +esq +estate +eurovision +eus +events +exchange +expert +exposed +express +extraspace +fage +fail +fairwinds +faith +family +fan +fans +farm +farmers +fashion +fast +fedex +feedback +ferrari +ferrero +fidelity +fido +film +final +finance +financial +fire +firestone +firmdale +fish +fishing +fit +fitness +flickr +flights +flir +florist +flowers +fly +foo +food +football +ford +forex +forsale +forum +foundation +fox +free +fresenius +frl +frogans +frontier +ftr +fujitsu +fun +fund +furniture +futbol +fyi +gal +gallery +gallo +gallup +game +games +gap +garden +gay +gbiz +gdn +gea +gent +genting +george +ggee +gift +gifts +gives +giving +glass +gle +global +globo +gmail +gmbh +gmo +gmx +godaddy +gold +goldpoint +golf +goodyear +goog +google +gop +got +grainger +graphics +gratis +green +gripe +grocery +group +gucci +guge +guide +guitars +guru +hair +hamburg +hangout +haus +hbo +hdfc +hdfcbank +health +healthcare +help +helsinki +here +hermes +hiphop +hisamitsu +hitachi +hiv +hkt +hockey +holdings +holiday +homedepot +homegoods +homes +homesense +honda +horse +hospital +host +hosting +hot +hotel +hotels +hotmail +house +how +hsbc +hughes +hyatt +hyundai +ibm +icbc +ice +icu +ieee +ifm +ikano +imamat +imdb +immo +immobilien +inc +industries +infiniti +ing +ink +institute +insurance +insure +international +intuit +investments +ipiranga +irish +ismaili +ist +istanbul +itau +itv +jaguar +java +jcb +jeep +jetzt +jewelry +jio +jll +jmp +jnj +joburg +jot +joy +jpmorgan +jprs +juegos +kaufen +kddi +kerryhotels +kerryproperties +kfh +kia +kids +kim +kindle +kitchen +kiwi +koeln +komatsu +kosher +kpmg +kpn +krd +kred +kuokgroup +kyoto +lacaixa +lamborghini +lamer +land +landrover +lanxess +lasalle +lat +latino +latrobe +law +lawyer +lds +lease +leclerc +lefrak +legal +lego +lexus +lgbt +lidl +life +lifeinsurance +lifestyle +lighting +like +lilly +limited +limo +lincoln +link +live +living +llc +llp +loan +loans +locker +locus +lol +london +lotte +lotto +love +lpl +lplfinancial +ltd +ltda +lundbeck +luxe +luxury +madrid +maif +maison +makeup +man +management +mango +map +market +marketing +markets +marriott +marshalls +mattel +mba +mckinsey +med +media +meet +melbourne +meme +memorial +men +menu +merck +merckmsd +miami +microsoft +mini +mint +mit +mitsubishi +mlb +mls +mma +mobile +moda +moe +moi +mom +monash +money +monster +mormon +mortgage +moscow +moto +motorcycles +mov +movie +msd +mtn +mtr +music +nab +nagoya +navy +nba +nec +netbank +netflix +network +neustar +new +news +next +nextdirect +nexus +nfl +ngo +nhk +nico +nike +nikon +ninja +nissan +nissay +nokia +norton +now +nowruz +nowtv +nra +nrw +ntt +nyc +obi +observer +office +okinawa +olayan +olayangroup +ollo +omega +one +ong +onl +online +ooo +open +oracle +orange +organic +origins +osaka +otsuka +ott +ovh +page +panasonic +paris +pars +partners +parts +party +pay +pccw +pet +pfizer +pharmacy +phd +philips +phone +photo +photography +photos +physio +pics +pictet +pictures +pid +pin +ping +pink +pioneer +pizza +place +play +playstation +plumbing +plus +pnc +pohl +poker +politie +porn +praxi +press +prime +prod +productions +prof +progressive +promo +properties +property +protection +pru +prudential +pub +pwc +qpon +quebec +quest +racing +radio +read +realestate +realtor +realty +recipes +red +redumbrella +rehab +reise +reisen +reit +reliance +ren +rent +rentals +repair +report +republican +rest +restaurant +review +reviews +rexroth +rich +richardli +ricoh +ril +rio +rip +rocks +rodeo +rogers +room +rsvp +rugby +ruhr +run +rwe +ryukyu +saarland +safe +safety +sakura +sale +salon +samsclub +samsung +sandvik +sandvikcoromant +sanofi +sap +sarl +sas +save +saxo +sbi +sbs +scb +schaeffler +schmidt +scholarships +school +schule +schwarz +science +scot +search +seat +secure +security +seek +select +sener +services +seven +sew +sex +sexy +sfr +shangrila +sharp +shell +shia +shiksha +shoes +shop +shopping +shouji +show +silk +sina +singles +site +ski +skin +sky +skype +sling +smart +smile +sncf +soccer +social +softbank +software +sohu +solar +solutions +song +sony +soy +spa +space +sport +spot +srl +stada +staples +star +statebank +statefarm +stc +stcgroup +stockholm +storage +store +stream +studio +study +style +sucks +supplies +supply +support +surf +surgery +suzuki +swatch +swiss +sydney +systems +tab +taipei +talk +taobao +target +tatamotors +tatar +tattoo +tax +taxi +tci +tdk +team +tech +technology +temasek +tennis +teva +thd +theater +theatre +tiaa +tickets +tienda +tips +tires +tirol +tjmaxx +tjx +tkmaxx +tmall +today +tokyo +tools +top +toray +toshiba +total +tours +town +toyota +toys +trade +trading +training +travel +travelers +travelersinsurance +trust +trv +tube +tui +tunes +tushu +tvs +ubank +ubs +unicom +university +uno +uol +ups +vacations +vana +vanguard +vegas +ventures +verisign +versicherung +vet +viajes +video +vig +viking +villas +vin +vip +virgin +visa +vision +viva +vivo +vlaanderen +vodka +volvo +vote +voting +voto +voyage +wales +walmart +walter +wang +wanggou +watch +watches +weather +weatherchannel +web +webcam +weber +website +wed +wedding +weibo +weir +whoswho +wien +wiki +williamhill +win +windows +wine +winners +wme +woodside +work +works +world +wow +wtc +wtf +xbox +xerox +xihuan +xin +xn--11b4c3d +xn--1ck2e1b +xn--1qqw23a +xn--30rr7y +xn--3bst00m +xn--3ds443g +xn--3pxu8k +xn--42c2d9a +xn--45q11c +xn--4gbrim +xn--55qw42g +xn--55qx5d +xn--5su34j936bgsg +xn--5tzm5g +xn--6frz82g +xn--6qq986b3xl +xn--80adxhks +xn--80aqecdr1a +xn--80asehdb +xn--80aswg +xn--8y0a063a +xn--9dbq2a +xn--9et52u +xn--9krt00a +xn--b4w605ferd +xn--bck1b9a5dre4c +xn--c1avg +xn--c2br7g +xn--cck2b3b +xn--cckwcxetd +xn--cg4bki +xn--czr694b +xn--czrs0t +xn--czru2d +xn--d1acj3b +xn--eckvdtc9d +xn--efvy88h +xn--fct429k +xn--fhbei +xn--fiq228c5hs +xn--fiq64b +xn--fjq720a +xn--flw351e +xn--fzys8d69uvgm +xn--g2xx48c +xn--gckr3f0f +xn--gk3at1e +xn--hxt814e +xn--i1b6b1a6a2e +xn--imr513n +xn--io0a7i +xn--j1aef +xn--jlq480n2rg +xn--jvr189m +xn--kcrx77d1x4a +xn--kput3i +xn--mgba3a3ejt +xn--mgba7c0bbn0a +xn--mgbab2bd +xn--mgbca7dzdo +xn--mgbi4ecexp +xn--mgbt3dhd +xn--mk1bu44c +xn--mxtq1m +xn--ngbc5azd +xn--ngbe9e0a +xn--ngbrx +xn--nqv7f +xn--nqv7fs00ema +xn--nyqy26a +xn--otu796d +xn--p1acf +xn--pssy2u +xn--q9jyb4c +xn--qcka1pmc +xn--rhqv96g +xn--rovu88b +xn--ses554g +xn--t60b56a +xn--tckwe +xn--tiq49xqyj +xn--unup4y +xn--vermgensberater-ctb +xn--vermgensberatung-pwb +xn--vhquv +xn--vuq861b +xn--w4r85el8fhu5dnra +xn--w4rs40l +xn--xhq521b +xn--zfr164b +xyz +yachts +yahoo +yamaxun +yandex +yodobashi +yoga +yokohama +you +youtube +yun +zappos +zara +zero +zip +zone +zuerich diff --git a/Source/NETworkManager/ViewModels/RDAPHostViewModel.cs b/Source/NETworkManager/ViewModels/RDAPHostViewModel.cs index d08ca96126..72fe499c95 100644 --- a/Source/NETworkManager/ViewModels/RDAPHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/RDAPHostViewModel.cs @@ -114,13 +114,13 @@ private static void CloseItemAction(ItemActionCallbackArgs args) /// /// Query (e.g. domain, IP address, AS number). /// - /// Type of the query. If null, the type is detected from the query (e.g. data redirected from another tool or a - /// run command), or the last selected type is used for an empty tab. + /// Type of the query. If null, the type is detected from the query (, e.g. data + /// redirected from another tool or a run command), or the last selected type is used for an empty tab. /// public void AddTab(string query = null, RDAPQueryType? queryType = null) { if (queryType == null && !string.IsNullOrWhiteSpace(query)) - queryType = RDAPQueryParser.DetectType(query); + queryType = RDAPQueryType.Auto; var tabId = Guid.NewGuid(); diff --git a/Source/NETworkManager/ViewModels/RDAPViewModel.cs b/Source/NETworkManager/ViewModels/RDAPViewModel.cs index bacf3b4dbe..4fa66789e5 100644 --- a/Source/NETworkManager/ViewModels/RDAPViewModel.cs +++ b/Source/NETworkManager/ViewModels/RDAPViewModel.cs @@ -337,9 +337,10 @@ private async Task RunQuery() List messages = []; - // A subdomain (e.g. a hostname) was not found, but its parent domain. + // The registered domain of a subdomain (e.g. a hostname) was queried. if (_result.Query.Value != query.Value) - messages.Add(string.Format(Strings.RDAPNoRecordForXShowingY, query.Value, _result.Query.Value)); + messages.Add(string.Format(Strings.RDAPXIsNotARegisteredDomainShowingY, query.Value, + _result.Query.Value)); if (_result.ReferralError != null) messages.Add(GetReferralErrorMessage(_result.ReferralError, _result.Query)); diff --git a/Source/NETworkManager/Views/TracerouteView.xaml b/Source/NETworkManager/Views/TracerouteView.xaml index e172960e64..f1cd088f0c 100644 --- a/Source/NETworkManager/Views/TracerouteView.xaml +++ b/Source/NETworkManager/Views/TracerouteView.xaml @@ -26,6 +26,7 @@ +