Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 29 additions & 12 deletions Source/NETworkManager.Models/Network/DNSLookup.cs
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -213,57 +214,73 @@ private void ProcessDnsAnswers(IEnumerable<DnsResourceRecord> 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<ARecord>())
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<AaaaRecord>())
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<CNameRecord>())
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<DnsKeyRecord>())
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<MxRecord>())
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<NsRecord>())
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<PtrRecord>())
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<SoaRecord>())
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<SrvRecord>())
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<TxtRecord>())
OnRecordReceived(new DNSLookupRecordReceivedArgs(
new DNSLookupRecordInfo(
record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}",
Expand All @@ -273,4 +290,4 @@ private void ProcessDnsAnswers(IEnumerable<DnsResourceRecord> answers, NameServe
}

#endregion
}
}
15 changes: 15 additions & 0 deletions Source/NETworkManager.Settings/GlobalStaticConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using NETworkManager.Models.RemoteDesktop;
using NETworkManager.Utilities;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

Expand Down Expand Up @@ -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<QueryType> 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;
Expand Down
43 changes: 22 additions & 21 deletions Source/NETworkManager/ViewModels/DNSLookupViewModel.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -254,17 +254,18 @@ private void LoadSettings()

private void LoadTypes()
{
// Filter by common types...
QueryTypes = SettingsManager.Current.DNSLookup_ShowOnlyMostCommonQueryTypes
? Enum.GetValues(typeof(QueryType)).Cast<QueryType>().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<QueryType>().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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion Website/docs/application/dns-lookup.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

Expand Down
7 changes: 7 additions & 0 deletions Website/docs/changelog/next-release.md
Original file line number Diff line number Diff line change
Expand Up @@ -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**
Expand Down