Skip to content

Commit c5be513

Browse files
authored
Whois added (#141)
1 parent f7e1909 commit c5be513

21 files changed

+7536
-21
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Filepath in the resources
2+
[string]$OutFilePath = Join-Path -Path (Split-Path $PSScriptRoot -Parent) -ChildPath "Source\NETworkManager\Resources\WhoisServers.xml"
3+
4+
$IANA_TLDs = (Invoke-WebRequest -Uri "https://data.iana.org/TLD/tlds-alpha-by-domain.txt").Content -split "[`r|`n]"
5+
6+
# Create xml document
7+
[xml]$Document = New-Object System.Xml.XmlDocument
8+
$Declaration = $Document.CreateXmlDeclaration("1.0", "UTF-8", $null)
9+
10+
[void]$Document.AppendChild($Declaration)
11+
12+
# Description
13+
$Description = @"
14+
Whois servers by domain from IANA
15+
Generated $(Get-Date)
16+
"@
17+
18+
[void]$Document.AppendChild($Document.CreateComment($Description))
19+
20+
# Root node
21+
$RootNode = $Document.CreateNode("element", "WhoisServers", $null)
22+
23+
$ProgressCount = 0
24+
25+
foreach($Tld in $IANA_TLDs)
26+
{
27+
if($Tld.StartsWith("#"))
28+
{
29+
continue
30+
}
31+
32+
$currentTld = $Tld.Trim()
33+
34+
$tcpClient = New-Object System.Net.Sockets.TcpClient("whois.iana.org", 43)
35+
36+
$networkStream= $tcpClient.GetStream()
37+
38+
$bufferedStream = New-Object System.IO.BufferedStream($networkStream)
39+
40+
$streamWriter = New-Object System.IO.StreamWriter($bufferedStream)
41+
42+
$streamWriter.WriteLine($currentTld)
43+
$streamWriter.Flush()
44+
45+
$streamReader = New-Object System.IO.StreamReader($bufferedStream)
46+
47+
$stringBuilder = New-Object System.Text.StringBuilder
48+
49+
while(!$streamReader.EndOfStream)
50+
{
51+
$stringBuilder.Append($streamReader.ReadLine())
52+
}
53+
54+
$WhoisServer = (($stringBuilder.ToString() -split "whois:")[1] -split "status:")[0].Trim()
55+
56+
$WhoisServerNode = $Document.CreateNode("element", "WhoisServer", $null)
57+
58+
$TldElement = $Document.CreateElement("TLD")
59+
$TldElement.InnerText = $currentTld
60+
[void]$WhoisServerNode.AppendChild($TldElement)
61+
62+
$ServerElement = $Document.CreateElement("Server")
63+
$ServerElement.InnerText = $WhoisServer
64+
[void]$WhoisServerNode.AppendChild($ServerElement)
65+
66+
[void]$RootNode.AppendChild($WhoisServerNode)
67+
68+
Write-Host -Object "Progress: $ProgressCount from $($IANA_TLDs.Count)"
69+
$ProgressCount ++
70+
}
71+
72+
[void]$Document.AppendChild($RootNode)
73+
$Document.Save($OutFilePath)

Source/NETworkManager/ApplicationViewManager.cs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,21 @@ public static string GetTranslatedNameByName(Name name)
4444
case Name.SNMP:
4545
return Resources.Localization.Strings.SNMP;
4646
case Name.WakeOnLAN:
47-
return Resources.Localization.Strings.WakeOnLAN;
48-
case Name.HTTPHeaders:
49-
return Resources.Localization.Strings.HTTPHeaders;
47+
return Resources.Localization.Strings.WakeOnLAN;
5048
case Name.SubnetCalculator:
5149
return Resources.Localization.Strings.SubnetCalculator;
5250
case Name.Lookup:
5351
return Resources.Localization.Strings.Lookup;
52+
case Name.Whois:
53+
return Resources.Localization.Strings.Whois;
54+
case Name.HTTPHeaders:
55+
return Resources.Localization.Strings.HTTPHeaders;
5456
case Name.Connections:
5557
return Resources.Localization.Strings.Connections;
5658
case Name.Listeners:
5759
return Resources.Localization.Strings.Listeners;
5860
case Name.ARPTable:
59-
return Resources.Localization.Strings.ARPTable;
61+
return Resources.Localization.Strings.ARPTable;
6062
default:
6163
return "Name not found!";
6264
}
@@ -98,15 +100,18 @@ public static Canvas GetIconByName(Name name)
98100
case Name.WakeOnLAN:
99101
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Power });
100102
break;
101-
case Name.HTTPHeaders:
102-
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Web });
103-
break;
104103
case Name.SubnetCalculator:
105104
canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Calculator });
106105
break;
107106
case Name.Lookup:
108107
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Magnify });
109108
break;
109+
case Name.Whois:
110+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.CloudSearchOutline });
111+
break;
112+
case Name.HTTPHeaders:
113+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Web });
114+
break;
110115
case Name.Connections:
111116
canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Connect });
112117
break;
@@ -136,10 +141,11 @@ public enum Name
136141
RemoteDesktop,
137142
PuTTY,
138143
SNMP,
139-
WakeOnLAN,
140-
HTTPHeaders,
144+
WakeOnLAN,
141145
SubnetCalculator,
142146
Lookup,
147+
Whois,
148+
HTTPHeaders,
143149
Connections,
144150
Listeners,
145151
ARPTable

