diff --git a/Source/NETworkManager.Models/Network/DNSLookup.cs b/Source/NETworkManager.Models/Network/DNSLookup.cs index 52bc4b5936..b265822f6c 100644 --- a/Source/NETworkManager.Models/Network/DNSLookup.cs +++ b/Source/NETworkManager.Models/Network/DNSLookup.cs @@ -1,11 +1,12 @@ -using System; +using DnsClient; +using DnsClient.Protocol; +using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Threading.Tasks; -using DnsClient; -using DnsClient.Protocol; namespace NETworkManager.Models.Network; @@ -213,57 +214,73 @@ private void ProcessDnsAnswers(IEnumerable answers, NameServe if (answers is not DnsResourceRecord[] dnsResourceRecords) return; + Debug.WriteLine(dnsResourceRecords); + // A - foreach (var record in dnsResourceRecords.ARecords()) + foreach (var record in dnsResourceRecords.OfType()) OnRecordReceived(new DNSLookupRecordReceivedArgs( new DNSLookupRecordInfo( record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", $"{record.Address}", $"{nameServer.Address}", nameServerHostname, nameServer.Port))); // AAAA - foreach (var record in dnsResourceRecords.AaaaRecords()) + foreach (var record in dnsResourceRecords.OfType()) OnRecordReceived(new DNSLookupRecordReceivedArgs( new DNSLookupRecordInfo( record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", $"{record.Address}", $"{nameServer.Address}", nameServerHostname, nameServer.Port))); // CNAME - foreach (var record in dnsResourceRecords.CnameRecords()) + foreach (var record in dnsResourceRecords.OfType()) OnRecordReceived(new DNSLookupRecordReceivedArgs( new DNSLookupRecordInfo( record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", record.CanonicalName, $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + // DNSKEY + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + $"{record.Flags} {record.Protocol} {record.Algorithm} {Convert.ToBase64String(record.PublicKey.ToArray())}", $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + // MX - foreach (var record in dnsResourceRecords.MxRecords()) + foreach (var record in dnsResourceRecords.OfType()) OnRecordReceived(new DNSLookupRecordReceivedArgs( new DNSLookupRecordInfo( record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", record.Exchange, $"{nameServer.Address}", nameServerHostname, nameServer.Port))); // NS - foreach (var record in dnsResourceRecords.NsRecords()) + foreach (var record in dnsResourceRecords.OfType()) OnRecordReceived(new DNSLookupRecordReceivedArgs( new DNSLookupRecordInfo( record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", record.NSDName, $"{nameServer.Address}", nameServerHostname, nameServer.Port))); // PTR - foreach (var record in dnsResourceRecords.PtrRecords()) + foreach (var record in dnsResourceRecords.OfType()) OnRecordReceived(new DNSLookupRecordReceivedArgs( new DNSLookupRecordInfo( record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", record.PtrDomainName, $"{nameServer.Address}", nameServerHostname, nameServer.Port))); // SOA - foreach (var record in dnsResourceRecords.SoaRecords()) + foreach (var record in dnsResourceRecords.OfType()) OnRecordReceived(new DNSLookupRecordReceivedArgs( new DNSLookupRecordInfo( record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", record.MName + ", " + record.RName, $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + // SRV + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + $"{record.Priority} {record.Weight} {record.Port} {record.Target}", $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + // TXT - foreach (var record in dnsResourceRecords.TxtRecords()) + foreach (var record in dnsResourceRecords.OfType()) OnRecordReceived(new DNSLookupRecordReceivedArgs( new DNSLookupRecordInfo( record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", @@ -273,4 +290,4 @@ private void ProcessDnsAnswers(IEnumerable answers, NameServe } #endregion -} \ No newline at end of file +} diff --git a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs index c7c07ce381..5eac555ddb 100644 --- a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs +++ b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs @@ -8,6 +8,7 @@ using NETworkManager.Models.RemoteDesktop; using NETworkManager.Utilities; using System; +using System.Collections.Generic; using System.IO; using System.Linq; @@ -140,6 +141,20 @@ public static class GlobalStaticConfiguration // Application: DNS Lookup public static QueryClass DNSLookup_QueryClass => QueryClass.IN; public static QueryType DNSLookup_QueryType => QueryType.ANY; + public static HashSet DNSLookup_CustomQueryTypes => + [ + QueryType.A, + QueryType.AAAA, + QueryType.ANY, + QueryType.CNAME, + QueryType.DNSKEY, + QueryType.MX, + QueryType.NS, + QueryType.PTR, + QueryType.SOA, + QueryType.SRV, + QueryType.TXT + ]; public static bool DNSLookup_UseTCPOnly => false; public static int DNSLookup_Retries => 3; public static int DNSLookup_Timeout => 2; diff --git a/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs b/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs index 51f0f47f3e..967db5caf4 100644 --- a/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs +++ b/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs @@ -1,15 +1,4 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Data; -using System.Windows.Input; -using System.Windows.Threading; -using DnsClient; +using DnsClient; using log4net; using MahApps.Metro.Controls; using MahApps.Metro.Controls.Dialogs; @@ -20,6 +9,17 @@ using NETworkManager.Settings; using NETworkManager.Utilities; using NETworkManager.Views; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; namespace NETworkManager.ViewModels; @@ -254,17 +254,18 @@ private void LoadSettings() private void LoadTypes() { - // Filter by common types... - QueryTypes = SettingsManager.Current.DNSLookup_ShowOnlyMostCommonQueryTypes - ? Enum.GetValues(typeof(QueryType)).Cast().Where(x => - x is QueryType.A or QueryType.AAAA or QueryType.ANY or QueryType.CNAME or QueryType.MX or QueryType.NS - or QueryType.PTR or QueryType.SOA or QueryType.TXT).OrderBy(x => x.ToString()).ToList() - : Enum.GetValues(typeof(QueryType)).Cast().OrderBy(x => x.ToString()).ToList(); + var queryTypes = (QueryType[])Enum.GetValues(typeof(QueryType)); + + if (SettingsManager.Current.DNSLookup_ShowOnlyMostCommonQueryTypes) + QueryTypes = [.. queryTypes.Where(GlobalStaticConfiguration.DNSLookup_CustomQueryTypes.Contains).OrderBy(x => x.ToString())]; + else + QueryTypes = [.. queryTypes.OrderBy(x => x.ToString())]; + QueryType = QueryTypes.FirstOrDefault(x => x == SettingsManager.Current.DNSLookup_QueryType); // Fallback if (QueryType == 0) - QueryType = QueryType.ANY; + QueryType = GlobalStaticConfiguration.DNSLookup_QueryType; } #endregion @@ -337,7 +338,7 @@ private void Query() dnsLookup.LookupError += DNSLookup_LookupError; dnsLookup.LookupComplete += DNSLookup_LookupComplete; - dnsLookup.ResolveAsync(Host.Split(';').Select(x => x.Trim()).ToList()); + dnsLookup.ResolveAsync([.. Host.Split(';').Select(x => x.Trim())]); } public void OnClose() @@ -391,7 +392,7 @@ private async Task Export() catch (Exception ex) { Log.Error("Error while exporting data as " + instance.FileType, ex); - + var settings = AppearanceManager.MetroDialog; settings.AffirmativeButtonText = Strings.OK; diff --git a/Website/docs/application/dns-lookup.md b/Website/docs/application/dns-lookup.md index d879e873e3..f4e5f1a936 100644 --- a/Website/docs/application/dns-lookup.md +++ b/Website/docs/application/dns-lookup.md @@ -125,7 +125,7 @@ DNS class to use for the query. ### Show only most common query types -Only show the most common query types (`A`, `AAAA`, `ANY`, `CNAME`, `MX`, `NS`, `PTR`, `SOA` and `TXT`) in the dropdown menu in the view. Otherwise all available query types are shown. +Only show the most common query types (`A`, `AAAA`, `ANY`, `CNAME`, `DNSKEY`, `MX`, `NS`, `PTR`, `SOA`, `SRV` and `TXT`) in the dropdown menu in the view. Otherwise all available query types are shown. **Type:** `Boolean` diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md index d32fb3b856..4e478e7513 100644 --- a/Website/docs/changelog/next-release.md +++ b/Website/docs/changelog/next-release.md @@ -19,8 +19,15 @@ Release date: **xx.xx.2025** ## What's new? +**General** + - New language Japanese (`ja-JP`) has been added. Thanks to [@coolvitto](https://github.com/coolvitto) [#3044](https://github.com/BornToBeRoot/NETworkManager/pull/3044) [#3030](https://github.com/BornToBeRoot/NETworkManager/pull/3030) [#3035](https://github.com/BornToBeRoot/NETworkManager/pull/3035) +**DNS Lookup** + +- `DNSKEY` records are now supported. [#3060](https://github.com/BornToBeRoot/NETworkManager/pull/3060) +- `SRV` records are now supported. [#3060](https://github.com/BornToBeRoot/NETworkManager/pull/3060) + ## Improvements **PowerShell**