Skip to content

Commit

Permalink
support mandatory port for mdns
Browse files Browse the repository at this point in the history
  • Loading branch information
viordash committed Aug 17, 2023
1 parent 6e7105c commit b58efbc
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -1,38 +1,84 @@
using ShareClipbrd.Core.Services;
using ShareClipbrd.Core.Helpers;
using ShareClipbrd.Core.Services;

namespace ShareClipbrd.Core.Tests.Services {
public class AddressResolverTests {
[Test]
public void UseAddressDiscoveryService_When_Invalid_Address_Return_False() {
string id;
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService(":55542", out id));
int? mandatoryPort;
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService(":55542", out id, out mandatoryPort));
Assert.That(id, Is.Empty);
Assert.That(mandatoryPort, Is.Null);

Assert.IsFalse(AddressResolver.UseAddressDiscoveryService(string.Empty, out id));
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService(string.Empty, out id, out mandatoryPort));
Assert.That(id, Is.Empty);
Assert.That(mandatoryPort, Is.Null);

Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns 1234", out id));
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns 1234", out id, out mandatoryPort));
Assert.That(id, Is.Empty);
Assert.That(mandatoryPort, Is.Null);

Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns", out id));
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns", out id, out mandatoryPort));
Assert.That(id, Is.Empty);
Assert.That(mandatoryPort, Is.Null);

Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns:", out id));
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns:", out id, out mandatoryPort));
Assert.That(id, Is.Empty);
Assert.That(mandatoryPort, Is.Null);

Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns: ", out id, out mandatoryPort));
Assert.That(id, Is.Empty);
Assert.That(mandatoryPort, Is.Null);
}

[Test]
public void UseAddressDiscoveryService_Valid_Address_Return_True_And_Id() {
string id;
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:a", out id));
int? mandatoryPort;
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:a", out id, out mandatoryPort));
Assert.That(id, Is.EqualTo("a"));
Assert.That(mandatoryPort, Is.Null);

Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:55542", out id));
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:55542", out id, out mandatoryPort));
Assert.That(id, Is.EqualTo("55542"));
Assert.That(mandatoryPort, Is.Null);

Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", out id));
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", out id, out mandatoryPort));
Assert.That(id, Is.EqualTo("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
Assert.That(mandatoryPort, Is.Null);
}

[Test]
public void UseAddressDiscoveryService_When_Invalid_Ports_Throws_ArgumentException() {
string id;
int? mandatoryPort;
Assert.Throws<ArgumentException>(() => AddressResolver.UseAddressDiscoveryService("mdns:abcde:", out id, out mandatoryPort));
Assert.Throws<ArgumentException>(() => AddressResolver.UseAddressDiscoveryService("mdns:abcde: ", out id, out mandatoryPort));
Assert.Throws<ArgumentException>(() => AddressResolver.UseAddressDiscoveryService("mdns:abcde:-1", out id, out mandatoryPort));
Assert.Throws<ArgumentException>(() => AddressResolver.UseAddressDiscoveryService("mdns:abcde:65536", out id, out mandatoryPort));

Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns::1", out id, out mandatoryPort));
Assert.That(id, Is.Empty);
Assert.That(mandatoryPort, Is.Null);
}

[Test]
public void UseAddressDiscoveryService_Valid_Ports_And_Entire_Id_Extracting_Tests() {
string id;
int? mandatoryPort;
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:abcde:0", out id, out mandatoryPort));
Assert.That(id, Is.EqualTo("abcde"));
Assert.That(mandatoryPort, Is.EqualTo(0));
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:abcde 12345:1", out id, out mandatoryPort));
Assert.That(id, Is.EqualTo("abcde 12345"));
Assert.That(mandatoryPort, Is.EqualTo(1));
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:abcde:65535", out id, out mandatoryPort));
Assert.That(id, Is.EqualTo("abcde"));
Assert.That(mandatoryPort, Is.EqualTo(65535));
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:abcde: 65535", out id, out mandatoryPort));
Assert.That(id, Is.EqualTo("abcde"));
Assert.That(mandatoryPort, Is.EqualTo(65535));
}
}
}
2 changes: 0 additions & 2 deletions ShareClipbrd/ShareClipbrd.Core/Helpers/NetworkHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@

