Ensure IPv6 are bracketed if it's with query or path

This commit is contained in:
VictoriousRaptor 2026-03-02 18:52:51 +08:00
parent 74c18d8195
commit 9017ce6b9d
2 changed files with 22 additions and 1 deletions

View file

@ -54,14 +54,17 @@ namespace Flow.Launcher.Test.Plugins
[TestCase("http://example.com/path")]
[TestCase("https://example.com/path?query=1")]
[TestCase("192.168.1.1/path/to/resource")]
[TestCase("192.168.1.1/path/to/resource?query=1")]
[TestCase("localhost:8080/api/endpoint")]
[TestCase("http://localhost/path")]
[TestCase("[::1]/path")]
[TestCase("[2001:db8::1]/path?query=1")]
public void WhenValidUrlThenIsUrlReturnsTrue(string url)
{
Assert.That(plugin.IsURL(url), Is.True);
}
[TestCase("2001:db8::1/path")]
[TestCase("wwww")]
[TestCase("wwww.c")]
[TestCase("not a url")]

View file

@ -94,8 +94,25 @@ namespace Flow.Launcher.Plugin.Url
// Check if it's a bare IP address with optional port, path, query, or fragment
var ipPart = input.Split('/', '?', '#')[0]; // Remove path, query, and fragment
if (IPEndPoint.TryParse(ipPart, out var endpoint) && !endpoint.Address.Equals(IPAddress.Any) && !endpoint.Address.Equals(IPAddress.IPv6Any))
if (IPEndPoint.TryParse(ipPart, out var endpoint))
{
switch (endpoint.AddressFamily)
{
case System.Net.Sockets.AddressFamily.InterNetwork:
return !endpoint.Address.Equals(IPAddress.Any);
case System.Net.Sockets.AddressFamily.InterNetworkV6:
if (input.Contains('/') || input.Contains('?') || input.Contains('#'))
{
// Check if IPv6 address is properly bracketed
var bracketStart = input.IndexOf('[');
var bracketEnd = input.IndexOf(']');
if (bracketStart == -1 || bracketEnd == -1 || bracketStart > bracketEnd)
return false;
}
return !endpoint.Address.Equals(IPAddress.IPv6Any);
}
return true;
}
// Add protocol if missing for Uri validation
var urlToValidate = UrlSchemes.Any(s => input.StartsWith(s, StringComparison.OrdinalIgnoreCase))
@ -104,6 +121,7 @@ namespace Flow.Launcher.Plugin.Url
if (!Uri.TryCreate(urlToValidate, UriKind.Absolute, out var uri))
return false;
// Validate protocol
if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps && uri.Scheme != Uri.UriSchemeFtp)