Source/NETworkManager/Controls/DragablzTabHostWindow.xaml.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ private void CloseItemAction(ItemActionCallbackArgs<TabablzControl> args)
111111
break;
112112
case ApplicationViewManager.Name.Lookup:
113113
break;
114+
case ApplicationViewManager.Name.Whois:
115+
((WhoisView)((DragablzTabItem)args.DragablzItem.Content).View).CloseTab();
116+
break;
114117
case ApplicationViewManager.Name.Connections:
115118
break;
116119
case ApplicationViewManager.Name.Listeners:

Source/NETworkManager/MainWindow.xaml.cs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
using System.Windows.Markup;
2121
using NETworkManager.Models.Update;
2222
using NETworkManager.Models.Documentation;
23+
using NETworkManager.Models.Network;
2324
using ContextMenu = System.Windows.Controls.ContextMenu;
2425

2526
namespace NETworkManager
@@ -248,6 +249,10 @@ public MainWindow()
248249
// Language Meta
249250
LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(LocalizationManager.Culture.IetfLanguageTag)));
250251

252+
// Update settings
253+
if (AssemblyManager.Current.Version > new Version(SettingsManager.Current.SettingsVersion))
254+
SettingsManager.Update(AssemblyManager.Current.Version, new Version(SettingsManager.Current.SettingsVersion));
255+
251256
// Load appearance
252257
AppearanceManager.Load();
253258

@@ -306,7 +311,7 @@ protected override async void OnContentRendered(EventArgs e)
306311
if (CommandLineManager.Current.Autostart && SettingsManager.Current.Autostart_StartMinimizedInTray)
307312
HideWindowToTray();
308313

309-
// Chech for updates...
314+
// Search for updates...
310315
if (SettingsManager.Current.Update_CheckForUpdatesAtStartup)
311316
CheckForUpdates();
312317
}
@@ -420,6 +425,7 @@ private async void MetroWindowMain_Closing(object sender, CancelEventArgs e)
420425
private SubnetCalculatorHostView _subnetCalculatorHostView;
421426
private HTTPHeadersHostView _httpHeadersHostView;
422427
private LookupHostView _lookupHostView;
428+
private WhoisHostView _whoisHostView;
423429
private ConnectionsView _connectionsView;
424430
private ListenersView _listenersView;
425431
private ARPTableView _arpTableView;
@@ -495,13 +501,6 @@ private void ChangeApplicationView(ApplicationViewManager.Name name)
495501

496502
ContentControlApplication.Content = _wakeOnLanView;
497503
break;
498-
499-
case ApplicationViewManager.Name.HTTPHeaders:
500-
if (_httpHeadersHostView == null)
501-
_httpHeadersHostView = new HTTPHeadersHostView();
502-
503-
ContentControlApplication.Content = _httpHeadersHostView;
504-
break;
505504
case ApplicationViewManager.Name.SubnetCalculator:
506505
if (_subnetCalculatorHostView == null)
507506
_subnetCalculatorHostView = new SubnetCalculatorHostView();
@@ -514,6 +513,18 @@ private void ChangeApplicationView(ApplicationViewManager.Name name)
514513

