diff --git a/leaf-api/paper-patches/features/0003-Paper-Avoid-and-discourage-use-of-Maven-Central-as-a-CDN.patch b/leaf-api/paper-patches/features/0003-Paper-Avoid-and-discourage-use-of-Maven-Central-as-a-CDN.patch new file mode 100644 index 00000000..b0f3d5f7 --- /dev/null +++ b/leaf-api/paper-patches/features/0003-Paper-Avoid-and-discourage-use-of-Maven-Central-as-a-CDN.patch @@ -0,0 +1,112 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> +Date: Wed, 18 Jun 2025 10:47:21 -0700 +Subject: [PATCH] Paper: Avoid and discourage use of Maven Central as a CDN + +Original license: GPLv3 +Original project: https://github.com/PaperMC/Paper + +https://github.com/PaperMC/Paper/commit/62b7f86dae659deb2fc450285452d7c1439f92dc + +Default LibraryLoader to Google's Maven Central mirror, add MavenLibraryResolver.MAVEN_CENTRAL_DEFAULT_MIRROR, and warn on use of Maven Central with MavenLibraryResolver + +https://www.sonatype.com/blog/maven-central-and-the-tragedy-of-the-commons +https://www.sonatype.com/blog/beyond-ips-addressing-organizational-overconsumption-in-maven-central + +diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java +index 107705db2d82b7c191e5e625ec888e0bc3b03831..ebb52c2c8d5fe8ca25513aadae8168180a3d426e 100644 +--- a/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java ++++ b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java +@@ -41,7 +41,7 @@ import org.slf4j.LoggerFactory; + * MavenLibraryResolver resolver = new MavenLibraryResolver(); + * resolver.addDependency(new Dependency(new DefaultArtifact("org.jooq:jooq:3.17.7"), null)); + * resolver.addRepository(new RemoteRepository.Builder( +- * "central", "default", "https://repo1.maven.org/maven2/" ++ * "central", "default", MavenLibraryResolver.MAVEN_CENTRAL_DEFAULT_MIRROR // Paper - Avoid and discourage use of Maven Central as a CDN + * ).build()); + * } + *

