fix(webhooks): fix error when DNS entry has non-ipv4 addresses

This commit is contained in:
spiral 2021-11-19 10:58:12 -05:00
parent 00b7f76a5b
commit e8beb245da
No known key found for this signature in database
GPG Key ID: A6059F0CA0E1BD31
2 changed files with 16 additions and 11 deletions

View File

@ -110,7 +110,7 @@ namespace PluralKit.Bot
await _repo.UpdateSystem(ctx.System.Id, new()
{
WebhookUrl = null,
Token = null,
WebhookToken = null,
});
await ctx.Reply($"{Emojis.Success} System webhook URL removed.");
@ -119,17 +119,14 @@ namespace PluralKit.Bot
var newUrl = ctx.RemainderOrNull();
if (!await DispatchExt.ValidateUri(newUrl))
{
await ctx.Reply($"New URL '{newUrl}' is invalid. Are you sure this is a valid, publicly accessible URL?");
return;
}
throw new PKError($"The URL {newUrl.AsCode()} is invalid or I cannot access it. Are you sure this is a valid, publicly accessible URL?");
var newToken = StringUtils.GenerateToken();
await _repo.UpdateSystem(ctx.System.Id, new()
{
WebhookUrl = newUrl,
Token = newToken,
WebhookToken = newToken,
});
await ctx.Reply($"{Emojis.Success} Successfully the new webhook URL for your system."

View File

@ -1,6 +1,8 @@
using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;
using System.Threading.Tasks;
using Newtonsoft.Json;
@ -78,22 +80,24 @@ namespace PluralKit.Core
public static async Task<bool> ValidateUri(string url)
{
var uri = new Uri(url);
IPHostEntry host = null;
try
{
var uri = new Uri(url);
host = await Dns.GetHostEntryAsync(uri.DnsSafeHost);
}
catch (Exception) { }
catch (Exception)
{
return false;
}
if (host == null || host.AddressList.Length == 0)
return false;
#pragma warning disable CS0618
foreach (var address in host.AddressList)
foreach (var address in host.AddressList.Where(address => address.AddressFamily is AddressFamily.InterNetwork))
{
if ((address.Address & 0x7f000000) == 0x7f000000) // 127.0/8
return false;
@ -105,7 +109,11 @@ namespace PluralKit.Core
return false;
}
return true;
if (host.AddressList.Any(address => address.IsIPv6LinkLocal))
return false;
// we only support IPv4 in prod :(
return host.AddressList.Any(address => address.AddressFamily is AddressFamily.InterNetwork);
}
}
}