namespace ShareClipbrd.Core.Helpers {
public class NetworkHelper {
public const string PublicIP = ":0";

public static IPEndPoint ResolveHostName(string hostname) {
int portStart = hostname.LastIndexOf(':');
if(!int.TryParse(hostname[(portStart + 1)..], out int port)) {
Expand Down
32 changes: 30 additions & 2 deletions ShareClipbrd/ShareClipbrd.Core/Services/AddressResolver.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,48 @@
namespace ShareClipbrd.Core.Services {
using System.Net;

namespace ShareClipbrd.Core.Services {
public class AddressResolver {
public const string TagDiscoveryService = "mdns:";

public static bool UseAddressDiscoveryService(string address, out string id) {
static void MandatoryPort(ref string id, out int? mandatoryPort) {
int portStart = id.LastIndexOf(':');
int port;
if(portStart < 0) {
mandatoryPort = null;
return;
}

if(int.TryParse(id[(portStart + 1)..], out port)) {
try {
_ = new IPEndPoint(IPAddress.Any, port);
id = id[..portStart];
mandatoryPort = port;
return;
} catch(ArgumentOutOfRangeException) {
}
}
throw new ArgumentException("mdns port for the partner address is not needed");
}

public static bool UseAddressDiscoveryService(string address, out string id, out int? mandatoryPort) {
if(!address.StartsWith(TagDiscoveryService)) {
id = string.Empty;
mandatoryPort = null;
return false;
}

var s = address.Replace(TagDiscoveryService, string.Empty);

MandatoryPort(ref s, out mandatoryPort);
s = s.Trim();
if(string.IsNullOrEmpty(s)) {
id = string.Empty;
mandatoryPort = null;
return false;
}
id = s;
return true;
}

}
}
7 changes: 6 additions & 1 deletion ShareClipbrd/ShareClipbrd.Core/Services/DataClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,10 @@ async Task Connect() {
client = new();

IPEndPoint ipEndPoint;
if(AddressResolver.UseAddressDiscoveryService(systemConfiguration.PartnerAddress, out string id)) {
if(AddressResolver.UseAddressDiscoveryService(systemConfiguration.PartnerAddress, out string id, out int? mandatoryPort)) {
if(mandatoryPort.HasValue) {
throw new ArgumentException("mdns port for the partner address is not needed");
}
ipEndPoint = await addressDiscoveryService.Discover(id);
} else {
ipEndPoint = NetworkHelper.ResolveHostName(systemConfiguration.PartnerAddress);
Expand Down Expand Up @@ -213,6 +216,8 @@ async Task Ping() {

await stream.WriteAsync((Int64)0, cancellationToken);
await stream.ReadUInt16Async(cancellationToken);
} catch(ArgumentException ex) {
await dialogService.ShowError(ex);
} catch(Exception) {
}
pingTimer.Enabled = !cancellationToken.IsCancellationRequested;
Expand Down
14 changes: 9 additions & 5 deletions ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,14 +163,18 @@ public void Start() {
while(!cancellationToken.IsCancellationRequested) {
try {
string hostAddress;
bool useAddressDiscoveryService = AddressResolver.UseAddressDiscoveryService(systemConfiguration.HostAddress, out string id);
IPEndPoint ipEndPoint;
bool useAddressDiscoveryService = AddressResolver.UseAddressDiscoveryService(systemConfiguration.HostAddress, out string id, out int? mandatoryPort);
if(useAddressDiscoveryService) {
hostAddress = NetworkHelper.PublicIP;
if(mandatoryPort.HasValue) {
ipEndPoint = new IPEndPoint(IPAddress.Any, mandatoryPort.Value);
} else {
ipEndPoint = new IPEndPoint(IPAddress.Any, 0);
}
} else {
hostAddress = systemConfiguration.HostAddress;
ipEndPoint = NetworkHelper.ResolveHostName(systemConfiguration.HostAddress);
}
var ipEndPoint = NetworkHelper.ResolveHostName(hostAddress);
var tcpServer = new TcpListener(ipEndPoint.Address, ipEndPoint.Port);
try {
Expand Down

0 comments on commit b58efbc

Please sign in to comment.