515514
ContentControlApplication.Content = _lookupHostView;
516515
break;
516+
case ApplicationViewManager.Name.Whois:
517+
if(_whoisHostView ==null)
518+
_whoisHostView = new WhoisHostView();
519+
520+
ContentControlApplication.Content = _whoisHostView;
521+
break;
522+
case ApplicationViewManager.Name.HTTPHeaders:
523+
if (_httpHeadersHostView == null)
524+
_httpHeadersHostView = new HTTPHeadersHostView();
525+
526+
ContentControlApplication.Content = _httpHeadersHostView;
527+
break;
517528
case ApplicationViewManager.Name.Connections:
518529
if (_connectionsView == null)
519530
_connectionsView = new ConnectionsView();
@@ -580,6 +591,8 @@ private void RefreshApplicationView(ApplicationViewManager.Name name)
580591
break;
581592
case ApplicationViewManager.Name.Lookup:
582593
break;
594+
case ApplicationViewManager.Name.Whois:
595+
break;
583596
case ApplicationViewManager.Name.Connections:
584597
break;
585598
case ApplicationViewManager.Name.Listeners:
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using System.Collections.Generic;
2+
using System.IO;
3+
using System.Linq;
4+
using System.Net.Sockets;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using System.Xml;
8+
using NETworkManager.Models.Settings;
9+
10+
namespace NETworkManager.Models.Network
11+
{
12+
public class Whois
13+
{
14+
#region Variables
15+
private static readonly string WhoisServerFilePath =
16+
Path.Combine(ConfigurationManager.Current.ExecutionPath, "Resources", "WhoisServers.xml");
17+
18+
private static readonly List<WhoisServerInfo> WhoisServerList;
19+
private static readonly Lookup<string, WhoisServerInfo> WhoisServers;
20+
#endregion
21+
22+
#region Constructor
23+
24+
static Whois()
25+
{
26+
var document = new XmlDocument();
27+
document.Load(WhoisServerFilePath);
28+
29+
WhoisServerList = new List<WhoisServerInfo>();
30+
31+
foreach (XmlNode node in document.SelectNodes("/WhoisServers/WhoisServer"))
32+
{
33+
if (node == null)
34+
continue;
35+
36+
WhoisServerList.Add(new WhoisServerInfo(node.SelectSingleNode("Server")?.InnerText, node.SelectSingleNode("TLD")?.InnerText));
37+
}
38+
39+
WhoisServers = (Lookup<string, WhoisServerInfo>)WhoisServerList.ToLookup(x => x.Tld);
40+
}
41+
#endregion
42+
43+
#region Methods
44+
public static Task<string> QueryAsync(string domain, string whoisServer)
45+
{
46+
return Task.Run(() => Query(domain, whoisServer));
47+
}
48+
49+
public static string Query(string domain, string whoisServer)
50+
{
51+
var tcpClient = new TcpClient(whoisServer, 43);
52+
53+
var networkStream = tcpClient.GetStream();
54+
55+
var bufferedStream = new BufferedStream(networkStream);
56+
57+
var streamWriter = new StreamWriter(bufferedStream);
58+
59+
streamWriter.WriteLine(domain);
60+
streamWriter.Flush();
61+
62+
var streamReader = new StreamReader(bufferedStream);
63+
64+
var stringBuilder = new StringBuilder();
65+
66+
while (!streamReader.EndOfStream)
67+
stringBuilder.AppendLine(streamReader.ReadLine());
68+
69+
return stringBuilder.ToString();
70+
}
71+
72+
public static string GetWhoisServer(string domain)
73+
{
74+
var domainParts = domain.Split('.');
75+
76+
// TLD to upper because the lookup is case sensitive
77+
return WhoisServers[domainParts[domainParts.Length - 1].ToUpper()].FirstOrDefault()?.Server;
78+
}
79+
#endregion
80+
}
81+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace NETworkManager.Models.Network
2+
{
3+
public class WhoisServerInfo
4+
{
5+
public string Server { get; set; }
6+
public string Tld { get; set; }
7+
8+
public WhoisServerInfo(string server, string tld)
9+
{
10+
Server = server;
11+
Tld = tld;
12+
}
13+
}
14+
}

Source/NETworkManager/Models/Settings/SettingsInfo.cs

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,22 @@ protected virtual void OnPropertyChanged([CallerMemberName] string propertyName
2727

2828
#region Variables
2929
[XmlIgnore] public bool SettingsChanged { get; set; }
30-
#region General
3130

31+
private string _settingsVersion = "0.0.0.0";
32+
public string SettingsVersion
33+
{
34+
get => _settingsVersion;
35+
set
36+
{
37+
if(value == _settingsVersion)
38+
return;
39+
40+
_settingsVersion = value;
41+
SettingsChanged = true;
42+
}
43+
}
44+
45+
#region General
3246
// General
3347
private ApplicationViewManager.Name _general_DefaultApplicationViewName = ApplicationViewManager.Name.NetworkInterface;
3448
public ApplicationViewManager.Name General_DefaultApplicationViewName
@@ -2330,6 +2344,53 @@ public ObservableCollection<string> Lookup_Port_PortsHistory
23302344
}
23312345
#endregion
23322346

2347+
#region Whois
2348+
private ObservableCollection<string> _whois_DomainHistory = new ObservableCollection<string>();
2349+
public ObservableCollection<string> Whois_DomainHistory
2350+
{
2351+
get => _whois_DomainHistory;
2352+
set
2353+
{
2354+
if (value == _whois_DomainHistory)
2355+
return;
2356+
2357+
_whois_DomainHistory = value;
2358+
SettingsChanged = true;
2359+
}
2360+
}
2361+
2362+
private bool _whois_ExpandStatistics = true;
2363+
public bool Whois_ExpandStatistics
2364+
{
2365+
get => _whois_ExpandStatistics;
2366+
set
2367+
{
2368+
if (value == _whois_ExpandStatistics)
2369+
return;
2370+
2371+
_whois_ExpandStatistics = value;
2372+
SettingsChanged = true;
2373+
}
2374+
}
2375+
2376+
private bool _whois_ShowStatistics = true;
2377+
public bool Whois_ShowStatistics
2378+
{
2379+
get => _whois_ShowStatistics;
2380+
set
2381+
{
2382+
if (value == _whois_ShowStatistics)
2383+
return;
2384+
2385+
_whois_ShowStatistics = value;
2386+
2387+
OnPropertyChanged();
2388+
2389+
SettingsChanged = true;
2390+
}
2391+
}
2392+
#endregion
2393+
23332394
#region Connections
23342395
private bool _connections_AutoRefresh;
23352396
public bool Connections_AutoRefresh

0 commit comments

Comments
 (0)