+@@ -50,6 +50,24 @@ import org.slf4j.LoggerFactory; + @NullMarked + public class MavenLibraryResolver implements ClassPathLibrary { + ++ // Paper start - Avoid and discourage use of Maven Central as a CDN ++ /** ++ * The default Maven Central mirror, configurable through the {@code PAPER_DEFAULT_CENTRAL_REPOSITORY} environment ++ * variable. Use this instead of Maven Central directly when you do not have your own mirror, as using ++ * Maven Central as a CDN is against the Maven Central Terms of Service, and you will cause users to hit ++ * rate limits. ++ * ++ *

This repository is also used by the legacy {@link org.bukkit.plugin.java.LibraryLoader}.

++ */ ++ public static final String MAVEN_CENTRAL_DEFAULT_MIRROR = getDefaultMavenCentralMirror(); ++ private static final List MAVEN_CENTRAL_URLS = List.of( ++ "https://repo1.maven.org/maven2", ++ "http://repo1.maven.org/maven2", ++ "https://repo.maven.apache.org/maven2", ++ "http://repo.maven.apache.org/maven2" ++ ); ++ // Paper end - Avoid and discourage use of Maven Central as a CDN ++ + private static final Logger LOGGER = LoggerFactory.getLogger("MavenLibraryResolver"); + + private final RepositorySystem repository; +@@ -105,6 +123,14 @@ public class MavenLibraryResolver implements ClassPathLibrary { + * dependencies from + */ + public void addRepository(final RemoteRepository remoteRepository) { ++ // Paper start - Avoid and discourage use of Maven Central as a CDN ++ if (MAVEN_CENTRAL_URLS.stream().anyMatch(remoteRepository.getUrl()::startsWith)) { ++ LOGGER.warn( ++ "Use of Maven Central as a CDN is against the Maven Central Terms of Service. Use MavenLibraryResolver.MAVEN_CENTRAL_DEFAULT_MIRROR instead.", ++ new RuntimeException("Plugin used Maven Central for library resolution") ++ ); ++ } ++ // Paper end - Avoid and discourage use of Maven Central as a CDN + this.repositories.add(remoteRepository); + } + +@@ -130,4 +156,17 @@ public class MavenLibraryResolver implements ClassPathLibrary { + store.addLibrary(file.toPath()); + } + } ++ ++ // Paper start - Avoid and discourage use of Maven Central as a CDN ++ private static String getDefaultMavenCentralMirror() { ++ String central = System.getenv("PAPER_DEFAULT_CENTRAL_REPOSITORY"); ++ if (central == null) { ++ central = System.getProperty("org.bukkit.plugin.java.LibraryLoader.centralURL"); ++ } ++ if (central == null) { ++ central = "https://maven-central.storage-download.googleapis.com/maven2"; ++ } ++ return central; ++ } ++ // Paper end - Avoid and discourage use of Maven Central as a CDN + } +diff --git a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java +index 211c093ce2253e918cd40725ebf1ef172d1b9bdf..998a5278f39d13ed6b0a6d03514658f28b0d420f 100644 +--- a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java ++++ b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java +@@ -49,6 +49,12 @@ public class LibraryLoader + public static java.util.function.BiFunction LIBRARY_LOADER_FACTORY; // Paper - rewrite reflection in libraries + public static java.util.function.Function, List> REMAPPER; // Paper - remap libraries + ++ // Paper start - Avoid and discourage use of Maven Central as a CDN ++ private static List getRepositories() { ++ return List.of(new RemoteRepository.Builder("central", "default", io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver.MAVEN_CENTRAL_DEFAULT_MIRROR).build()); ++ } ++ // Paper end - Avoid and discourage use of Maven Central as a CDN ++ + public LibraryLoader(@NotNull Logger logger) + { + this.logger = logger; +@@ -79,7 +85,7 @@ public class LibraryLoader + session.setSystemProperties( System.getProperties() ); + session.setReadOnly(); + +- this.repositories = repository.newResolutionRepositories( session, Arrays.asList( new RemoteRepository.Builder( "central", "default", "https://repo.maven.apache.org/maven2" ).build() ) ); ++ this.repositories = repository.newResolutionRepositories( session, getRepositories()); // Paper - Avoid and discourage use of Maven Central as a CDN + } + + @Nullable diff --git a/leaf-api/paper-patches/features/0003-Pufferfish-Sentry.patch b/leaf-api/paper-patches/features/0004-Pufferfish-Sentry.patch similarity index 100% rename from leaf-api/paper-patches/features/0003-Pufferfish-Sentry.patch rename to leaf-api/paper-patches/features/0004-Pufferfish-Sentry.patch diff --git a/leaf-api/paper-patches/features/0004-Purpur-API-Changes.patch b/leaf-api/paper-patches/features/0005-Purpur-API-Changes.patch similarity index 100% rename from leaf-api/paper-patches/features/0004-Purpur-API-Changes.patch rename to leaf-api/paper-patches/features/0005-Purpur-API-Changes.patch diff --git a/leaf-api/paper-patches/features/0005-Remove-Timings.patch b/leaf-api/paper-patches/features/0006-Remove-Timings.patch similarity index 100% rename from leaf-api/paper-patches/features/0005-Remove-Timings.patch rename to leaf-api/paper-patches/features/0006-Remove-Timings.patch diff --git a/leaf-api/paper-patches/features/0006-KeYi-Player-Skull-API.patch b/leaf-api/paper-patches/features/0007-KeYi-Player-Skull-API.patch similarity index 100% rename from leaf-api/paper-patches/features/0006-KeYi-Player-Skull-API.patch rename to leaf-api/paper-patches/features/0007-KeYi-Player-Skull-API.patch diff --git a/leaf-api/paper-patches/features/0008-Configurable-LibraryLoader-maven-repos.patch b/leaf-api/paper-patches/features/0008-Configurable-LibraryLoader-maven-repos.patch deleted file mode 100644 index 2568be33..00000000 --- a/leaf-api/paper-patches/features/0008-Configurable-LibraryLoader-maven-repos.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> -Date: Sat, 3 Feb 2024 18:45:53 -0500 -Subject: [PATCH] Configurable LibraryLoader maven repos - -TODO - Dreeam: Support multi maven repos for lib downloading. - -Add JVM flag `-DLeaf.library-download-repo=link` to choose library download repo link. -e.g. `-DLeaf.library-download-repo=https://maven.aliyun.com/repository/public` - -diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java -index 107705db2d82b7c191e5e625ec888e0bc3b03831..77a58fc7c173b1724d44b0eeaf23b4a1b22b5fcb 100644 ---- a/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java -+++ b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java -@@ -105,7 +105,7 @@ public class MavenLibraryResolver implements ClassPathLibrary { - * dependencies from - */ - public void addRepository(final RemoteRepository remoteRepository) { -- this.repositories.add(remoteRepository); -+ this.repositories.add(org.dreeam.leaf.plugin.loader.MavenCentralMirror.getCentralRepo(remoteRepository)); // Leaf - Configurable LibraryLoader maven repos - } - - /** -diff --git a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java -index 211c093ce2253e918cd40725ebf1ef172d1b9bdf..096140a91f19eb31a10631b949f4402e37e1c601 100644 ---- a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java -+++ b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java -@@ -79,7 +79,19 @@ public class LibraryLoader - session.setSystemProperties( System.getProperties() ); - session.setReadOnly(); - -- this.repositories = repository.newResolutionRepositories( session, Arrays.asList( new RemoteRepository.Builder( "central", "default", "https://repo.maven.apache.org/maven2" ).build() ) ); -+ // Leaf start - Configurable LibraryLoader maven repos -+ this.repositories = repository.newResolutionRepositories( -+ session, -+ List.of(org.dreeam.leaf.plugin.loader.MavenCentralMirror.getCentralRepo("https://repo.maven.apache.org/maven2")) -+ ); -+ /* // Dreeam TODO -+ this.repositories = repository.newResolutionRepositories(session, List.of( -+ new RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2").build(), -+ new RemoteRepository.Builder("aliyun", "default", "https://maven.aliyun.com/repository/public").build(), -+ new RemoteRepository.Builder("tencentclound", "default", "https://mirrors.cloud.tencent.com/nexus/repository/maven-public/").build(), -+ new RemoteRepository.Builder("huaweicloud", "default", "https://repo.huaweicloud.com/repository/maven/").build() -+ ));*/ -+ // Leaf end - Configurable LibraryLoader maven repos - } - - @Nullable -diff --git a/src/main/java/org/dreeam/leaf/plugin/loader/MavenCentralMirror.java b/src/main/java/org/dreeam/leaf/plugin/loader/MavenCentralMirror.java -new file mode 100644 -index 0000000000000000000000000000000000000000..95534cb6d771a0fe288e7c843c41b0036bdc7095 ---- /dev/null -+++ b/src/main/java/org/dreeam/leaf/plugin/loader/MavenCentralMirror.java -@@ -0,0 +1,24 @@ -+package org.dreeam.leaf.plugin.loader; -+ -+import org.eclipse.aether.repository.RemoteRepository; -+ -+public class MavenCentralMirror { -+ -+ public static final String MAVEN_CENTRAL_MIRROR_REPO = System.getProperty("Leaf.library-download-repo"); -+ -+ public static RemoteRepository getCentralRepo(RemoteRepository repo) { -+ if (MAVEN_CENTRAL_MIRROR_REPO != null && repo.getUrl().contains("repo.maven.apache.org/maven2")) { -+ repo = new RemoteRepository.Builder("central", "default", MAVEN_CENTRAL_MIRROR_REPO).build(); -+ } -+ -+ return repo; -+ } -+ -+ public static RemoteRepository getCentralRepo(String repo) { -+ if (MAVEN_CENTRAL_MIRROR_REPO != null) { -+ repo = MAVEN_CENTRAL_MIRROR_REPO; -+ } -+ -+ return new RemoteRepository.Builder("central", "default", repo).build(); -+ } -+} diff --git a/leaf-api/paper-patches/features/0007-Slice-Smooth-Teleports.patch b/leaf-api/paper-patches/features/0008-Slice-Smooth-Teleports.patch similarity index 95% rename from leaf-api/paper-patches/features/0007-Slice-Smooth-Teleports.patch rename to leaf-api/paper-patches/features/0008-Slice-Smooth-Teleports.patch index 651e7397..c75b4a33 100644 --- a/leaf-api/paper-patches/features/0007-Slice-Smooth-Teleports.patch +++ b/leaf-api/paper-patches/features/0008-Slice-Smooth-Teleports.patch @@ -9,7 +9,7 @@ Original project: https://github.com/Cryptite/Slice Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 2a8abee51e8fad62b0aa58a47eadfbac2bf51fdf..716f99b4d09ffd415f8a53a90031c92d8931f125 100644 +index 69f7a2fa54b667f2bb97454d6be9f6322a9aa43d..c92e0bb60504900fa1d1e7c86534a46578c91799 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -3709,6 +3709,33 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM diff --git a/leaf-api/paper-patches/features/0009-Configurable-LibraryLoader-maven-repos.patch b/leaf-api/paper-patches/features/0009-Configurable-LibraryLoader-maven-repos.patch new file mode 100644 index 00000000..151b87cc --- /dev/null +++ b/leaf-api/paper-patches/features/0009-Configurable-LibraryLoader-maven-repos.patch @@ -0,0 +1,86 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> +Date: Sat, 3 Feb 2024 18:45:53 -0500 +Subject: [PATCH] Configurable LibraryLoader maven repos + +Add JVM flag `-DLeaf.library-download-repo=link` to choose library download repo link. +e.g. `-DLeaf.library-download-repo=https://maven.aliyun.com/repository/public` + +diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java +index ebb52c2c8d5fe8ca25513aadae8168180a3d426e..006a86da6afa1b7b80df5df073ebd236e27cd2b5 100644 +--- a/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java ++++ b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java +@@ -60,12 +60,16 @@ public class MavenLibraryResolver implements ClassPathLibrary { + *

This repository is also used by the legacy {@link org.bukkit.plugin.java.LibraryLoader}.

+ */ + public static final String MAVEN_CENTRAL_DEFAULT_MIRROR = getDefaultMavenCentralMirror(); +- private static final List MAVEN_CENTRAL_URLS = List.of( ++ // Leaf start - Configurable LibraryLoader maven repos ++ @org.jspecify.annotations.Nullable ++ public static final RemoteRepository MAVEN_CENTRAL_MIRROR_REPO = getCentralMirrorRepo(); ++ private static final String[] MAVEN_CENTRAL_URLS = new String[]{ + "https://repo1.maven.org/maven2", + "http://repo1.maven.org/maven2", + "https://repo.maven.apache.org/maven2", + "http://repo.maven.apache.org/maven2" +- ); ++ }; ++ // Leaf end - Configurable LibraryLoader maven repos + // Paper end - Avoid and discourage use of Maven Central as a CDN + + private static final Logger LOGGER = LoggerFactory.getLogger("MavenLibraryResolver"); +@@ -124,12 +128,21 @@ public class MavenLibraryResolver implements ClassPathLibrary { + */ + public void addRepository(final RemoteRepository remoteRepository) { + // Paper start - Avoid and discourage use of Maven Central as a CDN +- if (MAVEN_CENTRAL_URLS.stream().anyMatch(remoteRepository.getUrl()::startsWith)) { +- LOGGER.warn( +- "Use of Maven Central as a CDN is against the Maven Central Terms of Service. Use MavenLibraryResolver.MAVEN_CENTRAL_DEFAULT_MIRROR instead.", +- new RuntimeException("Plugin used Maven Central for library resolution") +- ); ++ // Leaf start - Configurable LibraryLoader maven repos ++ for (String url : MAVEN_CENTRAL_URLS) { ++ if (remoteRepository.getUrl().startsWith(url)) { ++ RemoteRepository mirrorRepo = MAVEN_CENTRAL_MIRROR_REPO; ++ if (mirrorRepo != null) { ++ this.repositories.add(mirrorRepo); ++ return; ++ } ++ LOGGER.warn( ++ "Use of Maven Central as a CDN is against the Maven Central Terms of Service. Use MavenLibraryResolver.MAVEN_CENTRAL_DEFAULT_MIRROR instead.", ++ new RuntimeException("Plugin used Maven Central for library resolution") ++ ); ++ } + } ++ // Leaf end - Configurable LibraryLoader maven repos + // Paper end - Avoid and discourage use of Maven Central as a CDN + this.repositories.add(remoteRepository); + } +@@ -169,4 +182,15 @@ public class MavenLibraryResolver implements ClassPathLibrary { + return central; + } + // Paper end - Avoid and discourage use of Maven Central as a CDN ++ ++ // Leaf start - Configurable LibraryLoader maven repos ++ @org.jspecify.annotations.Nullable ++ private static RemoteRepository getCentralMirrorRepo() { ++ String mirrorAddr = System.getProperty("Leaf.library-download-repo"); ++ if (mirrorAddr != null) { ++ new RemoteRepository.Builder("central", "default", mirrorAddr).build(); ++ } ++ return null; ++ } ++ // Leaf end - Configurable LibraryLoader maven repos + } +diff --git a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java +index 998a5278f39d13ed6b0a6d03514658f28b0d420f..2b4f6f305d3e4418b912e36a6b603c412111947f 100644 +--- a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java ++++ b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java +@@ -51,6 +51,7 @@ public class LibraryLoader + + // Paper start - Avoid and discourage use of Maven Central as a CDN + private static List getRepositories() { ++ if (io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver.MAVEN_CENTRAL_MIRROR_REPO != null) return List.of(io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver.MAVEN_CENTRAL_MIRROR_REPO); // Leaf - Configurable LibraryLoader maven repos + return List.of(new RemoteRepository.Builder("central", "default", io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver.MAVEN_CENTRAL_DEFAULT_MIRROR).build()); + } + // Paper end - Avoid and discourage use of Maven Central as a CDN diff --git a/leaf-api/paper-patches/features/0009-Leaves-Replay-Mod-API.patch b/leaf-api/paper-patches/features/0010-Leaves-Replay-Mod-API.patch similarity index 100% rename from leaf-api/paper-patches/features/0009-Leaves-Replay-Mod-API.patch rename to leaf-api/paper-patches/features/0010-Leaves-Replay-Mod-API.patch diff --git a/leaf-api/paper-patches/features/0010-Async-structure-locate-api.patch b/leaf-api/paper-patches/features/0011-Async-structure-locate-api.patch similarity index 100% rename from leaf-api/paper-patches/features/0010-Async-structure-locate-api.patch rename to leaf-api/paper-patches/features/0011-Async-structure-locate-api.patch diff --git a/leaf-api/paper-patches/features/0011-PlayerInventoryOverflowEvent.patch b/leaf-api/paper-patches/features/0012-PlayerInventoryOverflowEvent.patch similarity index 100% rename from leaf-api/paper-patches/features/0011-PlayerInventoryOverflowEvent.patch rename to leaf-api/paper-patches/features/0012-PlayerInventoryOverflowEvent.patch diff --git a/leaf-api/paper-patches/features/0012-Raytrace-AntiXray-SDK-integration.patch b/leaf-api/paper-patches/features/0013-Raytrace-AntiXray-SDK-integration.patch similarity index 100% rename from leaf-api/paper-patches/features/0012-Raytrace-AntiXray-SDK-integration.patch rename to leaf-api/paper-patches/features/0013-Raytrace-AntiXray-SDK-integration.patch