From 070f8a720fa699469a65bb7b64d8d2a618301ede Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:38:22 +0200 Subject: [PATCH 01/54] Bump org.slf4j:slf4j-api from 2.0.15 to 2.0.16 (#41) Bumps org.slf4j:slf4j-api from 2.0.15 to 2.0.16. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ca8a652..8b042de 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ dependencies { api("io.jsonwebtoken:jjwt-gson:0.12.6") { exclude group: "com.google.code.gson", module: "gson" } - api "org.slf4j:slf4j-api:2.0.15" + api "org.slf4j:slf4j-api:2.0.16" } sourceSets { From b3a49f8c366169400fb44a3b3587634dc6f2943b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 18 Aug 2024 10:03:32 +0200 Subject: [PATCH 02/54] Update Gradle Wrapper from 8.9 to 8.10. (#42) Signed-off-by: gradle-update-robot Co-authored-by: gradle-update-robot --- gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 3 ++- gradlew | 5 ++++- gradlew.bat | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch delta 12612 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 HJ4oML2Lo<@i8BwbL^1~GkG`E7C$SEa_ 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09523c0..2b18997 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf1..f5feea6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 25da30d..9d21a21 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## From a56d46708665688e1443332795f3e922e48803d0 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:33:25 +0200 Subject: [PATCH 03/54] Check whole token chain for expiry Also ensures the whole token chain is valid after calling refresh --- .../java/net/raphimc/minecraftauth/step/AbstractStep.java | 8 ++++---- .../raphimc/minecraftauth/step/bedrock/StepMCChain.java | 4 ++++ .../minecraftauth/step/bedrock/StepPlayFabToken.java | 2 +- .../net/raphimc/minecraftauth/step/java/StepMCToken.java | 2 +- .../minecraftauth/step/java/StepPlayerCertificates.java | 2 +- .../minecraftauth/step/xbl/StepXblSisuAuthentication.java | 4 ++-- .../raphimc/minecraftauth/step/xbl/StepXblTitleToken.java | 2 +- .../raphimc/minecraftauth/step/xbl/StepXblUserToken.java | 2 +- .../raphimc/minecraftauth/step/xbl/StepXblXstsToken.java | 2 +- 9 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/raphimc/minecraftauth/step/AbstractStep.java b/src/main/java/net/raphimc/minecraftauth/step/AbstractStep.java index 552464c..c631703 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/AbstractStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/AbstractStep.java @@ -86,21 +86,21 @@ public abstract static class StepResult

> { protected abstract P prevResult(); /** - * Checks if this result is expired.
+ * Checks if this or any previous result is expired.
* Results that have no expire time returned by their API are never considered expired.
* If you want to minimize the amount of HTTP requests, you should only call {@link AbstractStep#refresh} if this method returns true.
* For certain use cases, like joining a Minecraft server, you want to make sure that the data is up-to-date, even if it is not expired yet. See {@link StepResult#isExpiredOrOutdated}. * - * @return true if this result is expired + * @return true if this or any previous result is expired */ public abstract boolean isExpired(); /** - * Checks if this result is expired or potentially outdated.
+ * Checks if this or any previous result is expired or potentially outdated.
* Results that have no expire time returned by their API are always considered outdated.
* If you want the data in the result to be up-to-date, you should call {@link AbstractStep#refresh} if this method returns true.
* - * @return true if this result is potentially outdated or expired + * @return true if this or any previous result is potentially outdated or expired */ public boolean isExpiredOrOutdated() { return this.isExpired(); diff --git a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java index 3839079..a1c72fb 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java +++ b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java @@ -175,6 +175,10 @@ protected StepXblXstsToken.XblXsts prevResult() { @Override public boolean isExpired() { + if (this.prevResult().isExpired()) { + return true; + } + // Cache the result for 1 second because it's expensive to check if (System.currentTimeMillis() - this.lastExpireCheckTimeMs < 1000) { return this.lastExpireCheckResult; diff --git a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepPlayFabToken.java b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepPlayFabToken.java index b229254..85fbef5 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepPlayFabToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepPlayFabToken.java @@ -129,7 +129,7 @@ protected StepXblXstsToken.XblXsts prevResult() { @Override public boolean isExpired() { - return this.expireTimeMs <= System.currentTimeMillis(); + return this.expireTimeMs <= System.currentTimeMillis() || this.prevResult().isExpired(); } } diff --git a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCToken.java b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCToken.java index 76cdac7..0605cef 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCToken.java @@ -98,7 +98,7 @@ protected StepXblXstsToken.XblXsts prevResult() { @Override public boolean isExpired() { - return this.expireTimeMs <= System.currentTimeMillis(); + return this.expireTimeMs <= System.currentTimeMillis() || this.prevResult().isExpired(); } } diff --git a/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java b/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java index 0e21c85..1f38bf6 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java +++ b/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java @@ -123,7 +123,7 @@ protected StepMCToken.MCToken prevResult() { @Override public boolean isExpired() { - return this.expireTimeMs <= System.currentTimeMillis(); + return this.expireTimeMs <= System.currentTimeMillis() || this.prevResult().isExpired(); } } diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblSisuAuthentication.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblSisuAuthentication.java index 8d4cb58..b927e62 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblSisuAuthentication.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblSisuAuthentication.java @@ -152,12 +152,12 @@ protected StepInitialXblSession.InitialXblSession prevResult() { @Override public boolean isExpired() { - return this.userToken.isExpired() || this.titleToken.isExpired() || this.xstsToken.isExpired(); + return this.userToken.isExpired() || this.titleToken.isExpired() || this.xstsToken.isExpired() || this.prevResult().isExpired(); } @Override public boolean isExpiredOrOutdated() { - return this.userToken.isExpiredOrOutdated() || this.titleToken.isExpiredOrOutdated() || this.xstsToken.isExpiredOrOutdated(); + return this.userToken.isExpiredOrOutdated() || this.titleToken.isExpiredOrOutdated() || this.xstsToken.isExpiredOrOutdated() || this.prevResult().isExpiredOrOutdated(); } } diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblTitleToken.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblTitleToken.java index fcfaec0..d862640 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblTitleToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblTitleToken.java @@ -132,7 +132,7 @@ protected StepInitialXblSession.InitialXblSession prevResult() { @Override public boolean isExpired() { - return this.expireTimeMs <= System.currentTimeMillis(); + return this.expireTimeMs <= System.currentTimeMillis() || this.prevResult().isExpired(); } } diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblUserToken.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblUserToken.java index b1187d7..6f71964 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblUserToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblUserToken.java @@ -128,7 +128,7 @@ protected StepInitialXblSession.InitialXblSession prevResult() { @Override public boolean isExpired() { - return this.expireTimeMs <= System.currentTimeMillis(); + return this.expireTimeMs <= System.currentTimeMillis() || this.prevResult().isExpired(); } } diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblXstsToken.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblXstsToken.java index bb85977..af1131c 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblXstsToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblXstsToken.java @@ -152,7 +152,7 @@ protected StepFullXblSession.FullXblSession prevResult() { @Override public boolean isExpired() { - return this.expireTimeMs <= System.currentTimeMillis(); + return this.expireTimeMs <= System.currentTimeMillis() || this.prevResult().isExpired(); } } From e64c5d506ea62f505d371daf8c1acf62e6ab86f6 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Mon, 26 Aug 2024 01:10:22 +0200 Subject: [PATCH 04/54] Use java crypto when signing requests if possible --- .../raphimc/minecraftauth/util/CryptUtil.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java b/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java index f0a1748..6702033 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java +++ b/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java @@ -31,10 +31,7 @@ import java.io.IOException; import java.math.BigInteger; import java.nio.charset.StandardCharsets; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; +import java.security.*; import java.security.interfaces.ECPrivateKey; import java.security.interfaces.ECPublicKey; import java.security.spec.InvalidKeySpecException; @@ -124,7 +121,21 @@ public static HttpHeader getSignatureHeader(final HttpRequest httpRequest, final data = new DataOutputStream(header); data.writeInt(1); // Policy Version data.writeLong(windowsTimestamp); // Timestamp - data.write(Jwts.SIG.ES256.digest(new DefaultSecureRequest<>(new ByteArrayInputStream(signatureContent.toByteArray()), null, null, privateKey))); // Signature + + try { + byte[] signature; + try { // Java 9+ only + final Signature ecdsaSignature = Signature.getInstance("SHA256withECDSAinP1363Format"); + ecdsaSignature.initSign(privateKey); + ecdsaSignature.update(signatureContent.toByteArray()); + signature = ecdsaSignature.sign(); + } catch (NoSuchAlgorithmException e) { // Fallback for Java 8 + signature = Jwts.SIG.ES256.digest(new DefaultSecureRequest<>(new ByteArrayInputStream(signatureContent.toByteArray()), null, null, privateKey)); + } + data.write(signature); // Signature + } catch (Throwable e) { + throw new RuntimeException("Could not sign request", e); + } return new HttpHeader("Signature", Base64.getEncoder().encodeToString(header.toByteArray())); } From 6b29b4ad40d627a4b0ae8b199b08c929965082fa Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Thu, 12 Sep 2024 15:59:39 +0200 Subject: [PATCH 05/54] Throw nicer error message if HTML parsing failed --- .../step/msa/StepCredentialsMsaCode.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java index 4691498..6d3e7da 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java @@ -167,15 +167,23 @@ protected MsaCode execute(final ILogger logger, final HttpClient httpClient, fin private JsonObject extractConfig(final String html) { switch (this.applicationDetails.getOAuthEnvironment()) { case LIVE: { - final JsonReader jsonReader = new JsonReader(new StringReader(html.substring(html.indexOf("var ServerData = ") + 17))); - jsonReader.setLenient(true); - return JsonUtil.GSON.fromJson(jsonReader, JsonObject.class); + try { + final JsonReader jsonReader = new JsonReader(new StringReader(html.substring(html.indexOf("var ServerData = ") + 17))); + jsonReader.setLenient(true); + return JsonUtil.GSON.fromJson(jsonReader, JsonObject.class); + } catch (Throwable e) { + throw new IllegalStateException("Could not extract config from html. This most likely indicates that the login was not successful", e); + } } case MICROSOFT_ONLINE_COMMON: case MICROSOFT_ONLINE_CONSUMERS: { - final JsonReader jsonReader = new JsonReader(new StringReader(html.substring(html.indexOf("$Config=") + 8))); - jsonReader.setLenient(true); - return JsonUtil.GSON.fromJson(jsonReader, JsonObject.class); + try { + final JsonReader jsonReader = new JsonReader(new StringReader(html.substring(html.indexOf("$Config=") + 8))); + jsonReader.setLenient(true); + return JsonUtil.GSON.fromJson(jsonReader, JsonObject.class); + } catch (Throwable e) { + throw new IllegalStateException("Could not extract config from html. This most likely indicates that the login was not successful", e); + } } default: throw new IllegalStateException("Unsupported OAuthEnvironment: " + this.applicationDetails.getOAuthEnvironment()); From c8308a7c4cbe5ee92b3f4df4f18fb20199185907 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 15 Sep 2024 11:14:42 +0200 Subject: [PATCH 06/54] Update Gradle Wrapper from 8.10 to 8.10.1. (#43) Signed-off-by: gradle-update-robot Co-authored-by: gradle-update-robot --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2b18997..8e876e1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionSha256Sum=1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 04390ba3f53cd25a34cc7a178ac8e25c74df7986 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sun, 15 Sep 2024 11:45:42 +0200 Subject: [PATCH 07/54] Use Java 21 in gradle wrapper update action --- .github/workflows/update-gradle-wrapper.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 0da284f..65bb1c9 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -10,5 +10,11 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + check-latest: true - name: Update Gradle Wrapper uses: gradle-update/update-gradle-wrapper-action@v1 From 459507702d3f856bc4df8aacfb20830f335b39cb Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Tue, 17 Sep 2024 00:11:27 +0200 Subject: [PATCH 08/54] Updated gradle wrapper update action --- .github/workflows/update-gradle-wrapper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 65bb1c9..1bc2373 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -17,4 +17,4 @@ jobs: java-version: 21 check-latest: true - name: Update Gradle Wrapper - uses: gradle-update/update-gradle-wrapper-action@v1 + uses: gradle-update/update-gradle-wrapper-action@v2 From 7c4758c364bf53dfea4d4b0f5443a40c4f241cb3 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Tue, 24 Sep 2024 18:19:39 +0200 Subject: [PATCH 09/54] Release 4.1.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index bc5ee59..6829dc4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.configureondemand=true maven_group=net.raphimc maven_name=MinecraftAuth -maven_version=4.1.1-SNAPSHOT +maven_version=4.1.1 From 6fa996f004be4c5df418f4c14827c9f9873b868b Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Tue, 24 Sep 2024 18:29:56 +0200 Subject: [PATCH 10/54] Bump version to 4.1.2-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 6829dc4..99d9416 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.configureondemand=true maven_group=net.raphimc maven_name=MinecraftAuth -maven_version=4.1.1 +maven_version=4.1.2-SNAPSHOT From 81d664875be80c256e6c2c365f1ceae9d9c04d1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:32:33 +0200 Subject: [PATCH 11/54] Bump org.jetbrains:annotations from 24.1.0 to 25.0.0 (#44) Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 24.1.0 to 25.0.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/24.1.0...25.0.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8b042de..c2ce533 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ repositories { dependencies { compileOnly(annotationProcessor("org.projectlombok:lombok:1.18.34")) - compileOnly "org.jetbrains:annotations:24.1.0" + compileOnly "org.jetbrains:annotations:25.0.0" compileOnly sourceSets.javaFxStub.output api "net.lenni0451.commons:httpclient:1.6.0" From 2b407789ef99e254c2ea65030b75e09695a5bdc1 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sat, 28 Sep 2024 23:19:25 +0200 Subject: [PATCH 12/54] Updated github actions to use ubuntu 24.04 --- .github/workflows/build.yml | 2 +- .github/workflows/update-gradle-wrapper.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5fcd6ee..d3e5f47 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} steps: - name: Checkout Repository diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 1bc2373..1dd36f6 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -6,7 +6,7 @@ on: jobs: update-gradle-wrapper: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Checkout Repository uses: actions/checkout@v4 From 404ec4080ce614711d06f10449e59a1769901951 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 29 Sep 2024 08:06:07 +0200 Subject: [PATCH 13/54] Update Gradle Wrapper from 8.10.1 to 8.10.2 (#45) Signed-off-by: gradle-update-robot Co-authored-by: gradle-update-robot --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8e876e1..fb602ee 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip +distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From b7f504e66b1da8b886841083166cc3c26eb7d5d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 13:50:38 +0200 Subject: [PATCH 14/54] Bump org.jetbrains:annotations from 25.0.0 to 26.0.0 (#46) Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 25.0.0 to 26.0.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/25.0.0...26.0.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c2ce533..a715f72 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ repositories { dependencies { compileOnly(annotationProcessor("org.projectlombok:lombok:1.18.34")) - compileOnly "org.jetbrains:annotations:25.0.0" + compileOnly "org.jetbrains:annotations:26.0.0" compileOnly sourceSets.javaFxStub.output api "net.lenni0451.commons:httpclient:1.6.0" From b498ec0efb53ab5b3955b25f87691b3936452cca Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sun, 13 Oct 2024 22:56:46 +0200 Subject: [PATCH 15/54] Fixed local webserver auth flow --- .../net/raphimc/minecraftauth/step/msa/MsaCodeStep.java | 9 +++++++++ .../minecraftauth/step/msa/StepLocalWebServer.java | 7 +++++-- .../step/msa/StepLocalWebServerMsaCode.java | 1 + .../net/raphimc/minecraftauth/step/msa/StepMsaToken.java | 6 +++++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/MsaCodeStep.java b/src/main/java/net/raphimc/minecraftauth/step/msa/MsaCodeStep.java index 8bfcacf..5ff3ff5 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/MsaCodeStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/MsaCodeStep.java @@ -72,6 +72,15 @@ public static class MsaCode extends AbstractStep.FirstStepResult { @EqualsAndHashCode.Exclude StepMsaToken.MsaToken msaToken; // Used in device code flow + @ApiStatus.Internal + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + @PackagePrivate + @NonFinal + @ToString.Exclude + @EqualsAndHashCode.Exclude + String customRedirectUri; // Used in local webserver flow + @Override public boolean isExpired() { return true; // MsaCode can only be used one time and can't be refreshed diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServer.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServer.java index 78359b6..015f113 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServer.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServer.java @@ -48,16 +48,18 @@ protected LocalWebServer execute(final ILogger logger, final HttpClient httpClie try (final ServerSocket localServer = new ServerSocket(0)) { final int localPort = localServer.getLocalPort(); + final String customRedirectUri = this.applicationDetails.getRedirectUri() + ":" + localPort; final URL authenticationUrl = new URLWrapper(this.applicationDetails.getOAuthEnvironment().getAuthorizeUrl()).wrapQuery() .addQueries(this.applicationDetails.getOAuthParameters()) - .setQuery("redirect_uri", this.applicationDetails.getRedirectUri() + ":" + localPort) + .setQuery("redirect_uri", customRedirectUri) .setQuery("prompt", "select_account") .apply().toURL(); final LocalWebServer localWebServer = new LocalWebServer( authenticationUrl.toString(), - localPort + localPort, + customRedirectUri ); logger.info(this, "Created local webserver MSA authentication URL: " + localWebServer.getAuthenticationUrl()); localWebServerCallback.callback.accept(localWebServer); @@ -71,6 +73,7 @@ public static class LocalWebServer extends AbstractStep.InitialInput { String authenticationUrl; int port; + String customRedirectUri; } diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServerMsaCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServerMsaCode.java index 0321f54..c08bf17 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServerMsaCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServerMsaCode.java @@ -83,6 +83,7 @@ protected MsaCode execute(final ILogger logger, final HttpClient httpClient, fin try { final MsaCode msaCode = msaCodeFuture.get(this.timeout, TimeUnit.MILLISECONDS); + msaCode.customRedirectUri = localWebServer.getCustomRedirectUri(); httpServer.stop(0); logger.info(this, "Got MSA Code"); return msaCode; diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaToken.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaToken.java index 2a8c29d..39c8ed9 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaToken.java @@ -104,7 +104,11 @@ private MsaToken execute(final ILogger logger, final HttpClient httpClient, fina postData.put("refresh_token", codeOrRefreshToken); } else if (type.equals("authorization_code")) { postData.put("code", codeOrRefreshToken); - postData.put("redirect_uri", this.applicationDetails.getRedirectUri()); + if (msaCode.customRedirectUri != null) { + postData.put("redirect_uri", msaCode.customRedirectUri); + } else { + postData.put("redirect_uri", this.applicationDetails.getRedirectUri()); + } } else { throw new IllegalArgumentException("Invalid type: " + type); } From a220a0d40ef43b6b77b6130dc914ed9c005b300e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 09:39:25 +0200 Subject: [PATCH 16/54] Bump org.jetbrains:annotations from 26.0.0 to 26.0.1 (#47) Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.0 to 26.0.1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.0...26.0.1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a715f72..27f8819 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ repositories { dependencies { compileOnly(annotationProcessor("org.projectlombok:lombok:1.18.34")) - compileOnly "org.jetbrains:annotations:26.0.0" + compileOnly "org.jetbrains:annotations:26.0.1" compileOnly sourceSets.javaFxStub.output api "net.lenni0451.commons:httpclient:1.6.0" From 09c84d3fd74e0c053c16ee9b56d56a116ba97e38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 09:41:53 +0200 Subject: [PATCH 17/54] Bump net.lenni0451.commons:httpclient from 1.6.0 to 1.6.1 (#48) Bumps [net.lenni0451.commons:httpclient](https://github.com/Lenni0451/commons) from 1.6.0 to 1.6.1. - [Release notes](https://github.com/Lenni0451/commons/releases) - [Commits](https://github.com/Lenni0451/commons/compare/1.6.0...b1.6.1) --- updated-dependencies: - dependency-name: net.lenni0451.commons:httpclient dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 27f8819..83eb2be 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ dependencies { compileOnly "org.jetbrains:annotations:26.0.1" compileOnly sourceSets.javaFxStub.output - api "net.lenni0451.commons:httpclient:1.6.0" + api "net.lenni0451.commons:httpclient:1.6.1" api "com.google.code.gson:gson:2.11.0" api "io.jsonwebtoken:jjwt-impl:0.12.6" api("io.jsonwebtoken:jjwt-gson:0.12.6") { From 98805b690618140890d9c4c1b2eba16994f1403e Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Wed, 6 Nov 2024 15:41:04 +0100 Subject: [PATCH 18/54] Moved JWT code into separate class to allow exclusion of the JWT library --- .../step/bedrock/StepMCChain.java | 20 +++---- .../raphimc/minecraftauth/util/CryptUtil.java | 5 +- .../raphimc/minecraftauth/util/JwtUtil.java | 60 +++++++++++++++++++ 3 files changed, 69 insertions(+), 16 deletions(-) create mode 100644 src/main/java/net/raphimc/minecraftauth/util/JwtUtil.java diff --git a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java index a1c72fb..1cd16b8 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java +++ b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java @@ -19,9 +19,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jws; -import io.jsonwebtoken.Jwts; import lombok.*; import lombok.experimental.NonFinal; import lombok.experimental.PackagePrivate; @@ -33,6 +30,7 @@ import net.raphimc.minecraftauth.step.xbl.StepXblXstsToken; import net.raphimc.minecraftauth.util.CryptUtil; import net.raphimc.minecraftauth.util.JsonContent; +import net.raphimc.minecraftauth.util.JwtUtil; import net.raphimc.minecraftauth.util.logging.ILogger; import org.jetbrains.annotations.ApiStatus; @@ -45,8 +43,6 @@ import java.util.Map; import java.util.UUID; -import static net.raphimc.minecraftauth.util.TimeUtil.MAX_JWT_CLOCK_SKEW; - public class StepMCChain extends AbstractStep, StepMCChain.MCChain> { public static final String MINECRAFT_LOGIN_URL = "https://multiplayer.minecraft.net/authentication"; @@ -80,11 +76,11 @@ protected MCChain execute(final ILogger logger, final HttpClient httpClient, fin throw new IllegalStateException("Invalid chain size"); } - final Jws mojangJwt = Jwts.parser().clockSkewSeconds(MAX_JWT_CLOCK_SKEW).verifyWith(MOJANG_PUBLIC_KEY).build().parseSignedClaims(chain.get(0).getAsString()); - final ECPublicKey mojangJwtPublicKey = CryptUtil.publicKeyEcFromBase64(mojangJwt.getPayload().get("identityPublicKey", String.class)); - final Jws identityJwt = Jwts.parser().clockSkewSeconds(MAX_JWT_CLOCK_SKEW).verifyWith(mojangJwtPublicKey).build().parseSignedClaims(chain.get(1).getAsString()); + final JwtUtil.Jwt mojangJwt = JwtUtil.parseSignedJwt(chain.get(0).getAsString(), MOJANG_PUBLIC_KEY); + final ECPublicKey mojangJwtPublicKey = CryptUtil.publicKeyEcFromBase64(mojangJwt.getClaim("identityPublicKey", String.class)); + final JwtUtil.Jwt identityJwt = JwtUtil.parseSignedJwt(chain.get(1).getAsString(), mojangJwtPublicKey); - final Map extraData = identityJwt.getPayload().get("extraData", Map.class); + final Map extraData = identityJwt.getClaim("extraData", Map.class); final String xuid = (String) extraData.get("XUID"); final UUID id = UUID.fromString((String) extraData.get("identity")); final String displayName = (String) extraData.get("displayName"); @@ -186,9 +182,9 @@ public boolean isExpired() { this.lastExpireCheckTimeMs = System.currentTimeMillis(); try { - final Jws mojangJwt = Jwts.parser().clockSkewSeconds(MAX_JWT_CLOCK_SKEW).verifyWith(MOJANG_PUBLIC_KEY).build().parseSignedClaims(this.mojangJwt); - final ECPublicKey mojangJwtPublicKey = CryptUtil.publicKeyEcFromBase64(mojangJwt.getPayload().get("identityPublicKey", String.class)); - Jwts.parser().clockSkewSeconds(MAX_JWT_CLOCK_SKEW).verifyWith(mojangJwtPublicKey).build().parseSignedClaims(this.identityJwt); + final JwtUtil.Jwt mojangJwt = JwtUtil.parseSignedJwt(this.mojangJwt, MOJANG_PUBLIC_KEY); + final ECPublicKey mojangJwtPublicKey = CryptUtil.publicKeyEcFromBase64(mojangJwt.getClaim("identityPublicKey", String.class)); + JwtUtil.parseSignedJwt(this.identityJwt, mojangJwtPublicKey); this.lastExpireCheckResult = false; } catch (Throwable e) { // Any error -> The jwts are expired or invalid this.lastExpireCheckResult = true; diff --git a/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java b/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java index 6702033..6ec9f82 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java +++ b/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java @@ -18,14 +18,11 @@ package net.raphimc.minecraftauth.util; import com.google.gson.JsonObject; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.impl.security.DefaultSecureRequest; import net.lenni0451.commons.httpclient.content.HttpContent; import net.lenni0451.commons.httpclient.model.HttpHeader; import net.lenni0451.commons.httpclient.requests.HttpContentRequest; import net.lenni0451.commons.httpclient.requests.HttpRequest; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -130,7 +127,7 @@ public static HttpHeader getSignatureHeader(final HttpRequest httpRequest, final ecdsaSignature.update(signatureContent.toByteArray()); signature = ecdsaSignature.sign(); } catch (NoSuchAlgorithmException e) { // Fallback for Java 8 - signature = Jwts.SIG.ES256.digest(new DefaultSecureRequest<>(new ByteArrayInputStream(signatureContent.toByteArray()), null, null, privateKey)); + signature = JwtUtil.signES256(privateKey, signatureContent.toByteArray()); } data.write(signature); // Signature } catch (Throwable e) { diff --git a/src/main/java/net/raphimc/minecraftauth/util/JwtUtil.java b/src/main/java/net/raphimc/minecraftauth/util/JwtUtil.java new file mode 100644 index 0000000..00af598 --- /dev/null +++ b/src/main/java/net/raphimc/minecraftauth/util/JwtUtil.java @@ -0,0 +1,60 @@ +/* + * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth + * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package net.raphimc.minecraftauth.util; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jws; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.impl.security.DefaultSecureRequest; +import org.jetbrains.annotations.ApiStatus; + +import java.io.ByteArrayInputStream; +import java.security.PrivateKey; +import java.security.PublicKey; + +import static net.raphimc.minecraftauth.util.TimeUtil.MAX_JWT_CLOCK_SKEW; + +/** + * Utility class for handling JWTs. Code is intentionally kept separate from the rest of the project to allow for the exclusion of the JWT library. + */ +@ApiStatus.Internal +public class JwtUtil { + + public static Jwt parseSignedJwt(final String jwt, final PublicKey publicKey) { + final Jws parsedJwt = Jwts.parser().clockSkewSeconds(MAX_JWT_CLOCK_SKEW).verifyWith(publicKey).build().parseSignedClaims(jwt); + return new Jwt() { + + @Override + public T getClaim(final String claimName, final Class requiredType) { + return parsedJwt.getPayload().get(claimName, requiredType); + } + + }; + } + + public static byte[] signES256(final PrivateKey privateKey, final byte[] data) { + return Jwts.SIG.ES256.digest(new DefaultSecureRequest<>(new ByteArrayInputStream(data), null, null, privateKey)); + } + + public interface Jwt { + + T getClaim(final String claimName, final Class requiredType); + + } + +} From d6e6f74854f3970e81d19b914a4ca4d94c65fac4 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Thu, 14 Nov 2024 00:52:38 +0100 Subject: [PATCH 19/54] Updated gradle to 8.11 --- build.gradle | 13 +++++-------- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 83eb2be..3fe7da9 100644 --- a/build.gradle +++ b/build.gradle @@ -40,7 +40,7 @@ sourceSets { main { classTokenReplacer { property("\${version}", project.version) - property("\${impl_version}", "git-${project.name}-${project.version}:${project.latestCommitHash()}") + property("\${impl_version}", "git-${project.name}-${project.version}:${project.latestCommitHash().get()}") } } } @@ -124,11 +124,8 @@ project.tasks.withType(PublishToMavenRepository).forEach { it.dependsOn(project.tasks.withType(Sign)) } -String latestCommitHash() { - def stdout = new ByteArrayOutputStream() - exec { - commandLine "git", "rev-parse", "--short", "HEAD" - standardOutput = stdout - } - return stdout.toString().trim() +Provider latestCommitHash() { + return providers.exec { + commandLine = ["git", "rev-parse", "--short", "HEAD"] + }.standardOutput.getAsText().map(String::trim) } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fb602ee..82dd18b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionSha256Sum=57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 8e5499c1f4284bc1a76076b9d0bd675c6d3ce87f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 08:49:33 +0100 Subject: [PATCH 20/54] Bump org.projectlombok:lombok from 1.18.34 to 1.18.36 (#50) Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.34 to 1.18.36. - [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/projectlombok/lombok/compare/v1.18.34...v1.18.36) --- updated-dependencies: - dependency-name: org.projectlombok:lombok dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3fe7da9..1fd0ca2 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ repositories { } dependencies { - compileOnly(annotationProcessor("org.projectlombok:lombok:1.18.34")) + compileOnly(annotationProcessor("org.projectlombok:lombok:1.18.36")) compileOnly "org.jetbrains:annotations:26.0.1" compileOnly sourceSets.javaFxStub.output From 97e6f27e65bf442c7a20b09812d2beacffa6b2e0 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Wed, 20 Nov 2024 19:44:33 +0100 Subject: [PATCH 21/54] Updated gradle to 8.11.1 --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 82dd18b..eb1a55b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip +distributionSha256Sum=f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From a8926cd9a538db5691f19b9974205e547e5bb202 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Mon, 2 Dec 2024 12:25:13 +0100 Subject: [PATCH 22/54] Bump org.gradle.toolchains.foojay-resolver-convention --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index f5d36ed..28c1d75 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,7 +6,7 @@ pluginManagement { } plugins { - id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" + id "org.gradle.toolchains.foojay-resolver-convention" version "0.9.0" } rootProject.name = "MinecraftAuth" From 60ee21225a4c1a44c4f52839b75e39536516b603 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sun, 15 Dec 2024 17:05:07 +0100 Subject: [PATCH 23/54] Don't persist credentials in github actions --- .github/workflows/build.yml | 2 ++ .github/workflows/update-gradle-wrapper.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d3e5f47..ffaa149 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,6 +8,8 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v4 + with: + persist-credentials: false - name: Validate Gradle Wrapper uses: gradle/actions/wrapper-validation@v4 - name: Set up JDK 21 diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 1dd36f6..690783d 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -10,6 +10,8 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up JDK 21 uses: actions/setup-java@v4 with: From 411243a5bf0b9012797768afe21bceab839e4bb5 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sun, 22 Dec 2024 01:57:13 +0100 Subject: [PATCH 24/54] Updated gradle to 8.12 --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index eb1a55b..e1b837a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionSha256Sum=7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6..f3b75f3 100755 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum From 3b3fa6e8d52b4150f909f19931aa0a21dc767ec7 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Thu, 26 Dec 2024 18:42:26 +0100 Subject: [PATCH 25/54] Improved credentials login flow The credentials login flow should now skip any optional user dialogs --- .../step/msa/StepCredentialsMsaCode.java | 77 +++++++++++++------ 1 file changed, 52 insertions(+), 25 deletions(-) diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java index 6d3e7da..cbf308e 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java @@ -22,11 +22,13 @@ import lombok.EqualsAndHashCode; import lombok.Value; import net.lenni0451.commons.httpclient.HttpClient; +import net.lenni0451.commons.httpclient.HttpResponse; import net.lenni0451.commons.httpclient.constants.ContentTypes; import net.lenni0451.commons.httpclient.constants.Headers; import net.lenni0451.commons.httpclient.constants.StatusCodes; import net.lenni0451.commons.httpclient.content.impl.URLEncodedFormContent; import net.lenni0451.commons.httpclient.exceptions.HttpRequestException; +import net.lenni0451.commons.httpclient.requests.HttpRequest; import net.lenni0451.commons.httpclient.requests.impl.GetRequest; import net.lenni0451.commons.httpclient.requests.impl.PostRequest; import net.lenni0451.commons.httpclient.utils.URLWrapper; @@ -36,9 +38,11 @@ import net.raphimc.minecraftauth.util.JsonUtil; import net.raphimc.minecraftauth.util.logging.ILogger; +import java.io.IOException; import java.io.StringReader; import java.net.CookieManager; import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.HashMap; import java.util.Map; @@ -59,6 +63,25 @@ protected MsaCode execute(final ILogger logger, final HttpClient httpClient, fin } final CookieManager cookieManager = new CookieManager(); + final PostRequest loginPostRequest = this.prepareLoginPostRequest(httpClient, msaCredentials, cookieManager); + final HttpResponse loginResponse = this.sendLoginRequest(httpClient, loginPostRequest); + + final Optional locationHeader = loginResponse.getFirstHeader(Headers.LOCATION); + if (!locationHeader.isPresent()) { + throw new IllegalStateException("Could not get redirect url"); + } + + final Map parameters = new URLWrapper(locationHeader.get()).wrapQuery().getQueries(); + if (!parameters.containsKey("code")) { + throw new IllegalStateException("Could not extract MSA Code from redirect url"); + } + + final MsaCode msaCode = new MsaCode(parameters.get("code")); + logger.info(this, "Got MSA Code"); + return msaCode; + } + + private PostRequest prepareLoginPostRequest(final HttpClient httpClient, final MsaCredentials msaCredentials, final CookieManager cookieManager) throws IOException, URISyntaxException { final URL authenticationUrl = new URLWrapper(this.applicationDetails.getOAuthEnvironment().getAuthorizeUrl()).wrapQuery().addQueries(this.applicationDetails.getOAuthParameters()).apply().toURL(); final GetRequest getRequest = new GetRequest(authenticationUrl); @@ -120,48 +143,52 @@ protected MsaCode execute(final ILogger logger, final HttpClient httpClient, fin postRequest.setCookieManager(cookieManager); postRequest.setHeader(Headers.ACCEPT, ContentTypes.TEXT_HTML.getMimeType()); postRequest.setContent(new URLEncodedFormContent(postData)); - final String code = httpClient.execute(postRequest, response -> { - if (response.getStatusCode() != StatusCodes.MOVED_TEMPORARILY) { - if (!response.getContentType().orElse(ContentTypes.TEXT_PLAIN).getMimeType().equals(ContentTypes.TEXT_HTML.getMimeType())) { - throw new InformativeHttpRequestException(response, "Wrong content type"); - } + return postRequest; + } - final JsonObject errorConfig = StepCredentialsMsaCode.this.extractConfig(response.getContentAsString()); - switch (StepCredentialsMsaCode.this.applicationDetails.getOAuthEnvironment()) { + private HttpResponse sendLoginRequest(final HttpClient httpClient, final HttpRequest request) throws IOException { + final HttpResponse loginResponse = httpClient.execute(request); + + if (loginResponse.getStatusCode() != StatusCodes.MOVED_TEMPORARILY) { + if (!loginResponse.getContentType().orElse(ContentTypes.TEXT_PLAIN).getMimeType().equals(ContentTypes.TEXT_HTML.getMimeType())) { + throw new InformativeHttpRequestException(loginResponse, "Wrong content type"); + } + + final String responseString = loginResponse.getContentAsString(); + if (responseString.contains("")) { // Dialog informing the user about something. Can be skipped by getting the return url. + String actionUrl = responseString.substring(responseString.indexOf("action=\"") + 8); + actionUrl = actionUrl.substring(0, actionUrl.indexOf("\"")); + final String returnUrl = new URLWrapper(actionUrl).wrapQuery().getQuery("ru").get(); + + final GetRequest getRequest = new GetRequest(returnUrl); + getRequest.setCookieManager(request.getCookieManager()); + getRequest.setHeader(Headers.ACCEPT, ContentTypes.TEXT_HTML.getMimeType()); + return this.sendLoginRequest(httpClient, getRequest); + } else { + final JsonObject errorConfig = this.extractConfig(loginResponse.getContentAsString()); + switch (this.applicationDetails.getOAuthEnvironment()) { case LIVE: { if (errorConfig.has("sErrorCode") && errorConfig.has("sErrTxt")) { - throw new MsaRequestException(response, errorConfig.get("sErrorCode").getAsString(), errorConfig.get("sErrTxt").getAsString()); + throw new MsaRequestException(loginResponse, errorConfig.get("sErrorCode").getAsString(), errorConfig.get("sErrTxt").getAsString()); } break; } case MICROSOFT_ONLINE_COMMON: case MICROSOFT_ONLINE_CONSUMERS: { if (errorConfig.has("iErrorCode") && errorConfig.has("strServiceExceptionMessage")) { - throw new MsaRequestException(response, errorConfig.get("iErrorCode").getAsString(), errorConfig.get("strServiceExceptionMessage").getAsString()); + throw new MsaRequestException(loginResponse, errorConfig.get("iErrorCode").getAsString(), errorConfig.get("strServiceExceptionMessage").getAsString()); } break; } default: - throw new IllegalStateException("Unsupported OAuthEnvironment: " + StepCredentialsMsaCode.this.applicationDetails.getOAuthEnvironment()); + throw new IllegalStateException("Unsupported OAuthEnvironment: " + this.applicationDetails.getOAuthEnvironment()); } - } - - final Optional locationHeader = response.getFirstHeader(Headers.LOCATION); - if (!locationHeader.isPresent()) { - throw new IllegalStateException("Could not get redirect url"); - } - final Map parameters = new URLWrapper(locationHeader.get()).wrapQuery().getQueries(); - if (!parameters.containsKey("code")) { - throw new IllegalStateException("Could not extract MSA Code from redirect url"); + throw new IllegalStateException("Could not extract config from html. This most likely indicates that the account does not exist"); } + } - return parameters.get("code"); - }); - - final MsaCode msaCode = new MsaCode(code); - logger.info(this, "Got MSA Code"); - return msaCode; + return loginResponse; } private JsonObject extractConfig(final String html) { From b40733270e8e242ca81306fa7ecfc1c1ee2e5a69 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Fri, 27 Dec 2024 01:55:23 +0100 Subject: [PATCH 26/54] [ci skip] Removed update-gradle-wrapper.yml --- .github/workflows/update-gradle-wrapper.yml | 22 --------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/update-gradle-wrapper.yml diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml deleted file mode 100644 index 690783d..0000000 --- a/.github/workflows/update-gradle-wrapper.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: update-gradle-wrapper -on: - workflow_dispatch: - schedule: - - cron: "0 0 * * 0" - -jobs: - update-gradle-wrapper: - runs-on: ubuntu-24.04 - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - with: - persist-credentials: false - - name: Set up JDK 21 - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: 21 - check-latest: true - - name: Update Gradle Wrapper - uses: gradle-update/update-gradle-wrapper-action@v2 From 2727f91a5ce4c7c818ee1d6c65a72a155ffa01ba Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Wed, 1 Jan 2025 01:33:19 +0100 Subject: [PATCH 27/54] [ci skip] Updated copyright: 2025 --- src/javaFxStub/java/javafx/application/Platform.java | 2 +- src/javaFxStub/java/javafx/beans/value/ChangeListener.java | 2 +- src/javaFxStub/java/javafx/beans/value/ObservableValue.java | 2 +- src/javaFxStub/java/javafx/embed/swing/JFXPanel.java | 2 +- src/javaFxStub/java/javafx/scene/Parent.java | 2 +- src/javaFxStub/java/javafx/scene/Scene.java | 2 +- src/javaFxStub/java/javafx/scene/web/WebEngine.java | 2 +- src/javaFxStub/java/javafx/scene/web/WebView.java | 2 +- src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java | 2 +- .../minecraftauth/responsehandler/JsonHttpResponseHandler.java | 2 +- .../responsehandler/MinecraftEduServicesResponseHandler.java | 2 +- .../minecraftauth/responsehandler/MinecraftResponseHandler.java | 2 +- .../minecraftauth/responsehandler/MsaResponseHandler.java | 2 +- .../minecraftauth/responsehandler/PlayFabResponseHandler.java | 2 +- .../minecraftauth/responsehandler/RealmsResponseHandler.java | 2 +- .../minecraftauth/responsehandler/XblResponseHandler.java | 2 +- .../responsehandler/exception/ApiHttpRequestException.java | 2 +- .../exception/InformativeHttpRequestException.java | 2 +- .../responsehandler/exception/MinecraftRequestException.java | 2 +- .../responsehandler/exception/MsaRequestException.java | 2 +- .../responsehandler/exception/PlayFabRequestException.java | 2 +- .../responsehandler/exception/RealmsRequestException.java | 2 +- .../responsehandler/exception/XblRequestException.java | 2 +- .../minecraftauth/service/realms/AbstractRealmsService.java | 2 +- .../minecraftauth/service/realms/BedrockRealmsService.java | 2 +- .../raphimc/minecraftauth/service/realms/JavaRealmsService.java | 2 +- .../raphimc/minecraftauth/service/realms/model/RealmsWorld.java | 2 +- src/main/java/net/raphimc/minecraftauth/step/AbstractStep.java | 2 +- src/main/java/net/raphimc/minecraftauth/step/BiMergeStep.java | 2 +- .../net/raphimc/minecraftauth/step/SameInputBiMergeStep.java | 2 +- src/main/java/net/raphimc/minecraftauth/step/SameInputStep.java | 2 +- .../net/raphimc/minecraftauth/step/SameInputTriMergeStep.java | 2 +- src/main/java/net/raphimc/minecraftauth/step/TriMergeStep.java | 2 +- .../net/raphimc/minecraftauth/step/bedrock/StepMCChain.java | 2 +- .../raphimc/minecraftauth/step/bedrock/StepPlayFabToken.java | 2 +- .../step/bedrock/session/StepFullBedrockSession.java | 2 +- .../java/net/raphimc/minecraftauth/step/edu/StepEduJWT.java | 2 +- .../java/net/raphimc/minecraftauth/step/java/StepMCProfile.java | 2 +- .../java/net/raphimc/minecraftauth/step/java/StepMCToken.java | 2 +- .../raphimc/minecraftauth/step/java/StepPlayerCertificates.java | 2 +- .../minecraftauth/step/java/session/StepFullJavaSession.java | 2 +- .../raphimc/minecraftauth/step/msa/InitialPreparationStep.java | 2 +- .../java/net/raphimc/minecraftauth/step/msa/MsaCodeStep.java | 2 +- .../raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java | 2 +- .../raphimc/minecraftauth/step/msa/StepJfxWebViewMsaCode.java | 2 +- .../net/raphimc/minecraftauth/step/msa/StepLocalWebServer.java | 2 +- .../minecraftauth/step/msa/StepLocalWebServerMsaCode.java | 2 +- .../net/raphimc/minecraftauth/step/msa/StepMsaDeviceCode.java | 2 +- .../minecraftauth/step/msa/StepMsaDeviceCodeMsaCode.java | 2 +- .../java/net/raphimc/minecraftauth/step/msa/StepMsaToken.java | 2 +- .../net/raphimc/minecraftauth/step/xbl/StepXblDeviceToken.java | 2 +- .../minecraftauth/step/xbl/StepXblSisuAuthentication.java | 2 +- .../net/raphimc/minecraftauth/step/xbl/StepXblTitleToken.java | 2 +- .../net/raphimc/minecraftauth/step/xbl/StepXblUserToken.java | 2 +- .../net/raphimc/minecraftauth/step/xbl/StepXblXstsToken.java | 2 +- .../step/xbl/adapter/StepXblXstsToFullXblSession.java | 2 +- .../minecraftauth/step/xbl/session/StepFullXblSession.java | 2 +- .../minecraftauth/step/xbl/session/StepInitialXblSession.java | 2 +- src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java | 2 +- src/main/java/net/raphimc/minecraftauth/util/JsonContent.java | 2 +- src/main/java/net/raphimc/minecraftauth/util/JsonUtil.java | 2 +- src/main/java/net/raphimc/minecraftauth/util/JwtUtil.java | 2 +- .../java/net/raphimc/minecraftauth/util/MicrosoftConstants.java | 2 +- .../java/net/raphimc/minecraftauth/util/OAuthEnvironment.java | 2 +- src/main/java/net/raphimc/minecraftauth/util/TimeUtil.java | 2 +- src/main/java/net/raphimc/minecraftauth/util/UuidUtil.java | 2 +- .../net/raphimc/minecraftauth/util/logging/ConsoleLogger.java | 2 +- .../java/net/raphimc/minecraftauth/util/logging/ILogger.java | 2 +- .../raphimc/minecraftauth/util/logging/JavaConsoleLogger.java | 2 +- .../java/net/raphimc/minecraftauth/util/logging/LazyLogger.java | 2 +- .../raphimc/minecraftauth/util/logging/PlainConsoleLogger.java | 2 +- .../raphimc/minecraftauth/util/logging/Slf4jConsoleLogger.java | 2 +- 72 files changed, 72 insertions(+), 72 deletions(-) diff --git a/src/javaFxStub/java/javafx/application/Platform.java b/src/javaFxStub/java/javafx/application/Platform.java index 8830b8c..66b7913 100644 --- a/src/javaFxStub/java/javafx/application/Platform.java +++ b/src/javaFxStub/java/javafx/application/Platform.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/javaFxStub/java/javafx/beans/value/ChangeListener.java b/src/javaFxStub/java/javafx/beans/value/ChangeListener.java index 4a300b6..5d774ba 100644 --- a/src/javaFxStub/java/javafx/beans/value/ChangeListener.java +++ b/src/javaFxStub/java/javafx/beans/value/ChangeListener.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/javaFxStub/java/javafx/beans/value/ObservableValue.java b/src/javaFxStub/java/javafx/beans/value/ObservableValue.java index 21793bb..8b56ee6 100644 --- a/src/javaFxStub/java/javafx/beans/value/ObservableValue.java +++ b/src/javaFxStub/java/javafx/beans/value/ObservableValue.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/javaFxStub/java/javafx/embed/swing/JFXPanel.java b/src/javaFxStub/java/javafx/embed/swing/JFXPanel.java index 6364e3d..63cd762 100644 --- a/src/javaFxStub/java/javafx/embed/swing/JFXPanel.java +++ b/src/javaFxStub/java/javafx/embed/swing/JFXPanel.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/javaFxStub/java/javafx/scene/Parent.java b/src/javaFxStub/java/javafx/scene/Parent.java index 67ec7bf..d8801d1 100644 --- a/src/javaFxStub/java/javafx/scene/Parent.java +++ b/src/javaFxStub/java/javafx/scene/Parent.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/javaFxStub/java/javafx/scene/Scene.java b/src/javaFxStub/java/javafx/scene/Scene.java index b3e829a..14f11c2 100644 --- a/src/javaFxStub/java/javafx/scene/Scene.java +++ b/src/javaFxStub/java/javafx/scene/Scene.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/javaFxStub/java/javafx/scene/web/WebEngine.java b/src/javaFxStub/java/javafx/scene/web/WebEngine.java index 1207ad3..6f51f41 100644 --- a/src/javaFxStub/java/javafx/scene/web/WebEngine.java +++ b/src/javaFxStub/java/javafx/scene/web/WebEngine.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/javaFxStub/java/javafx/scene/web/WebView.java b/src/javaFxStub/java/javafx/scene/web/WebView.java index d5a4fdd..3112ca4 100644 --- a/src/javaFxStub/java/javafx/scene/web/WebView.java +++ b/src/javaFxStub/java/javafx/scene/web/WebView.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java b/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java index b879ca1..49049d2 100644 --- a/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java +++ b/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/JsonHttpResponseHandler.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/JsonHttpResponseHandler.java index 5732448..b3e7415 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/JsonHttpResponseHandler.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/JsonHttpResponseHandler.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/MinecraftEduServicesResponseHandler.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/MinecraftEduServicesResponseHandler.java index 0db5adb..918eaec 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/MinecraftEduServicesResponseHandler.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/MinecraftEduServicesResponseHandler.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/MinecraftResponseHandler.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/MinecraftResponseHandler.java index 5345f4a..a4a642f 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/MinecraftResponseHandler.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/MinecraftResponseHandler.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/MsaResponseHandler.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/MsaResponseHandler.java index 790a099..1e1185d 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/MsaResponseHandler.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/MsaResponseHandler.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/PlayFabResponseHandler.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/PlayFabResponseHandler.java index 8098742..d514c6e 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/PlayFabResponseHandler.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/PlayFabResponseHandler.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/RealmsResponseHandler.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/RealmsResponseHandler.java index f53dac4..0f9b58b 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/RealmsResponseHandler.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/RealmsResponseHandler.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/XblResponseHandler.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/XblResponseHandler.java index e187851..c9ff930 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/XblResponseHandler.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/XblResponseHandler.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/ApiHttpRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/ApiHttpRequestException.java index 4079927..30e7475 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/ApiHttpRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/ApiHttpRequestException.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/InformativeHttpRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/InformativeHttpRequestException.java index b63bcfc..c69cdeb 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/InformativeHttpRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/InformativeHttpRequestException.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MinecraftRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MinecraftRequestException.java index ca11d2c..e533ada 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MinecraftRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MinecraftRequestException.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MsaRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MsaRequestException.java index 3645e8f..9b60a35 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MsaRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MsaRequestException.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/PlayFabRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/PlayFabRequestException.java index 39d707c..e0ebf7a 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/PlayFabRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/PlayFabRequestException.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/RealmsRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/RealmsRequestException.java index afea3b9..6fcd470 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/RealmsRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/RealmsRequestException.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/XblRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/XblRequestException.java index b15ffef..3795d94 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/XblRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/XblRequestException.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/service/realms/AbstractRealmsService.java b/src/main/java/net/raphimc/minecraftauth/service/realms/AbstractRealmsService.java index 26b95a5..069cc9b 100644 --- a/src/main/java/net/raphimc/minecraftauth/service/realms/AbstractRealmsService.java +++ b/src/main/java/net/raphimc/minecraftauth/service/realms/AbstractRealmsService.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/service/realms/BedrockRealmsService.java b/src/main/java/net/raphimc/minecraftauth/service/realms/BedrockRealmsService.java index ba3f039..07073fc 100644 --- a/src/main/java/net/raphimc/minecraftauth/service/realms/BedrockRealmsService.java +++ b/src/main/java/net/raphimc/minecraftauth/service/realms/BedrockRealmsService.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/service/realms/JavaRealmsService.java b/src/main/java/net/raphimc/minecraftauth/service/realms/JavaRealmsService.java index cff54cf..10c0755 100644 --- a/src/main/java/net/raphimc/minecraftauth/service/realms/JavaRealmsService.java +++ b/src/main/java/net/raphimc/minecraftauth/service/realms/JavaRealmsService.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/service/realms/model/RealmsWorld.java b/src/main/java/net/raphimc/minecraftauth/service/realms/model/RealmsWorld.java index f980dea..2ad4551 100644 --- a/src/main/java/net/raphimc/minecraftauth/service/realms/model/RealmsWorld.java +++ b/src/main/java/net/raphimc/minecraftauth/service/realms/model/RealmsWorld.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/AbstractStep.java b/src/main/java/net/raphimc/minecraftauth/step/AbstractStep.java index c631703..e6b799c 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/AbstractStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/AbstractStep.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/BiMergeStep.java b/src/main/java/net/raphimc/minecraftauth/step/BiMergeStep.java index 177c05f..69eac8f 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/BiMergeStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/BiMergeStep.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/SameInputBiMergeStep.java b/src/main/java/net/raphimc/minecraftauth/step/SameInputBiMergeStep.java index 35f1892..20a6e6a 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/SameInputBiMergeStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/SameInputBiMergeStep.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/SameInputStep.java b/src/main/java/net/raphimc/minecraftauth/step/SameInputStep.java index 69816eb..2800960 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/SameInputStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/SameInputStep.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/SameInputTriMergeStep.java b/src/main/java/net/raphimc/minecraftauth/step/SameInputTriMergeStep.java index cf6fd3b..ad63347 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/SameInputTriMergeStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/SameInputTriMergeStep.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/TriMergeStep.java b/src/main/java/net/raphimc/minecraftauth/step/TriMergeStep.java index aa74beb..d081077 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/TriMergeStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/TriMergeStep.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java index 1cd16b8..b1696ab 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java +++ b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepPlayFabToken.java b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepPlayFabToken.java index 85fbef5..07f14a8 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepPlayFabToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepPlayFabToken.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/bedrock/session/StepFullBedrockSession.java b/src/main/java/net/raphimc/minecraftauth/step/bedrock/session/StepFullBedrockSession.java index 5518699..56e3cef 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/bedrock/session/StepFullBedrockSession.java +++ b/src/main/java/net/raphimc/minecraftauth/step/bedrock/session/StepFullBedrockSession.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/edu/StepEduJWT.java b/src/main/java/net/raphimc/minecraftauth/step/edu/StepEduJWT.java index 54f9d41..3d6fe34 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/edu/StepEduJWT.java +++ b/src/main/java/net/raphimc/minecraftauth/step/edu/StepEduJWT.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java index 8665c46..b09c78e 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java +++ b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCToken.java b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCToken.java index 0605cef..9d6aa75 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCToken.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java b/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java index 1f38bf6..a24fb90 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java +++ b/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/java/session/StepFullJavaSession.java b/src/main/java/net/raphimc/minecraftauth/step/java/session/StepFullJavaSession.java index 16b6ca7..dd6e385 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/java/session/StepFullJavaSession.java +++ b/src/main/java/net/raphimc/minecraftauth/step/java/session/StepFullJavaSession.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/InitialPreparationStep.java b/src/main/java/net/raphimc/minecraftauth/step/msa/InitialPreparationStep.java index ea52131..74dcb08 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/InitialPreparationStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/InitialPreparationStep.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/MsaCodeStep.java b/src/main/java/net/raphimc/minecraftauth/step/msa/MsaCodeStep.java index 5ff3ff5..c933ee5 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/MsaCodeStep.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/MsaCodeStep.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java index cbf308e..ceb28e7 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepJfxWebViewMsaCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepJfxWebViewMsaCode.java index 1bedf52..71a42bf 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepJfxWebViewMsaCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepJfxWebViewMsaCode.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServer.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServer.java index 015f113..34ed918 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServer.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServer.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServerMsaCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServerMsaCode.java index c08bf17..7935923 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServerMsaCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepLocalWebServerMsaCode.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaDeviceCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaDeviceCode.java index 4a5cb25..3561ecd 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaDeviceCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaDeviceCode.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaDeviceCodeMsaCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaDeviceCodeMsaCode.java index 579f429..860ead1 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaDeviceCodeMsaCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaDeviceCodeMsaCode.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaToken.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaToken.java index 39c8ed9..e60b81f 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepMsaToken.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblDeviceToken.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblDeviceToken.java index 20edba4..9f312dd 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblDeviceToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblDeviceToken.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblSisuAuthentication.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblSisuAuthentication.java index b927e62..6039089 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblSisuAuthentication.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblSisuAuthentication.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblTitleToken.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblTitleToken.java index d862640..f67a72d 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblTitleToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblTitleToken.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblUserToken.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblUserToken.java index 6f71964..0c12bc4 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblUserToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblUserToken.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblXstsToken.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblXstsToken.java index af1131c..046e825 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblXstsToken.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/StepXblXstsToken.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/adapter/StepXblXstsToFullXblSession.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/adapter/StepXblXstsToFullXblSession.java index ad7996f..dc52a17 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/adapter/StepXblXstsToFullXblSession.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/adapter/StepXblXstsToFullXblSession.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/session/StepFullXblSession.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/session/StepFullXblSession.java index 20a90d5..1c7500b 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/session/StepFullXblSession.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/session/StepFullXblSession.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/step/xbl/session/StepInitialXblSession.java b/src/main/java/net/raphimc/minecraftauth/step/xbl/session/StepInitialXblSession.java index 834a64b..274f46c 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/xbl/session/StepInitialXblSession.java +++ b/src/main/java/net/raphimc/minecraftauth/step/xbl/session/StepInitialXblSession.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java b/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java index 6ec9f82..2061b29 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java +++ b/src/main/java/net/raphimc/minecraftauth/util/CryptUtil.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/JsonContent.java b/src/main/java/net/raphimc/minecraftauth/util/JsonContent.java index 3e631af..05c1068 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/JsonContent.java +++ b/src/main/java/net/raphimc/minecraftauth/util/JsonContent.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/JsonUtil.java b/src/main/java/net/raphimc/minecraftauth/util/JsonUtil.java index 236d4b5..c8c755e 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/JsonUtil.java +++ b/src/main/java/net/raphimc/minecraftauth/util/JsonUtil.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/JwtUtil.java b/src/main/java/net/raphimc/minecraftauth/util/JwtUtil.java index 00af598..547b210 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/JwtUtil.java +++ b/src/main/java/net/raphimc/minecraftauth/util/JwtUtil.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/MicrosoftConstants.java b/src/main/java/net/raphimc/minecraftauth/util/MicrosoftConstants.java index 6c655f8..e7a4f06 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/MicrosoftConstants.java +++ b/src/main/java/net/raphimc/minecraftauth/util/MicrosoftConstants.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/OAuthEnvironment.java b/src/main/java/net/raphimc/minecraftauth/util/OAuthEnvironment.java index 7f27756..7b9410a 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/OAuthEnvironment.java +++ b/src/main/java/net/raphimc/minecraftauth/util/OAuthEnvironment.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/TimeUtil.java b/src/main/java/net/raphimc/minecraftauth/util/TimeUtil.java index 26737d8..e812eab 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/TimeUtil.java +++ b/src/main/java/net/raphimc/minecraftauth/util/TimeUtil.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/UuidUtil.java b/src/main/java/net/raphimc/minecraftauth/util/UuidUtil.java index 3d82194..6a3271d 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/UuidUtil.java +++ b/src/main/java/net/raphimc/minecraftauth/util/UuidUtil.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/logging/ConsoleLogger.java b/src/main/java/net/raphimc/minecraftauth/util/logging/ConsoleLogger.java index 561e700..26ceb0d 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/logging/ConsoleLogger.java +++ b/src/main/java/net/raphimc/minecraftauth/util/logging/ConsoleLogger.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/logging/ILogger.java b/src/main/java/net/raphimc/minecraftauth/util/logging/ILogger.java index 17d06d1..456b99a 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/logging/ILogger.java +++ b/src/main/java/net/raphimc/minecraftauth/util/logging/ILogger.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/logging/JavaConsoleLogger.java b/src/main/java/net/raphimc/minecraftauth/util/logging/JavaConsoleLogger.java index 20797c6..2e37371 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/logging/JavaConsoleLogger.java +++ b/src/main/java/net/raphimc/minecraftauth/util/logging/JavaConsoleLogger.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/logging/LazyLogger.java b/src/main/java/net/raphimc/minecraftauth/util/logging/LazyLogger.java index f675f91..03e172e 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/logging/LazyLogger.java +++ b/src/main/java/net/raphimc/minecraftauth/util/logging/LazyLogger.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/logging/PlainConsoleLogger.java b/src/main/java/net/raphimc/minecraftauth/util/logging/PlainConsoleLogger.java index 07c8de3..14df296 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/logging/PlainConsoleLogger.java +++ b/src/main/java/net/raphimc/minecraftauth/util/logging/PlainConsoleLogger.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/src/main/java/net/raphimc/minecraftauth/util/logging/Slf4jConsoleLogger.java b/src/main/java/net/raphimc/minecraftauth/util/logging/Slf4jConsoleLogger.java index c4afe53..50742e5 100644 --- a/src/main/java/net/raphimc/minecraftauth/util/logging/Slf4jConsoleLogger.java +++ b/src/main/java/net/raphimc/minecraftauth/util/logging/Slf4jConsoleLogger.java @@ -1,6 +1,6 @@ /* * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth - * Copyright (C) 2022-2024 RK_01/RaphiMC and contributors + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public From 95dffbea45dcbde64459054897de023d544373db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 08:34:07 +0100 Subject: [PATCH 28/54] Bump org.jetbrains:annotations from 26.0.1 to 26.0.2 (#53) Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.1 to 26.0.2. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.1...26.0.2) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1fd0ca2..6116229 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ repositories { dependencies { compileOnly(annotationProcessor("org.projectlombok:lombok:1.18.36")) - compileOnly "org.jetbrains:annotations:26.0.1" + compileOnly "org.jetbrains:annotations:26.0.2" compileOnly sourceSets.javaFxStub.output api "net.lenni0451.commons:httpclient:1.6.1" From c6fc688e32e67d78ff734577b312581bff19f80c Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Fri, 24 Jan 2025 15:16:32 +0100 Subject: [PATCH 29/54] Updated gradle to 8.12.1 --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e1b837a..d710477 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionSha256Sum=8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From b9def82f8b65034c7883ec1f5f96b0516e19ef59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 09:38:51 +0100 Subject: [PATCH 30/54] Bump com.google.code.gson:gson from 2.11.0 to 2.12.0 (#55) Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.11.0 to 2.12.0. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.11.0...gson-parent-2.12.0) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6116229..bea1477 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { compileOnly sourceSets.javaFxStub.output api "net.lenni0451.commons:httpclient:1.6.1" - api "com.google.code.gson:gson:2.11.0" + api "com.google.code.gson:gson:2.12.0" api "io.jsonwebtoken:jjwt-impl:0.12.6" api("io.jsonwebtoken:jjwt-gson:0.12.6") { exclude group: "com.google.code.gson", module: "gson" From 4e5fa6c6264201a41797c0f8614aceb82e9e75a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 09:39:47 +0100 Subject: [PATCH 31/54] Bump net.lenni0451.commons:httpclient from 1.6.1 to 1.7.0 (#54) Bumps [net.lenni0451.commons:httpclient](https://github.com/Lenni0451/commons) from 1.6.1 to 1.7.0. - [Release notes](https://github.com/Lenni0451/commons/releases) - [Commits](https://github.com/Lenni0451/commons/compare/b1.6.1...v1.7.0) --- updated-dependencies: - dependency-name: net.lenni0451.commons:httpclient dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bea1477..7a9c1a1 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ dependencies { compileOnly "org.jetbrains:annotations:26.0.2" compileOnly sourceSets.javaFxStub.output - api "net.lenni0451.commons:httpclient:1.6.1" + api "net.lenni0451.commons:httpclient:1.7.0" api "com.google.code.gson:gson:2.12.0" api "io.jsonwebtoken:jjwt-impl:0.12.6" api("io.jsonwebtoken:jjwt-gson:0.12.6") { From d4c6b483709ea8b85326ad15ef64635a61d49a11 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 09:22:11 +0100 Subject: [PATCH 32/54] Bump com.google.code.gson:gson from 2.12.0 to 2.12.1 (#56) Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.12.0 to 2.12.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.12.0...gson-parent-2.12.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7a9c1a1..5a0e220 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { compileOnly sourceSets.javaFxStub.output api "net.lenni0451.commons:httpclient:1.7.0" - api "com.google.code.gson:gson:2.12.0" + api "com.google.code.gson:gson:2.12.1" api "io.jsonwebtoken:jjwt-impl:0.12.6" api("io.jsonwebtoken:jjwt-gson:0.12.6") { exclude group: "com.google.code.gson", module: "gson" From 975afa42e843c01e7749bc64dc23848f1ba3b14e Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Tue, 18 Feb 2025 22:28:05 +0100 Subject: [PATCH 33/54] Throw a nicer error message if the account doesn't have a game profile associated with it --- .../exception/ApiHttpRequestException.java | 8 ++++++ .../exception/MinecraftRequestException.java | 6 ----- .../exception/MsaRequestException.java | 6 ----- .../exception/PlayFabRequestException.java | 6 ----- .../step/java/StepMCProfile.java | 26 ++++++++++++++++++- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/ApiHttpRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/ApiHttpRequestException.java index 30e7475..bf92a60 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/ApiHttpRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/ApiHttpRequestException.java @@ -17,13 +17,21 @@ */ package net.raphimc.minecraftauth.responsehandler.exception; +import lombok.Getter; import net.lenni0451.commons.httpclient.HttpResponse; import net.lenni0451.commons.httpclient.exceptions.HttpRequestException; +@Getter public class ApiHttpRequestException extends HttpRequestException { + private final String error; + private final String errorMessage; + public ApiHttpRequestException(final HttpResponse response, final String error, final String errorMessage) { super(response, "status: " + response.getStatusCode() + " " + response.getStatusMessage() + ", error: " + error + ", error message: " + errorMessage); + + this.error = error; + this.errorMessage = errorMessage; } } diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MinecraftRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MinecraftRequestException.java index e533ada..a98040d 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MinecraftRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MinecraftRequestException.java @@ -17,18 +17,12 @@ */ package net.raphimc.minecraftauth.responsehandler.exception; -import lombok.Getter; import net.lenni0451.commons.httpclient.HttpResponse; -@Getter public class MinecraftRequestException extends ApiHttpRequestException { - private final String error; - public MinecraftRequestException(final HttpResponse response, final String error, final String errorMessage) { super(response, error, errorMessage); - - this.error = error; } } diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MsaRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MsaRequestException.java index 9b60a35..a81cf54 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MsaRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/MsaRequestException.java @@ -17,18 +17,12 @@ */ package net.raphimc.minecraftauth.responsehandler.exception; -import lombok.Getter; import net.lenni0451.commons.httpclient.HttpResponse; -@Getter public class MsaRequestException extends ApiHttpRequestException { - private final String error; - public MsaRequestException(final HttpResponse response, final String error, final String errorMessage) { super(response, error, errorMessage); - - this.error = error; } } diff --git a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/PlayFabRequestException.java b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/PlayFabRequestException.java index e0ebf7a..b3905c2 100644 --- a/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/PlayFabRequestException.java +++ b/src/main/java/net/raphimc/minecraftauth/responsehandler/exception/PlayFabRequestException.java @@ -17,18 +17,12 @@ */ package net.raphimc.minecraftauth.responsehandler.exception; -import lombok.Getter; import net.lenni0451.commons.httpclient.HttpResponse; -@Getter public class PlayFabRequestException extends ApiHttpRequestException { - private final String error; - public PlayFabRequestException(final HttpResponse response, final String error, final String errorMessage) { super(response, error, errorMessage); - - this.error = error; } } diff --git a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java index b09c78e..46d18c4 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java +++ b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java @@ -21,13 +21,16 @@ import lombok.EqualsAndHashCode; import lombok.Value; import net.lenni0451.commons.httpclient.HttpClient; +import net.lenni0451.commons.httpclient.HttpResponse; import net.lenni0451.commons.httpclient.constants.Headers; import net.lenni0451.commons.httpclient.requests.impl.GetRequest; import net.raphimc.minecraftauth.responsehandler.MinecraftResponseHandler; +import net.raphimc.minecraftauth.responsehandler.exception.MinecraftRequestException; import net.raphimc.minecraftauth.step.AbstractStep; import net.raphimc.minecraftauth.util.UuidUtil; import net.raphimc.minecraftauth.util.logging.ILogger; +import java.io.IOException; import java.util.UUID; public class StepMCProfile extends AbstractStep { @@ -44,7 +47,20 @@ protected MCProfile execute(final ILogger logger, final HttpClient httpClient, f final GetRequest getRequest = new GetRequest(MINECRAFT_PROFILE_URL); getRequest.setHeader(Headers.AUTHORIZATION, mcToken.getTokenType() + " " + mcToken.getAccessToken()); - final JsonObject obj = httpClient.execute(getRequest, new MinecraftResponseHandler()); + final JsonObject obj = httpClient.execute(getRequest, new MinecraftResponseHandler() { + @Override + protected void handleJsonError(final HttpResponse response, final JsonObject obj) throws IOException { + try { + super.handleJsonError(response, obj); + } catch (MinecraftRequestException e) { + if (e.getResponse().getStatusCode() == 404) { + throw new ProfileNotFoundException(e); + } else { + throw e; + } + } + } + }); final MCProfile mcProfile = new MCProfile( UuidUtil.fromLenientString(obj.get("id").getAsString()), @@ -103,4 +119,12 @@ public boolean isExpiredOrOutdated() { } + public static class ProfileNotFoundException extends MinecraftRequestException { + + public ProfileNotFoundException(final MinecraftRequestException exception) { + super(exception.getResponse(), exception.getError(), "Your account doesn't have a Minecraft profile. Please login to Minecraft and set up your profile."); + } + + } + } From c75bbb1da8c436fb9e60d742084bcd2e211968ef Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:25:05 +0100 Subject: [PATCH 34/54] Updated gradle to 8.13 --- gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43705 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 34744 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 delta 34727 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�{ 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 a%EQ2*fnt2> Date: Wed, 26 Feb 2025 09:49:54 +0100 Subject: [PATCH 35/54] Bump org.slf4j:slf4j-api from 2.0.16 to 2.0.17 (#57) Bumps org.slf4j:slf4j-api from 2.0.16 to 2.0.17. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5a0e220..32e4cff 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ dependencies { api("io.jsonwebtoken:jjwt-gson:0.12.6") { exclude group: "com.google.code.gson", module: "gson" } - api "org.slf4j:slf4j-api:2.0.16" + api "org.slf4j:slf4j-api:2.0.17" } sourceSets { From 70a19c4039e6d31ee9175fd73ab7434ef4841c59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:13:32 +0100 Subject: [PATCH 36/54] Bump net.raphimc.class-token-replacer from 1.1.3 to 1.1.4 (#58) Bumps net.raphimc.class-token-replacer from 1.1.3 to 1.1.4. --- updated-dependencies: - dependency-name: net.raphimc.class-token-replacer dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 32e4cff..76dfecb 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id "java-library" id "maven-publish" id "signing" - id "net.raphimc.class-token-replacer" version "1.1.3" + id "net.raphimc.class-token-replacer" version "1.1.4" } base { From adb1435ec4ad1b8f6dbec022a28edfabafe34644 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 12:41:49 +0200 Subject: [PATCH 37/54] Bump org.projectlombok:lombok from 1.18.36 to 1.18.38 (#59) Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.36 to 1.18.38. - [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/projectlombok/lombok/compare/v1.18.36...v1.18.38) --- updated-dependencies: - dependency-name: org.projectlombok:lombok dependency-version: 1.18.38 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 76dfecb..0412fed 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ repositories { } dependencies { - compileOnly(annotationProcessor("org.projectlombok:lombok:1.18.36")) + compileOnly(annotationProcessor("org.projectlombok:lombok:1.18.38")) compileOnly "org.jetbrains:annotations:26.0.2" compileOnly sourceSets.javaFxStub.output From d7a060d3c36a8e57a9cc98184eac6d41c3bdcae3 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Wed, 2 Apr 2025 20:44:39 +0200 Subject: [PATCH 38/54] Replaced deprecated HttpClient API usage --- .../net/raphimc/minecraftauth/MinecraftAuth.java | 8 ++++---- .../service/realms/AbstractRealmsService.java | 4 ++-- .../service/realms/BedrockRealmsService.java | 4 ++-- .../minecraftauth/step/bedrock/StepMCChain.java | 4 ++-- .../minecraftauth/step/java/StepMCProfile.java | 4 ++-- .../step/java/StepPlayerCertificates.java | 4 ++-- .../step/msa/StepCredentialsMsaCode.java | 12 ++++++------ .../step/msa/StepJfxWebViewMsaCode.java | 4 ++-- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java b/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java index 49049d2..68f17d7 100644 --- a/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java +++ b/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java @@ -21,7 +21,7 @@ import net.lenni0451.commons.httpclient.HttpClient; import net.lenni0451.commons.httpclient.RetryHandler; import net.lenni0451.commons.httpclient.constants.ContentTypes; -import net.lenni0451.commons.httpclient.constants.Headers; +import net.lenni0451.commons.httpclient.constants.HttpHeaders; import net.raphimc.minecraftauth.step.AbstractStep; import net.raphimc.minecraftauth.step.BiMergeStep; import net.raphimc.minecraftauth.step.bedrock.StepMCChain; @@ -127,9 +127,9 @@ public static HttpClient createHttpClient() { .setCookieManager(null) .setFollowRedirects(false) .setRetryHandler(new RetryHandler(0, 50)) - .setHeader(Headers.ACCEPT, ContentTypes.APPLICATION_JSON.toString()) - .setHeader(Headers.ACCEPT_LANGUAGE, "en-US,en") - .setHeader(Headers.USER_AGENT, USER_AGENT); + .setHeader(HttpHeaders.ACCEPT, ContentTypes.APPLICATION_JSON.toString()) + .setHeader(HttpHeaders.ACCEPT_LANGUAGE, "en-US,en") + .setHeader(HttpHeaders.USER_AGENT, USER_AGENT); } public static class MsaTokenBuilder { diff --git a/src/main/java/net/raphimc/minecraftauth/service/realms/AbstractRealmsService.java b/src/main/java/net/raphimc/minecraftauth/service/realms/AbstractRealmsService.java index 069cc9b..80a90c4 100644 --- a/src/main/java/net/raphimc/minecraftauth/service/realms/AbstractRealmsService.java +++ b/src/main/java/net/raphimc/minecraftauth/service/realms/AbstractRealmsService.java @@ -22,7 +22,7 @@ import lombok.SneakyThrows; import net.lenni0451.commons.httpclient.HttpClient; import net.lenni0451.commons.httpclient.constants.ContentTypes; -import net.lenni0451.commons.httpclient.constants.Headers; +import net.lenni0451.commons.httpclient.constants.HttpHeaders; import net.lenni0451.commons.httpclient.handler.ThrowingResponseHandler; import net.lenni0451.commons.httpclient.requests.HttpRequest; import net.lenni0451.commons.httpclient.requests.impl.GetRequest; @@ -57,7 +57,7 @@ public CompletableFuture isAvailable() { public Boolean get() { final GetRequest getRequest = new GetRequest(CLIENT_COMPATIBLE_URL.replace("$HOST", AbstractRealmsService.this.host)); getRequest.setCookieManager(AbstractRealmsService.this.cookieManager); - getRequest.setHeader(Headers.ACCEPT, ContentTypes.TEXT_PLAIN.getMimeType()); + getRequest.setHeader(HttpHeaders.ACCEPT, ContentTypes.TEXT_PLAIN.getMimeType()); AbstractRealmsService.this.addRequestHeaders(getRequest); final String response = AbstractRealmsService.this.httpClient.execute(getRequest, new ThrowingResponseHandler()).getContentAsString(); return response.equals("COMPATIBLE"); diff --git a/src/main/java/net/raphimc/minecraftauth/service/realms/BedrockRealmsService.java b/src/main/java/net/raphimc/minecraftauth/service/realms/BedrockRealmsService.java index 07073fc..6b5dfa9 100644 --- a/src/main/java/net/raphimc/minecraftauth/service/realms/BedrockRealmsService.java +++ b/src/main/java/net/raphimc/minecraftauth/service/realms/BedrockRealmsService.java @@ -20,7 +20,7 @@ import com.google.gson.JsonObject; import lombok.SneakyThrows; import net.lenni0451.commons.httpclient.HttpClient; -import net.lenni0451.commons.httpclient.constants.Headers; +import net.lenni0451.commons.httpclient.constants.HttpHeaders; import net.lenni0451.commons.httpclient.requests.HttpRequest; import net.lenni0451.commons.httpclient.requests.impl.DeleteRequest; import net.lenni0451.commons.httpclient.requests.impl.GetRequest; @@ -91,7 +91,7 @@ public void run() { @Override protected void addRequestHeaders(final HttpRequest httpRequest) { - httpRequest.setHeader(Headers.AUTHORIZATION, "XBL3.0 x=" + this.realmsXsts.getServiceToken()); + httpRequest.setHeader(HttpHeaders.AUTHORIZATION, "XBL3.0 x=" + this.realmsXsts.getServiceToken()); httpRequest.setHeader("Client-Version", this.clientVersion); } diff --git a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java index b1696ab..cec9ebf 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java +++ b/src/main/java/net/raphimc/minecraftauth/step/bedrock/StepMCChain.java @@ -23,7 +23,7 @@ import lombok.experimental.NonFinal; import lombok.experimental.PackagePrivate; import net.lenni0451.commons.httpclient.HttpClient; -import net.lenni0451.commons.httpclient.constants.Headers; +import net.lenni0451.commons.httpclient.constants.HttpHeaders; import net.lenni0451.commons.httpclient.requests.impl.PostRequest; import net.raphimc.minecraftauth.responsehandler.MinecraftResponseHandler; import net.raphimc.minecraftauth.step.AbstractStep; @@ -69,7 +69,7 @@ protected MCChain execute(final ILogger logger, final HttpClient httpClient, fin final PostRequest postRequest = new PostRequest(MINECRAFT_LOGIN_URL); postRequest.setContent(new JsonContent(postData)); - postRequest.setHeader(Headers.AUTHORIZATION, "XBL3.0 x=" + xblXsts.getServiceToken()); + postRequest.setHeader(HttpHeaders.AUTHORIZATION, "XBL3.0 x=" + xblXsts.getServiceToken()); final JsonObject obj = httpClient.execute(postRequest, new MinecraftResponseHandler()); final JsonArray chain = obj.getAsJsonArray("chain"); if (chain.size() != 2) { diff --git a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java index 46d18c4..498c3a0 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java +++ b/src/main/java/net/raphimc/minecraftauth/step/java/StepMCProfile.java @@ -22,7 +22,7 @@ import lombok.Value; import net.lenni0451.commons.httpclient.HttpClient; import net.lenni0451.commons.httpclient.HttpResponse; -import net.lenni0451.commons.httpclient.constants.Headers; +import net.lenni0451.commons.httpclient.constants.HttpHeaders; import net.lenni0451.commons.httpclient.requests.impl.GetRequest; import net.raphimc.minecraftauth.responsehandler.MinecraftResponseHandler; import net.raphimc.minecraftauth.responsehandler.exception.MinecraftRequestException; @@ -46,7 +46,7 @@ protected MCProfile execute(final ILogger logger, final HttpClient httpClient, f logger.info(this, "Getting profile..."); final GetRequest getRequest = new GetRequest(MINECRAFT_PROFILE_URL); - getRequest.setHeader(Headers.AUTHORIZATION, mcToken.getTokenType() + " " + mcToken.getAccessToken()); + getRequest.setHeader(HttpHeaders.AUTHORIZATION, mcToken.getTokenType() + " " + mcToken.getAccessToken()); final JsonObject obj = httpClient.execute(getRequest, new MinecraftResponseHandler() { @Override protected void handleJsonError(final HttpResponse response, final JsonObject obj) throws IOException { diff --git a/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java b/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java index a24fb90..e4e4ef8 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java +++ b/src/main/java/net/raphimc/minecraftauth/step/java/StepPlayerCertificates.java @@ -22,7 +22,7 @@ import lombok.Value; import net.lenni0451.commons.httpclient.HttpClient; import net.lenni0451.commons.httpclient.constants.ContentTypes; -import net.lenni0451.commons.httpclient.constants.Headers; +import net.lenni0451.commons.httpclient.constants.HttpHeaders; import net.lenni0451.commons.httpclient.content.impl.StringContent; import net.lenni0451.commons.httpclient.requests.impl.PostRequest; import net.raphimc.minecraftauth.responsehandler.MinecraftResponseHandler; @@ -52,7 +52,7 @@ protected PlayerCertificates execute(final ILogger logger, final HttpClient http final PostRequest postRequest = new PostRequest(PLAYER_CERTIFICATES_URL); postRequest.setContent(new StringContent(ContentTypes.APPLICATION_JSON, "")); - postRequest.setHeader(Headers.AUTHORIZATION, mcToken.getTokenType() + " " + mcToken.getAccessToken()); + postRequest.setHeader(HttpHeaders.AUTHORIZATION, mcToken.getTokenType() + " " + mcToken.getAccessToken()); final JsonObject obj = httpClient.execute(postRequest, new MinecraftResponseHandler()); final JsonObject keyPair = obj.getAsJsonObject("keyPair"); diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java index ceb28e7..9067753 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepCredentialsMsaCode.java @@ -24,7 +24,7 @@ import net.lenni0451.commons.httpclient.HttpClient; import net.lenni0451.commons.httpclient.HttpResponse; import net.lenni0451.commons.httpclient.constants.ContentTypes; -import net.lenni0451.commons.httpclient.constants.Headers; +import net.lenni0451.commons.httpclient.constants.HttpHeaders; import net.lenni0451.commons.httpclient.constants.StatusCodes; import net.lenni0451.commons.httpclient.content.impl.URLEncodedFormContent; import net.lenni0451.commons.httpclient.exceptions.HttpRequestException; @@ -66,7 +66,7 @@ protected MsaCode execute(final ILogger logger, final HttpClient httpClient, fin final PostRequest loginPostRequest = this.prepareLoginPostRequest(httpClient, msaCredentials, cookieManager); final HttpResponse loginResponse = this.sendLoginRequest(httpClient, loginPostRequest); - final Optional locationHeader = loginResponse.getFirstHeader(Headers.LOCATION); + final Optional locationHeader = loginResponse.getFirstHeader(HttpHeaders.LOCATION); if (!locationHeader.isPresent()) { throw new IllegalStateException("Could not get redirect url"); } @@ -86,10 +86,10 @@ private PostRequest prepareLoginPostRequest(final HttpClient httpClient, final M final GetRequest getRequest = new GetRequest(authenticationUrl); getRequest.setCookieManager(cookieManager); - getRequest.setHeader(Headers.ACCEPT, ContentTypes.TEXT_HTML.getMimeType()); + getRequest.setHeader(HttpHeaders.ACCEPT, ContentTypes.TEXT_HTML.getMimeType()); final JsonObject config = httpClient.execute(getRequest, response -> { if (response.getStatusCode() >= 300) { - final Optional locationHeader = response.getFirstHeader(Headers.LOCATION); + final Optional locationHeader = response.getFirstHeader(HttpHeaders.LOCATION); if (locationHeader.isPresent()) { final Map parameters = new URLWrapper(locationHeader.get()).wrapQuery().getQueries(); if (parameters.containsKey("error") && parameters.containsKey("error_description")) { @@ -141,7 +141,7 @@ private PostRequest prepareLoginPostRequest(final HttpClient httpClient, final M final PostRequest postRequest = new PostRequest(urlPost); postRequest.setCookieManager(cookieManager); - postRequest.setHeader(Headers.ACCEPT, ContentTypes.TEXT_HTML.getMimeType()); + postRequest.setHeader(HttpHeaders.ACCEPT, ContentTypes.TEXT_HTML.getMimeType()); postRequest.setContent(new URLEncodedFormContent(postData)); return postRequest; } @@ -162,7 +162,7 @@ private HttpResponse sendLoginRequest(final HttpClient httpClient, final HttpReq final GetRequest getRequest = new GetRequest(returnUrl); getRequest.setCookieManager(request.getCookieManager()); - getRequest.setHeader(Headers.ACCEPT, ContentTypes.TEXT_HTML.getMimeType()); + getRequest.setHeader(HttpHeaders.ACCEPT, ContentTypes.TEXT_HTML.getMimeType()); return this.sendLoginRequest(httpClient, getRequest); } else { final JsonObject errorConfig = this.extractConfig(loginResponse.getContentAsString()); diff --git a/src/main/java/net/raphimc/minecraftauth/step/msa/StepJfxWebViewMsaCode.java b/src/main/java/net/raphimc/minecraftauth/step/msa/StepJfxWebViewMsaCode.java index 71a42bf..13d0df7 100644 --- a/src/main/java/net/raphimc/minecraftauth/step/msa/StepJfxWebViewMsaCode.java +++ b/src/main/java/net/raphimc/minecraftauth/step/msa/StepJfxWebViewMsaCode.java @@ -27,7 +27,7 @@ import lombok.Value; import net.lenni0451.commons.httpclient.HttpClient; import net.lenni0451.commons.httpclient.HttpResponse; -import net.lenni0451.commons.httpclient.constants.Headers; +import net.lenni0451.commons.httpclient.constants.HttpHeaders; import net.lenni0451.commons.httpclient.utils.URLWrapper; import net.raphimc.minecraftauth.responsehandler.exception.MsaRequestException; import net.raphimc.minecraftauth.step.AbstractStep; @@ -83,7 +83,7 @@ public void windowClosing(WindowEvent e) { Platform.runLater(() -> { final WebView webView = new WebView(); webView.setContextMenuEnabled(false); - httpClient.getFirstHeader(Headers.USER_AGENT).ifPresent(s -> webView.getEngine().setUserAgent(s)); + httpClient.getFirstHeader(HttpHeaders.USER_AGENT).ifPresent(s -> webView.getEngine().setUserAgent(s)); webView.getEngine().load(authenticationUrl.toString()); webView.getEngine().locationProperty().addListener((observable, oldValue, newValue) -> { try { From 132096445665760e39bc897d2225bd2e82b969c1 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Mon, 7 Apr 2025 21:09:28 +0200 Subject: [PATCH 39/54] Added NoOpLogger --- .../util/logging/NoOpLogger.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/net/raphimc/minecraftauth/util/logging/NoOpLogger.java diff --git a/src/main/java/net/raphimc/minecraftauth/util/logging/NoOpLogger.java b/src/main/java/net/raphimc/minecraftauth/util/logging/NoOpLogger.java new file mode 100644 index 0000000..697f3cd --- /dev/null +++ b/src/main/java/net/raphimc/minecraftauth/util/logging/NoOpLogger.java @@ -0,0 +1,34 @@ +/* + * This file is part of MinecraftAuth - https://github.com/RaphiMC/MinecraftAuth + * Copyright (C) 2022-2025 RK_01/RaphiMC and contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package net.raphimc.minecraftauth.util.logging; + +public class NoOpLogger implements ILogger { + + @Override + public void info(String message) { + } + + @Override + public void warn(String message) { + } + + @Override + public void error(String message) { + } + +} From 0c38eb8f0899a23088227ea18b622a5d2fe2f6f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 12:00:55 +0200 Subject: [PATCH 40/54] Bump org.gradle.toolchains.foojay-resolver-convention (#60) Bumps org.gradle.toolchains.foojay-resolver-convention from 0.9.0 to 0.10.0. --- updated-dependencies: - dependency-name: org.gradle.toolchains.foojay-resolver-convention dependency-version: 0.10.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 28c1d75..21a49e4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,7 +6,7 @@ pluginManagement { } plugins { - id "org.gradle.toolchains.foojay-resolver-convention" version "0.9.0" + id "org.gradle.toolchains.foojay-resolver-convention" version "0.10.0" } rootProject.name = "MinecraftAuth" From 8dcd1f0a058a08e747308c61f31da76d407a19c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 09:35:36 +0200 Subject: [PATCH 41/54] Bump com.google.code.gson:gson from 2.12.1 to 2.13.0 (#61) Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.12.1 to 2.13.0. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.12.1...gson-parent-2.13.0) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-version: 2.13.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0412fed..e7f204e 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { compileOnly sourceSets.javaFxStub.output api "net.lenni0451.commons:httpclient:1.7.0" - api "com.google.code.gson:gson:2.12.1" + api "com.google.code.gson:gson:2.13.0" api "io.jsonwebtoken:jjwt-impl:0.12.6" api("io.jsonwebtoken:jjwt-gson:0.12.6") { exclude group: "com.google.code.gson", module: "gson" From 4ed1aa102cb2cbd18aed4d7ad8ac4feb500330d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:27:02 +0200 Subject: [PATCH 42/54] Bump com.google.code.gson:gson from 2.13.0 to 2.13.1 (#62) Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.13.0 to 2.13.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.13.0...gson-parent-2.13.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-version: 2.13.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e7f204e..9e863fa 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { compileOnly sourceSets.javaFxStub.output api "net.lenni0451.commons:httpclient:1.7.0" - api "com.google.code.gson:gson:2.13.0" + api "com.google.code.gson:gson:2.13.1" api "io.jsonwebtoken:jjwt-impl:0.12.6" api("io.jsonwebtoken:jjwt-gson:0.12.6") { exclude group: "com.google.code.gson", module: "gson" From 1bde0b84d40c345d3a13d4da58d3853bb0cf8c65 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sat, 26 Apr 2025 16:04:01 +0200 Subject: [PATCH 43/54] Updated gradle to 8.14 --- gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 4 ++-- gradlew.bat | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 642 zcmdmamFde>rVZJA^}0Q$xegf!xPEW^+5YDM%iT2bEgct9o+jH~+sJas#HZ=szO|** z=Pj=X_vx?W&DSwKck|WWn~hffsvnQ+42*W$b7b0$SCcOoZ`{W{^$^pk;4>8-A*-)$ z?n(Po`1$6Jn_u?t-L+tsPyZ2#X}8T6OS8pAU;kdgd+_Hw4z4TW0p9E!T+=f7-c&O% zFic^X{7^$?^Ho04eona9n#mGMxKhA=~8B%JN`M zMhm5wc-2v)$``sY$!Q`9xiU@DhI73ZxiGEKg>yIPs)NmWwMdF-ngLXpZSqV5ez36n zVkxF2rjrjWR+_xr6e6@_u@s~2uv{9vi*1pj2)BjFD+-%@&pRVP1f{O1glxTOp2-62Ph;v z`N1+vCd)9ea)af*Ol1*JCfnp$%Uu}%OuoN7g2}3C@`L5FlP#(sA=|h@iixuZC?qp^ z=L$=v$ZoI}|87Wh=&h7udff{aieKr*l+zDp?pf)_bbRvUf>kn;HCDMXNlgbbo!QRK I1x7am0No)LiU0rr delta 584 zcmexzm1*ZyrVZJAexH5Moc8h7)w{^+t*dqJ%=yhh23L$9JpFV=_k`zJ-?Q4DI*eSe z+ES)HSrVnWLtJ&)lO%hRkV9zl5qqWRt0e;bb zPPo`)y?HTAyZI&u&X<|2$FDHCf4;!v8}p=?Tm`^F0`u(|1ttf~&t$qP3KUSD>@TJQ zRwJ}Pim6NzEc8KA6)e;S6gs8=7IIL8sQL*MYEuRYO;Uj<%3UbMbV&^&!Zvx+LKmjT z8Zch6rYP7Tw?$Hn(UTJwWiS=$f{lB(C=e*%usDV})0AQIK~sat=ND@+Gg*Pyij!rR z*fa02W|%BsV++>4W{DKDGSIUEHd2$P+8ct!RF+CHDowUuTEZOZ%rJSQv*qOXOSPDN zT|sP-$p*_3ncsWB*qoD7JQcyZ9xan%cJP6Tb4-?AZpr*F6v98hoNaPJm@HV`yya5N z))6pqFXn@}P(3T0nEzM8*c_9KtE9o|_pFd&K35GBXP^9Kg(b6GH-z8S4GDzIl~T+b zdLd#meKKHu$5u))8cu$=GKINkGDPOUD)!0$C(BH(U!}!-e;Q0ok8Sc?V1zRO04>ts AA^-pY diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 36e4933..247cf2a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionSha256Sum=61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index faf9300..23d15a9 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a21..db3a6ac 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From 70b5d8d43b32c383d0d6bcef550930df33a5493a Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sun, 4 May 2025 00:38:17 +0200 Subject: [PATCH 44/54] Split monolithic gradle files into modular gradle snippets --- .gitignore | 6 +- build.gradle | 112 +----------------- buildSrc/build.gradle | 7 ++ .../main/groovy/base.base-conventions.gradle | 26 ++++ .../groovy/base.fill-build-constants.gradle | 16 +++ .../base.lenni0451-maven-publishing.gradle | 13 ++ .../base.maven-central-publishing.gradle | 13 ++ .../groovy/base.publishing-conventions.gradle | 30 +++++ ...inecraftauth.publishing-conventions.gradle | 33 ++++++ gradle.properties | 2 +- .../raphimc/minecraftauth/MinecraftAuth.java | 2 +- 11 files changed, 147 insertions(+), 113 deletions(-) create mode 100644 buildSrc/build.gradle create mode 100644 buildSrc/src/main/groovy/base.base-conventions.gradle create mode 100644 buildSrc/src/main/groovy/base.fill-build-constants.gradle create mode 100644 buildSrc/src/main/groovy/base.lenni0451-maven-publishing.gradle create mode 100644 buildSrc/src/main/groovy/base.maven-central-publishing.gradle create mode 100644 buildSrc/src/main/groovy/base.publishing-conventions.gradle create mode 100644 buildSrc/src/main/groovy/minecraftauth.publishing-conventions.gradle diff --git a/.gitignore b/.gitignore index 9d0620d..26560b9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,7 @@ hs_err_pid* /.idea/* !/.idea/copyright/ /.gradle/ -/build/ -/out/ +/buildSrc/.gradle/ +build/ +out/ +/run/ diff --git a/build.gradle b/build.gradle index 9e863fa..b0dc234 100644 --- a/build.gradle +++ b/build.gradle @@ -1,27 +1,15 @@ plugins { id "java-library" - id "maven-publish" - id "signing" + id "base.base-conventions" + id "base.fill-build-constants" + id "minecraftauth.publishing-conventions" id "net.raphimc.class-token-replacer" version "1.1.4" } -base { - java.toolchain.languageVersion = JavaLanguageVersion.of(8) - compileJava.options.encoding = compileTestJava.options.encoding = javadoc.options.encoding = "UTF-8" - - group = project.maven_group ?: rootProject.maven_group - archivesName = project.maven_name ?: rootProject.maven_name - version = project.maven_version ?: rootProject.maven_version -} - sourceSets { javaFxStub // Java 11+ does not include JavaFX anymore, so the JavaFX stubs are needed for the compiler } -repositories { - mavenCentral() -} - dependencies { compileOnly(annotationProcessor("org.projectlombok:lombok:1.18.38")) compileOnly "org.jetbrains:annotations:26.0.2" @@ -35,97 +23,3 @@ dependencies { } api "org.slf4j:slf4j-api:2.0.17" } - -sourceSets { - main { - classTokenReplacer { - property("\${version}", project.version) - property("\${impl_version}", "git-${project.name}-${project.version}:${project.latestCommitHash().get()}") - } - } -} - -java { - withSourcesJar() - withJavadocJar() -} - -jar { - from("LICENSE") { - rename { "${it}_${project.name ?: rootProject.name}" } - } -} - -artifacts { - archives javadocJar, sourcesJar -} - -publishing { - repositories { - maven { - name = "reposilite" - url = "https://maven.lenni0451.net/" + (project.maven_version.endsWith("SNAPSHOT") ? "snapshots" : "releases") - - credentials(PasswordCredentials) - authentication { - basic(BasicAuthentication) - } - } - maven { - name = "ossrh" - url = "https://s01.oss.sonatype.org/" + (project.maven_version.endsWith("SNAPSHOT") ? "content/repositories/snapshots/" : "service/local/staging/deploy/maven2/") - - credentials(PasswordCredentials) - authentication { - basic(BasicAuthentication) - } - } - } - publications { - maven(MavenPublication) { - groupId = project.maven_group - artifactId = project.maven_name - version = project.maven_version - - from components.java - - pom { - name = "MinecraftAuth" - description = "Simple and easy to use Minecraft microsoft authentication library (Java and Bedrock)" - url = "https://github.com/RaphiMC/MinecraftAuth" - licenses { - license { - name = "LGPL-3.0 License" - url = "https://github.com/RaphiMC/MinecraftAuth/blob/main/LICENSE" - } - } - developers { - developer { - id = "RK_01" - } - } - scm { - connection = "scm:git:git://github.com/RaphiMC/MinecraftAuth.git" - developerConnection = "scm:git:ssh://github.com/RaphiMC/MinecraftAuth.git" - url = "https://github.com/RaphiMC/MinecraftAuth.git" - } - } - } - } -} - -signing { - setRequired(false) - sign configurations.archives - sign publishing.publications.maven -} - -project.tasks.withType(PublishToMavenRepository).forEach { - it.dependsOn(project.tasks.withType(Sign)) -} - -Provider latestCommitHash() { - return providers.exec { - commandLine = ["git", "rev-parse", "--short", "HEAD"] - }.standardOutput.getAsText().map(String::trim) -} diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 0000000..e1c034f --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,7 @@ +plugins { + id "groovy-gradle-plugin" +} + +repositories { + gradlePluginPortal() +} diff --git a/buildSrc/src/main/groovy/base.base-conventions.gradle b/buildSrc/src/main/groovy/base.base-conventions.gradle new file mode 100644 index 0000000..e3f4137 --- /dev/null +++ b/buildSrc/src/main/groovy/base.base-conventions.gradle @@ -0,0 +1,26 @@ +base { + java.toolchain.languageVersion = JavaLanguageVersion.of(project.java_version) + + group = project.maven_group + archivesName = project.maven_name + version = project.maven_version +} + +repositories { + mavenCentral() +} + +jar { + var projectName = project.name + from("LICENSE") { + rename { "${it}_${projectName}" } + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.encoding = "UTF-8" +} + +tasks.withType(Javadoc).configureEach { + it.options.encoding = "UTF-8" +} diff --git a/buildSrc/src/main/groovy/base.fill-build-constants.gradle b/buildSrc/src/main/groovy/base.fill-build-constants.gradle new file mode 100644 index 0000000..60e6c75 --- /dev/null +++ b/buildSrc/src/main/groovy/base.fill-build-constants.gradle @@ -0,0 +1,16 @@ +plugins { + id "net.raphimc.class-token-replacer" +} + +sourceSets.configureEach { + it.classTokenReplacer { + property("\${version}", project.version) + property("\${commit_hash}", latestCommitHash().get()) + } +} + +Provider latestCommitHash() { + return providers.exec { + commandLine = ["git", "rev-parse", "--short", "HEAD"] + }.standardOutput.getAsText().map(String::trim) +} diff --git a/buildSrc/src/main/groovy/base.lenni0451-maven-publishing.gradle b/buildSrc/src/main/groovy/base.lenni0451-maven-publishing.gradle new file mode 100644 index 0000000..7dcd899 --- /dev/null +++ b/buildSrc/src/main/groovy/base.lenni0451-maven-publishing.gradle @@ -0,0 +1,13 @@ +publishing { + repositories { + maven { + name = "reposilite" + url = "https://maven.lenni0451.net/" + (project.maven_version.endsWith("SNAPSHOT") ? "snapshots" : "releases") + + credentials(PasswordCredentials) + authentication { + basic(BasicAuthentication) + } + } + } +} diff --git a/buildSrc/src/main/groovy/base.maven-central-publishing.gradle b/buildSrc/src/main/groovy/base.maven-central-publishing.gradle new file mode 100644 index 0000000..f92d87e --- /dev/null +++ b/buildSrc/src/main/groovy/base.maven-central-publishing.gradle @@ -0,0 +1,13 @@ +publishing { + repositories { + maven { + name = "ossrh" + url = "https://s01.oss.sonatype.org/" + (project.maven_version.endsWith("SNAPSHOT") ? "content/repositories/snapshots/" : "service/local/staging/deploy/maven2/") + + credentials(PasswordCredentials) + authentication { + basic(BasicAuthentication) + } + } + } +} diff --git a/buildSrc/src/main/groovy/base.publishing-conventions.gradle b/buildSrc/src/main/groovy/base.publishing-conventions.gradle new file mode 100644 index 0000000..4c87128 --- /dev/null +++ b/buildSrc/src/main/groovy/base.publishing-conventions.gradle @@ -0,0 +1,30 @@ +plugins { + id "maven-publish" + id "signing" +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + mavenJava(MavenPublication) { + from(components.java) + + groupId = project.maven_group + artifactId = project.maven_name + version = project.maven_version + } + } +} + +signing { + setRequired(false) + sign(publishing.publications.mavenJava) +} + +tasks.withType(PublishToMavenRepository).configureEach { + it.dependsOn(tasks.withType(Sign)) +} diff --git a/buildSrc/src/main/groovy/minecraftauth.publishing-conventions.gradle b/buildSrc/src/main/groovy/minecraftauth.publishing-conventions.gradle new file mode 100644 index 0000000..7c07e02 --- /dev/null +++ b/buildSrc/src/main/groovy/minecraftauth.publishing-conventions.gradle @@ -0,0 +1,33 @@ +plugins { + id "base.publishing-conventions" + id "base.maven-central-publishing" + id "base.lenni0451-maven-publishing" +} + +publishing { + publications { + mavenJava { + pom { + name = "MinecraftAuth" + description = "Simple and easy to use Minecraft microsoft authentication library (Java and Bedrock)" + url = "https://github.com/RaphiMC/MinecraftAuth" + licenses { + license { + name = "LGPL-3.0 License" + url = "https://github.com/RaphiMC/MinecraftAuth/blob/main/LICENSE" + } + } + developers { + developer { + id = "RK_01" + } + } + scm { + connection = "scm:git:git://github.com/RaphiMC/MinecraftAuth.git" + developerConnection = "scm:git:ssh://github.com/RaphiMC/MinecraftAuth.git" + url = "https://github.com/RaphiMC/MinecraftAuth.git" + } + } + } + } +} diff --git a/gradle.properties b/gradle.properties index 99d9416..41d9d04 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.daemon=true org.gradle.parallel=true -org.gradle.configureondemand=true +java_version=8 maven_group=net.raphimc maven_name=MinecraftAuth maven_version=4.1.2-SNAPSHOT diff --git a/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java b/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java index 68f17d7..5513a2e 100644 --- a/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java +++ b/src/main/java/net/raphimc/minecraftauth/MinecraftAuth.java @@ -50,7 +50,7 @@ public class MinecraftAuth { public static final String VERSION = "${version}"; - public static final String IMPL_VERSION = "${impl_version}"; + public static final String IMPL_VERSION = "${version}+${commit_hash}"; public static ILogger LOGGER = new LazyLogger(Slf4jConsoleLogger::new); public static String USER_AGENT = "MinecraftAuth/" + VERSION; From 822edb0ee16c752215deea2250efbd172e227a75 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sun, 4 May 2025 14:55:17 +0200 Subject: [PATCH 45/54] Enable gradle configuration cache --- build.gradle | 2 +- buildSrc/src/main/groovy/base.base-conventions.gradle | 1 + gradle.properties | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b0dc234..dfa34a8 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { id "base.base-conventions" id "base.fill-build-constants" id "minecraftauth.publishing-conventions" - id "net.raphimc.class-token-replacer" version "1.1.4" + id "net.raphimc.class-token-replacer" version "1.1.5" } sourceSets { diff --git a/buildSrc/src/main/groovy/base.base-conventions.gradle b/buildSrc/src/main/groovy/base.base-conventions.gradle index e3f4137..5192ad6 100644 --- a/buildSrc/src/main/groovy/base.base-conventions.gradle +++ b/buildSrc/src/main/groovy/base.base-conventions.gradle @@ -23,4 +23,5 @@ tasks.withType(JavaCompile).configureEach { tasks.withType(Javadoc).configureEach { it.options.encoding = "UTF-8" + it.options.addStringOption("Xdoclint:none", "-quiet") } diff --git a/gradle.properties b/gradle.properties index 41d9d04..c8cd3b1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,6 @@ org.gradle.daemon=true org.gradle.parallel=true +org.gradle.configuration-cache=true java_version=8 maven_group=net.raphimc From 18445c2c0d89e0706aa72c50c60d1fa9b44e2d85 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sun, 4 May 2025 19:00:48 +0200 Subject: [PATCH 46/54] Sync gradle scripts between projects --- .../src/main/groovy/base.base-conventions.gradle | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/groovy/base.base-conventions.gradle b/buildSrc/src/main/groovy/base.base-conventions.gradle index 5192ad6..1f54c3c 100644 --- a/buildSrc/src/main/groovy/base.base-conventions.gradle +++ b/buildSrc/src/main/groovy/base.base-conventions.gradle @@ -11,9 +11,16 @@ repositories { } jar { - var projectName = project.name - from("LICENSE") { - rename { "${it}_${projectName}" } + if (layout.projectDirectory.file("LICENSE").asFile.exists()) { + def projectName = project.name + from(layout.projectDirectory.file("LICENSE")) { + rename { "${it}_${projectName}" } + } + } else if (rootProject.layout.projectDirectory.file("LICENSE").asFile.exists()) { + def projectName = rootProject.name + from(rootProject.layout.projectDirectory.file("LICENSE")) { + rename { "${it}_${projectName}" } + } } } From 8e8a195a8c86e991bc31800e668663ae853c25bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 16:33:27 +0200 Subject: [PATCH 47/54] Bump net.lenni0451.commons:httpclient from 1.7.0 to 1.7.1 (#63) Bumps [net.lenni0451.commons:httpclient](https://github.com/Lenni0451/commons) from 1.7.0 to 1.7.1. - [Release notes](https://github.com/Lenni0451/commons/releases) - [Commits](https://github.com/Lenni0451/commons/commits) --- updated-dependencies: - dependency-name: net.lenni0451.commons:httpclient dependency-version: 1.7.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index dfa34a8..7396118 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ dependencies { compileOnly "org.jetbrains:annotations:26.0.2" compileOnly sourceSets.javaFxStub.output - api "net.lenni0451.commons:httpclient:1.7.0" + api "net.lenni0451.commons:httpclient:1.7.1" api "com.google.code.gson:gson:2.13.1" api "io.jsonwebtoken:jjwt-impl:0.12.6" api("io.jsonwebtoken:jjwt-gson:0.12.6") { From cd7c3ae148a91cfac2f68f9df3986dfb019d03ed Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Wed, 7 May 2025 21:29:16 +0200 Subject: [PATCH 48/54] Use project name for jar file name --- buildSrc/src/main/groovy/base.base-conventions.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/groovy/base.base-conventions.gradle b/buildSrc/src/main/groovy/base.base-conventions.gradle index 1f54c3c..7b0fc7b 100644 --- a/buildSrc/src/main/groovy/base.base-conventions.gradle +++ b/buildSrc/src/main/groovy/base.base-conventions.gradle @@ -2,7 +2,7 @@ base { java.toolchain.languageVersion = JavaLanguageVersion.of(project.java_version) group = project.maven_group - archivesName = project.maven_name + archivesName = project.name version = project.maven_version } From 635ee977500e1a94c73c421f42bbc4115f7ff5ed Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sat, 17 May 2025 17:36:58 +0200 Subject: [PATCH 49/54] Fixed dependabot config --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 21a90a3..0dff7a6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,9 +1,15 @@ version: 2 +registries: + maven-central: + type: maven-repository + url: "https://repo.maven.apache.org/maven2/" updates: - package-ecosystem: "gradle" directory: "/" schedule: interval: "daily" + registries: + - maven-central - package-ecosystem: "github-actions" directory: "/" schedule: From adcd670a0788d1ead175f720ec6ea3e431411038 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 17 May 2025 17:39:22 +0200 Subject: [PATCH 50/54] Bump net.raphimc.class-token-replacer from 1.1.5 to 1.1.6 (#64) Bumps net.raphimc.class-token-replacer from 1.1.5 to 1.1.6. --- updated-dependencies: - dependency-name: net.raphimc.class-token-replacer dependency-version: 1.1.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7396118..45f70a7 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { id "base.base-conventions" id "base.fill-build-constants" id "minecraftauth.publishing-conventions" - id "net.raphimc.class-token-replacer" version "1.1.5" + id "net.raphimc.class-token-replacer" version "1.1.6" } sourceSets { From 0a7efacbae4132d84431b60fa6985a0c80010f38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 09:14:09 +0200 Subject: [PATCH 51/54] Bump org.gradle.toolchains.foojay-resolver-convention (#65) Bumps org.gradle.toolchains.foojay-resolver-convention from 0.10.0 to 1.0.0. --- updated-dependencies: - dependency-name: org.gradle.toolchains.foojay-resolver-convention dependency-version: 1.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 21a49e4..62759a0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,7 +6,7 @@ pluginManagement { } plugins { - id "org.gradle.toolchains.foojay-resolver-convention" version "0.10.0" + id "org.gradle.toolchains.foojay-resolver-convention" version "1.0.0" } rootProject.name = "MinecraftAuth" From b734f88ee277ccfe0c6b15f823d2d427a4895678 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Thu, 22 May 2025 16:59:26 +0200 Subject: [PATCH 52/54] Updated gradle to 8.14.1 --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 247cf2a..9128c7d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionSha256Sum=845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 0553b2ba2d084a692257d890664b1ded901862b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=BA=E9=96=93=E5=B7=A5=E4=BD=9C?= Date: Sat, 7 Jun 2025 20:30:31 +0800 Subject: [PATCH 53/54] use gradle 8.5 is enough --- gradle/wrapper/gradle-wrapper.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9128c7d..1af9e09 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From b32f5427864cdb16952c00a14878167b23166298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=BA=E9=96=93=E5=B7=A5=E4=BD=9C?= Date: Sat, 7 Jun 2025 20:30:35 +0800 Subject: [PATCH 54/54] Update minecraftauth.publishing-conventions.gradle --- .../minecraftauth.publishing-conventions.gradle | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/buildSrc/src/main/groovy/minecraftauth.publishing-conventions.gradle b/buildSrc/src/main/groovy/minecraftauth.publishing-conventions.gradle index 7c07e02..c1f309e 100644 --- a/buildSrc/src/main/groovy/minecraftauth.publishing-conventions.gradle +++ b/buildSrc/src/main/groovy/minecraftauth.publishing-conventions.gradle @@ -8,13 +8,13 @@ publishing { publications { mavenJava { pom { - name = "MinecraftAuth" + name = "MinecraftAuthHeadless" description = "Simple and easy to use Minecraft microsoft authentication library (Java and Bedrock)" - url = "https://github.com/RaphiMC/MinecraftAuth" + url = "https://github.com/mcio-dev/MinecraftAuthHeadless" licenses { license { name = "LGPL-3.0 License" - url = "https://github.com/RaphiMC/MinecraftAuth/blob/main/LICENSE" + url = "https://github.com/mcio-dev/MinecraftAuthHeadless/blob/main/LICENSE" } } developers { @@ -23,9 +23,9 @@ publishing { } } scm { - connection = "scm:git:git://github.com/RaphiMC/MinecraftAuth.git" - developerConnection = "scm:git:ssh://github.com/RaphiMC/MinecraftAuth.git" - url = "https://github.com/RaphiMC/MinecraftAuth.git" + connection = "scm:git:git://github.com/mcio-dev/MinecraftAuthHeadless.git" + developerConnection = "scm:git:ssh://github.com/mcio-dev/MinecraftAuthHeadless.git" + url = "https://github.com/mcio-dev/MinecraftAuthHeadless.git" } } }