diff --git a/extra/admin-api/Spacebar.Cdn/Extensions/ImageController.cs b/extra/admin-api/Spacebar.Cdn/Extensions/ImageController.cs index 133eb8e..f817854 100644 --- a/extra/admin-api/Spacebar.Cdn/Extensions/ImageController.cs +++ b/extra/admin-api/Spacebar.Cdn/Extensions/ImageController.cs @@ -3,28 +3,33 @@ namespace Spacebar.Cdn.Extensions; -public class ImageController : ControllerBase { - protected DiscordImageResizeParams GetResizeParams() { - return new() { - Size = Request.Query.ContainsKey("size") && uint.TryParse(Request.Query["size"], out uint size) ? size : null, - Quality = Request.Query.ContainsKey("quality") && Enum.TryParse(Request.Query["quality"], true, out var quality) - ? quality - : DiscordImageResizeQuality.High, - KeepAspectRatio = !Request.Query.ContainsKey("keepAspectRatio") || !bool.TryParse(Request.Query["keepAspectRatio"], out bool kar) || kar, - Passthrough = Request.Query.ContainsKey("passthrough") && bool.TryParse(Request.Query["passthrough"], out bool pt) && pt, - Animated = Request.Query.ContainsKey("animated") && bool.TryParse(Request.Query["animated"], out bool an) && an, - SpacebarAllowUpscale = Request.Query.ContainsKey("allowUpscale") && bool.TryParse(Request.Query["allowUpscale"], out bool au) && au, - SpacebarOptimiseGif = Request.Query.ContainsKey("optimiseGif") && bool.TryParse(Request.Query["optimiseGif"], out bool og) && og, - }; - } - protected void SetSuccessCacheHeader() { - int cacheDuration = (int)TimeSpan.FromHours(6).TotalSeconds; - Response.Headers.CacheControl = $"public, max-age={cacheDuration}, s-maxage={cacheDuration}, immutable"; +public static class HttpRequestExtensions { + extension(HttpRequest request) { + public DiscordImageResizeParams GetResizeParams() { + return new() { + Size = request.Query.ContainsKey("size") && uint.TryParse(request.Query["size"], out uint size) ? size : null, + Quality = request.Query.ContainsKey("quality") && Enum.TryParse(request.Query["quality"], true, out var quality) + ? quality + : DiscordImageResizeQuality.High, + KeepAspectRatio = !request.Query.ContainsKey("keepAspectRatio") || !bool.TryParse(request.Query["keepAspectRatio"], out bool kar) || kar, + Passthrough = request.Query.ContainsKey("passthrough") && bool.TryParse(request.Query["passthrough"], out bool pt) && pt, + Animated = request.Query.ContainsKey("animated") && bool.TryParse(request.Query["animated"], out bool an) && an, + SpacebarAllowUpscale = request.Query.ContainsKey("allowUpscale") && bool.TryParse(request.Query["allowUpscale"], out bool au) && au, + SpacebarOptimiseGif = request.Query.ContainsKey("optimiseGif") && bool.TryParse(request.Query["optimiseGif"], out bool og) && og, + }; + } } + + extension (HttpResponse response) { + public void SetSuccessCacheHeader() { + int cacheDuration = (int)TimeSpan.FromHours(6).TotalSeconds; + response.Headers.CacheControl = $"public, max-age={cacheDuration}, s-maxage={cacheDuration}, immutable"; + } - protected void SetFailureCacheHeader() { - int cacheDuration = (int)TimeSpan.FromMinutes(5).TotalSeconds; - Response.Headers.CacheControl = $"public, max-age={cacheDuration}, s-maxage={cacheDuration}, immutable"; + public void SetFailureCacheHeader() { + int cacheDuration = (int)TimeSpan.FromMinutes(5).TotalSeconds; + response.Headers.CacheControl = $"public, max-age={cacheDuration}, s-maxage={cacheDuration}, immutable"; + } } } \ No newline at end of file diff --git a/extra/admin-api/Spacebar.Cdn/Helpers/DefaultAvatarRenderer.cs b/extra/admin-api/Spacebar.Cdn/Helpers/DefaultAvatarRenderer.cs deleted file mode 100644 index 35b478f..0000000 --- a/extra/admin-api/Spacebar.Cdn/Helpers/DefaultAvatarRenderer.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ArcaneLibs.Extensions; -using ImageMagick; - -namespace Spacebar.AdminApi.TestClient.Services.Helpers; - -public class DefaultAvatarRenderer { - // Slower at runtime, but doesnt depend on filesystem - private static string GetDefaultAvatarSvg(byte r, byte g, byte b) { - return $""" - - - - - """; - } - - public static async Task GetDefaultAvatar(byte r, byte g, byte b, MagickFormat format = MagickFormat.Png, int size = 4096) { - var img = new MagickImageCollection(GetDefaultAvatarSvg(r, g, b).AsBytes().ToArray()); - var ms = new MemoryStream(); - await img.WriteAsync(ms); - ms.Position = 0; - return ms; - } -} \ No newline at end of file diff --git a/extra/admin-api/Spacebar.Cdn/Mimes.cs b/extra/admin-api/Spacebar.Cdn/Mimes.cs index 5a28143..273df2d 100644 --- a/extra/admin-api/Spacebar.Cdn/Mimes.cs +++ b/extra/admin-api/Spacebar.Cdn/Mimes.cs @@ -1,7 +1,7 @@ using System.ComponentModel; using ImageMagick; -namespace Spacebar.AdminApi.TestClient.Services; +namespace Spacebar.Cdn; public static class Mimes { private static string PrintLogged(string msg, string mime) { @@ -12,15 +12,30 @@ public static MagickFormat GetFormatForExtension(string extension) { extension = extension.ToLower(); // ban some values... - if (extension == "screenshot") throw new AccessViolationException("Disallowed extension: " + extension); + // TODO: look for more + if (extension + // screen capture/write + is "screenshot" + or "win" + or "clipboard" + or "x" // read from/write to x11 server + or "xwd" // x11 window dump + or "dds" // MS DirectDraw surface + or "open" // display image on screen, OSX only + // printer stuff + or "print" + or "scan" + or "scanx" + // special + or "dmr" // MagicCache media library, let's not... + or "emf" // some microsoft meta format, windows only + or "mpr" // Magick Persistent Registry - basically a resident in-memory image + ) throw new AccessViolationException("Disallowed extension: " + extension); - var matchingFormat = Enum.GetNames(typeof(MagickFormat)).FirstOrDefault(f => f.ToLower() == extension); + MagickFormat + var matchingFormat = Enum.GetNames().FirstOrDefault(f => f.ToLower() == extension); if (string.IsNullOrWhiteSpace(matchingFormat)) throw new InvalidEnumArgumentException("Unknown format: " + extension); - if (Enum.TryParse(matchingFormat, out MagickFormat fmt)) { - return fmt; - } - - throw new InvalidEnumArgumentException("Unknown format: " + extension); + return Enum.TryParse(matchingFormat, out MagickFormat fmt) ? fmt : throw new InvalidEnumArgumentException("Unknown format: " + extension); } public static string GetMime(MagickFormat fmt) => fmt switch { diff --git a/extra/admin-api/Spacebar.Cdn/Properties/launchSettings.json b/extra/admin-api/Spacebar.Cdn/Properties/launchSettings.json index f3ffeac..4e377f5 100644 --- a/extra/admin-api/Spacebar.Cdn/Properties/launchSettings.json +++ b/extra/admin-api/Spacebar.Cdn/Properties/launchSettings.json @@ -8,7 +8,7 @@ "applicationUrl": "http://localhost:5114", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", - "LD_LIBRARY_PATH": "/home/Rory/git/spacebar/server-master/extra/admin-api/Spacebar.Cdn/result-lib/lib/" + // "LD_LIBRARY_PATH": "/home/Rory/git/spacebar/server-master/extra/admin-api/Spacebar.Cdn/result-lib/lib/" } }, "Local": { @@ -18,7 +18,7 @@ "applicationUrl": "http://localhost:5114", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Local", -// "LD_LIBRARY_PATH": "/home/Rory/git/spacebar/server-master/extra/admin-api/Spacebar.Cdn/result-lib/lib/", + // "LD_LIBRARY_PATH": "/home/Rory/git/spacebar/server-master/extra/admin-api/Spacebar.Cdn/result-lib/lib/", "STORAGE_PATH": "./files" } } diff --git a/extra/admin-api/Spacebar.Cdn/Spacebar.Cdn.csproj b/extra/admin-api/Spacebar.Cdn/Spacebar.Cdn.csproj index 3daa5c5..3958921 100644 --- a/extra/admin-api/Spacebar.Cdn/Spacebar.Cdn.csproj +++ b/extra/admin-api/Spacebar.Cdn/Spacebar.Cdn.csproj @@ -7,17 +7,21 @@ - - - - + + + + - + - + + + + +