Repository navigation
User Manual v6.3.0
This is the complete operator and user manual for PureAuth 6.3.0. It covers the Paper/Purpur authentication module, the BungeeCord and Velocity network modules, every command and permission, every configuration field, all authentication and recovery procedures, Redis network mode, Fair Play Guard, messages, security, maintenance and troubleshooting.
PureAuth protects offline-mode Minecraft servers with password registration and login. Optional layers include a PIN GUI, TOTP two-factor authentication (2FA), one-time 2FA recovery codes, account recovery questions, CAPTCHA, short sessions, Premium Auto-Login, progressive login locks, administrator 2FA enforcement, backups, Discord webhooks and PlaceholderAPI support.
Version 6.3.0 adds:
- Redis-backed multi-proxy duplicate-name protection, shared authentication state and shared sessions;
- Fair Play Guard for administrator-led cheat/modification inspections;
- persistent Fair Play Guard disconnect restrictions;
- separate editable English and Polish message files;
- a database migration that preserves all existing 6.2.0 accounts.
| Component | Requirement |
|---|---|
| Backend | Paper 26.2 or compatible Purpur build |
| Compiled Paper API | 26.2.build.117-stable |
plugin.yml API |
26.2 |
| Plugin bytecode | Java 21 |
| Practical Paper 26.2 runtime | Java 25 or newer |
| BungeeCord API | 1.21-R0.4 |
| Velocity API | 3.5.1 |
Backend server.properties
|
online-mode=false |
Spigot, Bukkit-only, Folia and Fabric/Forge are not supported targets. Never expose an offline-mode backend directly to the Internet. On a proxy network, firewall every backend so only the proxy can connect.
Files:
-
pureauth-paper-6.3.0-R.jar— install on every protected Paper/Purpur backend; -
pureauth-bungee-6.3.0-R.jar— install only on BungeeCord; -
pureauth-velocity-6.3.0-R.jar— install only on Velocity.
Do not install both proxy modules on one proxy. A proxy JAR does not replace the Paper JAR.
- Stop the server.
- Put the Paper JAR in
plugins/. - Set
online-mode=falseinserver.properties. - Start once to generate
plugins/PureAuth/config.ymlandplugins/PureAuth/Messages/. - Stop the server, review the generated settings, then start it again.
- Confirm that the console reports PureAuth 6.3.0 enabled without an exception.
The default network.mode: LOCAL and database.type: SQLITE are appropriate for one server.
- Install the Paper JAR on every authentication backend.
- Install the matching BungeeCord or Velocity JAR on every public proxy.
- Configure one shared MySQL/MariaDB database and the same table prefix in every module.
- Set all protected backends to offline mode and configure secure proxy forwarding.
- Firewall backend ports.
- For one proxy use
network.mode: LOCAL. For two or more public proxies usenetwork.mode: REDISeverywhere. - In Redis mode, use the same Redis host, database and
key_prefixon all PureAuth modules.
SQLite is not a network database. Do not share an SQLite file between servers or proxies.
- Stop every proxy and backend.
- Back up the database and
plugins/PureAuth/directories. - Replace all 6.2.0 modules together; do not run a mixed 6.2/6.3 network.
- Keep the existing database. PureAuth automatically adds
fair_play_lockedandfair_play_lock_reason. - Merge your settings into the generated 6.3.0 config.
- Move customized user-facing text to
Messages/EN_en.txtand/orMessages/PL_pl.txt. - Configure Redis if the network has multiple public proxies.
- Configure the Fair Play Guard location before its first use.
Password hashes, PIN hashes, PIN lengths, 2FA secrets, backup codes, recovery data, locations, Premium flags and lock history are retained.
The player joins, receives a CAPTCHA when enabled, and runs /register <password> <password> [captcha]. PureAuth validates the password length, matching copies, CAPTCHA and per-IP account limit, stores a BCrypt hash, then authenticates the player.
The player runs /login <password>. A correct password proceeds to 2FA when enabled, otherwise login completes. Repeated bad credentials feed the progressive lock system.
A PIN-enabled account uses the inventory GUI instead of /login. Digits submit automatically at the configured length. The password hash remains stored, so disabling PIN globally restores password login. PIN never bypasses 2FA.
After authentication, movement and interaction restrictions are removed, the last location may be restored, the proxy is notified, and Redis authentication/session state is published when configured.
Before successful authentication PureAuth restricts movement, world and inventory interaction, drops, damage and normal chat. Login/Register/2FA/recovery flows remain available as required by their state.
| Command | Who/when | Exact purpose |
|---|---|---|
/register <pass> <pass> |
Unregistered player | Creates an account when CAPTCHA is disabled. |
/register <pass> <pass> <captcha> |
Unregistered player | Creates an account when CAPTCHA is enabled. |
/login <pass> |
Registered password account | Verifies the password. PIN accounts must use the GUI. |
/changepass <old> <new> <new> |
Logged-in password account | Verifies the old password and saves the new BCrypt hash. |
/changepass |
Logged-in PIN account | Opens the PIN change sequence: current PIN, new PIN, confirmation. |
/setpin |
Logged-in player | Opens the new-PIN and confirmation sequence. |
/rempin |
Logged-in player with PIN | Removes PIN login and returns the account to password login. |
/premium |
Logged-in player | Verifies the name against Mojang and enables same-IP Premium Auto-Login. |
/cracked |
Logged-in Premium-mode player | Disables Premium Auto-Login. |
/2fa setup |
Logged-in player | Generates a TOTP secret, asks for a current code, then creates one-use backup codes. |
/2fa remove |
Logged-in 2FA player | Requires a current authenticator code and disables 2FA. Admin Guard may require it again. |
/2fa recovery <code> |
Login 2FA stage | Consumes one backup code, disables 2FA and invalidates the remaining old codes. |
/recovery setup |
Logged-in player | Selects a recovery question and stores a hash of the answer. |
/recovery remove |
Logged-in player | Deletes recovery question and answer data. |
/recovery start |
Logged-out registered player | Starts question verification. Chat input is private to the recovery flow. |
/recovery pass <new> <new> |
Verified recovery session | Replaces the password, removes a forgotten PIN, ends recovery and logs in. |
Player commands do not require Bukkit permissions in 6.3.0; their account/login state is the authorization boundary.
/setpin requires authentication and an enabled PIN feature. The player clicks number heads; closing the window cancels setup/change. Closing the required login PIN window halts that login for safety, and the player reconnects or uses configured recovery.
PIN length accepts 1–9 digits. PINs are hashed, not stored as plaintext. Administrators can set, change or remove a player's PIN with the admin commands described below. GUI names, lore, digit labels and status text are in the selected message file; materials, textures and sounds are in config.yml.
2FA is a second proof after the password or PIN. PureAuth uses time-based one-time passwords (TOTP), compatible with authenticator applications such as Google Authenticator, Aegis, 2FAS and similar apps.
- Log in normally.
- Run
/2fa setup. - Add the displayed secret key to the authenticator app.
- Type the current six-digit code in chat.
- Save the displayed backup codes outside Minecraft.
The secret is not active until the confirmation code succeeds. Each backup code is one-use. Successful backup recovery disables 2FA and invalidates every old backup code.
After a correct password/PIN, type the current authenticator code in chat. This private input is intercepted by PureAuth. A wrong code counts toward the login-attempt policy.
Use /2fa remove and confirm with a current TOTP code. If the device is lost during login, use /2fa recovery <backup-code>. If no backup code remains, an administrator must use account recovery/admin procedures according to server policy; PureAuth intentionally has no silent 2FA bypass command.
Recovery is optional and controlled by settings.recovery.enabled.
- Log in.
- Run
/recovery setup. - Type a displayed question number.
- Type the answer. The normalized answer is hashed before storage.
- Join but do not log in.
- Run
/recovery start. - Answer the configured question in chat.
- After successful verification run
/recovery pass <new-password> <new-password>.
Recovery sessions expire and are removed on disconnect. Type cancel during the question flow to cancel it. A successful password recovery removes the PIN so the forgotten PIN cannot keep the user locked out. Recovery questions are the recovery_questions list in both message files; keep the list order stable, because the database stores the selected zero-based index.
settings.max_attempts controls wrong attempts per connection. Reaching it creates one persistent kick stage. Defaults:
| Stage | Result |
|---|---|
| 1 | 30-minute temporary login lock |
| 2 | 24-hour temporary login lock |
| 3 | Permanent account lock |
Temporary locks survive restart. Titles, chat and actionbar countdowns are independently configurable. With reset_history_after_successful_login: false, a later successful login does not erase escalation history. /pureauth unlock <player> clears the permanent lock, temporary lock, kick history and Fair Play Guard persistent restriction.
Premium Auto-Login verifies that the name exists through Mojang's profile API. With require_same_ip: true, automatic login only occurs when the current IP equals the last trusted IP. It is convenience based on name/IP, not a replacement for secure proxy forwarding.
Sessions allow a recently authenticated UUID to reconnect for the configured time. In Redis mode the session expiry is shared between modules. PIN-required accounts still require the PIN GUI.
CAPTCHA adds a generated code to registration. length controls code length; characters is the allowed alphabet. An empty or overly small alphabet should not be used.
In a multi-proxy network, every proxy atomically tries to acquire a case-insensitive username lease before allowing login. Redis SET NX PX guarantees only one proxy owns that name at a time. The owning proxy refreshes the lease and releases it on disconnect. The TTL releases stale ownership after a crashed proxy. Owner-checked Lua scripts prevent one connection from refreshing or releasing another connection's lease.
Redis also shares authenticated UUID state and short session expiry. The proxy owns the network connection lease; backend Paper modules consume/publish auth and session state and do not acquire a second conflicting lease.
Set network.mode: REDIS on all modules, then configure identical host, port, credentials, database and key_prefix. Use a dedicated Redis ACL user, bind Redis to a private interface, require authentication, firewall it from players and never expose port 6379 publicly.
-
DENY(recommended) is fail-closed: new connections are rejected when Redis cannot prove the name is free. -
ALLOWfalls back to local-only operation during startup failure. It favors availability but cannot guarantee cross-proxy duplicate prevention.
connection_timeout_ms limits establishing a Redis connection. socket_timeout_ms limits an operation waiting for a reply. player_lock_ttl_seconds must be long enough to survive short pauses; proxies refresh around one-third of the TTL. authenticated_ttl_seconds controls shared authenticated-state lifetime.
All keys begin with key_prefix. Player names are normalized to lowercase. Do not let unrelated PureAuth networks share the same prefix unless they intentionally share online-name ownership and sessions.
“Fair Play Guard” is natural English and describes an administrative fair-play inspection without claiming that the plugin itself detects cheats.
- Grant
pureauth.admin.check.setup. - Run
/pureauth check setup. - Stand at the exact center/location used for inspections.
- Run
/pureauth check setup confirm.
The world, coordinates, yaw and pitch are serialized to settings.locations.fair_play_check. Do not hand-edit the serialized value unless you fully understand the format.
Run /pureauth check <player>. By default the target must be online and authenticated. PureAuth records the original location, game mode and flight state, teleports the player to the inspection location, sets Adventure mode, disables flight, sends the title/instructions and starts reminders.
Default restrictions block item drops, inventory changes, block breaking/placing/interacting, commands and damage. Chat from the checked player is cancelled globally and delivered only to the inspecting administrator; console receives it when console started the check. If the player exceeds 50 blocks from the configured center, PureAuth teleports them back.
Run /pureauth check clear <player>. For an active online inspection, PureAuth removes restrictions, restores the configured game mode/location/flight state, sends the cleared title and notifies both parties. For an offline player it clears a persistent Fair Play Guard disconnect restriction. /pureauth unlock <player> is the broader alternative that clears all account locks too.
With lock_on_disconnect: true, disconnecting stores a persistent database restriction. A later pre-login is denied with the editable PureAuth appeal message. With disconnect_command.enabled: true, the configured console command also runs, with %player% and %uuid% replaced. Command execution and PureAuth's persistent lock are independent switches.
When Paper reports a banned kick, the Bukkit name ban list contains the player, or a configured ban command is detected, PureAuth restores/removes its temporary inspection state and does not add its own disconnect restriction. Third-party ban commands must have their root added to ban_detection.command_prefixes. The list matches the command root and first target argument; it cannot infer an arbitrary plugin's custom syntax.
/pureauth reload reschedules radius and reminder tasks using current intervals. On normal plugin shutdown, active players are restored and are not punished as inspection leavers.
/pa is an alias for /pureauth.
| Command | Permission | Behaviour |
|---|---|---|
/pureauth |
none | Displays version and author. |
/pureauth reload |
pureauth.admin.reload |
Reloads config/messages and restarts backup, PIN and Fair Play task settings. |
/pureauth stats |
pureauth.admin.stats |
Console-only account count and feature status. |
/pureauth unlock <player> |
pureauth.admin.unlock |
Clears progressive, permanent and Fair Play locks; reconnects an online target safely. |
/pureauth unregister <player> |
pureauth.admin.unregister |
Deletes the account and asks an online target to rejoin/register. |
/pureauth register <player> <password> |
pureauth.admin.register |
Creates an offline/online player's account. Secret is redacted from audit logs. |
/pureauth forcelogin <player> |
pureauth.admin.forcelogin |
Marks an online player authenticated. Use only after manual identity verification. |
/pureauth info <player> |
pureauth.admin.info |
Displays stored UUID, IP, dates and security flags. |
/pureauth setpassword <player> <password> |
pureauth.admin.setpassword |
Replaces the player's password hash. Secret is redacted from logs. |
/pureauth accounts <ip> |
pureauth.admin.accounts |
Lists usernames recorded for the IP. |
/pureauth location login |
pureauth.admin.location |
Stores the command sender's current login waiting location. |
/pureauth location register |
pureauth.admin.location |
Stores the current registration waiting location. |
/pureauth setpin <player> <pin> |
pureauth.admin.pin |
Enables the supplied valid numeric PIN. Secret is redacted from logs. |
/pureauth changepin <player> <pin> |
pureauth.admin.pin |
Replaces an existing PIN. Secret is redacted. |
/pureauth rempin <player> |
pureauth.admin.pin |
Removes the target PIN. |
/pureauth check <player> |
pureauth.admin.check.start |
Starts Fair Play Guard. |
/pureauth check setup |
pureauth.admin.check.setup |
Starts location setup. Player-only. |
/pureauth check setup confirm |
pureauth.admin.check.setup |
Saves the administrator's current position. Player-only. |
/pureauth check clear <player> |
pureauth.admin.check.clear |
Clears an active inspection or persistent Fair Play restriction. |
With settings.safe_mode: true, sensitive administrative mutations are console-only. Tab completion filters entries by permission.
| Permission | Default | Meaning |
|---|---|---|
pureauth.admin |
op | Parent granting every admin permission below except Admin Guard. |
pureauth.admin.reload |
op | Reload configuration/messages. |
pureauth.admin.stats |
op | View console statistics. |
pureauth.admin.unlock |
op | Unlock accounts. |
pureauth.admin.unregister |
op | Delete accounts. |
pureauth.admin.register |
op | Create accounts. |
pureauth.admin.forcelogin |
op | Force online authentication. |
pureauth.admin.info |
op | Read account information. |
pureauth.admin.setpassword |
op | Replace passwords. |
pureauth.admin.accounts |
op | Query accounts by IP. |
pureauth.admin.location |
op | Set login/register locations. |
pureauth.admin.pin |
op | Administer PINs. |
pureauth.admin.guard |
false | Marks the holder as an administrator who must enable 2FA. It is a policy marker, not command access. |
pureauth.admin.check |
op | Parent for all three Fair Play permissions. |
pureauth.admin.check.start |
op | Start inspections. |
pureauth.admin.check.setup |
op | Set inspection location. |
pureauth.admin.check.clear |
op | Clear active/persistent inspection restrictions. |
For least privilege, grant individual permissions instead of pureauth.admin.
| Path | Default | Purpose |
|---|---|---|
database.type |
SQLITE |
SQLITE for one backend or MYSQL for network/shared storage. |
database.pool.maximum_pool_size |
-1 |
Auto size; explicitly use 1 for SQLite or a measured 16–32 range for MySQL. |
database.pool.minimum_idle |
-1 |
Auto idle connection count. |
database.pool.connection_timeout_ms |
10000 |
Maximum pool wait for a DB connection. |
database.pool.idle_timeout_ms |
600000 |
Time before excess idle DB connections may close. |
database.pool.max_lifetime_ms |
1800000 |
Maximum pooled connection age. Keep below DB/server limits. |
database.mysql.host |
localhost |
MySQL/MariaDB hostname. |
database.mysql.port |
3306 |
Database TCP port. |
database.mysql.database |
minecraft |
Schema name. |
database.mysql.username |
root |
DB user; create a restricted production user instead. |
database.mysql.password |
password |
DB password. Protect file permissions. |
database.mysql.table_prefix |
pureauth_ |
Letters, numbers and underscore only; identical on a shared network. |
| Path | Default | Purpose |
|---|---|---|
performance.async.database_threads |
8 |
Bounded database worker count. |
performance.async.crypto_threads |
4 |
BCrypt/TOTP-related worker count. |
performance.async.network_threads |
4 |
Mojang/Redis/network worker count. |
performance.async.queue_size |
512 |
Maximum queued work per bounded executor before safe rejection/backpressure. |
| Path | Default | Purpose |
|---|---|---|
network.mode |
LOCAL |
LOCAL for a single entry proxy/server; REDIS for multi-proxy coordination. |
network.redis.host |
localhost |
Redis hostname/private IP. |
network.redis.port |
6379 |
Redis port. |
network.redis.username |
empty | ACL username; empty uses default user. |
network.redis.password |
empty | Redis/ACL password. |
network.redis.database |
0 |
Logical Redis database index. |
network.redis.key_prefix |
pureauth: |
Namespace; a trailing colon is normalized automatically. |
network.redis.connection_timeout_ms |
2000 |
Connect timeout. |
network.redis.socket_timeout_ms |
2000 |
Read/write response timeout. |
network.redis.player_lock_ttl_seconds |
45 |
Username lease TTL; values below 10 are normalized to 10. |
network.redis.authenticated_ttl_seconds |
600 |
Shared authenticated UUID TTL. |
network.redis.failure_policy |
DENY |
DENY fail-closed or ALLOW local fallback. |
| Path | Default | Purpose |
|---|---|---|
settings.safe_mode |
false |
Makes sensitive admin changes console-only. |
settings.language |
EN |
Selects EN_en.txt; PL selects PL_pl.txt. Reload after changing. |
settings.blindness_effect |
true |
Applies the pre-authentication visual effect. |
settings.premium_login.enabled |
true |
Enables /premium and automatic Premium login. |
settings.premium_login.require_same_ip |
true |
Requires the last trusted IP. |
settings.pin.enabled |
true |
Enables PIN setup and PIN login. |
settings.pin.length |
6 |
Required PIN digits, supported 1–9; invalid values fail safely to 6. |
settings.pin.gui.digit_material |
PLAYER_HEAD |
Fallback digit item material. |
settings.pin.gui.filler.material |
GRAY_STAINED_GLASS_PANE |
Empty GUI filler. |
settings.pin.gui.input.filled.material |
LIME_STAINED_GLASS_PANE |
Filled PIN position. |
settings.pin.gui.input.empty.material |
BLACK_STAINED_GLASS_PANE |
Empty PIN position. |
settings.pin.gui.status_material |
NETHER_STAR |
Status/help item. |
settings.pin.gui.controls.backspace.material |
ARROW |
Backspace item. |
settings.pin.gui.controls.backspace.texture |
empty | Optional trusted Base64 Minecraft texture; empty uses material. |
settings.pin.gui.controls.clear.material |
BARRIER |
Clear item. |
settings.pin.gui.controls.clear.texture |
empty | Optional Base64 texture. |
settings.pin.gui.digits.0.texture, settings.pin.gui.digits.1.texture, settings.pin.gui.digits.2.texture, settings.pin.gui.digits.3.texture, settings.pin.gui.digits.4.texture, settings.pin.gui.digits.5.texture, settings.pin.gui.digits.6.texture, settings.pin.gui.digits.7.texture, settings.pin.gui.digits.8.texture, settings.pin.gui.digits.9.texture
|
bundled values | Base64 textures.minecraft.net player-head texture for each digit. Invalid/untrusted URLs fail closed to material. |
settings.pin.gui.sounds.enabled |
true |
Master GUI sound switch. |
settings.pin.gui.sounds.open |
minecraft:block.ender_chest.open |
GUI opening sound key. |
settings.pin.gui.sounds.click |
minecraft:ui.button.click |
Digit/control click sound. |
settings.pin.gui.sounds.step |
minecraft:block.note_block.pling |
PIN-stage transition sound. |
settings.pin.gui.sounds.success |
minecraft:entity.player.levelup |
Successful PIN sound. |
settings.pin.gui.sounds.error |
minecraft:entity.villager.no |
Invalid PIN/error sound. |
| Path | Default | Purpose |
|---|---|---|
settings.backup.enabled |
true |
Starts scheduled backup/export. |
settings.backup.interval_hours |
24 |
Time between backups. |
settings.backup.max_backups |
10 |
Retained rotating backups. |
settings.recovery.enabled |
true |
Enables account recovery commands/flow. |
settings.discord.enabled |
false |
Master Discord webhook switch. |
settings.discord.webhook_url |
placeholder | Discord webhook URL; keep it secret. |
settings.discord.events.server_lifecycle |
true |
Start/stop reports. |
settings.discord.events.user_login |
false |
Successful login reports. |
settings.discord.events.user_register |
true |
Registrations. |
settings.discord.events.user_changepass |
true |
Password changes. |
settings.discord.events.user_premium_toggle |
true |
Premium/cracked toggles. |
settings.discord.events.failed_attempts |
true |
Failed credential reports. |
settings.discord.events.account_locked |
true |
Account-lock reports. |
settings.discord.events.admin_usage |
true |
Ordinary admin action reports. |
settings.discord.events.admin_sensitive |
true |
Sensitive account mutation reports. |
| Path | Default | Purpose |
|---|---|---|
settings.security.account_lock_enabled |
true |
Master persistent lock policy. |
settings.security.kicks_before_lock |
3 |
Kick stage at which permanent lock occurs. |
settings.security.progressive_lock.enabled |
true |
Enables temporary stages before permanent lock. |
settings.security.progressive_lock.first_lock_seconds |
1800 |
First stage (30 minutes). |
settings.security.progressive_lock.second_lock_seconds |
86400 |
Second stage (24 hours). |
settings.security.progressive_lock.reset_history_after_successful_login |
false |
When true, successful auth clears escalation history. |
settings.security.progressive_lock.reminder_interval_seconds |
10 |
Lock status refresh/reminder interval. |
settings.security.progressive_lock.display.title |
true |
Show lock title. |
settings.security.progressive_lock.display.chat |
true |
Show lock chat messages. |
settings.security.progressive_lock.display.actionbar |
true |
Show actionbar countdown. |
settings.captcha.enabled |
true |
Adds CAPTCHA to registration. |
settings.captcha.length |
5 |
Generated code length. |
settings.captcha.characters |
A-Z0-9 |
Source alphabet exactly as configured. |
settings.login_timeout |
60 |
Seconds to complete login before kick. |
settings.max_attempts |
3 |
Bad credentials allowed per connection. |
settings.min_password_length |
4 |
Minimum password characters; production should use a stronger value. |
settings.max_accounts_per_ip |
3 |
Registration limit per recorded IP. |
settings.sessions.enabled |
true |
Enables reconnect sessions. |
settings.sessions.time_minutes |
1 |
Session lifetime. |
settings.admin_guard.enabled |
true |
Requires 2FA for holders of pureauth.admin.guard. |
| Path | Default | Purpose |
|---|---|---|
settings.fair_play_guard.enabled |
true |
Master switch. |
settings.fair_play_guard.require_authenticated |
true |
Target must finish PureAuth login first. |
settings.fair_play_guard.teleport_to_check_location |
true |
Teleport to configured inspection point. |
settings.fair_play_guard.force_adventure_mode |
true |
Change target to Adventure during inspection. |
settings.fair_play_guard.block_item_drops |
true |
Cancel item drops. |
settings.fair_play_guard.block_inventory_changes |
true |
Cancel inventory clicks. |
settings.fair_play_guard.block_world_interaction |
true |
Cancel break/place/interact. |
settings.fair_play_guard.block_commands |
true |
Cancel player commands. |
settings.fair_play_guard.prevent_damage |
true |
Cancel damage to the checked player. |
settings.fair_play_guard.private_chat |
true |
Send checked-player chat only to inspector/console. |
settings.fair_play_guard.lock_on_disconnect |
true |
Store persistent restriction after logout/kick not recognized as a ban. |
settings.fair_play_guard.restore_previous_location |
true |
Return to pre-check location on clear/ban/shutdown. |
settings.fair_play_guard.restore_survival_mode |
true |
Restore Survival specifically; false restores original game mode. |
settings.fair_play_guard.discord_invite |
discord.gg/yourserver |
%discord% used in reminders. |
settings.fair_play_guard.radius.enabled |
true |
Enforce inspection radius. |
settings.fair_play_guard.radius.max_distance |
50.0 |
Maximum 3D distance in blocks. Other worlds count as outside. |
settings.fair_play_guard.radius.check_interval_ticks |
20 |
Radius check period; minimum runtime value is 1 tick. |
settings.fair_play_guard.reminders.enabled |
true |
Repeated Discord/waiting-area instruction. |
settings.fair_play_guard.reminders.interval_seconds |
10 |
Reminder period; minimum runtime value is 1 second. |
settings.fair_play_guard.disconnect_command.enabled |
false |
Run optional console command on inspection disconnect. |
settings.fair_play_guard.disconnect_command.command |
example ban | Command without leading slash; supports %player%, %uuid%. Blank/invalid commands are ignored. |
settings.fair_play_guard.ban_detection.command_prefixes |
common ban roots | Command roots that identify an admin ban and suppress PureAuth disconnect punishment. |
| Path | Default | Purpose |
|---|---|---|
settings.update_checker |
true |
Checks the configured release source and notifies about newer semantic versions. |
settings.message_interval |
10 |
Seconds between login/register reminders. |
settings.locations.spawn_login |
empty | Serialized login waiting location; set with admin command. |
settings.locations.spawn_register |
empty | Serialized registration waiting location. |
settings.locations.fair_play_check |
empty | Serialized Fair Play Guard location. |
Both proxy configs contain the same database pool, language and Redis meanings documented above. Bungee uses database.type plus nested database.mysql.*; Velocity uses database.driver and flat host, port, database, username, password, prefix. Production proxy networks must use MYSQL and identical credentials/table prefix. settings.language selects the proxy duplicate/unavailable kick file. All network.redis.* fields have the same meaning and defaults as Paper.
PureAuth creates:
plugins/PureAuth/Messages/EN_en.txt
plugins/PureAuth/Messages/PL_pl.txt
Despite the .txt extension these files use YAML. Keep quotes around values containing :, #, brackets or leading spaces. Use \n for a new line. Legacy & colors and &#RRGGBB hex colors are supported. Change prefix to rebrand every response that uses it. Run /pureauth reload after editing.
The config contains operational values only; all player/admin chat, title, subtitle, actionbar, GUI label/lore and kick text is in these message files. Lists such as recovery_questions and GUI lore must remain YAML lists.
| Placeholder | Used for |
|---|---|
%player% |
Target/player name |
%admin% |
Inspector/administrator name |
%message% |
Private Fair Play chat text |
%discord% |
Fair Play Discord invite |
%reason% |
Stored Fair Play reason where applicable |
%time% |
Seconds or formatted remaining lock time, depending on key |
%code% |
CAPTCHA or generated recovery content depending on key |
%key% |
TOTP secret |
%codes% |
2FA backup-code block |
%question%, %number%
|
Recovery question/list entry |
%length% |
Required password/PIN length |
%attempts%, %max%
|
Failed attempts and limit |
%current%, %new%
|
Update versions |
%version%, %count%, %value%
|
Admin/version/stat output |
%accounts% |
Account list |
%uuid%, %ip%, %last_login%, %registered%, %premium%, %pin_enabled%, %locked%, %temporary_lock_until%, %failed_login_kicks%, %recovery_set%, %2fa_enabled%
|
/pureauth info template |
Do not remove a placeholder unless you intentionally do not want that value displayed. Unknown placeholders are printed literally.
Authentication/join/locks: prefix, join_title, join_subtitle_register, join_subtitle_login, actionbar_timer, captcha_message, reminder_register, reminder_login, title_locked, subtitle_locked, error_locked_chat, temporary_lock_title, temporary_lock_subtitle, temporary_lock_chat, temporary_lock_actionbar, temporary_lock_kick, temporary_lock_expired, permanent_lock_kick, lock_database_error_kick, success_register, success_login, success_premium_login, success_session, password_changed, title_success_register, subtitle_success_register, title_success_login, subtitle_success_login, title_success_premium_login, subtitle_success_premium_login, title_success_session, subtitle_success_session.
PIN and GUI: pin_login_open, pin_login_reminder, pin_setup_open, pin_change_open, pin_confirm_prompt, pin_mismatch, pin_current_success, pin_current_wrong, pin_login_success, pin_saved, pin_removed, pin_not_set, pin_already_set, pin_disabled, pin_invalid, pin_database_error, database_error, pin_gui_cancelled, pin_command_no_args, pin_login_command_blocked, pin_changepass_gui_only, pin_admin_changed_notice, pin_admin_rejoin, pin_halted_title, pin_halted_subtitle, pin_halted_subtitle_recovery, pin_halted_chat, pin_halted_chat_recovery, pin_gui_title, pin_gui_filler_name, pin_gui_input_filled_name, pin_gui_input_empty_name, pin_gui_status_login, pin_gui_status_setup_new, pin_gui_status_setup_confirm, pin_gui_status_change_current, pin_gui_status_change_new, pin_gui_status_change_confirm, pin_gui_status_complete, pin_gui_status_lore, pin_gui_control_backspace_name, pin_gui_control_backspace_lore, pin_gui_control_clear_name, pin_gui_control_clear_lore, pin_gui_digit_0_name, pin_gui_digit_0_lore, pin_gui_digit_1_name, pin_gui_digit_1_lore, pin_gui_digit_2_name, pin_gui_digit_2_lore, pin_gui_digit_3_name, pin_gui_digit_3_lore, pin_gui_digit_4_name, pin_gui_digit_4_lore, pin_gui_digit_5_name, pin_gui_digit_5_lore, pin_gui_digit_6_name, pin_gui_digit_6_lore, pin_gui_digit_7_name, pin_gui_digit_7_lore, pin_gui_digit_8_name, pin_gui_digit_8_lore, pin_gui_digit_9_name, pin_gui_digit_9_lore.
2FA: 2fa_usage, 2fa_title, 2fa_subtitle_setup, 2fa_subtitle_login, 2fa_setup_start, 2fa_key_msg, 2fa_enter_code, 2fa_setup_success, 2fa_setup_fail, 2fa_login_req, 2fa_removed, 2fa_verify_remove, 2fa_not_enabled, 2fa_already, title_success_2fa, subtitle_success_2fa, success_2fa_verify, 2fa_backup_codes_msg, 2fa_recovery_usage, 2fa_recovery_success, 2fa_recovery_fail.
Recovery: recovery_questions, recovery_setup_usage, recovery_remove_success, recovery_question_list, recovery_question_format, recovery_answer_prompt, recovery_setup_success, recovery_start_usage, recovery_verify_success, recovery_pass_usage, recovery_pass_changed, recovery_pin_removed, recovery_database_error, recovery_not_set, recovery_already_setup, recovery_fail, recovery_session_expired, recovery_cancelled, recovery_disabled, recovery_invalid_number, recovery_number_required, recovery_question_config_error, recovery_verification_required.
Premium, network and errors: sync_success, update_available, update_download, premium_enabled, premium_disabled, premium_fail_api, premium_already, premium_not_enabled, premium_ip_changed, premium_disabled_admin, premium_api_error, error_already_online, error_wrong_pass, error_usage_login, error_usage_changepass, error_vpn_kick, error_wrong_captcha, error_usage_captcha, error_usage_reg, error_kick_attempts, error_kick_timeout, error_already_logged, error_not_logged, error_match_pass, error_length_pass, error_already_reg, error_not_reg, error_wrong_old, error_max_ip, error_launcher_mismatch, online_mode_fail_safe_kick, network_duplicate_kick, network_unavailable_kick.
Admin/Admin Guard: admin_guard_title, admin_guard_subtitle, admin_guard_chat, admin_guard_forced_setup, admin_guard_remove_warning, admin_reload, admin_unregister, admin_loc_set, admin_pass_set, admin_force_login, admin_unlock, admin_register_success, admin_register_fail, admin_console_only, admin_safe_mode, admin_player_not_found, admin_unknown_command, admin_help, admin_pin_set, admin_pin_changed, admin_pin_removed, admin_pin_already_set, admin_pin_not_set, admin_no_perm, admin_players_only, admin_invalid_type, admin_offline, admin_header_border, admin_info_header, admin_info_body, admin_accounts, admin_version, admin_created_by, admin_stats_title, admin_stats_users, admin_stats_safe_mode, admin_stats_discord, admin_stats_backup, admin_unlock_kick, admin_unregister_kick, location_login_name, location_register_name, admin_usage_unlock, admin_usage_unregister, admin_usage_register, admin_usage_forcelogin, admin_usage_info, admin_usage_setpassword, admin_usage_accounts, admin_usage_location, admin_usage_setpin, admin_usage_changepin, admin_usage_rempin.
Fair Play Guard: fair_play_disabled, fair_play_setup_start, fair_play_setup_title, fair_play_setup_subtitle, fair_play_setup_not_started, fair_play_setup_saved, fair_play_location_missing, fair_play_usage, fair_play_target_offline, fair_play_target_not_authenticated, fair_play_already_checked, fair_play_started_admin, fair_play_started_player, fair_play_title, fair_play_subtitle, fair_play_reminder, fair_play_private_chat_format, fair_play_command_blocked, fair_play_returned_to_area, fair_play_clear_not_found, fair_play_cleared_admin, fair_play_cleared_player, fair_play_clear_title, fair_play_clear_subtitle, fair_play_disconnect_reason, fair_play_disconnect_locked, fair_play_lock_kick, fair_play_database_error, fair_play_ban_cleanup.
SQLite backups copy the local database; MySQL mode exports plugin-owned data according to the implementation. Rotation retains max_backups. Always also maintain infrastructure-level encrypted backups and test restores.
Administrative commands are written to PureAuth logs; password/PIN arguments for register, setpassword, setpin and changepin are replaced with [REDACTED]. Discord event switches only apply when the master switch is true and the webhook URL is valid. Treat webhook URLs as secrets.
PlaceholderAPI is optional (softdepend). PureAuth loads without it. Proxy plugin messages use pureauth:sync; do not block that channel between the proxy and backends.
Wait at least player_lock_ttl_seconds. If it persists, confirm all proxies use synchronized system time, the same prefix, and can refresh/release Redis keys. Do not manually delete keys while a proxy may still own them.
Check private routing, ACL username/password, database index, TLS/network policy if externally provided, and both timeouts. Under DENY, rejection is expected and protects against duplicates. Under ALLOW, the console states that protection has fallen back locally.
Add the third-party ban command root to ban_detection.command_prefixes. Prefer commands in ban Player Reason form. Paper-native banned kick causes and the built-in name ban list are also detected.
Run setup and confirm as a player in a loaded world. If the world was renamed/deleted, set the point again.
Edit the language file selected by settings.language, validate YAML quotes/lists, then /pureauth reload. On a proxy, restart after changing proxy resource/config files if its platform does not expose a reload lifecycle.
Confirm recovery is enabled, the account has a selected question, the player is not already logged in, and the saved question index still exists in the same position in recovery_questions.
Protected backend online-mode must be false. On a proxy network verify forwarding/firewall configuration instead of changing PureAuth's fail-safe message.
Verify type/driver spelling, credentials, schema permissions, prefix characters and pool timeouts. Do not treat a proxy SQLite warning as a production network configuration; use MySQL/MariaDB.
- Firewall offline-mode backends from the public Internet.
- Use MySQL/MariaDB for a network and a least-privilege database user.
- Use Redis ACL authentication, a private bind/firewall and
failure_policy: DENY. - Use a unique Redis key prefix per independent network.
- Keep
require_same_ip, account locks and Admin Guard enabled unless policy requires otherwise. - Grant individual admin permissions and reserve
pureauth.adminfor trusted operators. - Set strong password length and protect config, database, logs, backups and webhook URLs.
- Test
/pureauth unlock, recovery, 2FA recovery and Fair Play appeals before production incidents. - Keep Paper/Purpur, proxy and Java patched, and replace all PureAuth modules together.
- Retain off-host encrypted backups and perform restore drills.
After installation or upgrade verify:
- plugin enables and disables cleanly;
- register/login/CAPTCHA work;
- PIN setup, login, change, remove and GUI-close safety work;
- 2FA setup, login, removal and one-use recovery code work;
- account recovery works and removes a forgotten PIN;
- progressive temporary/permanent locks and
/pureauth unlockwork; - proxy switching preserves authentication;
- two proxies cannot accept the same nickname simultaneously in Redis mode;
- Redis outage produces the selected failure policy;
- Fair Play setup/start/private chat/radius/restrictions/clear/logout lock/appeal unlock/admin-ban cleanup work;
- EN and PL message reloads work;
- scheduled backup and webhook policy match expectations.
YooUUU rEAllY reAd thiiisS??