Compare commits

...

89 Commits

Author SHA1 Message Date
65a379c3c2 Catching missing class on other platforms than Paper or older
Related #1313
2025-06-23 19:51:35 +02:00
2ff6547552 Improve debug logs for force login in Passky 2025-06-23 11:05:01 +02:00
c3233b2c67 - Fix Passky hook
- Implement debug logs to Passky
2025-06-23 11:02:08 +02:00
f86c918a8b Use Paper API for detecting proxies (1.21.6+)
Related #1312
2025-06-23 10:44:58 +02:00
001cf3237b Update CraftAPI to fix 403 Forbidden errors from Mojang API
Fixes #1306
Fixes #1305
2025-06-13 11:13:52 +02:00
c28c634351 Bump advanced-security/maven-dependency-submission-action from 4.1.2 to 5.0.0 (#1298)
Bump advanced-security/maven-dependency-submission-action

Bumps [advanced-security/maven-dependency-submission-action](https://github.com/advanced-security/maven-dependency-submission-action) from 4.1.2 to 5.0.0.
- [Release notes](https://github.com/advanced-security/maven-dependency-submission-action/releases)
- [Commits](https://github.com/advanced-security/maven-dependency-submission-action/compare/v4.1.2...v5.0.0)

---
updated-dependencies:
- dependency-name: advanced-security/maven-dependency-submission-action
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-03 17:19:54 +02:00
4550562465 Fix finding the correct login sessions in Velocity
Velocity uses different objects during each login phase.
Therefore, keys are no persistent. Only an internal variable
is shared and exposed with `getConnection()`, but this method
is not available in the API. We use `InetSocketAddress` objects
until there is a better method for identifying sessions.

Related #1297
2025-06-02 18:23:33 +02:00
2308d98dcd Added /fldelete <name> to delete profiles from storage (#1283)
* Added `/fldelete <name>` to delete profiles from storage by name

* Implemented requested changes for pull request #1283

* Update delete command's perm default
2025-05-26 14:51:21 +02:00
063b6a9405 Add support for Passky login plugin (#1289) 2025-05-20 11:19:54 +02:00
1b45b8d2be Run tasks directly instead of using the sync method
Fixes #1291
2025-05-13 17:05:23 +02:00
8be0de4781 Add new download location 2025-05-13 16:59:58 +02:00
d06c44041d Add annotation processor explicitly to fix plugin json generation
Related #1286
Related #1292
2025-05-13 16:57:28 +02:00
69fa341188 [CI-SKIP] Add GitHub changelog configuration 2025-04-28 13:06:17 +02:00
e1ba698f28 Remove duplicated repository 2025-04-24 21:01:11 +02:00
7bf613c8b4 Add support for Passky login plugin 2025-04-24 20:55:03 +02:00
1c194280b1 Bump the production-dependencies group across 1 directory with 8 updates (#1288)
Bumps the production-dependencies group with 8 updates in the /
directory:

| Package | From | To |
| --- | --- | --- |
|
[com.puppycrawl.tools:checkstyle](https://github.com/checkstyle/checkstyle)
| `10.17.0` | `10.23.0` |
|
[org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin)
| `3.13.0` | `3.14.0` |
|
[com.mycila:license-maven-plugin](https://github.com/mathieucarbou/license-maven-plugin)
| `4.5` | `5.0.0` |
|
[org.apache.maven.plugins:maven-checkstyle-plugin](https://github.com/apache/maven-checkstyle-plugin)
| `3.4.0` | `3.6.0` |
|
[org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire)
| `3.3.0` | `3.5.3` |
| org.slf4j:slf4j-jdk14 | `2.0.13` | `2.0.17` |
| [org.yaml:snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) |
`2.2` | `2.4` |
|
[org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j)
| `3.4.0` | `3.5.3` |


Updates `com.puppycrawl.tools:checkstyle` from 10.17.0 to 10.23.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/checkstyle/checkstyle/releases">com.puppycrawl.tools:checkstyle's
releases</a>.</em></p>
<blockquote>
<h2>checkstyle-10.23.0</h2>
<p>Checkstyle 10.23.0 - <a
href="https://checkstyle.org/releasenotes.html#Release_10.23.0">https://checkstyle.org/releasenotes.html#Release_10.23.0</a></p>
<p>New:</p>
<p><a
href="https://redirect.github.com/checkstyle/checkstyle/issues/9745">#9745</a>
- JavadocMethod: new property 'allowInlineReturn' to support for Javadoc
return tag as inline</p>
<p>Bug fixes:</p>
<p><a
href="https://redirect.github.com/checkstyle/checkstyle/issues/14697">#14697</a>
- False negative in UnusedImportCheck</p>
<!-- raw HTML omitted -->
<h2>checkstyle-10.22.0</h2>
<p>Checkstyle 10.22.0 - <a
href="https://checkstyle.org/releasenotes.html#Release_10.22.0">https://checkstyle.org/releasenotes.html#Release_10.22.0</a></p>
<p>Breaking backward compatibility:</p>
<p><a
href="https://redirect.github.com/checkstyle/checkstyle/issues/9280">#9280</a>
- JavadocVariable: new property 'accessModifiers' as substitution of
'scope' and 'excludeScope'
<a
href="https://redirect.github.com/checkstyle/checkstyle/issues/15499">#15499</a>
- Change default or IllegalIdentifierName</p>
<p>Bug fixes:</p>
<p><a
href="https://redirect.github.com/checkstyle/checkstyle/issues/16641">#16641</a>
- <code>FileContents.getJavadocBefore()</code>: Comments should not be
skipped if it is not alone in line
<a
href="https://redirect.github.com/checkstyle/checkstyle/issues/16385">#16385</a>
- JavadocTagContinuationIndentation Ignore indentation check when HTML
tag break line
<a
href="https://redirect.github.com/checkstyle/checkstyle/issues/16628">#16628</a>
- use SLL prediction mode for fast javadoc parsing to improve
performance
<a
href="https://redirect.github.com/checkstyle/checkstyle/issues/43">#43</a>
- JavadocMethod: Javadoc Not Detected Above Multiline Comments
<a
href="https://redirect.github.com/checkstyle/checkstyle/issues/12817">#12817</a>
- Incorrect Indentation errors for expression switches with
google_checks.xml
<a
href="https://redirect.github.com/checkstyle/checkstyle/issues/6637">#6637</a>
- SuppressWarningsHolder aliasList members don't act like aliases
<a
href="https://redirect.github.com/checkstyle/checkstyle/issues/13043">#13043</a>
- Make references optional for link and linkplain tags
<a
href="https://redirect.github.com/checkstyle/checkstyle/issues/16005">#16005</a>
- Parse errors if ``@<code>see</code> spans multiple lines
<a
href="https://redirect.github.com/checkstyle/checkstyle/issues/14446">#14446</a>
- Parse error when Javadoc contains `@`snippet with code example that
uses Java annotation</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="25f2753f65"><code>25f2753</code></a>
[maven-release-plugin] prepare release checkstyle-10.23.0</li>
<li><a
href="ed97c94df9"><code>ed97c94</code></a>
doc: release notes for 10.23.0</li>
<li><a
href="9e773ff72e"><code>9e773ff</code></a>
Issue <a
href="https://redirect.github.com/checkstyle/checkstyle/issues/16332">#16332</a>:
Updated SuppressionSingleFilterExamplesTest methods to use veri...</li>
<li><a
href="688d0cda5b"><code>688d0cd</code></a>
Issue <a
href="https://redirect.github.com/checkstyle/checkstyle/issues/16360">#16360</a>:
Migrate XMLLoggerTest to use inlineConfigParser</li>
<li><a
href="66946e9fe9"><code>66946e9</code></a>
Issue <a
href="https://redirect.github.com/checkstyle/checkstyle/issues/16360">#16360</a>:
Migrate XMLLoggerTest.testAddErrorOnZeroColumns to use inlineCo...</li>
<li><a
href="4890ef67d1"><code>4890ef6</code></a>
Issue <a
href="https://redirect.github.com/checkstyle/checkstyle/issues/14631">#14631</a>:
Updated HR_TAG to new AST format</li>
<li><a
href="754c35d720"><code>754c35d</code></a>
minor: Bump version to 10.23.0-SNAPSHOT</li>
<li><a
href="359fa919d6"><code>359fa91</code></a>
Issue <a
href="https://redirect.github.com/checkstyle/checkstyle/issues/16155">#16155</a>:
use nio api in XpathFileGeneratorAuditListener</li>
<li><a
href="3f0fec8c85"><code>3f0fec8</code></a>
Issue <a
href="https://redirect.github.com/checkstyle/checkstyle/issues/9745">#9745</a>:
Added JavadocMethod inline return tag support</li>
<li><a
href="381a852b92"><code>381a852</code></a>
Issue <a
href="https://redirect.github.com/checkstyle/checkstyle/issues/14631">#14631</a>:
Updated DD to new AST format</li>
<li>Additional commits viewable in <a
href="https://github.com/checkstyle/checkstyle/compare/checkstyle-10.17.0...checkstyle-10.23.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.apache.maven.plugins:maven-compiler-plugin` from 3.13.0 to
3.14.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/apache/maven-compiler-plugin/releases">org.apache.maven.plugins:maven-compiler-plugin's
releases</a>.</em></p>
<blockquote>
<h2>3.14.0</h2>
<!-- raw HTML omitted -->
<h2>🚀 New features and improvements</h2>
<ul>
<li>Enable GitHub Issues (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/305">#305</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li><a
href="https://issues.apache.org/jira/browse/MCOMPILER-579">[MCOMPILER-579]</a>
- allow module-version configuration (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/273">#273</a>)
<a href="https://github.com/mguillem"><code>@​mguillem</code></a></li>
<li>Bump org.codehaus.plexus:plexus-java from 1.2.0 to 1.4.0 - JDK 24
support (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/293">#293</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Update release-drafter configuration, PR automation (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/281">#281</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li><a
href="https://issues.apache.org/jira/browse/MCOMPILER-588">[MCOMPILER-588]</a>
- JUnit4 test framework to JUnit5 migration (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/236">#236</a>)
<a
href="https://github.com/MidNight-er"><code>@​MidNight-er</code></a></li>
</ul>
<h2>🐛 Bug Fixes</h2>
<ul>
<li>Fix release-drafter config (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/292">#292</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li><a
href="https://issues.apache.org/jira/browse/MCOMPILER-591">[MCOMPILER-591]</a>
- testCompile - fix detections of target less than 1.9 (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/240">#240</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
</ul>
<h2>📦 Dependency updates</h2>
<ul>
<li>Bump org.codehaus.plexus:plexus-java from 1.2.0 to 1.4.0 - JDK 24
support (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/293">#293</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Bump mavenVersion from 3.6.3 to 3.9.9 (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/283">#283</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Bump org.mockito:mockito-core from 4.8.0 to 4.11.0 (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/288">#288</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Bump org.apache.maven.plugins:maven-plugins from 42 to 43 (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/285">#285</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li><a
href="https://issues.apache.org/jira/browse/MCOMPILER-590">[MCOMPILER-590]</a>
- Bump org.apache.maven.plugins:maven-plugins from 41 to 42 (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/235">#235</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
</ul>
<h2>👻 Maintenance</h2>
<ul>
<li>Update scm tag according to branch (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/303">#303</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li><a
href="https://issues.apache.org/jira/browse/MNGSITE-529">[MNGSITE-529]</a>
- Rename &quot;Goals&quot; to &quot;Plugin Documentation&quot; (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/300">#300</a>)
<a href="https://github.com/Bukama"><code>@​Bukama</code></a></li>
<li>Use JUnit version from parent (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/299">#299</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li><a
href="https://issues.apache.org/jira/browse/MCOMPILER-529">[MCOMPILER-529]</a>
- Update docs about version schema (Maven 3) (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/295">#295</a>)
<a href="https://github.com/Bukama"><code>@​Bukama</code></a></li>
<li>Use default Maven versions for build on GitHub (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/289">#289</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li>Remove Maven 3 note (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/241">#241</a>)
<a href="https://github.com/elharo"><code>@​elharo</code></a></li>
<li>Remove info about old versions (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/237">#237</a>)
<a href="https://github.com/elharo"><code>@​elharo</code></a></li>
</ul>
<h2>🔧 Build</h2>
<ul>
<li>Exclude JDK 8 - temurin, adopt-openj9 on macos, use defaults values
(<a
href="https://redirect.github.com/apache/maven-compiler-plugin/pull/238">#238</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b5e7d9b907"><code>b5e7d9b</code></a>
[maven-release-plugin] prepare release maven-compiler-plugin-3.14.0</li>
<li><a
href="9134f1231a"><code>9134f12</code></a>
Enable GitHub Issues</li>
<li><a
href="19b8b128f4"><code>19b8b12</code></a>
Update scm tag according to branch</li>
<li><a
href="09dce4e613"><code>09dce4e</code></a>
[MCOMPILER-579] allow module-version configuration (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/issues/273">#273</a>)</li>
<li><a
href="f7c3c5fab1"><code>f7c3c5f</code></a>
Bump org.codehaus.plexus:plexus-java from 1.2.0 to 1.4.0</li>
<li><a
href="764a54b22b"><code>764a54b</code></a>
[MNGSITE-529] Rename &quot;Goals&quot; to &quot;Plugin
Documentation&quot;</li>
<li><a
href="cfacbc1630"><code>cfacbc1</code></a>
PR Automation only on close event</li>
<li><a
href="5c26bba9ed"><code>5c26bba</code></a>
Use JUnit version from parent</li>
<li><a
href="5449407f10"><code>5449407</code></a>
[MCOMPILER-529] Update docs about version schema (Maven 3)</li>
<li><a
href="01d5b8824e"><code>01d5b88</code></a>
Bump mavenVersion from 3.6.3 to 3.9.9 (<a
href="https://redirect.github.com/apache/maven-compiler-plugin/issues/283">#283</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.13.0...maven-compiler-plugin-3.14.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `com.mycila:license-maven-plugin` from 4.5 to 5.0.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/mathieucarbou/license-maven-plugin/releases">com.mycila:license-maven-plugin's
releases</a>.</em></p>
<blockquote>
<h2>v5.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Bump junit.version from 5.11.0 to 5.11.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/836">mathieucarbou/license-maven-plugin#836</a></li>
<li>Drop Java 8, use 11 by <a
href="https://github.com/mathieucarbou"><code>@​mathieucarbou</code></a>
in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/833">mathieucarbou/license-maven-plugin#833</a></li>
<li>[pom] Bump jgit to 6.10.0.202406032230-r by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/837">mathieucarbou/license-maven-plugin#837</a></li>
<li>Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.6 to 3.2.7
by <a href="https://github.com/dependabot"><code>@​dependabot</code></a>
in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/838">mathieucarbou/license-maven-plugin#838</a></li>
<li>Bump com.puppycrawl.tools:checkstyle from 10.18.1 to 10.18.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/839">mathieucarbou/license-maven-plugin#839</a></li>
<li>Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.10.0 to
3.10.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/841">mathieucarbou/license-maven-plugin#841</a></li>
<li>Bump junit.version from 5.11.1 to 5.11.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/843">mathieucarbou/license-maven-plugin#843</a></li>
<li>Bump surefire.version from 3.5.0 to 3.5.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/844">mathieucarbou/license-maven-plugin#844</a></li>
<li>Bump junit.version from 5.11.2 to 5.11.3 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/845">mathieucarbou/license-maven-plugin#845</a></li>
<li>Bump org.apache.maven.plugins:maven-invoker-plugin from 3.8.0 to
3.8.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/846">mathieucarbou/license-maven-plugin#846</a></li>
<li>Bump org.apache.maven.plugins:maven-project-info-reports-plugin from
3.7.0 to 3.8.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/848">mathieucarbou/license-maven-plugin#848</a></li>
<li>Bump org.apache.maven.plugins:maven-site-plugin from 3.20.0 to
3.21.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/847">mathieucarbou/license-maven-plugin#847</a></li>
<li>Bump maven-plugin.version from 3.15.0 to 3.15.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/849">mathieucarbou/license-maven-plugin#849</a></li>
<li>Bump org.apache.maven.plugins:maven-checkstyle-plugin from 3.5.0 to
3.6.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/850">mathieucarbou/license-maven-plugin#850</a></li>
<li>Bump com.puppycrawl.tools:checkstyle from 10.18.2 to 10.19.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/851">mathieucarbou/license-maven-plugin#851</a></li>
<li>Bump com.puppycrawl.tools:checkstyle from 10.19.0 to 10.20.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/852">mathieucarbou/license-maven-plugin#852</a></li>
<li>Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.10.1 to
3.11.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/854">mathieucarbou/license-maven-plugin#854</a></li>
<li>Bump surefire.version from 3.5.1 to 3.5.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/853">mathieucarbou/license-maven-plugin#853</a></li>
<li>Bump com.puppycrawl.tools:checkstyle from 10.20.0 to 10.20.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/855">mathieucarbou/license-maven-plugin#855</a></li>
<li>Bump groovy.version from 4.0.23 to 4.0.24 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/856">mathieucarbou/license-maven-plugin#856</a></li>
<li>[exclusions] Do not handle .gradle or build directories by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/858">mathieucarbou/license-maven-plugin#858</a></li>
<li>Bump com.puppycrawl.tools:checkstyle from 10.20.1 to 10.20.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/861">mathieucarbou/license-maven-plugin#861</a></li>
<li>Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.11.1 to
3.11.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/862">mathieucarbou/license-maven-plugin#862</a></li>
<li>Bump org.apache.maven.plugins:maven-invoker-plugin from 3.8.1 to
3.9.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/863">mathieucarbou/license-maven-plugin#863</a></li>
<li>Bump junit.version from 5.11.3 to 5.11.4 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/865">mathieucarbou/license-maven-plugin#865</a></li>
<li>Bump com.puppycrawl.tools:checkstyle from 10.20.2 to 10.21.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/864">mathieucarbou/license-maven-plugin#864</a></li>
<li>Bump com.google.guava:guava from 33.3.1-jre to 33.4.0-jre by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/866">mathieucarbou/license-maven-plugin#866</a></li>
<li>Bump org.assertj:assertj-core from 3.26.3 to 3.27.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/867">mathieucarbou/license-maven-plugin#867</a></li>
<li>Bump com.puppycrawl.tools:checkstyle from 10.21.0 to 10.21.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/871">mathieucarbou/license-maven-plugin#871</a></li>
<li>Bump org.assertj:assertj-core from 3.27.0 to 3.27.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/872">mathieucarbou/license-maven-plugin#872</a></li>
<li>Bump org.assertj:assertj-core from 3.27.1 to 3.27.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/875">mathieucarbou/license-maven-plugin#875</a></li>
<li>Test to specify licenseSet includes from CLI by <a
href="https://github.com/mathieu"><code>@​mathieu</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/878">mathieucarbou/license-maven-plugin#878</a></li>
<li>[GA] Update snapshot report by <a
href="https://github.com/github-actions"><code>@​github-actions</code></a>
in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/835">mathieucarbou/license-maven-plugin#835</a></li>
<li>lazy evaluation for git provided properties by <a
href="https://github.com/frawa"><code>@​frawa</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/877">mathieucarbou/license-maven-plugin#877</a></li>
<li>[GA] Update snapshot report by <a
href="https://github.com/github-actions"><code>@​github-actions</code></a>
in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/879">mathieucarbou/license-maven-plugin#879</a></li>
<li>[exclusions] Add angular folder to exclusions by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/869">mathieucarbou/license-maven-plugin#869</a></li>
<li>Update dependency com.mycila:license-maven-plugin to v4.6 by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/868">mathieucarbou/license-maven-plugin#868</a></li>
<li>[java11] Use Path.of instead of Paths.get by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/881">mathieucarbou/license-maven-plugin#881</a></li>
<li>[GA] Update snapshot report by <a
href="https://github.com/github-actions"><code>@​github-actions</code></a>
in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/880">mathieucarbou/license-maven-plugin#880</a></li>
<li>Bump org.assertj:assertj-core from 3.27.2 to 3.27.3 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/889">mathieucarbou/license-maven-plugin#889</a></li>
<li>[tests] Rewrite hamcrest to assertj and remove hamcrest from the
build by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/895">mathieucarbou/license-maven-plugin#895</a></li>
<li>Use less of plexus and no longer need to override plexus xml by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/894">mathieucarbou/license-maven-plugin#894</a></li>
<li>Add to default exclusion and cleanup pom on exclusions already in
core releases by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/892">mathieucarbou/license-maven-plugin#892</a></li>
<li>[gha] Make sure we cache maven (and sort) and make sure docs are
proper EOF marked by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/893">mathieucarbou/license-maven-plugin#893</a></li>
<li>Build cleanup items by <a
href="https://github.com/hazendaz"><code>@​hazendaz</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/891">mathieucarbou/license-maven-plugin#891</a></li>
<li>[GA] Update snapshot report by <a
href="https://github.com/github-actions"><code>@​github-actions</code></a>
in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/890">mathieucarbou/license-maven-plugin#890</a></li>
<li>Bump com.puppycrawl.tools:checkstyle from 10.21.1 to 10.21.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/899">mathieucarbou/license-maven-plugin#899</a></li>
<li>Bump groovy.version from 4.0.24 to 4.0.25 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/pull/898">mathieucarbou/license-maven-plugin#898</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="57aa95f7b0"><code>57aa95f</code></a>
[maven-release-plugin] prepare release v5.0.0</li>
<li><a
href="de4e5d9fcc"><code>de4e5d9</code></a>
Merge pull request <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/issues/921">#921</a>
from mathieucarbou/dependabot/maven/org.mockito-mocki...</li>
<li><a
href="1fd530b022"><code>1fd530b</code></a>
Bump org.mockito:mockito-bom from 5.16.0 to 5.16.1</li>
<li><a
href="0229bcf6fe"><code>0229bcf</code></a>
Merge pull request <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/issues/920">#920</a>
from mathieucarbou/dependabot/maven/junit.version-5.12.1</li>
<li><a
href="34c9cb32b1"><code>34c9cb3</code></a>
Bump junit.version from 5.12.0 to 5.12.1</li>
<li><a
href="8d11e9c28b"><code>8d11e9c</code></a>
Merge pull request <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/issues/918">#918</a>
from mathieucarbou/dependabot/maven/com.puppycrawl.to...</li>
<li><a
href="04794f5a92"><code>04794f5</code></a>
Bump com.puppycrawl.tools:checkstyle from 10.21.3 to 10.21.4</li>
<li><a
href="b2243d70dd"><code>b2243d7</code></a>
Merge pull request <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/issues/917">#917</a>
from mathieucarbou/dependabot/maven/org.mockito-mocki...</li>
<li><a
href="915c37355d"><code>915c373</code></a>
Bump org.mockito:mockito-bom from 5.15.2 to 5.16.0</li>
<li><a
href="ff4b1d6565"><code>ff4b1d6</code></a>
Merge pull request <a
href="https://redirect.github.com/mathieucarbou/license-maven-plugin/issues/915">#915</a>
from mathieucarbou/dependabot/maven/org.apache.maven....</li>
<li>Additional commits viewable in <a
href="https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.5...v5.0.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.apache.maven.plugins:maven-checkstyle-plugin` from 3.4.0 to
3.6.0
<details>
<summary>Commits</summary>
<ul>
<li><a
href="dd1abd9ee7"><code>dd1abd9</code></a>
[maven-release-plugin] prepare release
maven-checkstyle-plugin-3.6.0</li>
<li><a
href="9ccb06ed3e"><code>9ccb06e</code></a>
fix</li>
<li><a
href="6ac89b88de"><code>6ac89b8</code></a>
[MCHECKSTYLE-452] Upgrade to Doxia 2.0.0 GA Stack</li>
<li><a
href="ff1a1b76e2"><code>ff1a1b7</code></a>
Bump org.apache.commons:commons-lang3 from 3.16.0 to 3.17.0</li>
<li><a
href="13e16c5bbf"><code>13e16c5</code></a>
Remove unecessary test dependency on plexus-container-default</li>
<li><a
href="a7c962ae77"><code>a7c962a</code></a>
[maven-release-plugin] prepare for next development iteration</li>
<li><a
href="868abc95ea"><code>868abc9</code></a>
[maven-release-plugin] prepare release
maven-checkstyle-plugin-3.5.0</li>
<li><a
href="9043f8a96e"><code>9043f8a</code></a>
[MCHECKSTYLE-446] Dynamically calculate
xrefLocation/xrefTestLocation</li>
<li><a
href="0e7bd00e10"><code>0e7bd00</code></a>
[MCHECKSTYLE-445] Upgrade to Doxia 2.0.0 Milestone Stack</li>
<li><a
href="b92666d0b0"><code>b92666d</code></a>
Bump org.apache.maven.plugins:maven-plugins from 42 to 43</li>
<li>Additional commits viewable in <a
href="https://github.com/apache/maven-checkstyle-plugin/compare/maven-checkstyle-plugin-3.4.0...maven-checkstyle-plugin-3.6.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.apache.maven.plugins:maven-surefire-plugin` from 3.3.0 to
3.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/apache/maven-surefire/releases">org.apache.maven.plugins:maven-surefire-plugin's
releases</a>.</em></p>
<blockquote>
<h2>3.5.3</h2>
<!-- raw HTML omitted -->
<h2>🐛 Bug Fixes</h2>
<ul>
<li><a
href="https://issues.apache.org/jira/browse/SUREFIRE-1737">[SUREFIRE-1737]</a>
- Fix disable in statelessTestsetReporter (<a
href="https://redirect.github.com/apache/maven-surefire/pull/816">#816</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li><a
href="https://issues.apache.org/jira/browse/SUREFIRE-1643">[SUREFIRE-1643]</a>
- surefire junit5 parallel tests (<a
href="https://redirect.github.com/apache/maven-surefire/pull/815">#815</a>)
<a href="https://github.com/olamy"><code>@​olamy</code></a></li>
<li><a
href="https://issues.apache.org/jira/browse/SUREFIRE-2289">[SUREFIRE-2289]</a>
- Make exceptions more appropriate to context (<a
href="https://redirect.github.com/apache/maven-surefire/pull/798">#798</a>)
<a href="https://github.com/elharo"><code>@​elharo</code></a></li>
</ul>
<h2>👻 Maintenance</h2>
<ul>
<li>surefire shared utils version current version (<a
href="https://redirect.github.com/apache/maven-surefire/pull/825">#825</a>)
<a href="https://github.com/olamy"><code>@​olamy</code></a></li>
<li>Update site descriptors (<a
href="https://redirect.github.com/apache/maven-surefire/pull/821">#821</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li>Use newer version of surefire for itself testing, enable JUnit 5 in
tests (<a
href="https://redirect.github.com/apache/maven-surefire/pull/822">#822</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li>Remove dependencies from root pom (<a
href="https://redirect.github.com/apache/maven-surefire/pull/819">#819</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li>move this dependency to dptMngt (<a
href="https://redirect.github.com/apache/maven-surefire/pull/818">#818</a>)
<a href="https://github.com/olamy"><code>@​olamy</code></a></li>
<li><a
href="https://issues.apache.org/jira/browse/SUREFIRE-2291">[SUREFIRE-2291]</a>
- Change logger from Plexus to SLF4J (<a
href="https://redirect.github.com/apache/maven-surefire/pull/811">#811</a>)
<a
href="https://github.com/jeffjensen"><code>@​jeffjensen</code></a></li>
<li>Add GitHub Automation actions (<a
href="https://redirect.github.com/apache/maven-surefire/pull/812">#812</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li>Convert reports to Guice (<a
href="https://redirect.github.com/apache/maven-surefire/pull/803">#803</a>)
<a href="https://github.com/elharo"><code>@​elharo</code></a></li>
<li><a
href="https://issues.apache.org/jira/browse/MNGSITE-529">[MNGSITE-529]</a>
- Rename &quot;Goals&quot; to &quot;Plugin Documentation&quot; (<a
href="https://redirect.github.com/apache/maven-surefire/pull/809">#809</a>)
<a href="https://github.com/Bukama"><code>@​Bukama</code></a></li>
<li>Update encoding docs (<a
href="https://redirect.github.com/apache/maven-surefire/pull/802">#802</a>)
<a href="https://github.com/elharo"><code>@​elharo</code></a></li>
<li>Guice injection (<a
href="https://redirect.github.com/apache/maven-surefire/pull/801">#801</a>)
<a href="https://github.com/elharo"><code>@​elharo</code></a></li>
</ul>
<h2>📦 Dependency updates</h2>
<ul>
<li>Bump org.htmlunit:htmlunit from 4.10.0 to 4.11.1 (<a
href="https://redirect.github.com/apache/maven-surefire/pull/823">#823</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Bump parent to 44 (<a
href="https://redirect.github.com/apache/maven-surefire/pull/817">#817</a>)
<a
href="https://github.com/slawekjaranowski"><code>@​slawekjaranowski</code></a></li>
<li>Bump org.codehaus.plexus:plexus-java from 1.3.0 to 1.4.0 (<a
href="https://redirect.github.com/apache/maven-surefire/pull/810">#810</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Bump org.htmlunit:htmlunit from 4.4.0 to 4.10.0 (<a
href="https://redirect.github.com/apache/maven-surefire/pull/813">#813</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Bump commons-io:commons-io from 2.17.0 to 2.18.0 (<a
href="https://redirect.github.com/apache/maven-surefire/pull/797">#797</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Bump org.assertj:assertj-core from 3.27.2 to 3.27.3 (<a
href="https://redirect.github.com/apache/maven-surefire/pull/807">#807</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Bump org.assertj:assertj-core from 3.27.0 to 3.27.2 (<a
href="https://redirect.github.com/apache/maven-surefire/pull/805">#805</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
<li>Bump org.assertj:assertj-core from 3.26.3 to 3.27.0 (<a
href="https://redirect.github.com/apache/maven-surefire/pull/800">#800</a>)
@<a href="https://github.com/apps/dependabot">dependabot[bot]</a></li>
</ul>
<h2>3.5.2</h2>
<!-- raw HTML omitted -->
<h2>🚀 New features and improvements</h2>
<ul>
<li><a
href="https://issues.apache.org/jira/browse/SUREFIRE-2278">[SUREFIRE-2278]</a>
- Don't say please. (<a
href="https://redirect.github.com/apache/maven-surefire/pull/792">#792</a>)
<a href="https://github.com/elharo"><code>@​elharo</code></a></li>
</ul>
<h2>📦 Dependency updates</h2>
<ul>
<li><a
href="https://issues.apache.org/jira/browse/SUREFIRE-2281">[SUREFIRE-2281]</a>
- Doxia 2.0.0 ga (<a
href="https://redirect.github.com/apache/maven-surefire/pull/794">#794</a>)
<a href="https://github.com/michael-o"><code>@​michael-o</code></a></li>
<li>Bump commons-io:commons-io from 2.2 to 2.14.0 in
/surefire-its/src/test/resources/surefire-979-smartStackTrace-wrongClassloader/module1
(<a
href="https://redirect.github.com/apache/maven-surefire/pull/789">#789</a>)
<a
href="https://github.com/dependabot"><code>@​dependabot</code></a></li>
</ul>
<h2>👻 Maintenance</h2>
<ul>
<li><a
href="https://issues.apache.org/jira/browse/SUREFIRE-2282">[SUREFIRE-2282]</a>
- surefire-report-plugin: Update Introduction documenta… (<a
href="https://redirect.github.com/apache/maven-surefire/pull/796">#796</a>)
<a href="https://github.com/michael-o"><code>@​michael-o</code></a></li>
<li>Reduce cyclomatic complexity (<a
href="https://redirect.github.com/apache/maven-surefire/pull/793">#793</a>)
<a href="https://github.com/elharo"><code>@​elharo</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4434650a8a"><code>4434650</code></a>
[maven-release-plugin] prepare release surefire-3.5.3</li>
<li><a
href="1270950bc2"><code>1270950</code></a>
use github directly</li>
<li><a
href="59f3a1f547"><code>59f3a1f</code></a>
release tag name backward compatible</li>
<li><a
href="dfbabe2cfa"><code>dfbabe2</code></a>
assertj-core must be test scope (<a
href="https://redirect.github.com/apache/maven-surefire/issues/826">#826</a>)</li>
<li><a
href="e1f8119bfa"><code>e1f8119</code></a>
back to 3.5.3-SNAPSHOT</li>
<li><a
href="c497559438"><code>c497559</code></a>
[maven-release-plugin] prepare for next development iteration</li>
<li><a
href="3962112f45"><code>3962112</code></a>
[maven-release-plugin] prepare release v3.5.3</li>
<li><a
href="227c134e36"><code>227c134</code></a>
surefire shared utils version current version (<a
href="https://redirect.github.com/apache/maven-surefire/issues/825">#825</a>)</li>
<li><a
href="1d34c34a7b"><code>1d34c34</code></a>
Bump org.htmlunit:htmlunit from 4.10.0 to 4.11.1</li>
<li><a
href="906b65aa11"><code>906b65a</code></a>
Update site descriptors</li>
<li>Additional commits viewable in <a
href="https://github.com/apache/maven-surefire/compare/surefire-3.3.0...surefire-3.5.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.slf4j:slf4j-jdk14` from 2.0.13 to 2.0.17

Updates `org.yaml:snakeyaml` from 2.2 to 2.4
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c2f88dff8f"><code>c2f88df</code></a>
[maven-release-plugin] prepare for next development iteration</li>
<li><a
href="f30369553d"><code>f303695</code></a>
Merge branch 'master' into build-21</li>
<li><a
href="85fa3093ac"><code>85fa309</code></a>
Update changes</li>
<li><a
href="a9a6534885"><code>a9a6534</code></a>
Merge branch 'master' into remove-custom-base64</li>
<li><a
href="ee85b4f371"><code>ee85b4f</code></a>
Fix Base64</li>
<li><a
href="c39afe58a3"><code>c39afe5</code></a>
Use tests for Java 8</li>
<li><a
href="df5632251a"><code>df56322</code></a>
Merge branch 'master' into ds/checkToken</li>
<li><a
href="95bd06bf21"><code>95bd06b</code></a>
Merge pull request <a
href="https://bitbucket.org/snakeyaml/snakeyaml/issues/13">#13</a> from
schlosna/ds/checkToken</li>
<li><a
href="ccc1be2292"><code>ccc1be2</code></a>
Update changes.xml</li>
<li><a
href="0487ff4ee7"><code>0487ff4</code></a>
Update changes.xml</li>
<li>Additional commits viewable in <a
href="https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-2.4..snakeyaml-2.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.mariadb.jdbc:mariadb-java-client` from 3.4.0 to 3.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/mariadb-corporation/mariadb-connector-j/releases">org.mariadb.jdbc:mariadb-java-client's
releases</a>.</em></p>
<blockquote>
<h2>MariaDB Connector/Java 3.5.3</h2>
<h2><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/tree/3.5.3">3.5.3</a>
(Feb 2025)</h2>
<p><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.2...3.5.3">Full
Changelog</a></p>
<h4>Bugs Fixed</h4>
<ul>
<li>CONJ-1226 Fixed issue where dates containing zero day or month
resulted in a DateTimeException</li>
<li>CONJ-1232 Resolved timestamp string representation incompatibility
between versions 2.7 and 3.x
<ul>
<li>see new option <a
href="https://mariadb.com/kb/en/about-mariadb-connector-j/#oldmodenoprecisiontimestamp">oldModeNoPrecisionTimestamp</a></li>
</ul>
</li>
<li>CONJ-1226 Fixed incorrect values returned by
ResultSet.getColumnType() for unsigned values</li>
<li>CONJ-1241 Corrected regression in 3.x affecting column metadata for
unsigned types</li>
<li>CONJ-1243 Fixed CallableStatement.getParameterMetadata() returning
wrong java.sql.Type for boolean values</li>
<li>CONJ-1236 Prevented NPE (Null Pointer Exception) after reconnection
failure in high availability configurations</li>
<li>CONJ-1237 Fixed issue with incorrect statements.isClosed value after
closing connection</li>
<li>CONJ-1239 Disabled BULK operations when no parameters are
present</li>
<li>CONJ-1240 Fixed connectivity issues with databases that only accept
TLSv1.3</li>
<li>CONJ-1235 Modified redirection option to enable by default only when
SSL is enabled</li>
</ul>
<h2>MariaDB Connector/Java 3.5.2</h2>
<h2><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/tree/3.5.2">3.5.2</a>
(Feb 2025)</h2>
<p><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.1...3.5.2">Full
Changelog</a></p>
<h4>Bugs Fixed</h4>
<ul>
<li>CONJ-1216 Resolved a performance issue that occurred when batch
processing on MySQL and older MariaDB (pre-10.2) servers</li>
<li>CONJ-1218 Incorrect behavior where XA connections are closed when
regular connections are terminated - this is against specifications</li>
<li>CONJ-1217 The trustCertificateKeyStorePassword alias parameter isn’t
taken into account</li>
<li>CONJ-1221 DatabaseMetadata.getTypeInfo() is missing the data types
UUID and VECTOR</li>
<li>CONJ-1225 System throws an exception prematurely without checking
all available connections</li>
<li>CONJ-1228 result-set.getObject() on BLOB type returns Blob in place
of byte[]</li>
<li>CONJ-660 new <code>disconnectOnExpiredPasswords</code> connection
option that controls client behavior when connecting with an expired
password.
When set to true (default), the client disconnects if it detects an
expired password.
When false, the client maintains the connection and allows setting a new
password.</li>
<li>CONJ-1229 Permit executeQuery commands to not return a
result-set</li>
</ul>
<h2>MariaDB Connector/Java 3.5.1</h2>
<h2><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/tree/3.5.1">3.5.1</a>
(Nov 2024)</h2>
<p><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.0...3.5.1">Full
Changelog</a></p>
<h4>Notable changes</h4>
<ul>
<li>CONJ-1193 Implement parsec authentication</li>
<li>CONJ-1207 New HaMode: sequential write, loadbalance read</li>
<li>CONJ-1208 permit bulk for INSERT ON DUPLICATE KEY UPDATE commands
for 11.5.1+ servers</li>
</ul>
<h4>Bugs Fixed</h4>
<ul>
<li>CONJ-1053 Mark waffle-jna dependency optional in module
descriptor</li>
<li>CONJ-1196 setObject on java.util.Date was considered was a
java.sql.Date and truncate hour/minutes/seconds/ms while it must be
considered like a java.sql.Timestamp</li>
<li>CONJ-1211 jdbc 4.3 enquoteIdentifier missing validation</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/mariadb-corporation/mariadb-connector-j/blob/master/CHANGELOG.md">org.mariadb.jdbc:mariadb-java-client's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/tree/3.5.3">3.5.3</a>
(Mar 2025)</h2>
<p><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.2...3.5.3">Full
Changelog</a></p>
<h4>Bugs Fixed</h4>
<ul>
<li></li>
<li>CONJ-1226 Fixed issue where dates containing zero day or month
resulted in a DateTimeException</li>
<li>CONJ-1232 Resolved timestamp string representation incompatibility
between versions 2.7 and 3.x
<ul>
<li>see new option oldModeNoPrecisionTimestamp</li>
</ul>
</li>
<li>CONJ-1226 Fixed incorrect values returned by
ResultSet.getColumnType() for unsigned values</li>
<li>CONJ-1241 Corrected regression in 3.x affecting column metadata for
unsigned types</li>
<li>CONJ-1243 Fixed CallableStatement.getParameterMetadata() returning
wrong java.sql.Type for boolean values</li>
<li>CONJ-1236 Prevented NPE (Null Pointer Exception) after reconnection
failure in high availability configurations</li>
<li>CONJ-1237 Fixed issue with incorrect statements.isClosed value after
closing connection</li>
<li>CONJ-1239 Disabled BULK operations when no parameters are
present</li>
<li>CONJ-1240 Fixed connectivity issues with databases that only accept
TLSv1.3</li>
<li>CONJ-1235 Modified redirection option to enable by default only when
SSL is enabled</li>
</ul>
<h2><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/tree/3.5.2">3.5.2</a>
(Feb 2025)</h2>
<p><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.1...3.5.2">Full
Changelog</a></p>
<h4>Bugs Fixed</h4>
<ul>
<li>CONJ-1216 Resolved a performance issue that occurred when batch
processing on MySQL and older MariaDB (pre-10.2) servers</li>
<li>CONJ-1218 Incorrect behavior where XA connections are closed when
regular connections are terminated - this is against specifications</li>
<li>CONJ-1217 The trustCertificateKeyStorePassword alias parameter isn’t
taken into account</li>
<li>CONJ-1221 DatabaseMetadata.getTypeInfo() is missing the data types
UUID and VECTOR</li>
<li>CONJ-1225 System throws an exception prematurely without checking
all available connections</li>
<li>CONJ-1228 result-set.getObject() on BLOB type returns Blob in place
of byte[]</li>
<li>CONJ-660 new <code>disconnectOnExpiredPasswords</code> connection
option that controls client behavior when connecting with an expired
password.
When set to true (default), the client disconnects if it detects an
expired password.
When false, the client maintains the connection and allows setting a new
password.</li>
<li>CONJ-1229 Permit executeQuery commands to not return a
result-set</li>
</ul>
<h2><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/tree/3.5.1">3.5.1</a>
(Nov 2024)</h2>
<p><a
href="https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.0...3.5.1">Full
Changelog</a></p>
<h4>Notable changes</h4>
<ul>
<li>CONJ-1193 Implement parsec authentication</li>
<li>CONJ-1207 New HaMode: sequential write, loadbalance read</li>
<li>CONJ-1208 permit bulk for INSERT ON DUPLICATE KEY UPDATE commands
for 11.5.1+ servers</li>
</ul>
<h4>Bugs Fixed</h4>
<ul>
<li>CONJ-1053 Mark waffle-jna dependency optional in module
descriptor</li>
<li>CONJ-1196 setObject on java.util.Date was considered was a
java.sql.Date and truncate hour/minutes/seconds/ms while it must be
considered like a java.sql.Timestamp</li>
<li>CONJ-1211 jdbc 4.3 enquoteIdentifier missing validation</li>
<li>CONJ-1213 sql command ending with semicolon and trailing space are
not using bulk</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1622933546"><code>1622933</code></a>
[misc] set 3.5.3 version</li>
<li><a
href="b0c299ee26"><code>b0c299e</code></a>
Merge branch 'develop'</li>
<li><a
href="bd1d18f1af"><code>bd1d18f</code></a>
[misc] zero config not permitting non plugins without hash</li>
<li><a
href="ac2555bdb8"><code>ac2555b</code></a>
Merge branch 'develop'</li>
<li><a
href="22f8126638"><code>22f8126</code></a>
[misc] test improvement</li>
<li><a
href="cb03a35974"><code>cb03a35</code></a>
[misc] correcting test for MySQL user length limitation</li>
<li><a
href="031de361f7"><code>031de36</code></a>
[CONJ-1235] enable redirection option by default only when SSL is
enabled</li>
<li><a
href="5352d6bad2"><code>5352d6b</code></a>
[CONJ-1226] Dates containing zero day or month results into
DateTimeException</li>
<li><a
href="2d481205ca"><code>2d48120</code></a>
[CONJ-1243] CallableStatement.getParameterMetadata for Boolean return
wrong v...</li>
<li><a
href="606fe0df86"><code>606fe0d</code></a>
[misc] code style correction</li>
<li>Additional commits viewable in <a
href="https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.4.0...3.5.3">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>
2025-04-23 17:17:40 +02:00
5803a34f84 Bump the development-dependencies group across 1 directory with 2 updates (#1287)
Bumps the development-dependencies group with 2 updates in the /
directory:
[org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5)
and [org.bouncycastle:bcprov-jdk18on](https://github.com/bcgit/bc-java).

Updates `org.junit.jupiter:junit-jupiter` from 5.10.3 to 5.12.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/junit-team/junit5/releases">org.junit.jupiter:junit-jupiter's
releases</a>.</em></p>
<blockquote>
<p>JUnit 5.12.2 = Platform 1.12.2 + Jupiter 5.12.2 + Vintage 5.12.2</p>
<p>See <a
href="https://junit.org/junit5/docs/5.12.2/release-notes/">Release
Notes</a>.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2">https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2</a></p>
<p>JUnit 5.12.1 = Platform 1.12.1 + Jupiter 5.12.1 + Vintage 5.12.1</p>
<p>See <a
href="https://junit.org/junit5/docs/5.12.1/release-notes/">Release
Notes</a>.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit5/compare/r5.12.0...r5.12.1">https://github.com/junit-team/junit5/compare/r5.12.0...r5.12.1</a></p>
<p>JUnit 5.12.0 = Platform 1.12.0 + Jupiter 5.12.0 + Vintage 5.12.0</p>
<p>See <a
href="https://junit.org/junit5/docs/5.12.0/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/chris-carneiro"><code>@​chris-carneiro</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/3938">junit-team/junit5#3938</a></li>
<li><a href="https://github.com/amaembo"><code>@​amaembo</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/4024">junit-team/junit5#4024</a></li>
<li><a
href="https://github.com/vdmitrienko"><code>@​vdmitrienko</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/3889">junit-team/junit5#3889</a></li>
<li><a
href="https://github.com/JojOatXGME"><code>@​JojOatXGME</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/4032">junit-team/junit5#4032</a></li>
<li><a href="https://github.com/yhkuo41"><code>@​yhkuo41</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/3169">junit-team/junit5#3169</a></li>
<li><a href="https://github.com/AndreasTu"><code>@​AndreasTu</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/3431">junit-team/junit5#3431</a></li>
<li><a href="https://github.com/YongGoose"><code>@​YongGoose</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/4115">junit-team/junit5#4115</a></li>
<li><a
href="https://github.com/JonasJebing"><code>@​JonasJebing</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/4045">junit-team/junit5#4045</a></li>
<li><a href="https://github.com/ky0n"><code>@​ky0n</code></a> made their
first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/4152">junit-team/junit5#4152</a></li>
<li><a href="https://github.com/filiphr"><code>@​filiphr</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/4148">junit-team/junit5#4148</a></li>
<li><a href="https://github.com/Anmavel"><code>@​Anmavel</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/4149">junit-team/junit5#4149</a></li>
<li><a href="https://github.com/awelless"><code>@​awelless</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/3259">junit-team/junit5#3259</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit5/compare/r5.11.4...r5.12.0">https://github.com/junit-team/junit5/compare/r5.11.4...r5.12.0</a></p>
<p>JUnit 5.12.0-RC2 = Platform 1.12.0-RC2 + Jupiter 5.12.0-RC2 + Vintage
5.12.0-RC2</p>
<p>See <a
href="https://junit.org/junit5/docs/5.12.0-RC2/release-notes/">Release
Notes</a>.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit5/compare/r5.12.0-RC1...r5.12.0-RC2">https://github.com/junit-team/junit5/compare/r5.12.0-RC1...r5.12.0-RC2</a></p>
<p>JUnit 5.12.0-RC1 = Platform 1.12.0-RC1 + Jupiter 5.12.0-RC1 + Vintage
5.12.0-RC1</p>
<p>See <a
href="https://junit.org/junit5/docs/5.12.0-RC1/release-notes/">Release
Notes</a>.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit5/compare/r5.12.0-M1...r5.12.0-RC1">https://github.com/junit-team/junit5/compare/r5.12.0-M1...r5.12.0-RC1</a></p>
<p>JUnit 5.12.0-M1 = Platform 1.12.0-M1 + Jupiter 5.12.0-M1 + Vintage
5.12.0-M1</p>
<p>See <a
href="https://junit.org/junit5/docs/5.12.0-M1/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/chris-carneiro"><code>@​chris-carneiro</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit5/pull/3938">junit-team/junit5#3938</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0a446598f2"><code>0a44659</code></a>
Release 5.12.2</li>
<li><a
href="4c7dfdc0c0"><code>4c7dfdc</code></a>
Finalize 5.12.2 release notes</li>
<li><a
href="561613e183"><code>561613e</code></a>
Fix handling of <code>CleanupMode.ON_SUCCESS</code></li>
<li><a
href="19d07d2306"><code>19d07d2</code></a>
Add 5.12.2 release notes from template</li>
<li><a
href="803cbb6d6e"><code>803cbb6</code></a>
Add build parameter for enabling dry-run mode for test execution</li>
<li><a
href="eb43e62247"><code>eb43e62</code></a>
Back to snapshots for further development</li>
<li><a
href="ba9c9ae111"><code>ba9c9ae</code></a>
Release 5.12.1</li>
<li><a
href="e28ad4a890"><code>e28ad4a</code></a>
Finalize 5.12.1 release notes</li>
<li><a
href="1044e2c63c"><code>1044e2c</code></a>
Move entry to 5.12.1 release notes</li>
<li><a
href="bea821d69a"><code>bea821d</code></a>
Fix Javadoc formatting</li>
<li>Additional commits viewable in <a
href="https://github.com/junit-team/junit5/compare/r5.10.3...r5.12.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.bouncycastle:bcprov-jdk18on` from 1.78.1 to 1.80
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html">org.bouncycastle:bcprov-jdk18on's
changelog</a>.</em></p>
<blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->2.1.1 Version<!--
raw HTML omitted --><!-- raw HTML omitted -->
Release: 1.80<!-- raw HTML omitted -->
Date:      2025, 14th January.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/bcgit/bc-java/commits">compare view</a></li>
</ul>
</details>
<br />

<details>
<summary>Most Recent Ignore Conditions Applied to This Pull
Request</summary>

| Dependency Name | Ignore Conditions |
| --- | --- |
| org.junit.jupiter:junit-jupiter | [< 5.10, > 5.9.1] |
</details>


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>
2025-04-23 17:17:27 +02:00
86c4f48ec6 Bump the production-dependencies group across 1 directory with 8 updates
Bumps the production-dependencies group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [com.puppycrawl.tools:checkstyle](https://github.com/checkstyle/checkstyle) | `10.17.0` | `10.23.0` |
| [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) | `3.13.0` | `3.14.0` |
| [com.mycila:license-maven-plugin](https://github.com/mathieucarbou/license-maven-plugin) | `4.5` | `5.0.0` |
| [org.apache.maven.plugins:maven-checkstyle-plugin](https://github.com/apache/maven-checkstyle-plugin) | `3.4.0` | `3.6.0` |
| [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) | `3.3.0` | `3.5.3` |
| org.slf4j:slf4j-jdk14 | `2.0.13` | `2.0.17` |
| [org.yaml:snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) | `2.2` | `2.4` |
| [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) | `3.4.0` | `3.5.3` |



Updates `com.puppycrawl.tools:checkstyle` from 10.17.0 to 10.23.0
- [Release notes](https://github.com/checkstyle/checkstyle/releases)
- [Commits](https://github.com/checkstyle/checkstyle/compare/checkstyle-10.17.0...checkstyle-10.23.0)

Updates `org.apache.maven.plugins:maven-compiler-plugin` from 3.13.0 to 3.14.0
- [Release notes](https://github.com/apache/maven-compiler-plugin/releases)
- [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.13.0...maven-compiler-plugin-3.14.0)

Updates `com.mycila:license-maven-plugin` from 4.5 to 5.0.0
- [Release notes](https://github.com/mathieucarbou/license-maven-plugin/releases)
- [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.5...v5.0.0)

Updates `org.apache.maven.plugins:maven-checkstyle-plugin` from 3.4.0 to 3.6.0
- [Release notes](https://github.com/apache/maven-checkstyle-plugin/releases)
- [Commits](https://github.com/apache/maven-checkstyle-plugin/compare/maven-checkstyle-plugin-3.4.0...maven-checkstyle-plugin-3.6.0)

Updates `org.apache.maven.plugins:maven-surefire-plugin` from 3.3.0 to 3.5.3
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.3.0...surefire-3.5.3)

Updates `org.slf4j:slf4j-jdk14` from 2.0.13 to 2.0.17

Updates `org.yaml:snakeyaml` from 2.2 to 2.4
- [Commits](https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-2.4..snakeyaml-2.2)

Updates `org.mariadb.jdbc:mariadb-java-client` from 3.4.0 to 3.5.3
- [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases)
- [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.4.0...3.5.3)

---
updated-dependencies:
- dependency-name: com.puppycrawl.tools:checkstyle
  dependency-version: 10.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.apache.maven.plugins:maven-compiler-plugin
  dependency-version: 3.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: com.mycila:license-maven-plugin
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: production-dependencies
- dependency-name: org.apache.maven.plugins:maven-checkstyle-plugin
  dependency-version: 3.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-version: 3.5.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.slf4j:slf4j-jdk14
  dependency-version: 2.0.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
- dependency-name: org.yaml:snakeyaml
  dependency-version: '2.4'
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.mariadb.jdbc:mariadb-java-client
  dependency-version: 3.5.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-23 15:17:02 +00:00
06e6741493 Bump advanced-security/maven-dependency-submission-action from 4.0.3 to 4.1.1 (#1254)
Bumps
[advanced-security/maven-dependency-submission-action](https://github.com/advanced-security/maven-dependency-submission-action)
from 4.0.3 to 4.1.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/advanced-security/maven-dependency-submission-action/releases">advanced-security/maven-dependency-submission-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.1.1</h2>
<p>No release notes provided.</p>
<h2>v4.1.0</h2>
<ul>
<li>
<p>Adds the ability to change the detector details for the dependency
snapshots via the optional input parameters:</p>
<ul>
<li><code>detector-name</code></li>
<li><code>detector-url</code></li>
<li><code>detector-version</code></li>
</ul>
<p>If the <code>detector-name</code> is specified, then all three become
mandatory as there are no sensible defaults that can be attributed to
the values.</p>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4f64ddab9d"><code>4f64dda</code></a>
chore: Updating release files</li>
<li><a
href="dba3dacedd"><code>dba3dac</code></a>
4.1.1</li>
<li><a
href="4883574ccf"><code>4883574</code></a>
Merge pull request <a
href="https://redirect.github.com/advanced-security/maven-dependency-submission-action/issues/89">#89</a>
from david-wiggs/hotfix/fix-test</li>
<li><a
href="33e1d3d801"><code>33e1d3d</code></a>
Remove reference to undefined function</li>
<li><a
href="4b85c77703"><code>4b85c77</code></a>
Merge pull request <a
href="https://redirect.github.com/advanced-security/maven-dependency-submission-action/issues/88">#88</a>
from david-wiggs/unique-job-matrix</li>
<li><a
href="73d9d97f9f"><code>73d9d97</code></a>
Update src/snapshot-generator.test.ts</li>
<li><a
href="967455e178"><code>967455e</code></a>
No need to import getMavenSettingsFile when testing</li>
<li><a
href="7592e88109"><code>7592e88</code></a>
Use supplied correlator without concatenation</li>
<li><a
href="2ba839e04b"><code>2ba839e</code></a>
Add some tests</li>
<li><a
href="5275a08fb4"><code>5275a08</code></a>
Address merge conflicts</li>
<li>Additional commits viewable in <a
href="https://github.com/advanced-security/maven-dependency-submission-action/compare/v4.0.3...v4.1.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=advanced-security/maven-dependency-submission-action&package-manager=github_actions&previous-version=4.0.3&new-version=4.1.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>
2025-04-23 17:17:02 +02:00
98da5a36da Bump the development-dependencies group across 1 directory with 2 updates
Bumps the development-dependencies group with 2 updates in the / directory: [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) and [org.bouncycastle:bcprov-jdk18on](https://github.com/bcgit/bc-java).


Updates `org.junit.jupiter:junit-jupiter` from 5.10.3 to 5.12.2
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.10.3...r5.12.2)

Updates `org.bouncycastle:bcprov-jdk18on` from 1.78.1 to 1.80
- [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html)
- [Commits](https://github.com/bcgit/bc-java/commits)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter
  dependency-version: 5.12.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
- dependency-name: org.bouncycastle:bcprov-jdk18on
  dependency-version: '1.80'
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-23 15:16:39 +00:00
3bd9e60783 Bump advanced-security/maven-dependency-submission-action
Bumps [advanced-security/maven-dependency-submission-action](https://github.com/advanced-security/maven-dependency-submission-action) from 4.0.3 to 4.1.1.
- [Release notes](https://github.com/advanced-security/maven-dependency-submission-action/releases)
- [Commits](https://github.com/advanced-security/maven-dependency-submission-action/compare/v4.0.3...v4.1.1)

---
updated-dependencies:
- dependency-name: advanced-security/maven-dependency-submission-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-23 15:16:04 +00:00
568ad7a621 Add configuration option to kick players when toggling premium state
Fixes #1285
2025-04-23 17:12:32 +02:00
1464ef2952 Add command invoker for change command events
Related #1285
2025-04-23 16:46:37 +02:00
46239c9ffc Use InboundConnection as session keys for Velocity
Related #1286
2025-04-23 12:22:10 +02:00
083068b856 Update Mockito for newer Java versions 2025-04-23 12:21:24 +02:00
dd2aa922d7 [ci-skip] Add project logo 2025-03-18 17:22:48 +01:00
b77ea285e5 Be more precise about why using legacy scheduler 2025-03-18 17:22:48 +01:00
f8f0e7ac7a Drop lombok tool 2025-03-18 17:22:48 +01:00
927f09af67 Fix ProtocolLib version and paper URL (#1269)
### Summary of your change

- Use new URL for papermc. The old one will breaked at the end of
december
- The used version of ProtocolLib is no longer available. I changed it
to new one.
2024-12-02 11:40:45 +01:00
9dee4e56a1 Fix ProtocolLib version and paper URL 2024-12-01 22:10:06 +01:00
4dd6b9ade4 Fix finding player network channel with Protocollib and Floodgate
This resolves the deleted ProtocolLib method for newer builds, but uses
reflection to find the channel despite the variable name.

Fixes #1216
2024-07-08 12:38:10 +02:00
51efb9d62d Extract username for protocollib packets 2024-07-08 12:30:14 +02:00
1a56741112 Merge pull request #1223 from Smart123s/fix/floodgate/velocity-1
Floodgate Velocity fixes
2024-07-08 11:40:28 +02:00
7f488498cf Minor code styling
* Use logging instead of raw exception printing
* Extract method
* Shorter var names
* More precise generics if possible
* Don't restore accessible state could be in conflict with other plugins
if we don't restore the exact value
2024-07-08 10:53:50 +02:00
9a40cf0afb Mark Floodgate Join events as fired too 2024-07-06 18:10:52 +02:00
2d177e3df5 Retrieve and use Floodgate username in Velocity PreLoginEvent 2024-07-06 18:10:26 +02:00
bdd7af8290 Use case-sensitive name from the event joining player
Related #1219
2024-07-05 14:45:20 +02:00
29100b5376 Merge pull request #1214 from games647/dependabot/maven/development-dependencies-ac1d0d4f7c
Bump the development-dependencies group across 1 directory with 2 updates
2024-07-02 14:18:04 +02:00
bcb1893176 Merge pull request #1215 from games647/dependabot/maven/production-dependencies-8573e958dd
Bump the production-dependencies group across 1 directory with 10 updates
2024-07-02 14:17:43 +02:00
5fb6308130 Fix finding the player injector with newer ProtocolLib versions
Fixes #1210
2024-07-02 14:16:56 +02:00
a33f53e259 Bump the production-dependencies group across 1 directory with 10 updates
Bumps the production-dependencies group with 10 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [com.puppycrawl.tools:checkstyle](https://github.com/checkstyle/checkstyle) | `10.16.0` | `10.17.0` |
| [org.projectlombok:lombok](https://github.com/projectlombok/lombok) | `1.18.32` | `1.18.34` |
| [com.mycila:license-maven-plugin](https://github.com/mathieucarbou/license-maven-plugin) | `4.4` | `4.5` |
| [org.apache.maven.plugins:maven-checkstyle-plugin](https://github.com/apache/maven-checkstyle-plugin) | `3.3.1` | `3.4.0` |
| [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) | `3.2.5` | `3.3.0` |
| [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) | `3.4.1` | `3.4.2` |
| me.clip:placeholderapi | `2.11.5` | `2.11.6` |
| [fr.xephi:authme](https://github.com/AuthMe/AuthMeReloaded) | `5.6.0-beta2` | `5.6.0` |
| [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) | `3.5.3` | `3.6.0` |
| [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) | `3.3.3` | `3.4.0` |



Updates `com.puppycrawl.tools:checkstyle` from 10.16.0 to 10.17.0
- [Release notes](https://github.com/checkstyle/checkstyle/releases)
- [Commits](https://github.com/checkstyle/checkstyle/compare/checkstyle-10.16.0...checkstyle-10.17.0)

Updates `org.projectlombok:lombok` from 1.18.32 to 1.18.34
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/projectlombok/lombok/compare/v1.18.32...v1.18.34)

Updates `com.mycila:license-maven-plugin` from 4.4 to 4.5
- [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.4...license-maven-plugin-4.5)

Updates `org.apache.maven.plugins:maven-checkstyle-plugin` from 3.3.1 to 3.4.0
- [Commits](https://github.com/apache/maven-checkstyle-plugin/compare/maven-checkstyle-plugin-3.3.1...maven-checkstyle-plugin-3.4.0)

Updates `org.apache.maven.plugins:maven-surefire-plugin` from 3.2.5 to 3.3.0
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.5...surefire-3.3.0)

Updates `org.apache.maven.plugins:maven-jar-plugin` from 3.4.1 to 3.4.2
- [Release notes](https://github.com/apache/maven-jar-plugin/releases)
- [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.4.1...maven-jar-plugin-3.4.2)

Updates `me.clip:placeholderapi` from 2.11.5 to 2.11.6

Updates `fr.xephi:authme` from 5.6.0-beta2 to 5.6.0
- [Release notes](https://github.com/AuthMe/AuthMeReloaded/releases)
- [Commits](https://github.com/AuthMe/AuthMeReloaded/compare/5.6.0-beta2...5.6.0)

Updates `org.apache.maven.plugins:maven-shade-plugin` from 3.5.3 to 3.6.0
- [Release notes](https://github.com/apache/maven-shade-plugin/releases)
- [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.3...maven-shade-plugin-3.6.0)

Updates `org.mariadb.jdbc:mariadb-java-client` from 3.3.3 to 3.4.0
- [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases)
- [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.3.3...3.4.0)

---
updated-dependencies:
- dependency-name: com.puppycrawl.tools:checkstyle
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.projectlombok:lombok
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
- dependency-name: com.mycila:license-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.apache.maven.plugins:maven-checkstyle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.apache.maven.plugins:maven-jar-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
- dependency-name: me.clip:placeholderapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
- dependency-name: fr.xephi:authme
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
- dependency-name: org.apache.maven.plugins:maven-shade-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.mariadb.jdbc:mariadb-java-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-01 07:58:40 +00:00
fb6209d26c Bump the development-dependencies group across 1 directory with 2 updates
Bumps the development-dependencies group with 2 updates in the / directory: [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) and [org.mockito:mockito-core](https://github.com/mockito/mockito).


Updates `org.junit.jupiter:junit-jupiter` from 5.10.2 to 5.10.3
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.10.2...r5.10.3)

Updates `org.mockito:mockito-core` from 5.11.0 to 5.12.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.11.0...v5.12.0)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: org.mockito:mockito-core
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-01 07:57:04 +00:00
829c70a51b Disable connection verification by default
This matches the vanilla, Spigot, BungeeCord and Velocity configuration.
Mojang seems to have too many issues like IPv6 errors and it's atm not
very useful for server administrators.

Fixes #1102
2024-05-22 15:32:30 +02:00
2876448e0c Merge pull request #1201 from games647/dependabot/maven/production-dependencies-e9fd1767f2
Bump com.mycila:license-maven-plugin from 4.3 to 4.4 in the production-dependencies group
2024-05-22 15:13:53 +02:00
2b60153f8a Merge pull request #1205 from wtlgo/main
Fix floodgate config parsing
2024-05-21 16:47:03 +02:00
54b49eb6be Fix floodgate config parsing 2024-05-21 17:02:46 +03:00
be2ec1e5a8 Clean up methods names and documentation 2024-05-21 14:41:41 +02:00
e9643ee3e2 Simplify bug report template by dropping expected behavior 2024-05-21 12:37:02 +02:00
f1b780c398 Clarify pending logins methods 2024-05-11 11:15:13 +02:00
33d3c751b9 Sanity check password generator 2024-05-11 11:13:52 +02:00
00c0bd3b7b Reduce build dependency bloat 2024-05-11 11:13:36 +02:00
492a17e7de Re-enable paper release repo to fix retrieving bungeecord and datafix 2024-05-10 12:20:39 +02:00
c063e7b58d Added shouldAuthenticate field for ProtocolLib
Related #1202
2024-05-10 12:10:31 +02:00
0c64597ff0 Override packet types until they are registered at ProtocolLib
Related #1202
2024-05-10 12:07:47 +02:00
9c06401e69 Fail safely if MinecraftEncryption is not found in newer versions 2024-05-10 12:06:52 +02:00
1f9253895c Document missing premium parameter 2024-05-10 12:06:20 +02:00
41a23bb292 Netty is no longer needed for tests 2024-05-10 10:09:24 +02:00
756b777056 Use a better method name for StoredProfile.isPremium 2024-05-10 10:09:12 +02:00
204d25a739 Re-order and remove outdated auth plugin documentation 2024-05-10 10:03:18 +02:00
07e19b590a Fix missing class 2024-05-08 09:33:36 +02:00
64d291556a Bump com.mycila:license-maven-plugin
Bumps the production-dependencies group with 1 update: [com.mycila:license-maven-plugin](https://github.com/mathieucarbou/license-maven-plugin).


Updates `com.mycila:license-maven-plugin` from 4.3 to 4.4
- [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.3...license-maven-plugin-4.4)

---
updated-dependencies:
- dependency-name: com.mycila:license-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-07 18:34:18 +00:00
bb78043d64 Run delayed velocity tasks under our scheduler too 2024-05-07 20:31:55 +02:00
7b6d2062cf Update license year 2024-05-06 16:40:24 +02:00
3473611b90 Enforce stricter permissions on GitHub actions 2024-05-06 11:18:48 +02:00
9fabc69ba9 Increase dependabot to monthly updates.
There are not many critical changes nowadays.
2024-05-06 11:18:28 +02:00
5a782137af Exclude redundant snakeyaml dependency in BungeeCord 2024-05-06 11:17:44 +02:00
4068fd06db Update platform dependencies 2024-05-06 11:17:16 +02:00
1419b7d357 Use transitive dependencies from craftapi instead of explicitly 2024-05-06 11:16:42 +02:00
690eabaa5e Use reflection for test to fix compiling core to older Java versions 2024-05-06 09:40:07 +02:00
caf5188246 Experimental bump of BungeeCord module to Java 17
Java 17+ and 21 are LTS releases. The other proxy Velocity
also includes Java 17. Ubuntu 24 LTS includes Java 21 already.
However, Ubuntu 22 LTS only uses Java 11, so it might be
necessary to fallback although Ubuntu 23 includes it.
Nevertheless, third-party JDK installations are also a thing
and Minecraft 1.20.6 nowadays also requires Java 21.
2024-05-05 13:29:06 +02:00
c905ca3d33 Move excluded shaded list to dependencies directly
It seems to be easier where the dependencies are coming from.
2024-05-05 13:23:07 +02:00
47b6835f37 Merge pull request #1200 from Freyhold/main
add removed dependency in last commit 8e35c5d that updated dependency
2024-05-05 13:20:07 +02:00
884a4e0d65 Add critical guava and gson back from craftapi
Co-authored-by: games647 <games647@users.noreply.github.com>
2024-05-05 13:18:07 +02:00
0ac8481d92 Synchronize velocity java version with upstream 2024-05-05 10:18:27 +02:00
f0209170c7 Exclude database windows authentication in velocity
It's very unlikely this is really needed.
2024-05-03 16:00:10 +02:00
e63642b146 Unlock yaml, because we are shipping it now 2024-05-03 15:59:20 +02:00
d58ef6b0a1 Add snakeyaml back 2024-05-03 11:18:15 +02:00
8e35c5df90 Update dependencies 2024-05-03 10:43:57 +02:00
cf4d19aeca Update deps 2024-05-02 10:57:51 +02:00
7479c8be87 Update compiler plugin to fix GH runner 2024-05-02 10:57:42 +02:00
1889c2605e Add unit test for multi-release scheduler 2024-05-02 10:57:10 +02:00
3925b66511 Merge pull request #1179 from games647/dependabot/github_actions/advanced-security/maven-dependency-submission-action-4.0.2
Bump advanced-security/maven-dependency-submission-action from 4.0.0 to 4.0.2
2024-04-30 16:04:10 +02:00
3f47356d35 Merge pull request #1195 from games647/dependabot/maven/production-dependencies-1cdc2e235a
Bump the production-dependencies group across 1 directory with 6 updates
2024-04-30 16:03:51 +02:00
20c2126e53 Merge pull request #1191 from games647/dependabot/maven/development-dependencies-35f3e2a187
Bump the development-dependencies group with 3 updates
2024-04-30 16:03:13 +02:00
e1335dccfe Bump the production-dependencies group across 1 directory with 6 updates
Bumps the production-dependencies group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [com.puppycrawl.tools:checkstyle](https://github.com/checkstyle/checkstyle) | `10.12.7` | `10.16.0` |
| [org.projectlombok:lombok](https://github.com/projectlombok/lombok) | `1.18.30` | `1.18.32` |
| [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) | `3.3.0` | `3.4.1` |
| org.slf4j:slf4j-jdk14 | `2.0.11` | `2.0.13` |
| [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) | `3.5.1` | `3.5.3` |
| [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) | `3.3.2` | `3.3.3` |



Updates `com.puppycrawl.tools:checkstyle` from 10.12.7 to 10.16.0
- [Release notes](https://github.com/checkstyle/checkstyle/releases)
- [Commits](https://github.com/checkstyle/checkstyle/compare/checkstyle-10.12.7...checkstyle-10.16.0)

Updates `org.projectlombok:lombok` from 1.18.30 to 1.18.32
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/projectlombok/lombok/compare/v1.18.30...v1.18.32)

Updates `org.apache.maven.plugins:maven-jar-plugin` from 3.3.0 to 3.4.1
- [Release notes](https://github.com/apache/maven-jar-plugin/releases)
- [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.3.0...maven-jar-plugin-3.4.1)

Updates `org.slf4j:slf4j-jdk14` from 2.0.11 to 2.0.13

Updates `org.apache.maven.plugins:maven-shade-plugin` from 3.5.1 to 3.5.3
- [Release notes](https://github.com/apache/maven-shade-plugin/releases)
- [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.1...maven-shade-plugin-3.5.3)

Updates `org.mariadb.jdbc:mariadb-java-client` from 3.3.2 to 3.3.3
- [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases)
- [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.3.2...3.3.3)

---
updated-dependencies:
- dependency-name: com.puppycrawl.tools:checkstyle
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.projectlombok:lombok
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
- dependency-name: org.apache.maven.plugins:maven-jar-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: org.slf4j:slf4j-jdk14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
- dependency-name: org.apache.maven.plugins:maven-shade-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
- dependency-name: org.mariadb.jdbc:mariadb-java-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-30 13:59:35 +00:00
b9e94d3020 Improve threading by making use of green threads with Java 21
This is an experiment. The code was checked to keep blocking
of platform threads to a minimum (See [1]). This will keep
overhead to of using threads small while only I/O will
allocate more threads.

The project now uses Multi-Release Jars, so it will detect
correct version during runtime while keeping backwards
compatibility. However, your IDE might be set manually to
Java 21. A multi-project [2] architecture might be necessary,
but not tested if it really fixes it.

[1] https://openjdk.org/jeps/444
[2] https://maven.apache.org/plugins/maven-compiler-plugin/multirelease.html
2024-04-30 15:57:02 +02:00
896e250fa2 Fix setting offline UUID with newer BungeeCord
Fixes #1189
Fixes #1193
2024-04-30 10:11:48 +02:00
815ff39c96 Bump the development-dependencies group with 3 updates
Bumps the development-dependencies group with 3 updates: [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5), [org.mockito:mockito-core](https://github.com/mockito/mockito) and [org.bouncycastle:bcprov-jdk18on](https://github.com/bcgit/bc-java).


Updates `org.junit.jupiter:junit-jupiter` from 5.10.1 to 5.10.2
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.10.1...r5.10.2)

Updates `org.mockito:mockito-core` from 5.9.0 to 5.11.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.9.0...v5.11.0)

Updates `org.bouncycastle:bcprov-jdk18on` from 1.77 to 1.78.1
- [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html)
- [Commits](https://github.com/bcgit/bc-java/commits)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: org.mockito:mockito-core
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
- dependency-name: org.bouncycastle:bcprov-jdk18on
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-22 07:11:16 +00:00
4100daa22a Bump advanced-security/maven-dependency-submission-action
Bumps [advanced-security/maven-dependency-submission-action](https://github.com/advanced-security/maven-dependency-submission-action) from 4.0.0 to 4.0.2.
- [Release notes](https://github.com/advanced-security/maven-dependency-submission-action/releases)
- [Commits](https://github.com/advanced-security/maven-dependency-submission-action/compare/v4.0.0...v4.0.2)

---
updated-dependencies:
- dependency-name: advanced-security/maven-dependency-submission-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-01 07:57:04 +00:00
129 changed files with 1454 additions and 710 deletions

View File

@ -12,10 +12,6 @@ body:
description: What behavior is observed? description: What behavior is observed?
validations: validations:
required: true required: true
- type: textarea
attributes:
label: What did you expect?
description: What behavior is expected?
- type: textarea - type: textarea
attributes: attributes:
label: Steps to reproduce label: Steps to reproduce

View File

@ -10,10 +10,10 @@ updates:
interval: "monthly" interval: "monthly"
# Maven project # Maven project
- package-ecosystem: maven - package-ecosystem: "maven"
directory: "/" directory: "/"
schedule: schedule:
interval: weekly interval: "monthly"
groups: groups:
production-dependencies: production-dependencies:
@ -30,6 +30,3 @@ updates:
# HikariCP dropped Java 8 support with 5.0 # HikariCP dropped Java 8 support with 5.0
- dependency-name: "com.zaxxer:HikariCP" - dependency-name: "com.zaxxer:HikariCP"
update-types: ["version-update:semver-major"] update-types: ["version-update:semver-major"]
# SnakeYAML has breaking changes with 2.0
- dependency-name: "org.yaml:snakeyaml"
update-types: ["version-update:semver-major"]

25
.github/release.yml vendored Normal file
View File

@ -0,0 +1,25 @@
# Configure how the release notes are generated for GitHub releases
changelog:
# List of authors (like bots) and labels to exclude from pull requests
exclude:
labels:
- ignore-for-release
categories:
- title: 🛠 Breaking Changes
labels:
- Semver-Major
- breaking-change
- title: 🎉 Exciting New Features
labels:
- Semver-Minor
- enhancement
- title: 🐞 Bugfixes
labels:
- bug
- title: 👒 Dependencies
labels:
- dependencies
- title: Other Changes
labels:
- "*"

View File

@ -25,8 +25,7 @@ jobs:
if: ${{ github.event.workflow_run.conclusion == 'success' }} if: ${{ github.event.workflow_run.conclusion == 'success' }}
permissions: permissions:
actions: read # Only allow write for security, then all others default to read only
contents: read
security-events: write security-events: write
strategy: strategy:

View File

@ -21,7 +21,8 @@ jobs:
# Environment image - always use the newest OS # Environment image - always use the newest OS
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: write # With at least one permission given, all default to read
contents: read
# Run steps # Run steps
steps: steps:
@ -42,6 +43,25 @@ jobs:
# ignore snapshot updates, because they are likely to have breaking changes, enforce checksums # ignore snapshot updates, because they are likely to have breaking changes, enforce checksums
run: mvn test --batch-mode --threads 2.0C --no-snapshot-updates --strict-checksums --file pom.xml run: mvn test --batch-mode --threads 2.0C --no-snapshot-updates --strict-checksums --file pom.xml
- name: Update dependency graph dependency:
runs-on: ubuntu-latest
permissions:
# Write only necessary for dependency submission all others then default to read
contents: write
# Run steps
steps:
# Pull changes
- uses: actions/checkout@v4
# Setup Java
- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version-file: '.java-version'
cache: 'maven'
- name: Submit Dependency Snapshot
if: ${{ github.event_name == 'push' }} if: ${{ github.event_name == 'push' }}
uses: advanced-security/maven-dependency-submission-action@v4.0.0 uses: advanced-security/maven-dependency-submission-action@v5.0.0

View File

@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015-2023 games647 and contributors Copyright (c) 2015-2024 games647 and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,7 @@
# FastLogin # FastLogin
![A shield-shaped emblem with a bold lightning bolt on the left, resembling Minecraft blocks. To the right, "FastLogin" is written in teal, with the tagline: "Automatically detect and login premium Minecraft players"](https://github.com/user-attachments/assets/0788ef69-029b-465e-83a2-b8e7bccc6295 "FastLogin project logo.avif")
Checks if a Minecraft player has a paid account (premium). If so, they can skip offline authentication (auth plugins). Checks if a Minecraft player has a paid account (premium). If so, they can skip offline authentication (auth plugins).
So they don't need to enter passwords. This is also called auto login (auto-login). So they don't need to enter passwords. This is also called auto login (auto-login).
@ -8,14 +10,11 @@ So they don't need to enter passwords. This is also called auto login (auto-logi
* Detect paid accounts from others * Detect paid accounts from others
* Automatically login paid accounts (premium) * Automatically login paid accounts (premium)
* Support various of auth plugins * Support various of auth plugins
* Cauldron support
* Forge/Sponge message support
* Premium UUID support * Premium UUID support
* Forward skins * Forward skins
* Detect username changed and will update the existing database record * Detect username changed and will update the existing database record
* BungeeCord support * BungeeCord/Velocity support
* Auto register new premium players * Auto register new premium players
* Plugin: ProtocolSupport is supported and can be used as an alternative to ProtocolLib
* No client modifications needed * No client modifications needed
* Good performance by using async operations * Good performance by using async operations
* Locale messages * Locale messages
@ -33,7 +32,11 @@ Development builds contain the latest changes from the Source-Code. They are ble
but also include features, enhancements and bug fixes that are not yet in a released version. If you click on the left but also include features, enhancements and bug fixes that are not yet in a released version. If you click on the left
side on `Changes`, you can see iterative change sets leading to a specific build. side on `Changes`, you can see iterative change sets leading to a specific build.
You can download them from here: https://ci.codemc.org/job/Games647/job/FastLogin/ ~~You can download them from here: [CodeMC(Jenkins)](https://ci.codemc.org/job/Games647/job/FastLogin/)~~
Currently broken due changed usernames. Download it from [here](https://github.com/TuxCoding/FastLogin/releases)
*** ***
@ -46,6 +49,7 @@ You can download them from here: https://ci.codemc.org/job/Games647/job/FastLogi
fastlogin.bukkit.command.premium fastlogin.bukkit.command.premium
fastlogin.bukkit.command.cracked fastlogin.bukkit.command.cracked
fastlogin.command.premium.other fastlogin.command.premium.other
fastlogin.command.cracked.other fastlogin.command.cracked.other
@ -60,13 +64,15 @@ Possible values: `Premium`, `Cracked`, `Unknown`
## Requirements ## Requirements
* Java 17+ (Recommended) * Java: 21+ recommended for improved multi-threading code by FastLogin
* Spigot: 8+
* BungeeCord and Velocity: 17+
* Server software in offlinemode: * Server software in offlinemode:
* Spigot (or a fork e.g. Paper) 1.8.8+ * Spigot (or a fork e.g. Paper) 1.8.8+
* Protocol plugin: * Protocol plugin:
* [ProtocolLib 5.1+](https://www.spigotmc.org/resources/protocollib.1997/) or * [ProtocolLib 5.3+ with development build above 720](https://www.spigotmc.org/resources/protocollib.1997/) or
* [ProtocolSupport](https://www.spigotmc.org/resources/protocolsupport.7201/) * [ProtocolSupport](https://www.spigotmc.org/resources/protocolsupport.7201/)
* Latest BungeeCord (or a fork e.g. Waterfall) or Velocity * Latest BungeeCord (or a fork e.g. Waterfall) or Velocity proxy
* An auth plugin. * An auth plugin.
### Supported auth plugins ### Supported auth plugins
@ -85,7 +91,6 @@ Possible values: `Premium`, `Cracked`, `Unknown`
#### BungeeCord/Waterfall #### BungeeCord/Waterfall
* [BungeeAuth](https://www.spigotmc.org/resources/bungeeauth.493/) * [BungeeAuth](https://www.spigotmc.org/resources/bungeeauth.493/)
* [BungeeAuthenticator](https://www.spigotmc.org/resources/bungeecordauthenticator.87669/)
## Network requests ## Network requests
@ -101,8 +106,8 @@ This plugin performs network requests to:
### Spigot/Paper ### Spigot/Paper
1. Download and install ProtocolLib/ProtocolSupport 1. Download and install ProtocolLib/ProtocolSupport
2. Download and install FastLogin (or `FastLoginBukkit` for newer versions) 2. Download and install `FastLoginBukkit`
3. Set your server in offline mode by setting the value `onlinemode` in your server.properties to false 3. Set your server in offline mode by setting the value `onlinemode` in your server.properties to `false`
### BungeeCord/Waterfall or Velocity ### BungeeCord/Waterfall or Velocity
@ -117,8 +122,8 @@ Install the plugin on both platforms, that is proxy (BungeeCord or Velocity) and
4. Activate ip forwarding in your proxy config 4. Activate ip forwarding in your proxy config
5. Check your database settings in the config of FastLogin on your proxy 5. Check your database settings in the config of FastLogin on your proxy
* The proxies only ship with a limited set of drivers where Spigot supports more. Therefore, these are supported: * The proxies only ship with a limited set of drivers where Spigot supports more. Therefore, these are supported:
* BungeeCord: `com.mysql.jdbc.Driver` for MySQL/MariaDB * BungeeCord: `mysql` for MySQL/MariaDB
* Velocity: `fastlogin.mariadb.jdbc.Driver` for MySQL/MariaDB * Velocity: `mariadb` for MySQL/MariaDB
* Note the embedded file storage SQLite is not available * Note the embedded file storage SQLite is not available
* MySQL/MariaDB requires an external database server running. Check your server provider if there is one available * MySQL/MariaDB requires an external database server running. Check your server provider if there is one available
or install one. or install one.

View File

@ -4,7 +4,7 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015-2023 games647 and contributors Copyright (c) 2015-2024 games647 and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@ -30,7 +30,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<properties> <properties>
<nettyVersion>4.1.79.Final</nettyVersion> <maven.compiler.release>8</maven.compiler.release>
</properties> </properties>
<parent> <parent>
@ -50,7 +50,7 @@
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>3.5.1</version> <version>3.6.0</version>
<configuration> <configuration>
<createDependencyReducedPom>false</createDependencyReducedPom> <createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>false</shadedArtifactAttached> <shadedArtifactAttached>false</shadedArtifactAttached>
@ -98,7 +98,6 @@
<filter> <filter>
<artifact>*:*</artifact> <artifact>*:*</artifact>
<excludes> <excludes>
<exclude>META-INF/MANIFEST.MF</exclude>
<exclude>**/module-info.class</exclude> <exclude>**/module-info.class</exclude>
</excludes> </excludes>
</filter> </filter>
@ -117,19 +116,16 @@
</build> </build>
<repositories> <repositories>
<!-- PaperSpigot API and PaperLib --> <!-- PaperSpigot API, PaperLib, datafixupper and bungeecord-chat -->
<repository> <repository>
<id>papermc</id> <id>papermc</id>
<url>https://papermc.io/repo/repository/maven-public/</url> <url>https://repo.papermc.io/repository/maven-public/</url>
</repository> </repository>
<!-- ProtocolLib --> <!-- ProtocolLib -->
<repository> <repository>
<id>dmulloy2-repo</id> <id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url> <url>https://repo.dmulloy2.net/repository/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository> </repository>
<!-- AuthMe Reloaded, xAuth and LoginSecurity --> <!-- AuthMe Reloaded, xAuth and LoginSecurity -->
@ -168,18 +164,11 @@
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.33</version>
<scope>compile</scope>
</dependency>
<!-- PaperSpigot API for correcting user cache usage --> <!-- PaperSpigot API for correcting user cache usage -->
<dependency> <dependency>
<groupId>io.papermc.paper</groupId> <groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId> <artifactId>paper-api</artifactId>
<version>1.19-R0.1-SNAPSHOT</version> <version>1.21.6-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
<!-- Use our own newer api version --> <!-- Use our own newer api version -->
<exclusions> <exclusions>
@ -187,13 +176,25 @@
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId> <artifactId>slf4j-api</artifactId>
</exclusion> </exclusion>
<exclusion>
<groupId>org.ow2.asm</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.maven</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.mojang</groupId> <groupId>com.mojang</groupId>
<artifactId>datafixerupper</artifactId> <artifactId>datafixerupper</artifactId>
<version>5.0.28</version> <version>7.1.15</version>
<scope>provided</scope> <scope>provided</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>
@ -207,7 +208,7 @@
<dependency> <dependency>
<groupId>com.comphenix.protocol</groupId> <groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib</artifactId> <artifactId>ProtocolLib</artifactId>
<version>5.1.0</version> <version>5.3.0</version>
<scope>provided</scope> <scope>provided</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>
@ -278,7 +279,7 @@
<dependency> <dependency>
<groupId>me.clip</groupId> <groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId> <artifactId>placeholderapi</artifactId>
<version>2.11.5</version> <version>2.11.6</version>
<scope>provided</scope> <scope>provided</scope>
<optional>true</optional> <optional>true</optional>
<exclusions> <exclusions>
@ -293,7 +294,7 @@
<dependency> <dependency>
<groupId>fr.xephi</groupId> <groupId>fr.xephi</groupId>
<artifactId>authme</artifactId> <artifactId>authme</artifactId>
<version>5.6.0-beta2</version> <version>5.6.0</version>
<scope>provided</scope> <scope>provided</scope>
<optional>true</optional> <optional>true</optional>
<exclusions> <exclusions>
@ -347,6 +348,22 @@
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>com.github.zigazajc007</groupId>
<artifactId>Passky</artifactId>
<version>v3.0.0</version>
<scope>provided</scope>
<optional>true</optional>
<!-- Exclude dependencies to prevent potential version conflicts-->
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--No maven repository :(--> <!--No maven repository :(-->
<dependency> <dependency>
<groupId>de.st_ddt.crazy</groupId> <groupId>de.st_ddt.crazy</groupId>
@ -378,29 +395,7 @@
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId> <artifactId>bcprov-jdk18on</artifactId>
<version>1.77</version> <version>1.80</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport</artifactId>
<version>${nettyVersion}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-codec</artifactId>
<version>${nettyVersion}</version>
<scope>test</scope>
</dependency>
<!-- Provided by the spigot, required for testing ProtocolLib -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -47,7 +47,6 @@ public class BukkitLoginSession extends LoginSession {
private final ClientPublicKey clientPublicKey; private final ClientPublicKey clientPublicKey;
private boolean verified; private boolean verified;
private SkinProperty skinProperty; private SkinProperty skinProperty;
public BukkitLoginSession(String username, byte[] verifyToken, ClientPublicKey publicKey, boolean registered, public BukkitLoginSession(String username, byte[] verifyToken, ClientPublicKey publicKey, boolean registered,
@ -109,7 +108,7 @@ public class BukkitLoginSession extends LoginSession {
* *
* @param verified whether the player has valid session * @param verified whether the player has valid session
*/ */
public synchronized void setVerified(boolean verified) { public synchronized void setVerifiedPremium(boolean verified) {
this.verified = verified; this.verified = verified;
} }
@ -118,7 +117,7 @@ public class BukkitLoginSession extends LoginSession {
* *
* @return whether the player has a valid session * @return whether the player has a valid session
*/ */
public synchronized boolean isVerified() { public synchronized boolean isVerifiedPremium() {
return verified; return verified;
} }
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -25,7 +25,7 @@
*/ */
package com.github.games647.fastlogin.bukkit; package com.github.games647.fastlogin.bukkit;
import com.github.games647.fastlogin.core.AsyncScheduler; import com.github.games647.fastlogin.core.scheduler.AsyncScheduler;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.slf4j.Logger; import org.slf4j.Logger;

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -31,6 +31,7 @@ import com.github.games647.fastlogin.core.message.LoginActionMessage;
import com.github.games647.fastlogin.core.message.NamespaceKey; import com.github.games647.fastlogin.core.message.NamespaceKey;
import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams; import com.google.common.io.ByteStreams;
import io.papermc.paper.configuration.ServerConfiguration;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -133,6 +134,13 @@ public class BungeeManager {
} }
private boolean detectProxy() { private boolean detectProxy() {
try {
ServerConfiguration.class.getDeclaredMethod("isProxyEnabled");
return Bukkit.getServerConfig().isProxyEnabled();
} catch (NoClassDefFoundError | NoSuchMethodException noSuchClassMethodEx) {
// Ignore continue below
}
try { try {
if (isProxySupported("org.spigotmc.SpigotConfig", "bungee")) { if (isProxySupported("org.spigotmc.SpigotConfig", "bungee")) {
return true; return true;

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,6 +28,7 @@ package com.github.games647.fastlogin.bukkit;
import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolLibrary;
import com.github.games647.fastlogin.bukkit.command.CrackedCommand; import com.github.games647.fastlogin.bukkit.command.CrackedCommand;
import com.github.games647.fastlogin.bukkit.command.PremiumCommand; import com.github.games647.fastlogin.bukkit.command.PremiumCommand;
import com.github.games647.fastlogin.bukkit.command.DeleteCommand;
import com.github.games647.fastlogin.bukkit.listener.ConnectionListener; import com.github.games647.fastlogin.bukkit.listener.ConnectionListener;
import com.github.games647.fastlogin.bukkit.listener.PaperCacheListener; import com.github.games647.fastlogin.bukkit.listener.PaperCacheListener;
import com.github.games647.fastlogin.bukkit.listener.protocollib.ProtocolLibListener; import com.github.games647.fastlogin.bukkit.listener.protocollib.ProtocolLibListener;
@ -36,6 +37,7 @@ import com.github.games647.fastlogin.bukkit.listener.protocolsupport.ProtocolSup
import com.github.games647.fastlogin.bukkit.task.DelayedAuthHook; import com.github.games647.fastlogin.bukkit.task.DelayedAuthHook;
import com.github.games647.fastlogin.core.CommonUtil; import com.github.games647.fastlogin.core.CommonUtil;
import com.github.games647.fastlogin.core.PremiumStatus; import com.github.games647.fastlogin.core.PremiumStatus;
import com.github.games647.fastlogin.core.antibot.AntiBotService;
import com.github.games647.fastlogin.core.hooks.bedrock.BedrockService; import com.github.games647.fastlogin.core.hooks.bedrock.BedrockService;
import com.github.games647.fastlogin.core.hooks.bedrock.FloodgateService; import com.github.games647.fastlogin.core.hooks.bedrock.FloodgateService;
import com.github.games647.fastlogin.core.hooks.bedrock.GeyserService; import com.github.games647.fastlogin.core.hooks.bedrock.GeyserService;
@ -53,6 +55,7 @@ import org.slf4j.Logger;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.nio.file.Path; import java.nio.file.Path;
import java.time.Duration;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@ -65,7 +68,10 @@ import java.util.concurrent.ConcurrentMap;
public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin<CommandSender> { public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin<CommandSender> {
//1 minutes should be enough as a timeout for bad internet connection (Server, Client and Mojang) //1 minutes should be enough as a timeout for bad internet connection (Server, Client and Mojang)
private final ConcurrentMap<String, BukkitLoginSession> loginSession = CommonUtil.buildCache(1, -1); private final ConcurrentMap<String, BukkitLoginSession> loginSession = CommonUtil.buildCache(
Duration.ofMinutes(1), -1
);
private final Map<UUID, PremiumStatus> premiumPlayers = new ConcurrentHashMap<>(); private final Map<UUID, PremiumStatus> premiumPlayers = new ConcurrentHashMap<>();
private final Logger logger; private final Logger logger;
@ -111,10 +117,11 @@ public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin<Comman
return; return;
} }
AntiBotService antiBotService = core.getAntiBotService();
if (pluginManager.isPluginEnabled("ProtocolSupport")) { if (pluginManager.isPluginEnabled("ProtocolSupport")) {
pluginManager.registerEvents(new ProtocolSupportListener(this, core.getAntiBot()), this); pluginManager.registerEvents(new ProtocolSupportListener(this, antiBotService), this);
} else if (pluginManager.isPluginEnabled("ProtocolLib")) { } else if (pluginManager.isPluginEnabled("ProtocolLib")) {
ProtocolLibListener.register(this, core.getAntiBot(), core.getConfig().getBoolean("verifyClientKeys")); ProtocolLibListener.register(this, antiBotService, core.getConfig().getBoolean("verifyClientKeys"));
//if server is using paper - we need to set the skin at pre login anyway, so no need for this listener //if server is using paper - we need to set the skin at pre login anyway, so no need for this listener
if (!isPaper() && getConfig().getBoolean("forwardSkin")) { if (!isPaper() && getConfig().getBoolean("forwardSkin")) {
@ -137,9 +144,7 @@ public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin<Comman
pluginManager.registerEvents(new PaperCacheListener(this), this); pluginManager.registerEvents(new PaperCacheListener(this), this);
} }
//register commands using a unique name registerCommands();
Optional.ofNullable(getCommand("premium")).ifPresent(c -> c.setExecutor(new PremiumCommand(this)));
Optional.ofNullable(getCommand("cracked")).ifPresent(c -> c.setExecutor(new CrackedCommand(this)));
if (pluginManager.isPluginEnabled("PlaceholderAPI")) { if (pluginManager.isPluginEnabled("PlaceholderAPI")) {
premiumPlaceholder = new PremiumPlaceholder(this); premiumPlaceholder = new PremiumPlaceholder(this);
@ -147,6 +152,13 @@ public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin<Comman
} }
} }
private void registerCommands() {
//register commands using a unique name
Optional.ofNullable(getCommand("premium")).ifPresent(c -> c.setExecutor(new PremiumCommand(this)));
Optional.ofNullable(getCommand("cracked")).ifPresent(c -> c.setExecutor(new CrackedCommand(this)));
Optional.ofNullable(getCommand("fldelete")).ifPresent(c -> c.setExecutor(new DeleteCommand(this)));
}
private boolean initializeFloodgate() { private boolean initializeFloodgate() {
if (getServer().getPluginManager().getPlugin("Geyser-Spigot") != null) { if (getServer().getPluginManager().getPlugin("Geyser-Spigot") != null) {
geyserService = new GeyserService(GeyserImpl.getInstance(), core); geyserService = new GeyserService(GeyserImpl.getInstance(), core);

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -74,11 +74,13 @@ public class PremiumPlaceholder extends PlaceholderExpansion {
@Override @Override
public @NotNull String getAuthor() { public @NotNull String getAuthor() {
//noinspection deprecation
return String.join(", ", plugin.getDescription().getAuthors()); return String.join(", ", plugin.getDescription().getAuthors());
} }
@Override @Override
public @NotNull String getVersion() { public @NotNull String getVersion() {
//noinspection deprecation
return plugin.getDescription().getVersion(); return plugin.getDescription().getVersion();
} }
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -30,6 +30,7 @@ import com.github.games647.fastlogin.bukkit.event.BukkitFastLoginPremiumToggleEv
import com.github.games647.fastlogin.core.storage.StoredProfile; import com.github.games647.fastlogin.core.storage.StoredProfile;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static com.github.games647.fastlogin.core.shared.event.FastLoginPremiumToggleEvent.PremiumToggleReason; import static com.github.games647.fastlogin.core.shared.event.FastLoginPremiumToggleEvent.PremiumToggleReason;
@ -57,21 +58,31 @@ public class CrackedCommand extends ToggleCommand {
return; return;
} }
Player player = (Player) sender;
if (forwardCrackedCommand(sender, sender.getName())) { if (forwardCrackedCommand(sender, sender.getName())) {
return; return;
} }
// todo: load async if // todo: load async if
StoredProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName()); StoredProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName());
if (profile.isPremium()) { if (profile.isOnlinemodePreferred()) {
plugin.getCore().sendLocaleMessage("remove-premium", sender); plugin.getCore().sendLocaleMessage("remove-premium", sender);
profile.setPremium(false); profile.setOnlinemodePreferred(false);
profile.setId(null); profile.setId(null);
plugin.getScheduler().runAsync(() -> { plugin.getScheduler().runAsync(() -> {
plugin.getCore().getStorage().save(profile); plugin.getCore().getStorage().save(profile);
plugin.getServer().getPluginManager().callEvent( plugin.getServer().getPluginManager().callEvent(
new BukkitFastLoginPremiumToggleEvent(profile, PremiumToggleReason.COMMAND_OTHER)); new BukkitFastLoginPremiumToggleEvent(sender, profile, PremiumToggleReason.COMMAND_OTHER)
);
plugin.getScheduler().getSyncExecutor().execute(() -> {
if (plugin.getCore().getConfig().getBoolean("kick-toggle", true)) {
player.kickPlayer(plugin.getCore().getMessage("remove-premium"));
} else {
plugin.getCore().sendLocaleMessage("add-premium", sender);
}
});
}); });
} else { } else {
plugin.getCore().sendLocaleMessage("not-premium", sender); plugin.getCore().sendLocaleMessage("not-premium", sender);
@ -95,16 +106,16 @@ public class CrackedCommand extends ToggleCommand {
} }
//existing player is already cracked //existing player is already cracked
if (profile.isSaved() && !profile.isPremium()) { if (profile.isExistingPlayer() && !profile.isOnlinemodePreferred()) {
plugin.getCore().sendLocaleMessage("not-premium-other", sender); plugin.getCore().sendLocaleMessage("not-premium-other", sender);
} else { } else {
plugin.getCore().sendLocaleMessage("remove-premium", sender); plugin.getCore().sendLocaleMessage("remove-premium", sender);
profile.setPremium(false); profile.setOnlinemodePreferred(false);
plugin.getScheduler().runAsync(() -> { plugin.getScheduler().runAsync(() -> {
plugin.getCore().getStorage().save(profile); plugin.getCore().getStorage().save(profile);
plugin.getServer().getPluginManager().callEvent( plugin.getServer().getPluginManager().callEvent(
new BukkitFastLoginPremiumToggleEvent(profile, PremiumToggleReason.COMMAND_OTHER)); new BukkitFastLoginPremiumToggleEvent(sender, profile, PremiumToggleReason.COMMAND_OTHER));
}); });
} }
} }

View File

@ -0,0 +1,94 @@
/*
* SPDX-License-Identifier: MIT
*
* The MIT License (MIT)
*
* Copyright (c) 2015-2024 games647 and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.github.games647.fastlogin.bukkit.command;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
public class DeleteCommand implements TabExecutor {
private final FastLoginBukkit plugin;
public DeleteCommand(FastLoginBukkit plugin) {
this.plugin = plugin;
}
/**
* Handles the command to delete profiles.
*/
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!sender.hasPermission(command.getPermission())) {
plugin.getCore().sendLocaleMessage("no-permission", sender);
return true;
}
if (plugin.getBungeeManager().isEnabled()) {
sender.sendMessage("Error: Cannot delete profile entries when using BungeeCord!");
return false;
}
if (args.length < 1) {
sender.sendMessage("Error: Must supply username to delete!");
return false;
}
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
int count = plugin.getCore().getStorage().deleteProfile(args[0]);
if (!(sender instanceof ConsoleCommandSender)) {
Bukkit.getScheduler().runTask(plugin, () -> {
if (count == 0) {
sender.sendMessage("Error: No profile entries found!");
} else {
sender.sendMessage("Deleted " + count + " matching profile entries");
}
});
}
});
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
List<String> list = new ArrayList<>();
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getName().toLowerCase().startsWith(args[0])) {
list.add(p.getName());
}
}
return null;
}
}

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -68,7 +68,8 @@ public class PremiumCommand extends ToggleCommand {
return; return;
} }
UUID id = ((Player) sender).getUniqueId(); Player player = (Player) sender;
UUID id = player.getUniqueId();
if (plugin.getConfig().getBoolean("premium-warning") && !plugin.getCore().getPendingConfirms().contains(id)) { if (plugin.getConfig().getBoolean("premium-warning") && !plugin.getCore().getPendingConfirms().contains(id)) {
sender.sendMessage(plugin.getCore().getMessage("premium-warning")); sender.sendMessage(plugin.getCore().getMessage("premium-warning"));
plugin.getCore().getPendingConfirms().add(id); plugin.getCore().getPendingConfirms().add(id);
@ -78,19 +79,26 @@ public class PremiumCommand extends ToggleCommand {
plugin.getCore().getPendingConfirms().remove(id); plugin.getCore().getPendingConfirms().remove(id);
//todo: load async //todo: load async
StoredProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName()); StoredProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName());
if (profile.isPremium()) { if (profile.isOnlinemodePreferred()) {
plugin.getCore().sendLocaleMessage("already-exists", sender); plugin.getCore().sendLocaleMessage("already-exists", sender);
} else { } else {
//todo: resolve uuid //todo: resolve uuid
profile.setPremium(true); profile.setOnlinemodePreferred(true);
plugin.getScheduler().runAsync(() -> { plugin.getScheduler().runAsync(() -> {
plugin.getCore().getStorage().save(profile); plugin.getCore().getStorage().save(profile);
plugin.getServer().getPluginManager().callEvent( plugin.getServer().getPluginManager().callEvent(
new BukkitFastLoginPremiumToggleEvent(profile, PremiumToggleReason.COMMAND_SELF)); new BukkitFastLoginPremiumToggleEvent(sender, profile, PremiumToggleReason.COMMAND_SELF)
}); );
plugin.getScheduler().getSyncExecutor().execute(() -> {
if (plugin.getCore().getConfig().getBoolean("kick-toggle", true)) {
player.kickPlayer(plugin.getCore().getMessage("remove-premium"));
} else {
plugin.getCore().sendLocaleMessage("add-premium", sender); plugin.getCore().sendLocaleMessage("add-premium", sender);
} }
});
});
}
} }
private void onPremiumOther(CommandSender sender, Command command, String[] args) { private void onPremiumOther(CommandSender sender, Command command, String[] args) {
@ -109,15 +117,16 @@ public class PremiumCommand extends ToggleCommand {
return; return;
} }
if (profile.isPremium()) { if (profile.isOnlinemodePreferred()) {
plugin.getCore().sendLocaleMessage("already-exists-other", sender); plugin.getCore().sendLocaleMessage("already-exists-other", sender);
} else { } else {
//todo: resolve uuid //todo: resolve uuid
profile.setPremium(true); profile.setOnlinemodePreferred(true);
plugin.getScheduler().runAsync(() -> { plugin.getScheduler().runAsync(() -> {
plugin.getCore().getStorage().save(profile); plugin.getCore().getStorage().save(profile);
plugin.getServer().getPluginManager().callEvent( plugin.getServer().getPluginManager().callEvent(
new BukkitFastLoginPremiumToggleEvent(profile, PremiumToggleReason.COMMAND_OTHER)); new BukkitFastLoginPremiumToggleEvent(sender, profile, PremiumToggleReason.COMMAND_OTHER)
);
}); });
plugin.getCore().sendLocaleMessage("add-premium-other", sender); plugin.getCore().sendLocaleMessage("add-premium-other", sender);

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -27,6 +27,7 @@ package com.github.games647.fastlogin.bukkit.event;
import com.github.games647.fastlogin.core.shared.event.FastLoginPremiumToggleEvent; import com.github.games647.fastlogin.core.shared.event.FastLoginPremiumToggleEvent;
import com.github.games647.fastlogin.core.storage.StoredProfile; import com.github.games647.fastlogin.core.storage.StoredProfile;
import org.bukkit.command.CommandSender;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -34,11 +35,15 @@ import org.jetbrains.annotations.NotNull;
public class BukkitFastLoginPremiumToggleEvent extends Event implements FastLoginPremiumToggleEvent { public class BukkitFastLoginPremiumToggleEvent extends Event implements FastLoginPremiumToggleEvent {
private static final HandlerList HANDLERS = new HandlerList(); private static final HandlerList HANDLERS = new HandlerList();
private final CommandSender invoker;
private final StoredProfile profile; private final StoredProfile profile;
private final PremiumToggleReason reason; private final PremiumToggleReason reason;
public BukkitFastLoginPremiumToggleEvent(StoredProfile profile, PremiumToggleReason reason) { public BukkitFastLoginPremiumToggleEvent(CommandSender invoker, StoredProfile profile, PremiumToggleReason reason) {
super(true); super(true);
this.invoker = invoker;
this.profile = profile; this.profile = profile;
this.reason = reason; this.reason = reason;
} }
@ -48,6 +53,13 @@ public class BukkitFastLoginPremiumToggleEvent extends Event implements FastLogi
return profile; return profile;
} }
/**
* @return who triggered this change. This could be a Player for itself or others (Admin) or the console.
*/
public CommandSender getInvoker() {
return invoker;
}
@Override @Override
public PremiumToggleReason getReason() { public PremiumToggleReason getReason() {
return reason; return reason;

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -45,9 +45,9 @@ import java.lang.reflect.Field;
* <p> * <p>
* Project page: * Project page:
* <p> * <p>
* Bukkit: <a href="https://dev.bukkit.org/bukkit-plugins/authme-reloaded/">...</a> * <a href="https://dev.bukkit.org/bukkit-plugins/authme-reloaded/">Bukkit</a>
* <p> * <p>
* Spigot: <a href="https://www.spigotmc.org/resources/authme-reloaded.6269/">...</a> * <a href="https://www.spigotmc.org/resources/authme-reloaded.6269/">Spigot</a>
*/ */
public class AuthMeHook implements AuthPlugin<Player>, Listener { public class AuthMeHook implements AuthPlugin<Player>, Listener {
@ -76,7 +76,7 @@ public class AuthMeHook implements AuthPlugin<Player>, Listener {
Player player = restoreSessionEvent.getPlayer(); Player player = restoreSessionEvent.getPlayer();
BukkitLoginSession session = plugin.getSession(player.spigot().getRawAddress()); BukkitLoginSession session = plugin.getSession(player.spigot().getRawAddress());
if (session != null && session.isVerified()) { if (session != null && session.isVerifiedPremium()) {
restoreSessionEvent.setCancelled(true); restoreSessionEvent.setCancelled(true);
} }
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -46,7 +46,7 @@ import java.util.concurrent.Future;
* <p> * <p>
* Project page: * Project page:
* <p> * <p>
* Bukkit: <a href="https://dev.bukkit.org/server-mods/crazylogin/">...</a> * <a href="https://dev.bukkit.org/server-mods/crazylogin/">Bukkit</a>
*/ */
public class CrazyLoginHook implements AuthPlugin<Player> { public class CrazyLoginHook implements AuthPlugin<Player> {

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -39,9 +39,9 @@ import org.bukkit.entity.Player;
* <p> * <p>
* Project page: * Project page:
* <p> * <p>
* Bukkit: <a href="https://dev.bukkit.org/bukkit-plugins/loginsecurity/">...</a> * <a href="https://dev.bukkit.org/bukkit-plugins/loginsecurity/">Bukkit</a>
* <p> * <p>
* Spigot: <a href="https://www.spigotmc.org/resources/loginsecurity.19362/">...</a> * <a href="https://www.spigotmc.org/resources/loginsecurity.19362/">Spigot</a>
*/ */
public class LoginSecurityHook implements AuthPlugin<Player> { public class LoginSecurityHook implements AuthPlugin<Player> {

View File

@ -0,0 +1,68 @@
/*
* SPDX-License-Identifier: MIT
*
* The MIT License (MIT)
*
* Copyright (c) 2015-2024 games647 and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.github.games647.fastlogin.bukkit.hook;
import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
import com.github.games647.fastlogin.core.hooks.AuthPlugin;
import com.rabbitcomapny.api.Identifier;
import com.rabbitcomapny.api.LoginResult;
import com.rabbitcomapny.api.PasskyAPI;
import com.rabbitcomapny.api.RegisterResult;
import org.bukkit.entity.Player;
public class PasskyHook implements AuthPlugin<Player> {
private final FastLoginBukkit plugin;
public PasskyHook(FastLoginBukkit plugin) {
this.plugin = plugin;
}
@Override
public boolean forceLogin(Player player) {
LoginResult result = PasskyAPI.forceLogin(new Identifier(player), true);
if (!result.success) {
plugin.getLog().error("Failed to force login {} via Passky: {}", player.getName(), result.status);
}
return result.success;
}
@Override
public boolean forceRegister(Player player, String password) {
RegisterResult result = PasskyAPI.forceRegister(new Identifier(player), password, true);
if (!result.success) {
plugin.getLog().error("Failed to register {} via Passky: {}", player.getName(), result.status);
}
return result.success;
}
@Override
public boolean isRegistered(String playerName) {
return PasskyAPI.isRegistered(new Identifier(playerName));
}
}

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -38,9 +38,9 @@ import java.util.concurrent.Future;
/** /**
* Project page: * Project page:
* <p> * <p>
* Bukkit: <a href="https://dev.bukkit.org/bukkit-plugins/ultraauth-aa/">...</a> * <a href="https://dev.bukkit.org/bukkit-plugins/ultraauth-aa/">Bukkit</a>
* <p> * <p>
* Spigot: <a href="https://www.spigotmc.org/resources/ultraauth.17044/">...</a> * <a href="https://www.spigotmc.org/resources/ultraauth.17044/">Spigot</a>
*/ */
public class UltraAuthHook implements AuthPlugin<Player> { public class UltraAuthHook implements AuthPlugin<Player> {

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -40,7 +40,7 @@ import java.util.concurrent.Future;
* <p> * <p>
* Project page: * Project page:
* <p> * <p>
* Bukkit: <a href="https://dev.bukkit.org/bukkit-plugins/xauth/">...</a> * <a href="https://dev.bukkit.org/bukkit-plugins/xauth/">Bukkit</a>
*/ */
public class XAuthHook implements AuthPlugin<Player> { public class XAuthHook implements AuthPlugin<Player> {

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -123,7 +123,7 @@ public class BungeeListener implements PluginMessageListener {
} }
private void startLoginTaskIfReady(Player player, BukkitLoginSession session) { private void startLoginTaskIfReady(Player player, BukkitLoginSession session) {
session.setVerified(true); session.setVerifiedPremium(true);
plugin.putSession(player.spigot().getRawAddress(), session); plugin.putSession(player.spigot().getRawAddress(), session);
// only start a new login task if the join event fired earlier. This event then didn't // only start a new login task if the join event fired earlier. This event then didn't

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -90,6 +90,7 @@ public class ConnectionListener implements Listener {
if (floodgatePlayer != null) { if (floodgatePlayer != null) {
Runnable floodgateAuthTask = new FloodgateAuthTask(plugin.getCore(), player, floodgatePlayer); Runnable floodgateAuthTask = new FloodgateAuthTask(plugin.getCore(), player, floodgatePlayer);
Bukkit.getScheduler().runTaskAsynchronously(plugin, floodgateAuthTask); Bukkit.getScheduler().runTaskAsynchronously(plugin, floodgateAuthTask);
plugin.getBungeeManager().markJoinEventFired(player);
return; return;
} }
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -31,7 +31,6 @@ import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
import com.google.common.io.Resources; import com.google.common.io.Resources;
import com.google.common.primitives.Longs; import com.google.common.primitives.Longs;
import lombok.val;
import javax.crypto.BadPaddingException; import javax.crypto.BadPaddingException;
import javax.crypto.Cipher; import javax.crypto.Cipher;
@ -41,6 +40,7 @@ import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import java.io.IOException; import java.io.IOException;
import java.math.BigInteger; import java.math.BigInteger;
import java.net.URL;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
@ -53,6 +53,7 @@ import java.security.PublicKey;
import java.security.Signature; import java.security.Signature;
import java.security.SignatureException; import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException; import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.security.spec.X509EncodedKeySpec; import java.security.spec.X509EncodedKeySpec;
import java.time.Instant; import java.time.Instant;
import java.util.Arrays; import java.util.Arrays;
@ -198,9 +199,9 @@ final class EncryptionUtil {
private static PublicKey loadMojangSessionKey() private static PublicKey loadMojangSessionKey()
throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
val keyUrl = FastLoginBukkit.class.getClassLoader().getResource("yggdrasil_session_pubkey.der"); URL keyUrl = FastLoginBukkit.class.getClassLoader().getResource("yggdrasil_session_pubkey.der");
val keyData = Resources.toByteArray(keyUrl); byte[] keyData = Resources.toByteArray(keyUrl);
val keySpec = new X509EncodedKeySpec(keyData); KeySpec keySpec = new X509EncodedKeySpec(keyData);
return KeyFactory.getInstance("RSA").generatePublic(keySpec); return KeyFactory.getInstance("RSA").generatePublic(keySpec);
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -97,7 +97,7 @@ public class NameCheckTask extends JoinManagement<Player, CommandSender, Protoco
} }
String ip = player.getAddress().getAddress().getHostAddress(); String ip = player.getAddress().getAddress().getHostAddress();
core.getPendingLogin().put(ip + username, new Object()); core.addLoginAttempt(ip, username);
byte[] verify = source.getVerifyToken(); byte[] verify = source.getVerifyToken();
ClientPublicKey clientKey = source.getClientKey(); ClientPublicKey clientKey = source.getClientKey();

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -30,15 +30,16 @@ import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.injector.PacketFilterManager; import com.comphenix.protocol.injector.netty.channel.NettyChannelInjector;
import com.comphenix.protocol.injector.player.PlayerInjectionHandler; import com.comphenix.protocol.injector.temporary.TemporaryPlayerFactory;
import com.comphenix.protocol.reflect.FieldAccessException;
import com.comphenix.protocol.reflect.FuzzyReflection; import com.comphenix.protocol.reflect.FuzzyReflection;
import com.comphenix.protocol.reflect.accessors.Accessors; import com.comphenix.protocol.reflect.accessors.Accessors;
import com.comphenix.protocol.reflect.accessors.FieldAccessor;
import com.comphenix.protocol.utility.MinecraftVersion; import com.comphenix.protocol.utility.MinecraftVersion;
import com.comphenix.protocol.wrappers.BukkitConverters; import com.comphenix.protocol.wrappers.BukkitConverters;
import com.comphenix.protocol.wrappers.Converters; import com.comphenix.protocol.wrappers.Converters;
import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.comphenix.protocol.wrappers.WrappedProfilePublicKey.WrappedProfileKeyData;
import com.github.games647.fastlogin.bukkit.BukkitLoginSession; import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
import com.github.games647.fastlogin.bukkit.FastLoginBukkit; import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
import com.github.games647.fastlogin.bukkit.listener.protocollib.packet.ClientPublicKey; import com.github.games647.fastlogin.bukkit.listener.protocollib.packet.ClientPublicKey;
@ -48,9 +49,9 @@ import com.mojang.datafixers.util.Either;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandler;
import io.netty.util.AttributeKey; import io.netty.util.AttributeKey;
import lombok.val;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.api.player.FloodgatePlayer;
import org.jetbrains.annotations.NotNull;
import javax.crypto.BadPaddingException; import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException; import javax.crypto.IllegalBlockSizeException;
@ -73,7 +74,6 @@ import static com.comphenix.protocol.PacketType.Login.Client.START;
public class ProtocolLibListener extends PacketAdapter { public class ProtocolLibListener extends PacketAdapter {
private final FastLoginBukkit plugin; private final FastLoginBukkit plugin;
private final PlayerInjectionHandler handler;
//just create a new once on plugin enable. This used for verify token generation //just create a new once on plugin enable. This used for verify token generation
private final SecureRandom random = new SecureRandom(); private final SecureRandom random = new SecureRandom();
@ -92,7 +92,6 @@ public class ProtocolLibListener extends PacketAdapter {
this.plugin = plugin; this.plugin = plugin;
this.antiBotService = antiBotService; this.antiBotService = antiBotService;
this.verifyClientKeys = verifyClientKeys; this.verifyClientKeys = verifyClientKeys;
this.handler = getHandler();
} }
public static void register(FastLoginBukkit plugin, AntiBotService antiBotService, boolean verifyClientKeys) { public static void register(FastLoginBukkit plugin, AntiBotService antiBotService, boolean verifyClientKeys) {
@ -112,16 +111,16 @@ public class ProtocolLibListener extends PacketAdapter {
return; return;
} }
plugin.getLog().info("New packet {} from {}", packetEvent.getPacketType(), packetEvent.getPlayer());
Player sender = packetEvent.getPlayer(); Player sender = packetEvent.getPlayer();
PacketType packetType = packetEvent.getPacketType(); PacketType packetType = getOverriddenType(packetEvent.getPacketType());
if (packetType == START) {
plugin.getLog().info("New incoming packet {} from {}", packetType, sender.getName());
try {
if (packetType == START) {
if (plugin.getFloodgateService() != null) { if (plugin.getFloodgateService() != null) {
boolean success = processFloodgateTasks(packetEvent); boolean success = processFloodgateTasks(packetEvent);
// don't continue execution if the player was kicked by Floodgate
if (!success) { if (!success) {
// don't continue execution if the player was kicked by Floodgate
return; return;
} }
} }
@ -146,9 +145,30 @@ public class ProtocolLibListener extends PacketAdapter {
onLoginStart(packetEvent, sender, username); onLoginStart(packetEvent, sender, username);
break; break;
} }
} else { } else if (packetType == ENCRYPTION_BEGIN) {
onEncryptionBegin(packetEvent, sender); onEncryptionBegin(packetEvent, sender);
} else {
plugin.getLog().warn("Unknown packet type received {}", packetType);
} }
} catch (FieldAccessException fieldAccessEx) {
plugin.getLog().error("Failed to parse packet {}", packetEvent.getPacketType(), fieldAccessEx);
}
}
private @NotNull PacketType getOverriddenType(PacketType packetType) {
if (packetType.isDynamic()) {
String vanillaName = packetType.getPacketClass().getName();
plugin.getLog().info("Overriding packet type for unregistered packet type to fix ProtocolLib bug");
if (vanillaName.endsWith("ServerboundHelloPacket")) {
return START;
}
if (vanillaName.endsWith("ServerboundKeyPacket")) {
return ENCRYPTION_BEGIN;
}
}
return packetType;
} }
private void onEncryptionBegin(PacketEvent packetEvent, Player sender) { private void onEncryptionBegin(PacketEvent packetEvent, Player sender) {
@ -222,11 +242,12 @@ public class ProtocolLibListener extends PacketAdapter {
PacketContainer packet = packetEvent.getPacket(); PacketContainer packet = packetEvent.getPacket();
Optional<ClientPublicKey> clientKey; Optional<ClientPublicKey> clientKey;
if (new MinecraftVersion(1, 19, 3).atOrAbove()) { if (new MinecraftVersion(1, 19, 3).atOrAbove()) {
// public key sent separate // public key is sent separate
clientKey = Optional.empty(); clientKey = Optional.empty();
} else { } else {
val profileKey = packet.getOptionals(BukkitConverters.getWrappedPublicKeyDataConverter()) Optional<Optional<WrappedProfileKeyData>> profileKey = packet.getOptionals(
.optionRead(0); BukkitConverters.getWrappedPublicKeyDataConverter()
).optionRead(0);
clientKey = profileKey.flatMap(Function.identity()).flatMap(data -> { clientKey = profileKey.flatMap(Function.identity()).flatMap(data -> {
Instant expires = data.getExpireTime(); Instant expires = data.getExpireTime();
@ -247,7 +268,6 @@ public class ProtocolLibListener extends PacketAdapter {
} }
} }
plugin.getLog().trace("GameProfile {} with {} connecting", sessionKey, username); plugin.getLog().trace("GameProfile {} with {} connecting", sessionKey, username);
packetEvent.getAsyncMarker().incrementProcessingDelay(); packetEvent.getAsyncMarker().incrementProcessingDelay();
@ -275,18 +295,19 @@ public class ProtocolLibListener extends PacketAdapter {
return profile.getName(); return profile.getName();
} }
private static PlayerInjectionHandler getHandler() {
PacketFilterManager manager = (PacketFilterManager) ProtocolLibrary.getProtocolManager();
FieldAccessor accessor = Accessors.getFieldAccessor(manager.getClass(), PlayerInjectionHandler.class, true);
return (PlayerInjectionHandler) accessor.get(manager);
}
private FloodgatePlayer getFloodgatePlayer(Player player) { private FloodgatePlayer getFloodgatePlayer(Player player) {
Channel channel = handler.getChannel(player); Channel channel = getChannel(player);
AttributeKey<FloodgatePlayer> floodgateAttribute = AttributeKey.valueOf("floodgate-player"); AttributeKey<FloodgatePlayer> floodgateAttribute = AttributeKey.valueOf("floodgate-player");
return channel.attr(floodgateAttribute).get(); return channel.attr(floodgateAttribute).get();
} }
private static Channel getChannel(Player player) {
NettyChannelInjector injector = (NettyChannelInjector) Accessors.getMethodAccessorOrNull(
TemporaryPlayerFactory.class, "getInjectorFromPlayer", Player.class
).invoke(null, player);
return FuzzyReflection.getFieldValue(injector, Channel.class, true);
}
/** /**
* Reimplementation of the tasks injected Floodgate in ProtocolLib that are not run due to a bug * Reimplementation of the tasks injected Floodgate in ProtocolLib that are not run due to a bug
* @see <a href="https://github.com/GeyserMC/Floodgate/issues/143">Issue Floodgate#143</a> * @see <a href="https://github.com/GeyserMC/Floodgate/issues/143">Issue Floodgate#143</a>
@ -303,7 +324,7 @@ public class ProtocolLibListener extends PacketAdapter {
} }
// kick the player, if necessary // kick the player, if necessary
Channel channel = handler.getChannel(packetEvent.getPlayer()); Channel channel = getChannel(packetEvent.getPlayer());
AttributeKey<String> kickMessageAttribute = AttributeKey.valueOf("floodgate-kick-message"); AttributeKey<String> kickMessageAttribute = AttributeKey.valueOf("floodgate-kick-message");
String kickMessage = channel.attr(kickMessageAttribute).get(); String kickMessage = channel.attr(kickMessageAttribute).get();
if (kickMessage != null) { if (kickMessage != null) {

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -51,7 +51,6 @@ class ProtocolLibLoginSource implements LoginSource {
private final ClientPublicKey clientKey; private final ClientPublicKey clientKey;
private final PublicKey publicKey; private final PublicKey publicKey;
private final String serverId = "";
private byte[] verifyToken; private byte[] verifyToken;
ProtocolLibLoginSource(Player player, Random random, PublicKey serverPublicKey, ClientPublicKey clientKey) { ProtocolLibLoginSource(Player player, Random random, PublicKey serverPublicKey, ClientPublicKey clientKey) {
@ -72,7 +71,7 @@ class ProtocolLibLoginSource implements LoginSource {
*/ */
PacketContainer newPacket = new PacketContainer(ENCRYPTION_BEGIN); PacketContainer newPacket = new PacketContainer(ENCRYPTION_BEGIN);
newPacket.getStrings().write(0, serverId); newPacket.getStrings().write(0, "");
StructureModifier<PublicKey> keyModifier = newPacket.getSpecificModifier(PublicKey.class); StructureModifier<PublicKey> keyModifier = newPacket.getSpecificModifier(PublicKey.class);
int verifyField = 0; int verifyField = 0;
if (keyModifier.getFields().isEmpty()) { if (keyModifier.getFields().isEmpty()) {
@ -84,6 +83,8 @@ class ProtocolLibLoginSource implements LoginSource {
} }
newPacket.getByteArrays().write(verifyField, verifyToken); newPacket.getByteArrays().write(verifyField, verifyToken);
// shouldAuthenticate, but why does this field even exist?
newPacket.getBooleans().writeSafely(0, true);
//serverId is an empty string //serverId is an empty string
ProtocolLibrary.getProtocolManager().sendServerPacket(player, newPacket); ProtocolLibrary.getProtocolManager().sendServerPacket(player, newPacket);
@ -115,10 +116,6 @@ class ProtocolLibLoginSource implements LoginSource {
return clientKey; return clientKey;
} }
public String getServerId() {
return serverId;
}
public byte[] getVerifyToken() { public byte[] getVerifyToken() {
return verifyToken.clone(); return verifyToken.clone();
} }
@ -128,7 +125,6 @@ class ProtocolLibLoginSource implements LoginSource {
return this.getClass().getSimpleName() + '{' return this.getClass().getSimpleName() + '{'
+ "player=" + player + "player=" + player
+ ", random=" + random + ", random=" + random
+ ", serverId='" + serverId + '\''
+ ", verifyToken=" + Arrays.toString(verifyToken) + ", verifyToken=" + Arrays.toString(verifyToken)
+ '}'; + '}';
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,6 +28,7 @@ package com.github.games647.fastlogin.bukkit.listener.protocollib;
import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.injector.netty.channel.NettyChannelInjector;
import com.comphenix.protocol.injector.packet.PacketRegistry; import com.comphenix.protocol.injector.packet.PacketRegistry;
import com.comphenix.protocol.injector.temporary.TemporaryPlayerFactory; import com.comphenix.protocol.injector.temporary.TemporaryPlayerFactory;
import com.comphenix.protocol.reflect.EquivalentConverter; import com.comphenix.protocol.reflect.EquivalentConverter;
@ -49,7 +50,6 @@ import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
import com.github.games647.fastlogin.bukkit.FastLoginBukkit; import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
import com.github.games647.fastlogin.bukkit.InetUtils; import com.github.games647.fastlogin.bukkit.InetUtils;
import com.github.games647.fastlogin.bukkit.listener.protocollib.packet.ClientPublicKey; import com.github.games647.fastlogin.bukkit.listener.protocollib.packet.ClientPublicKey;
import lombok.val;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.crypto.Cipher; import javax.crypto.Cipher;
@ -72,7 +72,6 @@ import static com.comphenix.protocol.PacketType.Login.Server.DISCONNECT;
public class VerifyResponseTask implements Runnable { public class VerifyResponseTask implements Runnable {
private static final String ENCRYPTION_CLASS_NAME = "MinecraftEncryption"; private static final String ENCRYPTION_CLASS_NAME = "MinecraftEncryption";
private static final Class<?> ENCRYPTION_CLASS;
private static final String ADDRESS_VERIFY_WARNING = "This indicates the use of reverse-proxy like HAProxy, " private static final String ADDRESS_VERIFY_WARNING = "This indicates the use of reverse-proxy like HAProxy, "
+ "TCPShield, BungeeCord, Velocity, etc. " + "TCPShield, BungeeCord, Velocity, etc. "
+ "By default (configurable in the config) this plugin requests Mojang to verify the connecting IP " + "By default (configurable in the config) this plugin requests Mojang to verify the connecting IP "
@ -81,12 +80,6 @@ public class VerifyResponseTask implements Runnable {
+ "(keyword IP forwarding). This process will also be useful for other server " + "(keyword IP forwarding). This process will also be useful for other server "
+ "features like IP banning, so that it doesn't ban the proxy IP."; + "features like IP banning, so that it doesn't ban the proxy IP.";
static {
ENCRYPTION_CLASS = MinecraftReflection.getMinecraftClass(
"util." + ENCRYPTION_CLASS_NAME, ENCRYPTION_CLASS_NAME
);
}
private final FastLoginBukkit plugin; private final FastLoginBukkit plugin;
private final PacketEvent packetEvent; private final PacketEvent packetEvent;
private final KeyPair serverKey; private final KeyPair serverKey;
@ -98,6 +91,8 @@ public class VerifyResponseTask implements Runnable {
private final byte[] sharedSecret; private final byte[] sharedSecret;
private static Method encryptMethod; private static Method encryptMethod;
private static Method encryptKeyMethod;
private static Method cipherMethod; private static Method cipherMethod;
public VerifyResponseTask(FastLoginBukkit plugin, PacketEvent packetEvent, public VerifyResponseTask(FastLoginBukkit plugin, PacketEvent packetEvent,
@ -173,12 +168,12 @@ public class VerifyResponseTask implements Runnable {
"The incoming request for player {} uses a local IP address", "The incoming request for player {} uses a local IP address",
requestedUsername requestedUsername
); );
plugin.getLog().warn(ADDRESS_VERIFY_WARNING);
} else { } else {
plugin.getLog().warn("If you think this is an error, please verify that the incoming " plugin.getLog().warn("If you think this is an error, please verify that the incoming "
+ "IP address {} is not associated with a server hosting company.", address); + "IP address {} is not associated with a server hosting company.", address);
plugin.getLog().warn(ADDRESS_VERIFY_WARNING);
} }
plugin.getLog().warn(ADDRESS_VERIFY_WARNING);
} }
} catch (IOException ioEx) { } catch (IOException ioEx) {
disconnect("error-kick", "Failed to connect to session server", ioEx); disconnect("error-kick", "Failed to connect to session server", ioEx);
@ -200,7 +195,7 @@ public class VerifyResponseTask implements Runnable {
session.setVerifiedUsername(realUsername); session.setVerifiedUsername(realUsername);
session.setUuid(verification.getId()); session.setUuid(verification.getId());
session.setVerified(true); session.setVerifiedPremium(true);
setPremiumUUID(session.getUuid()); setPremiumUUID(session.getUuid());
receiveFakeStartPacket(realUsername, session.getClientPublicKey(), session.getUuid()); receiveFakeStartPacket(realUsername, session.getClientPublicKey(), session.getUuid());
@ -223,34 +218,36 @@ public class VerifyResponseTask implements Runnable {
//try to get the networkManager from ProtocolLib //try to get the networkManager from ProtocolLib
private Object getNetworkManager() throws ClassNotFoundException { private Object getNetworkManager() throws ClassNotFoundException {
Object injectorContainer = TemporaryPlayerFactory.getInjectorFromPlayer(player); NettyChannelInjector injectorContainer = (NettyChannelInjector) Accessors.getMethodAccessorOrNull(
TemporaryPlayerFactory.class, "getInjectorFromPlayer", Player.class
).invoke(null, player);
// ChannelInjector FieldAccessor accessor = Accessors.getFieldAccessorOrNull(
Class<?> injectorClass = Class.forName("com.comphenix.protocol.injector.netty.Injector"); NettyChannelInjector.class, "networkManager", Object.class
Object rawInjector = FuzzyReflection.getFieldValue(injectorContainer, injectorClass, true); );
return accessor.get(injectorContainer);
Class<?> rawInjectorClass = rawInjector.getClass();
FieldAccessor accessor = Accessors.getFieldAccessorOrNull(rawInjectorClass, "networkManager", Object.class);
return accessor.get(rawInjector);
} }
private boolean enableEncryption(SecretKey loginKey) throws IllegalArgumentException { private boolean enableEncryption(SecretKey loginKey) throws IllegalArgumentException {
plugin.getLog().info("Enabling onlinemode encryption for {}", player.getAddress()); plugin.getLog().info("Enabling onlinemode encryption for {}", player.getAddress());
// Initialize method reflections // Initialize method reflections
if (encryptMethod == null) { if (encryptKeyMethod == null || encryptMethod == null) {
Class<?> networkManagerClass = MinecraftReflection.getNetworkManagerClass(); Class<?> networkManagerClass = MinecraftReflection.getNetworkManagerClass();
try { try {
// Try to get the old (pre MC 1.16.4) encryption method // Try to get the old (pre MC 1.16.4) encryption method
encryptMethod = FuzzyReflection.fromClass(networkManagerClass) encryptKeyMethod = FuzzyReflection.fromClass(networkManagerClass)
.getMethodByParameters("a", SecretKey.class); .getMethodByParameters("a", SecretKey.class);
} catch (IllegalArgumentException exception) { } catch (IllegalArgumentException exception) {
// Get the new encryption method // Get the new encryption method
encryptMethod = FuzzyReflection.fromClass(networkManagerClass) encryptMethod = FuzzyReflection.fromClass(networkManagerClass)
.getMethodByParameters("a", Cipher.class, Cipher.class); .getMethodByParameters("a", Cipher.class, Cipher.class);
Class<?> encryptionClass = MinecraftReflection.getMinecraftClass(
"util." + ENCRYPTION_CLASS_NAME, ENCRYPTION_CLASS_NAME
);
// Get the needed Cipher helper method (used to generate ciphers from login key) // Get the needed Cipher helper method (used to generate ciphers from login key)
cipherMethod = FuzzyReflection.fromClass(ENCRYPTION_CLASS) cipherMethod = FuzzyReflection.fromClass(encryptionClass)
.getMethodByParameters("a", int.class, Key.class); .getMethodByParameters("a", int.class, Key.class);
} }
} }
@ -259,9 +256,9 @@ public class VerifyResponseTask implements Runnable {
Object networkManager = this.getNetworkManager(); Object networkManager = this.getNetworkManager();
// If cipherMethod is null - use old encryption (pre MC 1.16.4), otherwise use the new cipher one // If cipherMethod is null - use old encryption (pre MC 1.16.4), otherwise use the new cipher one
if (cipherMethod == null) { if (encryptKeyMethod != null) {
// Encrypt/decrypt packet flow, this behaviour is expected by the client // Encrypt/decrypt packet flow, this behaviour is expected by the client
encryptMethod.invoke(networkManager, loginKey); encryptKeyMethod.invoke(networkManager, loginKey);
} else { } else {
// Create ciphers from login key // Create ciphers from login key
Object decryptionCipher = cipherMethod.invoke(null, Cipher.DECRYPT_MODE, loginKey); Object decryptionCipher = cipherMethod.invoke(null, Cipher.DECRYPT_MODE, loginKey);
@ -309,7 +306,7 @@ public class VerifyResponseTask implements Runnable {
startPacket.getStrings().write(0, username); startPacket.getStrings().write(0, username);
EquivalentConverter<WrappedProfileKeyData> converter = BukkitConverters.getWrappedPublicKeyDataConverter(); EquivalentConverter<WrappedProfileKeyData> converter = BukkitConverters.getWrappedPublicKeyDataConverter();
val wrappedKey = Optional.ofNullable(clientKey).map(key -> Optional<WrappedProfileKeyData> wrappedKey = Optional.ofNullable(clientKey).map(key ->
new WrappedProfileKeyData(clientKey.expiry(), clientKey.key(), clientKey.signature()) new WrappedProfileKeyData(clientKey.expiry(), clientKey.key(), clientKey.signature())
); );

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -25,20 +25,38 @@
*/ */
package com.github.games647.fastlogin.bukkit.listener.protocollib.packet; package com.github.games647.fastlogin.bukkit.listener.protocollib.packet;
import lombok.Value;
import lombok.experimental.Accessors;
import java.security.PublicKey; import java.security.PublicKey;
import java.time.Instant; import java.time.Instant;
import java.util.Base64; import java.util.Base64;
import java.util.StringJoiner; import java.util.StringJoiner;
@Accessors(fluent = true)
@Value(staticConstructor = "of")
public class ClientPublicKey { public class ClientPublicKey {
Instant expiry;
PublicKey key; private final Instant expiry;
byte[] signature; private final PublicKey key;
private final byte[] signature;
public Instant expiry() {
return expiry;
}
public PublicKey key() {
return key;
}
public byte[] signature() {
return signature;
}
public ClientPublicKey(Instant expiry, PublicKey key, byte[] signature) {
this.expiry = expiry;
this.key = key;
this.signature = signature;
}
public static ClientPublicKey of(Instant expiry, PublicKey key, byte[] signature) {
return new ClientPublicKey(expiry, key, signature);
}
public boolean isExpired(Instant verifyTimestamp) { public boolean isExpired(Instant verifyTimestamp) {
return !verifyTimestamp.isBefore(expiry); return !verifyTimestamp.isBefore(expiry);

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -101,7 +101,7 @@ public class ProtocolSupportListener extends JoinManagement<Player, CommandSende
BukkitLoginSession session = plugin.getSession(address); BukkitLoginSession session = plugin.getSession(address);
if (session != null && profileCompleteEvent.getConnection().getProfile().isOnlineMode()) { if (session != null && profileCompleteEvent.getConnection().getProfile().isOnlineMode()) {
session.setVerified(true); session.setVerifiedPremium(true);
if (!plugin.getConfig().getBoolean("premiumUuid")) { if (!plugin.getConfig().getBoolean("premiumUuid")) {
String username = Optional.ofNullable(profileCompleteEvent.getForcedName()) String username = Optional.ofNullable(profileCompleteEvent.getForcedName())
@ -125,7 +125,7 @@ public class ProtocolSupportListener extends JoinManagement<Player, CommandSende
source.enableOnlinemode(); source.enableOnlinemode();
String ip = source.getAddress().getAddress().getHostAddress(); String ip = source.getAddress().getAddress().getHostAddress();
plugin.getCore().getPendingLogin().put(ip + username, new Object()); plugin.getCore().addLoginAttempt(ip, username);
BukkitLoginSession playerSession = new BukkitLoginSession(username, registered, profile); BukkitLoginSession playerSession = new BukkitLoginSession(username, registered, profile);
plugin.putSession(source.getAddress(), playerSession); plugin.putSession(source.getAddress(), playerSession);

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -32,6 +32,7 @@ import com.github.games647.fastlogin.bukkit.hook.LogItHook;
import com.github.games647.fastlogin.bukkit.hook.LoginSecurityHook; import com.github.games647.fastlogin.bukkit.hook.LoginSecurityHook;
import com.github.games647.fastlogin.bukkit.hook.UltraAuthHook; import com.github.games647.fastlogin.bukkit.hook.UltraAuthHook;
import com.github.games647.fastlogin.bukkit.hook.XAuthHook; import com.github.games647.fastlogin.bukkit.hook.XAuthHook;
import com.github.games647.fastlogin.bukkit.hook.PasskyHook;
import com.github.games647.fastlogin.core.hooks.AuthPlugin; import com.github.games647.fastlogin.core.hooks.AuthPlugin;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -94,7 +95,7 @@ public class DelayedAuthHook implements Runnable {
try { try {
List<Class<? extends AuthPlugin<Player>>> hooks = Arrays.asList(AuthMeHook.class, List<Class<? extends AuthPlugin<Player>>> hooks = Arrays.asList(AuthMeHook.class,
CrazyLoginHook.class, LogItHook.class, LoginSecurityHook.class, UltraAuthHook.class, CrazyLoginHook.class, LogItHook.class, LoginSecurityHook.class, UltraAuthHook.class,
XAuthHook.class); XAuthHook.class, PasskyHook.class);
for (Class<? extends AuthPlugin<Player>> clazz : hooks) { for (Class<? extends AuthPlugin<Player>> clazz : hooks) {
String pluginName = clazz.getSimpleName(); String pluginName = clazz.getSimpleName();

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -49,7 +49,7 @@ public class FloodgateAuthTask extends FloodgateManagement<Player, CommandSender
BukkitLoginSession session = new BukkitLoginSession(player.getName(), isRegistered, profile); BukkitLoginSession session = new BukkitLoginSession(player.getName(), isRegistered, profile);
// enable auto login based on the value of 'autoLoginFloodgate' in config.yml // enable auto login based on the value of 'autoLoginFloodgate' in config.yml
session.setVerified(isAutoAuthAllowed(autoLoginFloodgate)); session.setVerifiedPremium(isAutoAuthAllowed(autoLoginFloodgate));
// run login task // run login task
Runnable forceLoginTask = new ForceLoginTask(core.getPlugin().getCore(), player, session); Runnable forceLoginTask = new ForceLoginTask(core.getPlugin().getCore(), player, session);

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -103,6 +103,6 @@ public class ForceLoginTask extends ForceLoginManagement<Player, CommandSender,
@Override @Override
public boolean isOnlineMode() { public boolean isOnlineMode() {
return session.isVerified(); return session.isVerifiedPremium();
} }
} }

View File

@ -25,12 +25,12 @@ softdepend:
- floodgate - floodgate
# Auth plugins # Auth plugins
- AuthMe - AuthMe
- CrazyLogin
- LoginSecurity - LoginSecurity
- SodionAuth
- xAuth
- LogIt - LogIt
- UltraAuth - UltraAuth
- CrazyLogin - xAuth
- Passky
commands: commands:
${project.parent.name}: ${project.parent.name}:
@ -45,6 +45,11 @@ commands:
usage: /<command> [player] usage: /<command> [player]
permission: ${project.artifactId}.command.cracked permission: ${project.artifactId}.command.cracked
fldelete:
description: 'Delete player profile data'
usage: /<command> [player]
permission: ${project.artifactId}.command.delete
permissions: permissions:
${project.artifactId}.command.premium: ${project.artifactId}.command.premium:
description: 'Label themselves as premium' description: 'Label themselves as premium'
@ -63,3 +68,7 @@ permissions:
description: 'Label others as cracked' description: 'Label others as cracked'
children: children:
${project.artifactId}.command.cracked: true ${project.artifactId}.command.cracked: true
${project.artifactId}.command.delete:
description: 'Delete other players profile data'
default: op

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -26,7 +26,7 @@
package com.github.games647.fastlogin.bukkit; package com.github.games647.fastlogin.bukkit;
import com.github.games647.fastlogin.core.CommonUtil; import com.github.games647.fastlogin.core.CommonUtil;
import lombok.val; import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.chat.ComponentSerializer; import net.md_5.bungee.chat.ComponentSerializer;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -37,12 +37,14 @@ class FastLoginBukkitTest {
@Test @Test
void testRGB() { void testRGB() {
val message = "&x00002a00002b&lText"; String message = "&x00002a00002b&lText";
val msg = CommonUtil.translateColorCodes(message); String msg = CommonUtil.translateColorCodes(message);
assertEquals(msg, "§x00002a00002b§lText"); assertEquals(msg, "§x00002a00002b§lText");
val components = TextComponent.fromLegacyText(msg); @SuppressWarnings("deprecation")
val expected = "{\"bold\":true,\"color\":\"#00a00b\",\"text\":\"Text\"}"; BaseComponent[] components = TextComponent.fromLegacyText(msg);
String expected = "{\"bold\":true,\"color\":\"#00a00b\",\"text\":\"Text\"}";
//noinspection deprecation
assertEquals(ComponentSerializer.toString(components), expected); assertEquals(ComponentSerializer.toString(components), expected);
} }
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,7 +28,6 @@ package com.github.games647.fastlogin.bukkit.listener.protocollib;
import com.google.gson.TypeAdapter; import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter; import com.google.gson.stream.JsonWriter;
import lombok.val;
import java.io.IOException; import java.io.IOException;
import java.util.Base64; import java.util.Base64;
@ -37,7 +36,7 @@ public class Base64Adapter extends TypeAdapter<byte[]> {
@Override @Override
public void write(JsonWriter out, byte[] value) throws IOException { public void write(JsonWriter out, byte[] value) throws IOException {
val encoded = Base64.getEncoder().encodeToString(value); String encoded = Base64.getEncoder().encodeToString(value);
out.value(encoded); out.value(encoded);
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -27,8 +27,8 @@ package com.github.games647.fastlogin.bukkit.listener.protocollib;
import com.github.games647.fastlogin.bukkit.listener.protocollib.SignatureTestData.SignatureData; import com.github.games647.fastlogin.bukkit.listener.protocollib.SignatureTestData.SignatureData;
import com.github.games647.fastlogin.bukkit.listener.protocollib.packet.ClientPublicKey; import com.github.games647.fastlogin.bukkit.listener.protocollib.packet.ClientPublicKey;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
import lombok.val;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource; import org.junit.jupiter.params.provider.ValueSource;
@ -51,6 +51,7 @@ import java.security.SignatureException;
import java.security.interfaces.RSAPublicKey; import java.security.interfaces.RSAPublicKey;
import java.time.Instant; import java.time.Instant;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Random;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
@ -60,7 +61,7 @@ class EncryptionUtilTest {
@Test @Test
void testVerifyToken() { void testVerifyToken() {
val random = ThreadLocalRandom.current(); Random random = ThreadLocalRandom.current();
byte[] token = EncryptionUtil.generateVerifyToken(random); byte[] token = EncryptionUtil.generateVerifyToken(random);
assertAll( assertAll(
@ -88,10 +89,10 @@ class EncryptionUtilTest {
@Test @Test
void testExpiredClientKey() throws Exception { void testExpiredClientKey() throws Exception {
val clientKey = ResourceLoader.loadClientKey("client_keys/valid_public_key.json"); ClientPublicKey clientKey = ResourceLoader.loadClientKey("client_keys/valid_public_key.json");
// Client expires at the exact second mentioned, so use it for verification // Client expires at the exact second mentioned, so use it for verification
val expiredTimestamp = clientKey.expiry(); Instant expiredTimestamp = clientKey.expiry();
assertFalse(EncryptionUtil.verifyClientKey(clientKey, expiredTimestamp, null)); assertFalse(EncryptionUtil.verifyClientKey(clientKey, expiredTimestamp, null));
} }
@ -105,7 +106,7 @@ class EncryptionUtilTest {
"client_keys/invalid_wrong_signature.json" "client_keys/invalid_wrong_signature.json"
}) })
void testInvalidClientKey(String clientKeySource) throws Exception { void testInvalidClientKey(String clientKeySource) throws Exception {
val clientKey = ResourceLoader.loadClientKey(clientKeySource); ClientPublicKey clientKey = ResourceLoader.loadClientKey(clientKeySource);
Instant expireTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS); Instant expireTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS);
assertFalse(EncryptionUtil.verifyClientKey(clientKey, expireTimestamp, null)); assertFalse(EncryptionUtil.verifyClientKey(clientKey, expireTimestamp, null));
@ -113,34 +114,34 @@ class EncryptionUtilTest {
@Test @Test
void testValidClientKey() throws Exception { void testValidClientKey() throws Exception {
val clientKey = ResourceLoader.loadClientKey("client_keys/valid_public_key.json"); ClientPublicKey clientKey = ResourceLoader.loadClientKey("client_keys/valid_public_key.json");
val verificationTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS); Instant verificationTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS);
assertTrue(EncryptionUtil.verifyClientKey(clientKey, verificationTimestamp, null)); assertTrue(EncryptionUtil.verifyClientKey(clientKey, verificationTimestamp, null));
} }
@Test @Test
void testValid191ClientKey() throws Exception { void testValid191ClientKey() throws Exception {
val clientKey = ResourceLoader.loadClientKey("client_keys/valid_public_key_19_1.json"); ClientPublicKey clientKey = ResourceLoader.loadClientKey("client_keys/valid_public_key_19_1.json");
val verificationTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS); Instant verificationTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS);
val ownerPremiumId = UUID.fromString("0aaa2c13-922a-411b-b655-9b8c08404695"); UUID ownerPremiumId = UUID.fromString("0aaa2c13-922a-411b-b655-9b8c08404695");
assertTrue(EncryptionUtil.verifyClientKey(clientKey, verificationTimestamp, ownerPremiumId)); assertTrue(EncryptionUtil.verifyClientKey(clientKey, verificationTimestamp, ownerPremiumId));
} }
@Test @Test
void testIncorrect191ClientOwner() throws Exception { void testIncorrect191ClientOwner() throws Exception {
val clientKey = ResourceLoader.loadClientKey("client_keys/valid_public_key_19_1.json"); ClientPublicKey clientKey = ResourceLoader.loadClientKey("client_keys/valid_public_key_19_1.json");
val verificationTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS); Instant verificationTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS);
val ownerPremiumId = UUID.fromString("61699b2e-d327-4a01-9f1e-0ea8c3f06bc6"); UUID ownerPremiumId = UUID.fromString("61699b2e-d327-4a01-9f1e-0ea8c3f06bc6");
assertFalse(EncryptionUtil.verifyClientKey(clientKey, verificationTimestamp, ownerPremiumId)); assertFalse(EncryptionUtil.verifyClientKey(clientKey, verificationTimestamp, ownerPremiumId));
} }
@Test @Test
void testDecryptSharedSecret() throws Exception { void testDecryptSharedSecret() throws Exception {
KeyPair serverPair = EncryptionUtil.generateKeyPair(); KeyPair serverPair = EncryptionUtil.generateKeyPair();
val serverPK = serverPair.getPublic(); PublicKey serverPK = serverPair.getPublic();
SecretKey secretKey = generateSharedKey(); SecretKey secretKey = generateSharedKey();
byte[] encryptedSecret = encrypt(serverPK, secretKey.getEncoded()); byte[] encryptedSecret = encrypt(serverPK, secretKey.getEncoded());
@ -152,7 +153,7 @@ class EncryptionUtilTest {
private static byte[] encrypt(PublicKey receiverKey, byte... message) private static byte[] encrypt(PublicKey receiverKey, byte... message)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException { IllegalBlockSizeException, BadPaddingException {
val encryptCipher = Cipher.getInstance(receiverKey.getAlgorithm()); Cipher encryptCipher = Cipher.getInstance(receiverKey.getAlgorithm());
encryptCipher.init(Cipher.ENCRYPT_MODE, receiverKey); encryptCipher.init(Cipher.ENCRYPT_MODE, receiverKey);
return encryptCipher.doFinal(message); return encryptCipher.doFinal(message);
} }
@ -168,9 +169,9 @@ class EncryptionUtilTest {
@Test @Test
void testServerIdHash() throws Exception { void testServerIdHash() throws Exception {
val serverId = ""; String serverId = "";
val sharedSecret = generateSharedKey(); SecretKeySpec sharedSecret = generateSharedKey();
val serverPK = ResourceLoader.loadClientKey("client_keys/valid_public_key.json").key(); PublicKey serverPK = ResourceLoader.loadClientKey("client_keys/valid_public_key.json").key();
String sessionHash = getServerHash(serverId, sharedSecret, serverPK); String sessionHash = getServerHash(serverId, sharedSecret, serverPK);
assertEquals(EncryptionUtil.getServerIdHashString(serverId, sharedSecret, serverPK), sessionHash); assertEquals(EncryptionUtil.getServerIdHashString(serverId, sharedSecret, serverPK), sessionHash);
@ -185,7 +186,7 @@ class EncryptionUtilTest {
// sha1.update(server's encoded public key from Encryption Request) // sha1.update(server's encoded public key from Encryption Request)
// hash := sha1.hexdigest() # String of hex characters // hash := sha1.hexdigest() # String of hex characters
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
val hasher = Hashing.sha1().newHasher(); Hasher hasher = Hashing.sha1().newHasher();
hasher.putString(serverId, StandardCharsets.US_ASCII); hasher.putString(serverId, StandardCharsets.US_ASCII);
hasher.putBytes(sharedSecret.getEncoded()); hasher.putBytes(sharedSecret.getEncoded());
hasher.putBytes(serverPK.getEncoded()); hasher.putBytes(serverPK.getEncoded());
@ -198,9 +199,9 @@ class EncryptionUtilTest {
@Test @Test
void testServerIdHashWrongSecret() throws Exception { void testServerIdHashWrongSecret() throws Exception {
val serverId = ""; String serverId = "";
val sharedSecret = generateSharedKey(); SecretKeySpec sharedSecret = generateSharedKey();
val serverPK = ResourceLoader.loadClientKey("client_keys/valid_public_key.json").key(); PublicKey serverPK = ResourceLoader.loadClientKey("client_keys/valid_public_key.json").key();
String sessionHash = getServerHash(serverId, sharedSecret, serverPK); String sessionHash = getServerHash(serverId, sharedSecret, serverPK);
assertNotEquals(EncryptionUtil.getServerIdHashString("", generateSharedKey(), serverPK), sessionHash); assertNotEquals(EncryptionUtil.getServerIdHashString("", generateSharedKey(), serverPK), sessionHash);
@ -208,12 +209,12 @@ class EncryptionUtilTest {
@Test @Test
void testServerIdHashWrongServerKey() { void testServerIdHashWrongServerKey() {
val serverId = ""; String serverId = "";
val sharedSecret = generateSharedKey(); SecretKeySpec sharedSecret = generateSharedKey();
val serverPK = EncryptionUtil.generateKeyPair().getPublic(); PublicKey serverPK = EncryptionUtil.generateKeyPair().getPublic();
String sessionHash = getServerHash(serverId, sharedSecret, serverPK); String sessionHash = getServerHash(serverId, sharedSecret, serverPK);
val wrongPK = EncryptionUtil.generateKeyPair().getPublic(); PublicKey wrongPK = EncryptionUtil.generateKeyPair().getPublic();
assertNotEquals(EncryptionUtil.getServerIdHashString("", sharedSecret, wrongPK), sessionHash); assertNotEquals(EncryptionUtil.getServerIdHashString("", sharedSecret, wrongPK), sessionHash);
} }
@ -257,8 +258,8 @@ class EncryptionUtilTest {
@Test @Test
void testNonce() throws Exception { void testNonce() throws Exception {
byte[] expected = {1, 2, 3, 4}; byte[] expected = {1, 2, 3, 4};
val serverKey = EncryptionUtil.generateKeyPair(); KeyPair serverKey = EncryptionUtil.generateKeyPair();
val encryptedNonce = encrypt(serverKey.getPublic(), expected); byte[] encryptedNonce = encrypt(serverKey.getPublic(), expected);
assertTrue(EncryptionUtil.verifyNonce(expected, serverKey.getPrivate(), encryptedNonce)); assertTrue(EncryptionUtil.verifyNonce(expected, serverKey.getPrivate(), encryptedNonce));
} }
@ -266,19 +267,19 @@ class EncryptionUtilTest {
@Test @Test
void testNonceIncorrect() throws Exception { void testNonceIncorrect() throws Exception {
byte[] expected = {1, 2, 3, 4}; byte[] expected = {1, 2, 3, 4};
val serverKey = EncryptionUtil.generateKeyPair(); KeyPair serverKey = EncryptionUtil.generateKeyPair();
// flipped first character // flipped first character
val encryptedNonce = encrypt(serverKey.getPublic(), new byte[]{0, 2, 3, 4}); byte[] encryptedNonce = encrypt(serverKey.getPublic(), new byte[]{0, 2, 3, 4});
assertFalse(EncryptionUtil.verifyNonce(expected, serverKey.getPrivate(), encryptedNonce)); assertFalse(EncryptionUtil.verifyNonce(expected, serverKey.getPrivate(), encryptedNonce));
} }
@Test @Test
void testNonceFailedDecryption() throws Exception { void testNonceFailedDecryption() throws Exception {
byte[] expected = {1, 2, 3, 4}; byte[] expected = {1, 2, 3, 4};
val serverKey = EncryptionUtil.generateKeyPair(); KeyPair serverKey = EncryptionUtil.generateKeyPair();
// generate a new keypair that is different // generate a new keypair that is different
val encryptedNonce = encrypt(EncryptionUtil.generateKeyPair().getPublic(), expected); byte[] encryptedNonce = encrypt(EncryptionUtil.generateKeyPair().getPublic(), expected);
assertThrows(GeneralSecurityException.class, assertThrows(GeneralSecurityException.class,
() -> EncryptionUtil.verifyNonce(expected, serverKey.getPrivate(), encryptedNonce) () -> EncryptionUtil.verifyNonce(expected, serverKey.getPrivate(), encryptedNonce)
@ -288,7 +289,7 @@ class EncryptionUtilTest {
@Test @Test
void testNonceIncorrectEmpty() { void testNonceIncorrectEmpty() {
byte[] expected = {1, 2, 3, 4}; byte[] expected = {1, 2, 3, 4};
val serverKey = EncryptionUtil.generateKeyPair(); KeyPair serverKey = EncryptionUtil.generateKeyPair();
byte[] encryptedNonce = {}; byte[] encryptedNonce = {};
assertThrows(GeneralSecurityException.class, assertThrows(GeneralSecurityException.class,

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,16 +28,16 @@ package com.github.games647.fastlogin.bukkit.listener.protocollib;
import com.google.common.io.Resources; import com.google.common.io.Resources;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.JsonAdapter;
import lombok.val;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
public class SignatureTestData { public class SignatureTestData {
public static SignatureTestData fromResource(String resourceName) throws IOException { public static SignatureTestData fromResource(String resourceName) throws IOException {
val keyUrl = Resources.getResource(resourceName); URL keyUrl = Resources.getResource(resourceName);
val encodedSignature = Resources.toString(keyUrl, StandardCharsets.US_ASCII); String encodedSignature = Resources.toString(keyUrl, StandardCharsets.US_ASCII);
return new Gson().fromJson(encodedSignature, SignatureTestData.class); return new Gson().fromJson(encodedSignature, SignatureTestData.class);
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -26,7 +26,6 @@
package com.github.games647.fastlogin.bukkit.task; package com.github.games647.fastlogin.bukkit.task;
import com.github.games647.fastlogin.core.hooks.AuthPlugin; import com.github.games647.fastlogin.core.hooks.AuthPlugin;
import lombok.val;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -36,7 +35,7 @@ class DelayedAuthHookTest {
@Test @Test
void createNewReflectiveInstance() throws ReflectiveOperationException { void createNewReflectiveInstance() throws ReflectiveOperationException {
val authHook = new DelayedAuthHook(null); DelayedAuthHook authHook = new DelayedAuthHook(null);
assertNotNull(authHook.newInstance(DummyHook.class)); assertNotNull(authHook.newInstance(DummyHook.class));
} }

View File

@ -4,7 +4,7 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015-2023 games647 and contributors Copyright (c) 2015-2024 games647 and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@ -40,6 +40,10 @@
<artifactId>fastlogin.bungee</artifactId> <artifactId>fastlogin.bungee</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<!--Represents the main plugin--> <!--Represents the main plugin-->
<name>FastLoginBungee</name> <name>FastLoginBungee</name>
@ -47,20 +51,12 @@
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>3.5.1</version> <version>3.6.0</version>
<configuration> <configuration>
<minimizeJar>true</minimizeJar> <minimizeJar>true</minimizeJar>
<createDependencyReducedPom>false</createDependencyReducedPom> <createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>false</shadedArtifactAttached> <shadedArtifactAttached>false</shadedArtifactAttached>
<artifactSet>
<excludes>
<!--Those classes are already present in BungeeCord version-->
<exclude>net.md-5:bungeecord-config</exclude>
<exclude>com.google.code.gson:gson</exclude>
<exclude>com.google.guava:guava</exclude>
</excludes>
</artifactSet>
<relocations> <relocations>
<relocation> <relocation>
<pattern>com.zaxxer.hikari</pattern> <pattern>com.zaxxer.hikari</pattern>
@ -82,6 +78,7 @@
<artifact>*:*</artifact> <artifact>*:*</artifact>
<excludes> <excludes>
<exclude>META-INF/MANIFEST.MF</exclude> <exclude>META-INF/MANIFEST.MF</exclude>
<exclude>**/module-info</exclude>
<exclude>**/module-info.class</exclude> <exclude>**/module-info.class</exclude>
</excludes> </excludes>
</filter> </filter>
@ -120,13 +117,33 @@
<groupId>${project.groupId}</groupId> <groupId>${project.groupId}</groupId>
<artifactId>fastlogin.core</artifactId> <artifactId>fastlogin.core</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
<!--Those classes are already present in BungeeCord version-->
<exclusions>
<exclusion>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-config</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
<!-- Exclude snakeyaml, because it is included in BungeeCord with the correct version -->
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!--BungeeCord with also the part outside the API--> <!--BungeeCord with also the part outside the API-->
<dependency> <dependency>
<groupId>net.md-5</groupId> <groupId>net.md-5</groupId>
<artifactId>bungeecord-proxy</artifactId> <artifactId>bungeecord-proxy</artifactId>
<version>1.19-R0.1-SNAPSHOT</version> <version>1.20-R0.2-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
<!-- Use our own newer api version --> <!-- Use our own newer api version -->
<exclusions> <exclusions>
@ -135,13 +152,14 @@
<artifactId>slf4j-api</artifactId> <artifactId>slf4j-api</artifactId>
</exclusion> </exclusion>
<exclusion> <exclusion>
<groupId>mysql</groupId> <groupId>com.mysql</groupId>
<artifactId>*</artifactId> <artifactId>*</artifactId>
</exclusion> </exclusion>
<exclusion> <exclusion>
<groupId>net.md-5</groupId> <groupId>net.md-5</groupId>
<artifactId>bungeecord-native</artifactId> <artifactId>bungeecord-native</artifactId>
</exclusion> </exclusion>
<exclusion> <exclusion>
<groupId>net.md-5</groupId> <groupId>net.md-5</groupId>
<artifactId>bungeecord-query</artifactId> <artifactId>bungeecord-query</artifactId>
@ -150,6 +168,11 @@
<groupId>net.md-5</groupId> <groupId>net.md-5</groupId>
<artifactId>bungeecord-slf4j</artifactId> <artifactId>bungeecord-slf4j</artifactId>
</exclusion> </exclusion>
<exclusion>
<groupId>net.sf.jopt-simple</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion> <exclusion>
<groupId>org.apache.maven</groupId> <groupId>org.apache.maven</groupId>
<artifactId>*</artifactId> <artifactId>*</artifactId>
@ -158,6 +181,10 @@
<groupId>org.apache.maven.resolver</groupId> <groupId>org.apache.maven.resolver</groupId>
<artifactId>*</artifactId> <artifactId>*</artifactId>
</exclusion> </exclusion>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -54,9 +54,15 @@ public class BungeeLoginSource implements LoginSource {
preLoginEvent.setCancelled(true); preLoginEvent.setCancelled(true);
if (message == null) { if (message == null) {
preLoginEvent.setCancelReason(new ComponentBuilder("Kicked").color(ChatColor.WHITE).create()); preLoginEvent.setReason(
TextComponent.fromArray(
new ComponentBuilder("Kicked").color(ChatColor.WHITE).create()
));
} else { } else {
preLoginEvent.setCancelReason(TextComponent.fromLegacyText(message)); preLoginEvent.setReason(
TextComponent.fromArray(
TextComponent.fromLegacyText(message)
));
} }
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,7 +28,6 @@ package com.github.games647.fastlogin.bungee;
import com.github.games647.fastlogin.bungee.hook.BungeeAuthHook; import com.github.games647.fastlogin.bungee.hook.BungeeAuthHook;
import com.github.games647.fastlogin.bungee.listener.ConnectListener; import com.github.games647.fastlogin.bungee.listener.ConnectListener;
import com.github.games647.fastlogin.bungee.listener.PluginMessageListener; import com.github.games647.fastlogin.bungee.listener.PluginMessageListener;
import com.github.games647.fastlogin.core.AsyncScheduler;
import com.github.games647.fastlogin.core.CommonUtil; import com.github.games647.fastlogin.core.CommonUtil;
import com.github.games647.fastlogin.core.hooks.AuthPlugin; import com.github.games647.fastlogin.core.hooks.AuthPlugin;
import com.github.games647.fastlogin.core.hooks.bedrock.BedrockService; import com.github.games647.fastlogin.core.hooks.bedrock.BedrockService;
@ -38,6 +37,7 @@ import com.github.games647.fastlogin.core.message.ChangePremiumMessage;
import com.github.games647.fastlogin.core.message.ChannelMessage; import com.github.games647.fastlogin.core.message.ChannelMessage;
import com.github.games647.fastlogin.core.message.NamespaceKey; import com.github.games647.fastlogin.core.message.NamespaceKey;
import com.github.games647.fastlogin.core.message.SuccessMessage; import com.github.games647.fastlogin.core.message.SuccessMessage;
import com.github.games647.fastlogin.core.scheduler.AsyncScheduler;
import com.github.games647.fastlogin.core.shared.FastLoginCore; import com.github.games647.fastlogin.core.shared.FastLoginCore;
import com.github.games647.fastlogin.core.shared.PlatformPlugin; import com.github.games647.fastlogin.core.shared.PlatformPlugin;
import com.google.common.collect.MapMaker; import com.google.common.collect.MapMaker;
@ -98,7 +98,7 @@ public class FastLoginBungee extends Plugin implements PlatformPlugin<CommandSen
//events //events
PluginManager pluginManager = getProxy().getPluginManager(); PluginManager pluginManager = getProxy().getPluginManager();
Listener connectListener = new ConnectListener(this, core.getAntiBot()); Listener connectListener = new ConnectListener(this, core.getAntiBotService());
pluginManager.registerListener(this, connectListener); pluginManager.registerListener(this, connectListener);
pluginManager.registerListener(this, new PluginMessageListener(this)); pluginManager.registerListener(this, new PluginMessageListener(this));

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -71,25 +71,43 @@ public class ConnectListener implements Listener {
private static final String UUID_FIELD_NAME = "uniqueId"; private static final String UUID_FIELD_NAME = "uniqueId";
protected static final MethodHandle UNIQUE_ID_SETTER; protected static final MethodHandle UNIQUE_ID_SETTER;
private static final String REWRITE_ID_NAME = "rewriteId";
protected static final MethodHandle REWRITE_ID_SETTER;
static { static {
MethodHandle setHandle = null; MethodHandle uniqueIdHandle = null;
MethodHandle rewriterHandle = null;
try { try {
Lookup lookup = MethodHandles.lookup(); Lookup lookup = MethodHandles.lookup();
// test for implementation class availability
Class.forName("net.md_5.bungee.connection.InitialHandler"); Class.forName("net.md_5.bungee.connection.InitialHandler");
uniqueIdHandle = getHandlerSetter(lookup, UUID_FIELD_NAME);
Field uuidField = InitialHandler.class.getDeclaredField(UUID_FIELD_NAME); try {
uuidField.setAccessible(true); rewriterHandle = getHandlerSetter(lookup, REWRITE_ID_NAME);
setHandle = lookup.unreflectSetter(uuidField); } catch (NoSuchFieldException noSuchFieldEx) {
Logger logger = LoggerFactory.getLogger(ConnectListener.class);
logger.error(
"Rewrite field not found. Setting only legacy BungeeCord field"
);
}
} catch (ReflectiveOperationException reflectiveOperationException) { } catch (ReflectiveOperationException reflectiveOperationException) {
Logger logger = LoggerFactory.getLogger(ConnectListener.class); Logger logger = LoggerFactory.getLogger(ConnectListener.class);
logger.error( logger.error(
"Cannot find Bungee initial handler; Disabling premium UUID and skin won't work.", "Cannot find Bungee UUID field implementation; Disabling premium UUID and skin won't work.",
reflectiveOperationException reflectiveOperationException
); );
} }
UNIQUE_ID_SETTER = setHandle; UNIQUE_ID_SETTER = uniqueIdHandle;
REWRITE_ID_SETTER = rewriterHandle;
}
private static MethodHandle getHandlerSetter(Lookup lookup, String fieldName)
throws NoSuchFieldException, IllegalAccessException {
Field uuidField = InitialHandler.class.getDeclaredField(fieldName);
uuidField.setAccessible(true);
return lookup.unreflectSetter(uuidField);
} }
private final FastLoginBungee plugin; private final FastLoginBungee plugin;
@ -179,6 +197,12 @@ public class ConnectListener implements Listener {
// So we have to do it with reflection // So we have to do it with reflection
UNIQUE_ID_SETTER.invokeExact(connection, offlineUUID); UNIQUE_ID_SETTER.invokeExact(connection, offlineUUID);
// if available set rewrite id to forward the UUID for newer BungeeCord versions since
// https://github.com/SpigotMC/BungeeCord/commit/1be25b6c74ec2be4b15adf8ca53a0497f01e2afe
if (REWRITE_ID_SETTER != null) {
REWRITE_ID_SETTER.invokeExact(connection, offlineUUID);
}
String format = "Overridden UUID from {} to {} (based of {}) on {}"; String format = "Overridden UUID from {} to {} (based of {}) on {}";
plugin.getLog().info(format, oldPremiumId, offlineUUID, username, connection); plugin.getLog().info(format, oldPremiumId, offlineUUID, username, connection);
} catch (Exception ex) { } catch (Exception ex) {

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -131,7 +131,7 @@ public class PluginMessageListener implements Listener {
loginSession.setRegistered(true); loginSession.setRegistered(true);
if (!loginSession.isAlreadySaved()) { if (!loginSession.isAlreadySaved()) {
playerProfile.setPremium(true); playerProfile.setOnlinemodePreferred(true);
plugin.getCore().getStorage().save(playerProfile); plugin.getCore().getStorage().save(playerProfile);
loginSession.setAlreadySaved(true); loginSession.setAlreadySaved(true);
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -81,7 +81,7 @@ public class AsyncPremiumCheck extends JoinManagement<ProxiedPlayer, CommandSend
plugin.getSession().put(source.getConnection(), new BungeeLoginSession(username, registered, profile)); plugin.getSession().put(source.getConnection(), new BungeeLoginSession(username, registered, profile));
String ip = source.getAddress().getAddress().getHostAddress(); String ip = source.getAddress().getAddress().getHostAddress();
plugin.getCore().getPendingLogin().put(ip + username, new Object()); plugin.getCore().addLoginAttempt(ip, username);
} }
@Override @Override

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -64,29 +64,34 @@ public class AsyncToggleMessage implements Runnable {
private void turnOffPremium() { private void turnOffPremium() {
StoredProfile playerProfile = core.getStorage().loadProfile(targetPlayer); StoredProfile playerProfile = core.getStorage().loadProfile(targetPlayer);
//existing player is already cracked //existing player is already cracked
if (playerProfile.isSaved() && !playerProfile.isPremium()) { if (playerProfile.isExistingPlayer() && !playerProfile.isOnlinemodePreferred()) {
sendMessage("not-premium"); sendMessage("not-premium");
return; return;
} }
playerProfile.setPremium(false); playerProfile.setOnlinemodePreferred(false);
playerProfile.setId(null); playerProfile.setId(null);
core.getStorage().save(playerProfile); core.getStorage().save(playerProfile);
PremiumToggleReason reason = (!isPlayerSender || !sender.getName().equalsIgnoreCase(playerProfile.getName())) PremiumToggleReason reason = (!isPlayerSender || !sender.getName().equalsIgnoreCase(playerProfile.getName()))
? PremiumToggleReason.COMMAND_OTHER : PremiumToggleReason.COMMAND_SELF; ? PremiumToggleReason.COMMAND_OTHER : PremiumToggleReason.COMMAND_SELF;
core.getPlugin().getProxy().getPluginManager().callEvent( core.getPlugin().getProxy().getPluginManager().callEvent(
new BungeeFastLoginPremiumToggleEvent(playerProfile, reason)); new BungeeFastLoginPremiumToggleEvent(playerProfile, reason));
if (isPlayerSender && core.getConfig().getBoolean("kick-toggle", true)) {
sender.disconnect(TextComponent.fromLegacyText(core.getMessage("remove-premium")));
} else {
sendMessage("remove-premium"); sendMessage("remove-premium");
} }
}
private void activatePremium() { private void activatePremium() {
StoredProfile playerProfile = core.getStorage().loadProfile(targetPlayer); StoredProfile playerProfile = core.getStorage().loadProfile(targetPlayer);
if (playerProfile.isPremium()) { if (playerProfile.isOnlinemodePreferred()) {
sendMessage("already-exists"); sendMessage("already-exists");
return; return;
} }
playerProfile.setPremium(true); playerProfile.setOnlinemodePreferred(true);
core.getStorage().save(playerProfile); core.getStorage().save(playerProfile);
PremiumToggleReason reason = (!isPlayerSender || !sender.getName().equalsIgnoreCase(playerProfile.getName())) PremiumToggleReason reason = (!isPlayerSender || !sender.getName().equalsIgnoreCase(playerProfile.getName()))
? PremiumToggleReason.COMMAND_OTHER : PremiumToggleReason.COMMAND_SELF; ? PremiumToggleReason.COMMAND_OTHER : PremiumToggleReason.COMMAND_SELF;

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -11,8 +11,6 @@ author: games647, https://github.com/games647/FastLogin/graphs/contributors
softDepends: softDepends:
# BungeeCord auth plugins # BungeeCord auth plugins
- BungeeAuth - BungeeAuth
- BungeeCordAuthenticatorBungee
- SodionAuth
# Bedrock Player Bridge # Bedrock Player Bridge
- Geyser-BungeeCord - Geyser-BungeeCord
- floodgate - floodgate

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -5,7 +5,7 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015-2023 games647 and contributors Copyright (c) 2015-2024 games647 and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@ -29,35 +29,6 @@
<!DOCTYPE module PUBLIC <!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd"> "https://checkstyle.org/dtds/configuration_1_3.dtd">
<!--
Checkstyle configuration that checks the sun coding conventions from:
- the Java Language Specification at
https://docs.oracle.com/javase/specs/jls/se11/html/index.html
- the Sun Code Conventions at https://www.oracle.com/java/technologies/javase/codeconventions-contents.html
- the Javadoc guidelines at
https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html
- the JDK Api documentation https://docs.oracle.com/en/java/javase/11/
- some best practices
Checkstyle is very configurable. Be sure to read the documentation at
https://checkstyle.org (or in your downloaded distribution).
Most Checks are configurable, be sure to consult the documentation.
To completely disable a check, just comment it out or delete it from the file.
To suppress certain violations please review suppression filters.
Finally, it is worth reading the documentation.
-->
<module name="Checker"> <module name="Checker">
<!-- <!--
If you set the basedir property below, then all reported file If you set the basedir property below, then all reported file
@ -227,7 +198,5 @@
<property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/> <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
<property name="checkFormat" value="$1"/> <property name="checkFormat" value="$1"/>
</module> </module>
</module> </module>
</module> </module>

View File

@ -4,7 +4,7 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015-2023 games647 and contributors Copyright (c) 2015-2024 games647 and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@ -39,6 +39,11 @@
<artifactId>fastlogin.core</artifactId> <artifactId>fastlogin.core</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties>
<!-- Still force Java 8 for the remaining project -->
<maven.compiler.release>8</maven.compiler.release>
</properties>
<name>FastLoginCore</name> <name>FastLoginCore</name>
<repositories> <repositories>
@ -55,7 +60,7 @@
</repository> </repository>
<!-- Floodgate --> <!-- Floodgate -->
<repository> <repository>
<id>opencollab-snapshot</id> <id>opencollab</id>
<url>https://repo.opencollab.dev/maven-snapshots/</url> <url>https://repo.opencollab.dev/maven-snapshots/</url>
<releases> <releases>
<enabled>false</enabled> <enabled>false</enabled>
@ -68,7 +73,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId> <artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version> <version>3.4.2</version>
<configuration> <configuration>
<archive> <archive>
<manifestEntries> <manifestEntries>
@ -80,6 +85,39 @@
</plugins> </plugins>
</build> </build>
<profiles>
<profile>
<id>jdk21</id>
<activation>
<jdk>[21,)</jdk>
</activation>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>jdk21</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<release>21</release>
<compileSourceRoots>
<compileSourceRoot>${project.basedir}/src/main/java21</compileSourceRoot>
</compileSourceRoots>
<multiReleaseOutput>true</multiReleaseOutput>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
</profiles>
<dependencies> <dependencies>
<!-- Libraries that we shade into the project --> <!-- Libraries that we shade into the project -->
@ -102,14 +140,21 @@
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId> <artifactId>slf4j-jdk14</artifactId>
<version>2.0.11</version> <version>2.0.17</version>
</dependency> </dependency>
<!-- snakeyaml is present in Bungee, Spigot, Cauldron, so we could use this independent implementation --> <!-- snakeyaml is present in Bungee, Spigot, so we could use this independent implementation -->
<dependency> <dependency>
<groupId>net.md-5</groupId> <groupId>net.md-5</groupId>
<artifactId>bungeecord-config</artifactId> <artifactId>bungeecord-config</artifactId>
<version>1.19-R0.1-SNAPSHOT</version> <version>1.20-R0.2</version>
</dependency>
<!-- This is optional in BungeeCord-config, so we include it here manually -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.4</version>
</dependency> </dependency>
<!--Floodgate for Xbox Live Authentication--> <!--Floodgate for Xbox Live Authentication-->
@ -158,46 +203,10 @@
<dependency> <dependency>
<groupId>com.github.games647</groupId> <groupId>com.github.games647</groupId>
<artifactId>craftapi</artifactId> <artifactId>craftapi</artifactId>
<version>0.6.2</version> <version>1.0-SNAPSHOT</version>
</dependency>
<!-- APIs we can use because they are available in all platforms (Spigot, Bungee, Velocity) -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<!-- Old version for velocity -->
<version>25.1-jre</version>
<!-- Exclude compile time dependencies not marked as such on upstream -->
<exclusions>
<exclusion>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</exclusion>
<exclusion>
<groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_annotations</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.j2objc</groupId>
<artifactId>j2objc-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>animal-sniffer-annotations</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency> </dependency>
<!-- Database driver included in Spigot -->
<dependency> <dependency>
<groupId>org.xerial</groupId> <groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId> <artifactId>sqlite-jdbc</artifactId>

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -32,8 +32,8 @@ import org.slf4j.jul.JDK14LoggerAdapter;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.time.Duration;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level; import java.util.logging.Level;
public final class CommonUtil { public final class CommonUtil {
@ -41,11 +41,11 @@ public final class CommonUtil {
private static final char COLOR_CHAR = '&'; private static final char COLOR_CHAR = '&';
private static final char TRANSLATED_CHAR = '§'; private static final char TRANSLATED_CHAR = '§';
public static <K, V> ConcurrentMap<K, V> buildCache(int expireAfterWrite, int maxSize) { public static <K, V> ConcurrentMap<K, V> buildCache(Duration expireAfterWrite, int maxSize) {
CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder(); CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder();
if (expireAfterWrite > 0) { if (expireAfterWrite != null) {
builder.expireAfterWrite(expireAfterWrite, TimeUnit.MINUTES); builder.expireAfterWrite(expireAfterWrite);
} }
if (maxSize > 0) { if (maxSize > 0) {

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -27,10 +27,9 @@ package com.github.games647.fastlogin.core;
import com.github.games647.craftapi.model.auth.Verification; import com.github.games647.craftapi.model.auth.Verification;
import com.github.games647.craftapi.resolver.MojangResolver; import com.github.games647.craftapi.resolver.MojangResolver;
import com.github.games647.craftapi.resolver.Options;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.Optional; import java.util.Optional;
@ -44,38 +43,12 @@ import java.util.Optional;
*/ */
public class ProxyAgnosticMojangResolver extends MojangResolver { public class ProxyAgnosticMojangResolver extends MojangResolver {
private static final String HOST = "sessionserver.mojang.com"; public ProxyAgnosticMojangResolver(Options options) {
super(options);
/** }
* A formatting string containing a URL used to call the {@code hasJoined} method on mojang session servers.
* <p>
* Formatting parameters:
* 1. The username of the player in question
* 2. The serverId of this server
*/
public static final String ENDPOINT = "https://" + HOST + "/session/minecraft/hasJoined?username=%s&serverId=%s";
@Override @Override
public Optional<Verification> hasJoined(String username, String serverHash, InetAddress hostIp) public Optional<Verification> hasJoined(String username, String serverHash, InetAddress hostIp)
throws IOException { throws IOException {
String url = String.format(ENDPOINT, username, serverHash); return super.hasJoined(username, serverHash, null);
HttpURLConnection conn = this.getConnection(url);
int responseCode = conn.getResponseCode();
Verification verification = null;
// Mojang session servers send HTTP 204 (NO CONTENT) when the authentication seems invalid
// If that's not our case, the authentication is valid, and so we can parse the response.
if (responseCode != HttpURLConnection.HTTP_NO_CONTENT) {
verification = this.parseRequest(conn, this::parseVerification);
}
return Optional.ofNullable(verification);
}
// Functional implementation of InputStreamAction, used in hasJoined method in parseRequest call
protected Verification parseVerification(InputStream input) throws IOException {
return this.readJson(input, Verification.class);
} }
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -34,8 +34,8 @@ public interface PasswordGenerator<P> {
/** /**
* Generate a password for a non-registered player * Generate a password for a non-registered player
* @param player * @param player player representation
* @return daw * @return generated password
*/ */
String getRandomPassword(P player); String getRandomPassword(P player);
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -63,7 +63,7 @@ public class LoginActionMessage implements ChannelMessage {
@Override @Override
public void readFrom(ByteArrayDataInput input) { public void readFrom(ByteArrayDataInput input) {
this.type = Type.values()[input.readInt()]; this.type = Type.values()[input.readByte()];
this.playerName = input.readUTF(); this.playerName = input.readUTF();
@ -75,7 +75,7 @@ public class LoginActionMessage implements ChannelMessage {
@Override @Override
public void writeTo(ByteArrayDataOutput output) { public void writeTo(ByteArrayDataOutput output) {
output.writeInt(type.ordinal()); output.writeByte(type.ordinal());
//Data is sent through a random player. We have to tell the Bukkit version of this plugin the target //Data is sent through a random player. We have to tell the Bukkit version of this plugin the target
output.writeUTF(playerName); output.writeUTF(playerName);

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,36 +23,22 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package com.github.games647.fastlogin.core; package com.github.games647.fastlogin.core.scheduler;
import org.slf4j.Logger; import org.slf4j.Logger;
import java.time.Duration;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
/** public abstract class AbstractAsyncScheduler {
* This limits the number of threads that are used at maximum. Thread creation can be very heavy for the CPU and
* context switching between threads too. However, we need many threads for blocking HTTP and database calls.
* Nevertheless, this number can be further limited, because the number of actually working database threads
* is limited by the size of our database pool. The goal is to separate concerns into processing and blocking only
* threads.
*/
public class AsyncScheduler {
private static final int MAX_CAPACITY = 1024; protected final Logger logger;
protected final Executor processingPool;
protected final AtomicInteger currentlyRunning = new AtomicInteger();
//todo: single thread for delaying and scheduling tasks public AbstractAsyncScheduler(Logger logger, Executor processingPool) {
private final Logger logger;
// 30 threads are still too many - the optimal solution is to separate into processing and blocking threads
// where processing threads could only be max number of cores while blocking threads could be minimized using
// non-blocking I/O and a single event executor
private final Executor processingPool;
private final AtomicInteger currentlyRunning = new AtomicInteger();
public AsyncScheduler(Logger logger, Executor processingPool) {
this.logger = logger; this.logger = logger;
this.processingPool = processingPool; this.processingPool = processingPool;
} }
@ -64,7 +50,25 @@ public class AsyncScheduler {
}); });
} }
private void process(Runnable task) { public CompletableFuture<Void> runAsyncDelayed(Runnable task, Duration delay) {
return CompletableFuture.runAsync(() -> {
currentlyRunning.incrementAndGet();
try {
Thread.sleep(delay.toMillis());
task.run();
} catch (InterruptedException interruptedException) {
// restore interrupt flag
Thread.currentThread().interrupt();
} finally {
currentlyRunning.getAndDecrement();
}
}, processingPool).exceptionally(error -> {
logger.warn("Error occurred on thread pool", error);
return null;
});
}
protected void process(Runnable task) {
currentlyRunning.incrementAndGet(); currentlyRunning.incrementAndGet();
try { try {
task.run(); task.run();

View File

@ -0,0 +1,47 @@
/*
* SPDX-License-Identifier: MIT
*
* The MIT License (MIT)
*
* Copyright (c) 2015-2024 games647 and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.github.games647.fastlogin.core.scheduler;
import org.slf4j.Logger;
import java.util.concurrent.Executor;
/**
* This limits the number of threads that are used at maximum. Thread creation can be very heavy for the CPU and
* context switching between threads too. However, we need many threads for blocking HTTP and database calls.
* Nevertheless, this number can be further limited, because the number of actually working database threads
* is limited by the size of our database pool. The goal is to separate concerns into processing and blocking only
* threads.
*/
public class AsyncScheduler extends AbstractAsyncScheduler {
public AsyncScheduler(Logger logger, Executor processingPool) {
super(logger, processingPool);
logger.info("Using legacy platform scheduler for using an older Java version. "
+ "Upgrade Java to 21+ for improved performance");
}
}

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -26,6 +26,7 @@
package com.github.games647.fastlogin.core.shared; package com.github.games647.fastlogin.core.shared;
import com.github.games647.craftapi.resolver.MojangResolver; import com.github.games647.craftapi.resolver.MojangResolver;
import com.github.games647.craftapi.resolver.Options;
import com.github.games647.craftapi.resolver.http.RotatingProxySelector; import com.github.games647.craftapi.resolver.http.RotatingProxySelector;
import com.github.games647.fastlogin.core.CommonUtil; import com.github.games647.fastlogin.core.CommonUtil;
import com.github.games647.fastlogin.core.ProxyAgnosticMojangResolver; import com.github.games647.fastlogin.core.ProxyAgnosticMojangResolver;
@ -48,13 +49,12 @@ import net.md_5.bungee.config.YamlConfiguration;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.Reader; import java.io.Reader;
import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Proxy; import java.net.Proxy;
import java.net.Proxy.Type; import java.net.Proxy.Type;
import java.net.UnknownHostException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.time.Duration;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
@ -78,7 +78,10 @@ public class FastLoginCore<P extends C, C, T extends PlatformPlugin<C>> {
private static final long MAX_EXPIRE_RATE = 1_000_000; private static final long MAX_EXPIRE_RATE = 1_000_000;
private final Map<String, String> localeMessages = new ConcurrentHashMap<>(); private final Map<String, String> localeMessages = new ConcurrentHashMap<>();
private final ConcurrentMap<String, Object> pendingLogin = CommonUtil.buildCache(5, -1); private final ConcurrentMap<String, Object> pendingLogin = CommonUtil.buildCache(
Duration.ofMinutes(5), -1
);
private final Collection<UUID> pendingConfirms = new HashSet<>(); private final Collection<UUID> pendingConfirms = new HashSet<>();
private final T plugin; private final T plugin;
@ -117,30 +120,35 @@ public class FastLoginCore<P extends C, C, T extends PlatformPlugin<C>> {
return; return;
} }
// Initialize the resolver based on the config parameter Options resolverOptions = new Options();
this.resolver = this.config.getBoolean("useProxyAgnosticResolver", false) resolverOptions.setMaxNameRequests(config.getInt("mojang-request-limit", 600));
? new ProxyAgnosticMojangResolver() : new MojangResolver();
antiBot = createAntiBotService(config.getSection("anti-bot"));
Set<Proxy> proxies = config.getStringList("proxies") Set<Proxy> proxies = config.getStringList("proxies")
.stream() .stream()
.map(proxy -> proxy.split(":")) .map(proxy -> proxy.split(":"))
.map(proxy -> new InetSocketAddress(proxy[0], Integer.parseInt(proxy[1]))) .map(proxy -> new InetSocketAddress(proxy[0], Integer.parseInt(proxy[1])))
.map(sa -> new Proxy(Type.HTTP, sa)) .map(sa -> new Proxy(Type.HTTP, sa))
.collect(toSet()); .collect(toSet());
if (!proxies.isEmpty()) {
Collection<InetAddress> addresses = new HashSet<>(); resolverOptions.setProxySelector(new RotatingProxySelector(proxies));
for (String localAddress : config.getStringList("ip-addresses")) {
try {
addresses.add(InetAddress.getByName(localAddress.replace('-', '.')));
} catch (UnknownHostException ex) {
plugin.getLog().error("IP-Address is unknown to us", ex);
}
} }
resolver.setMaxNameRequests(config.getInt("mojang-request-limit")); // TODO: Not available currently in craftapi?
resolver.setProxySelector(new RotatingProxySelector(proxies)); // Collection<InetAddress> addresses = new HashSet<>();
resolver.setOutgoingAddresses(addresses); // for (String localAddress : config.getStringList("ip-addresses")) {
// try {
// addresses.add(InetAddress.getByName(localAddress.replace('-', '.')));
// } catch (UnknownHostException ex) {
// plugin.getLog().error("IP-Address is unknown to us", ex);
// }
// }
// resolver.setOutgoingAddresses(addresses);
// Initialize the resolver based on the config parameter
this.resolver = this.config.getBoolean("useProxyAgnosticResolver", false)
? new ProxyAgnosticMojangResolver(resolverOptions) : new MojangResolver(resolverOptions);
antiBot = createAntiBotService(config.getSection("anti-bot"));
} }
private AntiBotService createAntiBotService(Configuration botSection) { private AntiBotService createAntiBotService(Configuration botSection) {
@ -272,8 +280,16 @@ public class FastLoginCore<P extends C, C, T extends PlatformPlugin<C>> {
this.passwordGenerator = passwordGenerator; this.passwordGenerator = passwordGenerator;
} }
public ConcurrentMap<String, Object> getPendingLogin() { public void addLoginAttempt(String ip, String username) {
return pendingLogin; pendingLogin.put(ip + username, new Object());
}
public boolean hasFailedLogin(String ip, String username) {
if (!config.get("secondAttemptCracked", false)) {
return false;
}
return pendingLogin.remove(ip + username) != null;
} }
public Collection<UUID> getPendingConfirms() { public Collection<UUID> getPendingConfirms() {
@ -284,7 +300,7 @@ public class FastLoginCore<P extends C, C, T extends PlatformPlugin<C>> {
return authPlugin; return authPlugin;
} }
public AntiBotService getAntiBot() { public AntiBotService getAntiBotService() {
return antiBot; return antiBot;
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -62,9 +62,9 @@ public abstract class FloodgateManagement<P extends C, C, L extends LoginSession
this.username = getName(player); this.username = getName(player);
//load values from config.yml //load values from config.yml
autoLoginFloodgate = core.getConfig().getString("autoLoginFloodgate").toLowerCase(Locale.ROOT); autoLoginFloodgate = core.getConfig().get("autoLoginFloodgate").toString().toLowerCase(Locale.ROOT);
autoRegisterFloodgate = core.getConfig().getString("autoRegisterFloodgate").toLowerCase(Locale.ROOT); autoRegisterFloodgate = core.getConfig().get("autoRegisterFloodgate").toString().toLowerCase(Locale.ROOT);
allowNameConflict = core.getConfig().getString("allowFloodgateNameConflict").toLowerCase(Locale.ROOT); allowNameConflict = core.getConfig().get("allowFloodgateNameConflict").toString().toLowerCase(Locale.ROOT);
} }
@Override @Override
@ -82,7 +82,7 @@ public abstract class FloodgateManagement<P extends C, C, L extends LoginSession
profile = core.getStorage().loadProfile(username); profile = core.getStorage().loadProfile(username);
if (profile.isSaved()) { if (profile.isExistingPlayer()) {
if (profile.isFloodgateMigrated()) { if (profile.isFloodgateMigrated()) {
if (profile.getFloodgate() == FloodgateState.TRUE && isLinked) { if (profile.getFloodgate() == FloodgateState.TRUE && isLinked) {
core.getPlugin().getLog() core.getPlugin().getLog()
@ -121,7 +121,7 @@ public abstract class FloodgateManagement<P extends C, C, L extends LoginSession
//maybe Bungee without auth plugin //maybe Bungee without auth plugin
if (authPlugin == null) { if (authPlugin == null) {
if (profile != null) { if (profile != null) {
isRegistered = profile.isPremium(); isRegistered = profile.isOnlinemodePreferred();
} else { } else {
isRegistered = false; isRegistered = false;
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -47,7 +47,7 @@ public enum FloodgateState {
*/ */
NOT_MIGRATED(3); NOT_MIGRATED(3);
private int value; private final int value;
FloodgateState(int value) { FloodgateState(int value) {
this.value = value; this.value = value;

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -81,7 +81,7 @@ public abstract class ForceLoginManagement<P extends C, C, L extends LoginSessio
//update only on success to prevent corrupt data //update only on success to prevent corrupt data
if (playerProfile != null) { if (playerProfile != null) {
playerProfile.setId(session.getUuid()); playerProfile.setId(session.getUuid());
playerProfile.setPremium(true); playerProfile.setOnlinemodePreferred(true);
storage.save(playerProfile); storage.save(playerProfile);
} }
@ -91,7 +91,7 @@ public abstract class ForceLoginManagement<P extends C, C, L extends LoginSessio
} else if (playerProfile != null) { } else if (playerProfile != null) {
//cracked player //cracked player
playerProfile.setId(null); playerProfile.setId(null);
playerProfile.setPremium(false); playerProfile.setOnlinemodePreferred(false);
storage.save(playerProfile); storage.save(playerProfile);
} }
} catch (Exception ex) { } catch (Exception ex) {

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -48,8 +48,6 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
} }
public void onLogin(String username, S source) { public void onLogin(String username, S source) {
core.getPlugin().getLog().info("Handling player {}", username);
//check if the player is connecting through Bedrock Edition //check if the player is connecting through Bedrock Edition
if (bedrockService != null && bedrockService.isBedrockConnection(username)) { if (bedrockService != null && bedrockService.isBedrockConnection(username)) {
//perform Bedrock specific checks and skip Java checks if no longer needed //perform Bedrock specific checks and skip Java checks if no longer needed
@ -59,7 +57,6 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
} }
StoredProfile profile = core.getStorage().loadProfile(username); StoredProfile profile = core.getStorage().loadProfile(username);
//can't be a premium Java player, if it's not saved in the database //can't be a premium Java player, if it's not saved in the database
if (profile == null) { if (profile == null) {
return; return;
@ -74,18 +71,16 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
} else { } else {
profile.setFloodgate(FloodgateState.FALSE); profile.setFloodgate(FloodgateState.FALSE);
core.getPlugin().getLog().info( core.getPlugin().getLog().info(
"Player {} will be migrated to the v2 database schema as a JAVA user", username); "Player {} will be migrated to the v2 database schema as a JAVA user", username
);
} }
callFastLoginPreLoginEvent(username, source, profile); callFastLoginPreLoginEvent(username, source, profile);
Configuration config = core.getConfig();
String ip = source.getAddress().getAddress().getHostAddress(); String ip = source.getAddress().getAddress().getHostAddress();
profile.setLastIp(ip); profile.setLastIp(ip);
try { if (profile.isExistingPlayer()) {
if (profile.isSaved()) { if (profile.isOnlinemodePreferred()) {
if (profile.isPremium()) {
core.getPlugin().getLog().info("Requesting premium login for registered player: {}", username); core.getPlugin().getLog().info("Requesting premium login for registered player: {}", username);
requestPremiumLogin(source, profile, username, true); requestPremiumLogin(source, profile, username, true);
} else { } else {
@ -94,7 +89,13 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
} }
} }
} else { } else {
if (core.getPendingLogin().remove(ip + username) != null && config.get("secondAttemptCracked", false)) { performNewPlayerLogin(username, source, ip, profile);
}
}
private void performNewPlayerLogin(String username, S source, String ip, StoredProfile profile) {
try {
if (core.hasFailedLogin(ip, username)) {
core.getPlugin().getLog().info("Second attempt login -> cracked {}", username); core.getPlugin().getLog().info("Second attempt login -> cracked {}", username);
//first login request failed so make a cracked session //first login request failed so make a cracked session
@ -102,14 +103,15 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
return; return;
} }
Configuration config = core.getConfig();
Optional<Profile> premiumUUID = Optional.empty(); Optional<Profile> premiumUUID = Optional.empty();
if (config.get("nameChangeCheck", false) || config.get("autoRegister", false)) { if (config.get("nameChangeCheck", false) || config.get("autoRegister", false)) {
premiumUUID = core.getResolver().findProfile(username); premiumUUID = core.getResolver().findProfile(username);
} }
if (!premiumUUID.isPresent() if (!premiumUUID.isPresent()
|| (!checkNameChange(source, username, premiumUUID.get()) || (!isNameChanged(source, username, premiumUUID.get())
&& !checkPremiumName(source, username, profile))) { && !isUsernameAvailable(source, username, profile))) {
//nothing detected the player as premium -> start a cracked session //nothing detected the player as premium -> start a cracked session
if (core.getConfig().get("switchMode", false)) { if (core.getConfig().get("switchMode", false)) {
source.kick(core.getMessage("switch-kick-message")); source.kick(core.getMessage("switch-kick-message"));
@ -118,18 +120,16 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
startCrackedSession(source, profile, username); startCrackedSession(source, profile, username);
} }
}
} catch (RateLimitException rateLimitEx) { } catch (RateLimitException rateLimitEx) {
core.getPlugin().getLog().error("Mojang's rate limit reached for {}. The public IPv4 address of this" core.getPlugin().getLog().error("Mojang's rate limit reached for {}. The public IPv4 address of this"
+ " server issued more than 600 Name -> UUID requests within 10 minutes. After those 10" + " server issued more than 600 Name -> UUID requests within 10 minutes. After those 10"
+ " minutes we can make requests again.", username); + " minutes we can make requests again.", username);
} catch (Exception ex) { } catch (Exception ex) {
core.getPlugin().getLog().error("Failed to check premium state for {}", username, ex);
core.getPlugin().getLog().error("Failed to check premium state of {}", username, ex); core.getPlugin().getLog().error("Failed to check premium state of {}", username, ex);
} }
} }
protected boolean isValidUsername(LoginSource source, StoredProfile profile) throws Exception { protected boolean isValidUsername(LoginSource source, StoredProfile profile) {
if (bedrockService != null && bedrockService.isUsernameForbidden(profile)) { if (bedrockService != null && bedrockService.isUsernameForbidden(profile)) {
core.getPlugin().getLog().info("Floodgate Prefix detected on cracked player"); core.getPlugin().getLog().info("Floodgate Prefix detected on cracked player");
source.kick("Your username contains illegal characters"); source.kick("Your username contains illegal characters");
@ -139,7 +139,7 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
return true; return true;
} }
private boolean checkPremiumName(S source, String username, StoredProfile profile) throws Exception { private boolean isUsernameAvailable(S source, String username, StoredProfile profile) throws Exception {
core.getPlugin().getLog().info("GameProfile {} uses a premium username", username); core.getPlugin().getLog().info("GameProfile {} uses a premium username", username);
if (core.getConfig().get("autoRegister", false) && (authHook == null || !authHook.isRegistered(username))) { if (core.getConfig().get("autoRegister", false) && (authHook == null || !authHook.isRegistered(username))) {
requestPremiumLogin(source, profile, username, false); requestPremiumLogin(source, profile, username, false);
@ -149,7 +149,7 @@ public abstract class JoinManagement<P extends C, C, S extends LoginSource> {
return false; return false;
} }
private boolean checkNameChange(S source, String username, Profile profile) { private boolean isNameChanged(S source, String username, Profile profile) {
//user not exists in the db //user not exists in the db
if (core.getConfig().get("nameChangeCheck", false)) { if (core.getConfig().get("nameChangeCheck", false)) {
StoredProfile storedProfile = core.getStorage().loadProfile(profile.getId()); StoredProfile storedProfile = core.getStorage().loadProfile(profile.getId());

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -31,7 +31,7 @@ public interface LoginSource {
void enableOnlinemode() throws Exception; void enableOnlinemode() throws Exception;
void kick(String message) throws Exception; void kick(String message);
InetSocketAddress getAddress(); InetSocketAddress getAddress();
} }

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -25,8 +25,8 @@
*/ */
package com.github.games647.fastlogin.core.shared; package com.github.games647.fastlogin.core.shared;
import com.github.games647.fastlogin.core.AsyncScheduler;
import com.github.games647.fastlogin.core.hooks.bedrock.BedrockService; import com.github.games647.fastlogin.core.hooks.bedrock.BedrockService;
import com.github.games647.fastlogin.core.scheduler.AsyncScheduler;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.slf4j.Logger; import org.slf4j.Logger;

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -30,7 +30,7 @@ import com.github.games647.fastlogin.core.storage.StoredProfile;
/** /**
* This event fires if the plugin performs an auto login on the platform where the login plugin is * This event fires if the plugin performs an auto login on the platform where the login plugin is
* * <p>
* {@snippet : * {@snippet :
* @EventHandler() * @EventHandler()
* public void onPlayerLogin(FastLoginAutoLoginEvent loginEvent) { * public void onPlayerLogin(FastLoginAutoLoginEvent loginEvent) {

View File

@ -3,7 +3,7 @@
* *
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2015-2023 games647 and contributors * Copyright (c) 2015-2024 games647 and contributors
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

Some files were not shown because too many files have changed in this diff Show More