aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md30
-rw-r--r--.github/workflows/build.yml32
-rw-r--r--.github/workflows/test.yml32
-rw-r--r--.gitignore120
-rw-r--r--HEADER.txt14
-rw-r--r--VERSION1
-rw-r--r--build.gradle115
-rw-r--r--config/checkstyle/checkstyle.xml369
-rw-r--r--config/checkstyle/suppressions.xml16
-rw-r--r--config/spotbugs/suppressions.xml7
-rw-r--r--gradle/wrapper/gradle-wrapper.jarbin0 -> 59536 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.properties5
-rw-r--r--gradlew234
-rw-r--r--gradlew.bat89
-rw-r--r--settings.gradle1
-rw-r--r--src/main/java/net/elytrium/limboauth/LimboAuth.java371
-rw-r--r--src/main/java/net/elytrium/limboauth/Settings.java196
-rw-r--r--src/main/java/net/elytrium/limboauth/command/ChangePasswordCommand.java101
-rw-r--r--src/main/java/net/elytrium/limboauth/command/DestroySessionCommand.java60
-rw-r--r--src/main/java/net/elytrium/limboauth/command/ForceUnregisterCommand.java106
-rw-r--r--src/main/java/net/elytrium/limboauth/command/LimboAuthCommand.java95
-rw-r--r--src/main/java/net/elytrium/limboauth/command/TotpCommand.java204
-rw-r--r--src/main/java/net/elytrium/limboauth/command/UnregisterCommand.java97
-rw-r--r--src/main/java/net/elytrium/limboauth/config/Config.java392
-rw-r--r--src/main/java/net/elytrium/limboauth/handler/AuthSessionHandler.java297
-rw-r--r--src/main/java/net/elytrium/limboauth/listener/AuthListener.java114
-rw-r--r--src/main/java/net/elytrium/limboauth/migration/MigrationHash.java54
-rw-r--r--src/main/java/net/elytrium/limboauth/migration/MigrationHashVerifier.java23
-rw-r--r--src/main/java/net/elytrium/limboauth/model/RegisteredPlayer.java130
-rw-r--r--src/main/java/net/elytrium/limboauth/utils/UpdatesChecker.java75
-rw-r--r--src/main/templates/net/elytrium/limboauth/BuildConstants.java24
31 files changed, 3404 insertions, 0 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..68093ca
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,30 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: "[BUG] "
+labels: bug
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Set '...' in config to '...'
+2. Do in game '....'
+3. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Server Info (please complete the following information):**
+ - LimboAPI Version [e.g. 1.0.1-rc2, downloaded from https://github.com/Elytrium/LimboAPI/actions/runs/1354021163]
+ - /velocity dump link [e.g. https://dump.velocitypowered.com/dotihadufu.json]
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..40d732e
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,32 @@
+name: Java CI with Gradle
+
+on: [ push ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ java: [ 11, 16 ]
+ fail-fast: true
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2.3.5
+ - name: Set up JDK ${{ matrix.java }}
+ uses: actions/setup-java@v2.3.1
+ with:
+ distribution: adopt
+ java-version: ${{ matrix.java }}
+ - name: Cache Gradle
+ uses: actions/cache@v2.1.6
+ with:
+ path: ~/.gradle
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: ${{ runner.os }}-gradle-
+ - name: Build LimboAuth
+ run: ./gradlew build
+ - name: Upload LimboAuth
+ uses: actions/upload-artifact@v2.2.4
+ with:
+ name: LimboAuth Built On ${{ matrix.java }} JDK
+ path: "build/libs/limboauth*.jar"
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..6259d74
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,32 @@
+name: Java CI with Gradle [PR tests]
+
+on: [ pull_request ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ java: [ 11, 16 ]
+ fail-fast: true
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2.3.5
+ - name: Set up JDK ${{ matrix.java }}
+ uses: actions/setup-java@v2.3.1
+ with:
+ distribution: adopt
+ java-version: ${{ matrix.java }}
+ - name: Cache Gradle
+ uses: actions/cache@v2.1.6
+ with:
+ path: ~/.gradle
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: ${{ runner.os }}-gradle-
+ - name: Build LimboAuth
+ run: ./gradlew build
+ - name: Upload LimboAuth
+ uses: actions/upload-artifact@v2.2.4
+ with:
+ name: LimboAuth Built On ${{ matrix.java }} JDK
+ path: "build/libs/limboauth*.jar"
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..442df48
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,120 @@
+# User-specific stuff
+.idea/
+
+*.iml
+*.ipr
+*.iws
+
+# IntelliJ
+out/
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Package Files
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# Virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+*~
+
+# Temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+# Gradle
+.gradle
+build/
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Cache of project
+.gradletasknamecache
+
+# Gradle Patch
+**/build/
+
+# Common working directory
+run/
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
diff --git a/HEADER.txt b/HEADER.txt
new file mode 100644
index 0000000..f52ff2f
--- /dev/null
+++ b/HEADER.txt
@@ -0,0 +1,14 @@
+Copyright (C) 2021 Elytrium
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..6d7de6e
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+1.0.2
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..ac00097
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,115 @@
+//file:noinspection GroovyAssignabilityCheck
+
+plugins {
+ id("java")
+ id("checkstyle")
+ id("com.github.spotbugs").version("5.0.3")
+ id("org.cadixdev.licenser").version("0.6.1")
+ id("com.github.johnrengelman.shadow").version("7.1.0")
+}
+
+setGroup("net.elytrium")
+setVersion("1.0.3-SNAPSHOT")
+
+compileJava {
+ getOptions().setEncoding("UTF-8")
+}
+
+java {
+ setSourceCompatibility(JavaVersion.VERSION_11)
+ setTargetCompatibility(JavaVersion.VERSION_11)
+}
+
+repositories {
+ mavenCentral()
+
+ maven {
+ setName("velocitypowered-repo")
+ setUrl("https://nexus.velocitypowered.com/repository/maven-public/")
+ }
+ maven {
+ setName("elytrium-repo")
+ setUrl("https://maven.elytrium.net/repo/")
+ }
+}
+
+dependencies {
+ compileOnly("net.elytrium:limboapi-api:1.0.3-SNAPSHOT")
+
+ compileOnly("com.velocitypowered:velocity-api:3.1.0")
+ annotationProcessor("com.velocitypowered:velocity-api:3.1.0")
+
+ implementation("at.favre.lib:bcrypt:0.9.0")
+ implementation("dev.samstevens.totp:totp:1.7.1")
+
+ implementation("com.j256.ormlite:ormlite-jdbc:5.7")
+
+ implementation("com.h2database:h2:2.0.202")
+ implementation("mysql:mysql-connector-java:8.0.27")
+ implementation("org.postgresql:postgresql:42.3.1")
+
+ compileOnly("com.github.spotbugs:spotbugs-annotations:4.5.2")
+}
+
+shadowJar {
+ getArchiveClassifier().set("")
+
+ exclude("META-INF/maven/**")
+ exclude("META-INF/INFO_BIN")
+ exclude("META-INF/INFO_SRC")
+ exclude("google/protobuf/**")
+ exclude("com/google/protobuf/**")
+ exclude("com/mysql/cj/x/**")
+ exclude("com/mysql/cj/xdevapi/**")
+ exclude("org/apache/commons/codec/language/**")
+ exclude("org/checkerframework/**")
+ exclude("**/package-info.class")
+
+ minimize()
+
+ relocate("at.favre.lib", "net.elytrium.limboauth.thirdparty.at.favre.lib")
+ relocate("com.j256.ormlite", "net.elytrium.limboauth.thirdparty.com.j256.ormlite")
+ relocate("com.mysql", "net.elytrium.limboauth.thirdparty.com.mysql")
+ relocate("dev.samstevens.totp", "net.elytrium.limboauth.thirdparty.dev.samstevens.totp")
+ relocate("org.apache.commons.codec", "net.elytrium.limboauth.thirdparty.org.apache.commons.codec")
+ relocate("org.h2", "net.elytrium.limboauth.thirdparty.org.h2")
+ relocate("org.postgresql", "net.elytrium.limboauth.thirdparty.org.postgresql")
+}
+
+license {
+ setHeader(file("HEADER.txt"))
+}
+
+checkstyle {
+ setToolVersion("9.2")
+ setConfigFile(file("${this.getRootDir()}/config/checkstyle/checkstyle.xml"))
+ setConfigProperties("configDirectory": "${this.getRootDir()}/config/checkstyle")
+
+ // The build should immediately fail if we have errors.
+ setMaxErrors(0)
+ setMaxWarnings(0)
+}
+
+spotbugsMain {
+ setExcludeFilter(file("${this.getRootDir()}/config/spotbugs/suppressions.xml"))
+
+ reports {
+ html {
+ getRequired().set(true)
+ getOutputLocation().set(file("${this.getBuildDir()}/reports/spotbugs/main/spotbugs.html"))
+ setStylesheet("fancy-hist.xsl")
+ }
+ }
+}
+
+sourceSets.main.getJava().srcDir(getTasks().register("generateTemplates", Copy) { task ->
+ task.getInputs().properties("version": getVersion())
+
+ task.from(file("src/main/templates"))
+ .into(getLayout().getBuildDirectory().dir("generated/sources/templates"))
+ .expand("version": getVersion())
+}.map {
+ it.getOutputs()
+})
+
+assemble.dependsOn(shadowJar)
diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml
new file mode 100644
index 0000000..f6a501f
--- /dev/null
+++ b/config/checkstyle/checkstyle.xml
@@ -0,0 +1,369 @@
+<?xml version="1.0"?>
+<!DOCTYPE module PUBLIC
+ "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
+ "https://checkstyle.org/dtds/configuration_1_3.dtd">
+
+<!--
+ Checkstyle configuration that checks the Google coding conventions from Google Java Style
+ that can be found at https://google.github.io/styleguide/javaguide.html
+ Checkstyle is very configurable. Be sure to read the documentation at
+ http://checkstyle.org (or in your downloaded distribution).
+ To completely disable a check, just comment it out or delete it from the file.
+ To suppress certain violations please review suppression filters.
+ Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
+ -->
+
+<module name="Checker">
+ <property name="charset" value="UTF-8"/>
+
+ <property name="severity" value="warning"/>
+
+ <property name="fileExtensions" value="java, properties, xml"/>
+ <!-- Excludes all 'module-info.java' files -->
+ <!-- See https://checkstyle.org/config_filefilters.html -->
+ <module name="BeforeExecutionExclusionFileFilter">
+ <property name="fileNamePattern" value="module\-info\.java$"/>
+ </module>
+ <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
+ <module name="SuppressionFilter">
+ <property name="file" value="${configDirectory}/suppressions.xml"/>
+ </module>
+
+ <!-- Checks for whitespace -->
+ <!-- See http://checkstyle.org/config_whitespace.html -->
+ <module name="FileTabCharacter">
+ <property name="eachLine" value="true"/>
+ </module>
+
+ <module name="LineLength">
+ <property name="fileExtensions" value="java"/>
+ <property name="max" value="155"/>
+ <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
+ </module>
+
+ <module name="NewlineAtEndOfFile"/>
+
+ <module name="TreeWalker">
+ <module name="MissingOverride"/>
+ <module name="FinalClass"/>
+ <module name="RedundantImport"/>
+ <module name="UnusedImports"/>
+ <module name="RequireThis">
+ <property name="validateOnlyOverlapping" value="false"/>
+ </module>
+
+ <module name="OuterTypeFilename"/>
+ <module name="IllegalTokenText">
+ <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
+ <property name="format"
+ value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
+ <property name="message"
+ value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
+ </module>
+ <module name="AvoidEscapedUnicodeCharacters">
+ <property name="allowEscapesForControlCharacters" value="true"/>
+ <property name="allowByTailComment" value="true"/>
+ <property name="allowNonPrintableEscapes" value="true"/>
+ </module>
+ <module name="AvoidStarImport"/>
+ <module name="OneTopLevelClass"/>
+ <module name="NoLineWrap">
+ <property name="tokens" value="PACKAGE_DEF, IMPORT, STATIC_IMPORT"/>
+ </module>
+ <module name="EmptyBlock">
+ <property name="option" value="TEXT"/>
+ <property name="tokens"
+ value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
+ </module>
+ <module name="NeedBraces">
+ <property name="tokens"
+ value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_IF, LITERAL_WHILE"/>
+ </module>
+ <module name="LeftCurly">
+ <property name="tokens"
+ value="ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_CONSTANT_DEF, ENUM_DEF,
+ INTERFACE_DEF, LAMBDA, LITERAL_CASE, LITERAL_CATCH, LITERAL_DEFAULT,
+ LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF,
+ LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, METHOD_DEF,
+ OBJBLOCK, STATIC_INIT, RECORD_DEF, COMPACT_CTOR_DEF"/>
+ </module>
+ <module name="RightCurly">
+ <property name="id" value="RightCurlySame"/>
+ <property name="tokens"
+ value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE,
+ LITERAL_DO"/>
+ </module>
+ <module name="RightCurly">
+ <property name="id" value="RightCurlyAlone"/>
+ <property name="option" value="alone"/>
+ <property name="tokens"
+ value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT,
+ INSTANCE_INIT, ANNOTATION_DEF, ENUM_DEF, INTERFACE_DEF, RECORD_DEF,
+ COMPACT_CTOR_DEF"/>
+ </module>
+ <module name="SuppressionXpathSingleFilter">
+ <!-- suppresion is required till https://github.com/checkstyle/checkstyle/issues/7541 -->
+ <property name="id" value="RightCurlyAlone"/>
+ <property name="query" value="//RCURLY[parent::SLIST[count(./*)=1]
+ or preceding-sibling::*[last()][self::LCURLY]]"/>
+ </module>
+ <module name="WhitespaceAfter">
+ <property name="tokens"
+ value="COMMA, SEMI, TYPECAST, LITERAL_IF, LITERAL_ELSE,
+ LITERAL_WHILE, LITERAL_DO, LITERAL_FOR, DO_WHILE"/>
+ </module>
+ <module name="WhitespaceAround">
+ <property name="allowEmptyConstructors" value="true"/>
+ <property name="allowEmptyLambdas" value="true"/>
+ <property name="allowEmptyMethods" value="true"/>
+ <property name="allowEmptyTypes" value="true"/>
+ <property name="allowEmptyLoops" value="true"/>
+ <property name="ignoreEnhancedForColon" value="false"/>
+ <property name="tokens"
+ value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR,
+ BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, DO_WHILE, EQUAL, GE, GT, LAMBDA, LAND,
+ LCURLY, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY,
+ LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SWITCH, LITERAL_SYNCHRONIZED,
+ LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN,
+ NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR,
+ SR_ASSIGN, STAR, STAR_ASSIGN, LITERAL_ASSERT, TYPE_EXTENSION_AND"/>
+ <message key="ws.notFollowed"
+ value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
+ <message key="ws.notPreceded"
+ value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
+ </module>
+ <module name="OneStatementPerLine"/>
+ <module name="MultipleVariableDeclarations"/>
+ <module name="ArrayTypeStyle"/>
+ <module name="MissingSwitchDefault"/>
+ <module name="FallThrough"/>
+ <module name="UpperEll"/>
+ <module name="ModifierOrder"/>
+ <module name="EmptyLineSeparator">
+ <property name="tokens"
+ value="PACKAGE_DEF, IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
+ STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF, VARIABLE_DEF, RECORD_DEF,
+ COMPACT_CTOR_DEF"/>
+ <property name="allowNoEmptyLineBetweenFields" value="true"/>
+ </module>
+ <module name="SeparatorWrap">
+ <property name="id" value="SeparatorWrapDot"/>
+ <property name="tokens" value="DOT"/>
+ <property name="option" value="nl"/>
+ </module>
+ <module name="SeparatorWrap">
+ <property name="id" value="SeparatorWrapComma"/>
+ <property name="tokens" value="COMMA"/>
+ <property name="option" value="EOL"/>
+ </module>
+ <module name="SeparatorWrap">
+ <!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/259 -->
+ <property name="id" value="SeparatorWrapEllipsis"/>
+ <property name="tokens" value="ELLIPSIS"/>
+ <property name="option" value="EOL"/>
+ </module>
+ <module name="SeparatorWrap">
+ <!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/258 -->
+ <property name="id" value="SeparatorWrapArrayDeclarator"/>
+ <property name="tokens" value="ARRAY_DECLARATOR"/>
+ <property name="option" value="EOL"/>
+ </module>
+ <module name="SeparatorWrap">
+ <property name="id" value="SeparatorWrapMethodRef"/>
+ <property name="tokens" value="METHOD_REF"/>
+ <property name="option" value="nl"/>
+ </module>
+ <module name="PackageName">
+ <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
+ <message key="name.invalidPattern"
+ value="Package name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="TypeName">
+ <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
+ ANNOTATION_DEF, RECORD_DEF"/>
+ <message key="name.invalidPattern"
+ value="Type name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="MemberName">
+ <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
+ <message key="name.invalidPattern"
+ value="Member name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="ParameterName">
+ <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+ <message key="name.invalidPattern"
+ value="Parameter name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="LambdaParameterName">
+ <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+ <message key="name.invalidPattern"
+ value="Lambda parameter name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="CatchParameterName">
+ <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+ <message key="name.invalidPattern"
+ value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="LocalVariableName">
+ <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+ <message key="name.invalidPattern"
+ value="Local variable name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="PatternVariableName">
+ <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+ <message key="name.invalidPattern"
+ value="Pattern variable name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="ClassTypeParameterName">
+ <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
+ <message key="name.invalidPattern"
+ value="Class type name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="RecordComponentName">
+ <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+ <message key="name.invalidPattern"
+ value="Record component name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="RecordTypeParameterName">
+ <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
+ <message key="name.invalidPattern"
+ value="Record type name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="MethodTypeParameterName">
+ <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
+ <message key="name.invalidPattern"
+ value="Method type name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="InterfaceTypeParameterName">
+ <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
+ <message key="name.invalidPattern"
+ value="Interface type name ''{0}'' must match pattern ''{1}''."/>
+ </module>
+ <module name="NoFinalizer"/>
+ <module name="GenericWhitespace">
+ <message key="ws.followed"
+ value="GenericWhitespace ''{0}'' is followed by whitespace."/>
+ <message key="ws.preceded"
+ value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
+ <message key="ws.illegalFollow"
+ value="GenericWhitespace ''{0}'' should followed by whitespace."/>
+ <message key="ws.notPreceded"
+ value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
+ </module>
+ <module name="Indentation">
+ <property name="basicOffset" value="2"/>
+ <property name="braceAdjustment" value="2"/>
+ <property name="caseIndent" value="2"/>
+ <property name="throwsIndent" value="4"/>
+ <property name="lineWrappingIndentation" value="4"/>
+ <property name="arrayInitIndent" value="2"/>
+ </module>
+ <module name="AbbreviationAsWordInName">
+ <property name="ignoreFinal" value="false"/>
+ <property name="allowedAbbreviationLength" value="2"/>
+ <property name="tokens"
+ value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF, ANNOTATION_FIELD_DEF,
+ PARAMETER_DEF, VARIABLE_DEF, METHOD_DEF, PATTERN_VARIABLE_DEF, RECORD_DEF,
+ RECORD_COMPONENT_DEF"/>
+ </module>
+ <module name="NoWhitespaceBeforeCaseDefaultColon"/>
+ <module name="OverloadMethodsDeclarationOrder"/>
+ <module name="VariableDeclarationUsageDistance"/>
+ <module name="CustomImportOrder">
+ <property name="sortImportsInGroupAlphabetically" value="true"/>
+ <property name="separateLineBetweenGroups" value="true"/>
+ <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
+ <property name="tokens" value="IMPORT, STATIC_IMPORT, PACKAGE_DEF"/>
+ </module>
+ <module name="MethodParamPad">
+ <property name="tokens"
+ value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF,
+ SUPER_CTOR_CALL, ENUM_CONSTANT_DEF, RECORD_DEF"/>
+ </module>
+ <module name="NoWhitespaceBefore">
+ <property name="tokens"
+ value="COMMA, SEMI, POST_INC, POST_DEC, DOT,
+ LABELED_STAT, METHOD_REF"/>
+ <property name="allowLineBreaks" value="true"/>
+ </module>
+ <module name="ParenPad">
+ <property name="tokens"
+ value="ANNOTATION, ANNOTATION_FIELD_DEF, CTOR_CALL, CTOR_DEF, DOT, ENUM_CONSTANT_DEF,
+ EXPR, LITERAL_CATCH, LITERAL_DO, LITERAL_FOR, LITERAL_IF, LITERAL_NEW,
+ LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_WHILE, METHOD_CALL,
+ METHOD_DEF, QUESTION, RESOURCE_SPECIFICATION, SUPER_CTOR_CALL, LAMBDA,
+ RECORD_DEF"/>
+ </module>
+ <module name="OperatorWrap">
+ <property name="option" value="NL"/>
+ <property name="tokens"
+ value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,
+ LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF,
+ TYPE_EXTENSION_AND "/>
+ </module>
+ <module name="AnnotationLocation">
+ <property name="id" value="AnnotationLocationMostCases"/>
+ <property name="tokens"
+ value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF,
+ RECORD_DEF, COMPACT_CTOR_DEF"/>
+ </module>
+ <module name="AnnotationLocation">
+ <property name="id" value="AnnotationLocationVariables"/>
+ <property name="tokens" value="VARIABLE_DEF"/>
+ <property name="allowSamelineMultipleAnnotations" value="true"/>
+ </module>
+ <module name="NonEmptyAtclauseDescription"/>
+ <module name="InvalidJavadocPosition"/>
+ <module name="JavadocTagContinuationIndentation"/>
+ <module name="SummaryJavadoc">
+ <property name="forbiddenSummaryFragments"
+ value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
+ </module>
+ <module name="JavadocParagraph"/>
+ <module name="RequireEmptyLineBeforeBlockTagGroup"/>
+ <module name="AtclauseOrder">
+ <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
+ <property name="target"
+ value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
+ </module>
+ <module name="JavadocMethod">
+ <property name="accessModifiers" value="public"/>
+ <property name="allowMissingParamTags" value="true"/>
+ <property name="allowMissingReturnTag" value="true"/>
+ <property name="allowedAnnotations" value="Override, Test"/>
+ <property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF, COMPACT_CTOR_DEF"/>
+ </module>
+ <module name="MissingJavadocMethod">
+ <property name="scope" value="public"/>
+ <property name="minLineCount" value="2"/>
+ <property name="allowedAnnotations" value="Override, Test"/>
+ <property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF,
+ COMPACT_CTOR_DEF"/>
+ </module>
+ <module name="MissingJavadocType">
+ <property name="scope" value="protected"/>
+ <property name="tokens"
+ value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
+ RECORD_DEF, ANNOTATION_DEF"/>
+ <property name="excludeScope" value="nothing"/>
+ </module>
+ <module name="MethodName">
+ <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
+ <message key="name.invalidPattern"