From 41deb1be8cc225a6d5969dd95aeecf93212f572a Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Thu, 27 Jun 2024 11:07:45 +0200 Subject: [PATCH] Allow defining the media volume via JSON - Also verify JSON hosting website is safe to avoid IP-Grabbers on multiplayer servers --- .../picturesign/config/PictureSignConfig.java | 1 + .../render/PictureSignRenderer.java | 24 +++++++++++++++---- .../picturesign/util/MediaHandler.java | 6 ++++- .../assets/picturesign/lang/en_us.json | 1 + 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java b/common/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java index 15fb8f2..0cd6226 100755 --- a/common/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java +++ b/common/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java @@ -26,6 +26,7 @@ public class PictureSignConfig extends MidnightConfig { @Entry(category = advanced) public static List safeProviders = Lists.newArrayList("https://i.imgur.com/", "https://i.ibb.co/", "https://pictshare.net/", "https://iili.io/", "https://media1.tenor.com/"); @Entry(category = advanced) public static List safeGifProviders = Lists.newArrayList("https://i.imgur.com/", "https://media1.tenor.com/"); @Entry(category = advanced) public static List safeMultimediaProviders = Lists.newArrayList("https://youtube.com/", "https://www.youtube.com/", "https://youtu.be/","https://vimeo.com/"); + @Entry(category = advanced) public static List safeJsonProviders = Lists.newArrayList("https://github.com/", "https://gist.github.com/", "https://www.jsonkeeper.com/", "https://api.npoint.io/", "https://api.jsonsilo.com/"); @Comment(category = general) public static Comment ebeWarning; @Entry(category = advanced) public static MissingImageMode missingImageMode = MissingImageMode.BLACK; @Entry(category = advanced) public static PictureShader pictureShader = PictureShader.PosColTexLight; diff --git a/common/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java b/common/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java index 6896751..16e4810 100755 --- a/common/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java +++ b/common/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java @@ -21,6 +21,7 @@ import static eu.midnightdust.picturesign.PictureSignClient.id; public class PictureSignRenderer { private boolean isSafeUrl; + private boolean isSafeJsonUrl; public void render(SignBlockEntity signBlockEntity, MatrixStack matrixStack, int light, int overlay, boolean front) { PictureSignType type = PictureSignType.getType(signBlockEntity, front); @@ -29,11 +30,21 @@ public class PictureSignRenderer { if (!url.contains("://")) { url = "https://" + url; } - if (url.endsWith(".json")) { + isSafeJsonUrl = false; + String jsonUrl = url; + PictureSignConfig.safeJsonProviders.forEach(safe -> { + if (!isSafeUrl) isSafeJsonUrl = jsonUrl.startsWith(safe); + }); + if (url.endsWith(".json") || isSafeJsonUrl) { + if (PictureSignConfig.safeMode) { + if (!isSafeJsonUrl) return; + } + info = PictureURLUtils.infoFromJson(url); if (info == null) return; url = info.url(); } + if (!url.contains("://")) { url = "https://" + url; } @@ -62,8 +73,6 @@ public class PictureSignRenderer { if ((!PictureSignConfig.enableVideoSigns || !PictureSignClient.hasWaterMedia) && type != PictureSignType.PICTURE) return; if (url.startsWith("https://youtube.com/") || url.startsWith("https://www.youtube.com/watch?v=") || url.startsWith("https://youtu.be/")) { url = url.replace("https://www.", "https://"); - //url = url.replace("youtube.com/watch?v=", PictureSignConfig.invidiousInstance.replace("https://", "").replace("/", "")+"/latest_version?id="); - //url = url.replace("youtu.be/", PictureSignConfig.invidiousInstance.replace("https://", "").replace("/", "")+"/latest_version?id="); } World world = signBlockEntity.getWorld(); BlockPos pos = signBlockEntity.getPos(); @@ -74,7 +83,11 @@ public class PictureSignRenderer { GIFHandler gifHandler = null; if (PictureSignClient.hasWaterMedia) { if (type.isVideo || type.isAudio) mediaHandler = MediaHandler.getOrCreate(videoId, pos); - if (type == PictureSignType.GIF) gifHandler = GIFHandler.getOrCreate(videoId); + else if (type == PictureSignType.GIF) gifHandler = GIFHandler.getOrCreate(videoId); + else { + MediaHandler.closePlayer(videoId); + GIFHandler.closePlayer(videoId); + } } if (world != null && ((world.getBlockState(pos.down()).getBlock().equals(Blocks.REDSTONE_TORCH) || world.getBlockState(pos.down()).getBlock().equals(Blocks.REDSTONE_WALL_TORCH)) @@ -147,11 +160,12 @@ public class PictureSignRenderer { PictureSignClient.LOGGER.error(e); return; } + if (info != null && info.volume() != -1) mediaHandler.setMaxVolume(info.volume()); mediaHandler.setVolumeBasedOnDistance(); if (info != null && info.start() > 0 && mediaHandler.getTime() < info.start()) mediaHandler.setTime(info.start()); if (info != null && info.end() > 0 && mediaHandler.getTime() >= info.end() && !mediaHandler.playbackStarted) mediaHandler.stop(); } - else if (type == PictureSignType.GIF) { + else if (type == PictureSignType.GIF && gifHandler != null) { try { if (!gifHandler.hasMedia() && !gifHandler.playbackStarted) { gifHandler.play(url); diff --git a/common/src/main/java/eu/midnightdust/picturesign/util/MediaHandler.java b/common/src/main/java/eu/midnightdust/picturesign/util/MediaHandler.java index befda48..2cf693c 100644 --- a/common/src/main/java/eu/midnightdust/picturesign/util/MediaHandler.java +++ b/common/src/main/java/eu/midnightdust/picturesign/util/MediaHandler.java @@ -25,6 +25,7 @@ public class MediaHandler { public boolean playbackStarted = false; public boolean isDeactivated; private SyncBasePlayer player; + private int maxVolume = 100; private MediaHandler(Identifier id, BlockPos pos) { this.id = id; @@ -44,11 +45,14 @@ public class MediaHandler { return; } double distance = this.pos.getSquaredDistance(playerPos) / PictureSignConfig.audioDistanceMultiplier; - setVolume((int) Math.clamp(100-distance, 0, 100)); + setVolume((int) Math.clamp(maxVolume-distance, 0, 100)); } private void setVolume(int volume) { player.setVolume(volume); } + public void setMaxVolume(int volume) { + maxVolume = volume; + } public void closePlayer() { if (player != null) { diff --git a/common/src/main/resources/assets/picturesign/lang/en_us.json b/common/src/main/resources/assets/picturesign/lang/en_us.json index be502d8..fd82a69 100755 --- a/common/src/main/resources/assets/picturesign/lang/en_us.json +++ b/common/src/main/resources/assets/picturesign/lang/en_us.json @@ -21,6 +21,7 @@ "picturesign.midnightconfig.safeProviders":"Safe Image Providers", "picturesign.midnightconfig.safeGifProviders":"Safe GIF Providers", "picturesign.midnightconfig.safeMultimediaProviders":"Safe Multimedia Providers", + "picturesign.midnightconfig.safeJsonProviders":"Safe JSON Providers", "picturesign.midnightconfig.invidiousInstance":"Invidious Instance", "picturesign.midnightconfig.invidiousInstance.tooltip":"Select the Invidious instance that is being used to play YouTube videos. \nYou can find a list of them at\ndocs.invidious.io/instances/", "picturesign.midnightconfig.missingImageMode":"Missing image mode",