From e8beb245da35794b13c1f847f0fbbc278fa1dfb3 Mon Sep 17 00:00:00 2001 From: spiral Date: Fri, 19 Nov 2021 10:58:12 -0500 Subject: [PATCH] fix(webhooks): fix error when DNS entry has non-ipv4 addresses --- PluralKit.Bot/Commands/Api.cs | 9 +++------ PluralKit.Core/Dispatch/DispatchModels.cs | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/PluralKit.Bot/Commands/Api.cs b/PluralKit.Bot/Commands/Api.cs index ac276976..75ef3f5d 100644 --- a/PluralKit.Bot/Commands/Api.cs +++ b/PluralKit.Bot/Commands/Api.cs @@ -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." diff --git a/PluralKit.Core/Dispatch/DispatchModels.cs b/PluralKit.Core/Dispatch/DispatchModels.cs index 543457d8..62ca8902 100644 --- a/PluralKit.Core/Dispatch/DispatchModels.cs +++ b/PluralKit.Core/Dispatch/DispatchModels.cs @@ -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 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); } } } \ No newline at end of file