From 40598721f1992c8cc08c85029d94e7505cf27f7c Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Mon, 15 Apr 2019 18:17:19 -0400 Subject: [PATCH] Url helpers --- src/Core/Utilities/CoreHelpers.cs | 73 +++++++++++++++++++++++++++++++ src/Core/Utilities/DomainName.cs | 12 ----- 2 files changed, 73 insertions(+), 12 deletions(-) diff --git a/src/Core/Utilities/CoreHelpers.cs b/src/Core/Utilities/CoreHelpers.cs index c7a39dacb..6e67ba8bf 100644 --- a/src/Core/Utilities/CoreHelpers.cs +++ b/src/Core/Utilities/CoreHelpers.cs @@ -1,9 +1,19 @@ using System; +using System.Text.RegularExpressions; namespace Bit.Core.Utilities { public static class CoreHelpers { + private static string IpRegex = + "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." + + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." + + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." + + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; + + private static string TldEndingRegex = + ".*\\.(com|net|org|edu|uk|gov|ca|de|jp|fr|au|ru|ch|io|es|us|co|xyz|info|ly|mil)$"; + public static readonly DateTime Epoc = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static bool InDebugMode() @@ -14,5 +24,68 @@ namespace Bit.Core.Utilities return false; #endif } + + public static string GetHostname(string uriString) + { + return GetUri(uriString)?.Host; + } + + public static string GetHost(string uriString) + { + var uri = GetUri(uriString); + if(uri != null) + { + if(uri.IsDefaultPort) + { + return uri.Host; + } + else + { + return string.Format("{0}:{1}", uri.Host, uri.Port); + } + } + return null; + } + + public static string GetDomain(string uriString) + { + var uri = GetUri(uriString); + if(uri == null) + { + return null; + } + + if(uri.Host == "localhost" || Regex.IsMatch(uriString, IpRegex)) + { + return uri.Host; + } + try + { + if(DomainName.TryParseBaseDomain(uri.Host, out var baseDomain)) + { + return baseDomain ?? uri.Host; + } + } + catch { } + return null; + } + + private static Uri GetUri(string uriString) + { + if(string.IsNullOrWhiteSpace(uriString)) + { + return null; + } + var httpUrl = uriString.StartsWith("https://") || uriString.StartsWith("http://"); + if(!httpUrl && !uriString.Contains("://") && Regex.IsMatch(uriString, TldEndingRegex)) + { + uriString = "http://" + uriString; + } + if(Uri.TryCreate(uriString, UriKind.Absolute, out var uri)) + { + return uri; + } + return null; + } } } diff --git a/src/Core/Utilities/DomainName.cs b/src/Core/Utilities/DomainName.cs index 6ff5c1e01..955d6d3e8 100644 --- a/src/Core/Utilities/DomainName.cs +++ b/src/Core/Utilities/DomainName.cs @@ -4,19 +4,12 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; -using System.Text.RegularExpressions; namespace Bit.Core.Utilities { // ref: https://github.com/danesparza/domainname-parser public class DomainName { - private const string IpRegex = - "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." + - "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." + - "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." + - "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; - private readonly string _subDomain = string.Empty; private readonly string _domain = string.Empty; private readonly string _tld = string.Empty; @@ -66,11 +59,6 @@ namespace Bit.Core.Utilities public static bool TryParseBaseDomain(string domainString, out string result) { - if(Regex.IsMatch(domainString, IpRegex)) - { - result = domainString; - return true; - } var retVal = TryParse(domainString, out DomainName domain); result = domain?.BaseDomain; return retVal;